aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/OptionalModules
diff options
context:
space:
mode:
authorUbitUmarov2012-03-28 17:51:56 +0100
committerUbitUmarov2012-03-28 17:51:56 +0100
commit1888e174cd9407003d544a8a3fad21ae53e8dcb4 (patch)
tree80df2ea53b4824e196ddbba835dc8b420f5e99bf /OpenSim/Region/OptionalModules
parentMerge branch 'master' of ssh://3dhosting.de/var/git/careminster into ubitwork (diff)
parentMerge branch 'master' into careminster (diff)
downloadopensim-SC_OLD-1888e174cd9407003d544a8a3fad21ae53e8dcb4.zip
opensim-SC_OLD-1888e174cd9407003d544a8a3fad21ae53e8dcb4.tar.gz
opensim-SC_OLD-1888e174cd9407003d544a8a3fad21ae53e8dcb4.tar.bz2
opensim-SC_OLD-1888e174cd9407003d544a8a3fad21ae53e8dcb4.tar.xz
Merge branch 'master' of ssh://3dhosting.de/var/git/careminster into ubitwork
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/Voice/VivoxVoice/VivoxVoiceModule.cs70
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs144
2 files changed, 143 insertions, 71 deletions
diff --git a/OpenSim/Region/OptionalModules/Avatar/Voice/VivoxVoice/VivoxVoiceModule.cs b/OpenSim/Region/OptionalModules/Avatar/Voice/VivoxVoice/VivoxVoiceModule.cs
index 0be0a19..4dbac1d 100644
--- a/OpenSim/Region/OptionalModules/Avatar/Voice/VivoxVoice/VivoxVoiceModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/Voice/VivoxVoice/VivoxVoiceModule.cs
@@ -221,15 +221,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice
221 } 221 }
222 } 222 }
223 223
224 // Called to indicate that the module has been added to the region
225 public void AddRegion(Scene scene) 224 public void AddRegion(Scene scene)
226 { 225 {
227
228 if (m_pluginEnabled) 226 if (m_pluginEnabled)
229 { 227 {
230 lock (vlock) 228 lock (vlock)
231 { 229 {
232
233 string channelId; 230 string channelId;
234 231
235 string sceneUUID = scene.RegionInfo.RegionID.ToString(); 232 string sceneUUID = scene.RegionInfo.RegionID.ToString();
@@ -273,23 +270,22 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice
273 } 270 }
274 } 271 }
275 272
276
277 // Create a dictionary entry unconditionally. This eliminates the 273 // Create a dictionary entry unconditionally. This eliminates the
278 // need to check for a parent in the core code. The end result is 274 // need to check for a parent in the core code. The end result is
279 // the same, if the parent table entry is an empty string, then 275 // the same, if the parent table entry is an empty string, then
280 // region channels will be created as first-level channels. 276 // region channels will be created as first-level channels.
281 277 lock (m_parents)
282 lock (m_parents) 278 {
283 if (m_parents.ContainsKey(sceneUUID)) 279 if (m_parents.ContainsKey(sceneUUID))
284 { 280 {
285 RemoveRegion(scene); 281 RemoveRegion(scene);
286 m_parents.Add(sceneUUID, channelId); 282 m_parents.Add(sceneUUID, channelId);
287 } 283 }
288 else 284 else
289 { 285 {
290 m_parents.Add(sceneUUID, channelId); 286 m_parents.Add(sceneUUID, channelId);
291 } 287 }
292 288 }
293 } 289 }
294 290
295 // we need to capture scene in an anonymous method 291 // we need to capture scene in an anonymous method
@@ -298,26 +294,20 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice
298 { 294 {
299 OnRegisterCaps(scene, agentID, caps); 295 OnRegisterCaps(scene, agentID, caps);
300 }; 296 };
301
302 } 297 }
303
304 } 298 }
305 299
306 // Called to indicate that all loadable modules have now been added
307 public void RegionLoaded(Scene scene) 300 public void RegionLoaded(Scene scene)
308 { 301 {
309 // Do nothing. 302 // Do nothing.
310 } 303 }
311 304
312 // Called to indicate that the region is going away.
313 public void RemoveRegion(Scene scene) 305 public void RemoveRegion(Scene scene)
314 { 306 {
315
316 if (m_pluginEnabled) 307 if (m_pluginEnabled)
317 { 308 {
318 lock (vlock) 309 lock (vlock)
319 { 310 {
320
321 string channelId; 311 string channelId;
322 312
323 string sceneUUID = scene.RegionInfo.RegionID.ToString(); 313 string sceneUUID = scene.RegionInfo.RegionID.ToString();
@@ -328,10 +318,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice
328 // iteration over the set of chidren identified. 318 // iteration over the set of chidren identified.
329 // This assumes that there is just one directory per 319 // This assumes that there is just one directory per
330 // region. 320 // region.
331
332 if (VivoxTryGetDirectory(sceneUUID + "D", out channelId)) 321 if (VivoxTryGetDirectory(sceneUUID + "D", out channelId))
333 { 322 {
334
335 m_log.DebugFormat("[VivoxVoice]: region {0}: uuid {1}: located directory id {2}", 323 m_log.DebugFormat("[VivoxVoice]: region {0}: uuid {1}: located directory id {2}",
336 sceneName, sceneUUID, channelId); 324 sceneName, sceneUUID, channelId);
337 325
@@ -360,7 +348,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice
360 348
361 lock (m_parents) 349 lock (m_parents)
362 { 350 {
363 if (m_parents.ContainsKey(sceneUUID)) 351 if (m_parents.ContainsKey(sceneUUID))
364 { 352 {
365 m_parents.Remove(sceneUUID); 353 m_parents.Remove(sceneUUID);
366 } 354 }
@@ -459,11 +447,11 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice
459 { 447 {
460 try 448 try
461 { 449 {
462
463 ScenePresence avatar = null; 450 ScenePresence avatar = null;
464 string avatarName = null; 451 string avatarName = null;
465 452
466 if (scene == null) throw new Exception("[VivoxVoice][PROVISIONVOICE] Invalid scene"); 453 if (scene == null)
454 throw new Exception("[VivoxVoice][PROVISIONVOICE]: Invalid scene");
467 455
468 avatar = scene.GetScenePresence(agentID); 456 avatar = scene.GetScenePresence(agentID);
469 while (avatar == null) 457 while (avatar == null)
@@ -566,7 +554,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice
566 } 554 }
567 } 555 }
568 } 556 }
569 } while (retry); 557 }
558 while (retry);
570 559
571 if (code != "OK") 560 if (code != "OK")
572 { 561 {
@@ -676,7 +665,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice
676 } 665 }
677 } 666 }
678 667
679
680 /// <summary> 668 /// <summary>
681 /// Callback for a client request for a private chat channel 669 /// Callback for a client request for a private chat channel
682 /// </summary> 670 /// </summary>
@@ -698,10 +686,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice
698 return "<llsd>true</llsd>"; 686 return "<llsd>true</llsd>";
699 } 687 }
700 688
701
702 private string RegionGetOrCreateChannel(Scene scene, LandData land) 689 private string RegionGetOrCreateChannel(Scene scene, LandData land)
703 { 690 {
704
705 string channelUri = null; 691 string channelUri = null;
706 string channelId = null; 692 string channelId = null;
707 693
@@ -709,11 +695,11 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice
709 string landName; 695 string landName;
710 string parentId; 696 string parentId;
711 697
712 lock (m_parents) parentId = m_parents[scene.RegionInfo.RegionID.ToString()]; 698 lock (m_parents)
699 parentId = m_parents[scene.RegionInfo.RegionID.ToString()];
713 700
714 // Create parcel voice channel. If no parcel exists, then the voice channel ID is the same 701 // Create parcel voice channel. If no parcel exists, then the voice channel ID is the same
715 // as the directory ID. Otherwise, it reflects the parcel's ID. 702 // as the directory ID. Otherwise, it reflects the parcel's ID.
716
717 if (land.LocalID != 1 && (land.Flags & (uint)ParcelFlags.UseEstateVoiceChan) == 0) 703 if (land.LocalID != 1 && (land.Flags & (uint)ParcelFlags.UseEstateVoiceChan) == 0)
718 { 704 {
719 landName = String.Format("{0}:{1}", scene.RegionInfo.RegionName, land.Name); 705 landName = String.Format("{0}:{1}", scene.RegionInfo.RegionName, land.Name);
@@ -741,8 +727,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice
741 727
742 m_log.DebugFormat("[VivoxVoice]: Region:Parcel \"{0}\": parent channel id {1}: retrieved parcel channel_uri {2} ", 728 m_log.DebugFormat("[VivoxVoice]: Region:Parcel \"{0}\": parent channel id {1}: retrieved parcel channel_uri {2} ",
743 landName, parentId, channelUri); 729 landName, parentId, channelUri);
744
745
746 } 730 }
747 731
748 return channelUri; 732 return channelUri;
@@ -761,7 +745,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice
761 return VivoxCall(requrl, false); 745 return VivoxCall(requrl, false);
762 } 746 }
763 747
764
765 private static readonly string m_vivoxLogoutPath = "https://{0}/api2/viv_signout.php?auth_token={1}"; 748 private static readonly string m_vivoxLogoutPath = "https://{0}/api2/viv_signout.php?auth_token={1}";
766 749
767 /// <summary> 750 /// <summary>
@@ -828,7 +811,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice
828 /// 811 ///
829 /// In this case the call handles parent and description as optional values. 812 /// In this case the call handles parent and description as optional values.
830 /// </summary> 813 /// </summary>
831
832 private bool VivoxTryCreateChannel(string parent, string channelId, string description, out string channelUri) 814 private bool VivoxTryCreateChannel(string parent, string channelId, string description, out string channelUri)
833 { 815 {
834 string requrl = String.Format(m_vivoxChannelPath, m_vivoxServer, "create", channelId, m_authToken); 816 string requrl = String.Format(m_vivoxChannelPath, m_vivoxServer, "create", channelId, m_authToken);
@@ -864,7 +846,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice
864 /// channel name space. 846 /// channel name space.
865 /// The parent and description are optional values. 847 /// The parent and description are optional values.
866 /// </summary> 848 /// </summary>
867
868 private bool VivoxTryCreateDirectory(string dirId, string description, out string channelId) 849 private bool VivoxTryCreateDirectory(string dirId, string description, out string channelId)
869 { 850 {
870 string requrl = String.Format(m_vivoxChannelPath, m_vivoxServer, "create", dirId, m_authToken); 851 string requrl = String.Format(m_vivoxChannelPath, m_vivoxServer, "create", dirId, m_authToken);
@@ -901,7 +882,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice
901 /// are required in a later phase. 882 /// are required in a later phase.
902 /// In this case the call handles parent and description as optional values. 883 /// In this case the call handles parent and description as optional values.
903 /// </summary> 884 /// </summary>
904
905 private bool VivoxTryGetChannel(string channelParent, string channelName, 885 private bool VivoxTryGetChannel(string channelParent, string channelName,
906 out string channelId, out string channelUri) 886 out string channelId, out string channelUri)
907 { 887 {
@@ -1044,6 +1024,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice
1044 // return VivoxCall(requrl, true); 1024 // return VivoxCall(requrl, true);
1045 // } 1025 // }
1046 1026
1027 private static readonly string m_vivoxChannelDel = "https://{0}/api2/viv_chan_mod.php?mode={1}&chan_id={2}&auth_token={3}";
1028
1047 /// <summary> 1029 /// <summary>
1048 /// Delete a channel. 1030 /// Delete a channel.
1049 /// Once again, there a multitude of options possible. In the simplest case 1031 /// Once again, there a multitude of options possible. In the simplest case
@@ -1056,8 +1038,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice
1056 /// In this case the call handles parent and description as optional values. 1038 /// In this case the call handles parent and description as optional values.
1057 /// </summary> 1039 /// </summary>
1058 1040
1059 private static readonly string m_vivoxChannelDel = "https://{0}/api2/viv_chan_mod.php?mode={1}&chan_id={2}&auth_token={3}";
1060
1061 private XmlElement VivoxDeleteChannel(string parent, string channelid) 1041 private XmlElement VivoxDeleteChannel(string parent, string channelid)
1062 { 1042 {
1063 string requrl = String.Format(m_vivoxChannelDel, m_vivoxServer, "delete", channelid, m_authToken); 1043 string requrl = String.Format(m_vivoxChannelDel, m_vivoxServer, "delete", channelid, m_authToken);
@@ -1068,12 +1048,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice
1068 return VivoxCall(requrl, true); 1048 return VivoxCall(requrl, true);
1069 } 1049 }
1070 1050
1051 private static readonly string m_vivoxChannelSearch = "https://{0}/api2/viv_chan_search.php?&cond_chanparent={1}&auth_token={2}";
1052
1071 /// <summary> 1053 /// <summary>
1072 /// Return information on channels in the given directory 1054 /// Return information on channels in the given directory
1073 /// </summary> 1055 /// </summary>
1074 1056
1075 private static readonly string m_vivoxChannelSearch = "https://{0}/api2/viv_chan_search.php?&cond_chanparent={1}&auth_token={2}";
1076
1077 private XmlElement VivoxListChildren(string channelid) 1057 private XmlElement VivoxListChildren(string channelid)
1078 { 1058 {
1079 string requrl = String.Format(m_vivoxChannelSearch, m_vivoxServer, channelid, m_authToken); 1059 string requrl = String.Format(m_vivoxChannelSearch, m_vivoxServer, channelid, m_authToken);
@@ -1118,7 +1098,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice
1118 /// The outcome of the call can be determined by examining the 1098 /// The outcome of the call can be determined by examining the
1119 /// status value in the hash table. 1099 /// status value in the hash table.
1120 /// </summary> 1100 /// </summary>
1121
1122 private XmlElement VivoxCall(string requrl, bool admin) 1101 private XmlElement VivoxCall(string requrl, bool admin)
1123 { 1102 {
1124 1103
@@ -1164,7 +1143,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice
1164 /// <summary> 1143 /// <summary>
1165 /// Just say if it worked. 1144 /// Just say if it worked.
1166 /// </summary> 1145 /// </summary>
1167
1168 private bool IsOK(XmlElement resp) 1146 private bool IsOK(XmlElement resp)
1169 { 1147 {
1170 string status; 1148 string status;
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
index d39b847..9ff3652 100644
--- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
@@ -84,6 +84,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
84 private bool m_groupsEnabled = false; 84 private bool m_groupsEnabled = false;
85 private bool m_groupNoticesEnabled = true; 85 private bool m_groupNoticesEnabled = true;
86 private bool m_debugEnabled = false; 86 private bool m_debugEnabled = false;
87 private int m_levelGroupCreate = 0;
87 88
88 #region IRegionModuleBase Members 89 #region IRegionModuleBase Members
89 90
@@ -115,6 +116,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
115 116
116 m_groupNoticesEnabled = groupsConfig.GetBoolean("NoticesEnabled", true); 117 m_groupNoticesEnabled = groupsConfig.GetBoolean("NoticesEnabled", true);
117 m_debugEnabled = groupsConfig.GetBoolean("DebugEnabled", false); 118 m_debugEnabled = groupsConfig.GetBoolean("DebugEnabled", false);
119 m_levelGroupCreate = groupsConfig.GetInt("LevelGroupCreate", 0);
118 } 120 }
119 } 121 }
120 122
@@ -708,13 +710,29 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
708 remoteClient.SendCreateGroupReply(UUID.Zero, false, "A group with the same name already exists."); 710 remoteClient.SendCreateGroupReply(UUID.Zero, false, "A group with the same name already exists.");
709 return UUID.Zero; 711 return UUID.Zero;
710 } 712 }
713
714 // check user level
715 ScenePresence avatar = null;
716 Scene scene = (Scene)remoteClient.Scene;
717 scene.TryGetScenePresence(remoteClient.AgentId, out avatar);
718
719 if (avatar != null)
720 {
721 if (avatar.UserLevel < m_levelGroupCreate)
722 {
723 remoteClient.SendCreateGroupReply(UUID.Zero, false, "You have got insufficient permissions to create a group.");
724 return UUID.Zero;
725 }
726 }
727
728 // check funds
711 // is there is a money module present ? 729 // is there is a money module present ?
712 IMoneyModule money = remoteClient.Scene.RequestModuleInterface<IMoneyModule>(); 730 IMoneyModule money = scene.RequestModuleInterface<IMoneyModule>();
713 if (money != null) 731 if (money != null)
714 { 732 {
715 // do the transaction, that is if the agent has got sufficient funds 733 // do the transaction, that is if the agent has got sufficient funds
716 if (!money.AmountCovered(remoteClient.AgentId, money.GroupCreationCharge)) { 734 if (!money.AmountCovered(remoteClient.AgentId, money.GroupCreationCharge)) {
717 remoteClient.SendCreateGroupReply(UUID.Zero, false, "You have got issuficient funds to create a group."); 735 remoteClient.SendCreateGroupReply(UUID.Zero, false, "You have got insufficient funds to create a group.");
718 return UUID.Zero; 736 return UUID.Zero;
719 } 737 }
720 money.ApplyCharge(GetRequestingAgentID(remoteClient), money.GroupCreationCharge, "Group Creation"); 738 money.ApplyCharge(GetRequestingAgentID(remoteClient), money.GroupCreationCharge, "Group Creation");
@@ -939,17 +957,55 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
939 957
940 public void EjectGroupMemberRequest(IClientAPI remoteClient, UUID groupID, UUID ejecteeID) 958 public void EjectGroupMemberRequest(IClientAPI remoteClient, UUID groupID, UUID ejecteeID)
941 { 959 {
942 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 960 EjectGroupMember(remoteClient, GetRequestingAgentID(remoteClient), groupID, ejecteeID);
961 }
943 962
963 public void EjectGroupMember(IClientAPI remoteClient, UUID agentID, UUID groupID, UUID ejecteeID)
964 {
965 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
944 966
945 // Todo: Security check? 967 // Todo: Security check?
946 m_groupData.RemoveAgentFromGroup(GetRequestingAgentID(remoteClient), ejecteeID, groupID); 968 m_groupData.RemoveAgentFromGroup(agentID, ejecteeID, groupID);
947 969
948 remoteClient.SendEjectGroupMemberReply(GetRequestingAgentID(remoteClient), groupID, true); 970 string agentName;
971 RegionInfo regionInfo;
949 972
950 GroupRecord groupInfo = m_groupData.GetGroupRecord(GetRequestingAgentID(remoteClient), groupID, null); 973 // remoteClient provided or just agentID?
974 if (remoteClient != null)
975 {
976 agentName = remoteClient.Name;
977 regionInfo = remoteClient.Scene.RegionInfo;
978 remoteClient.SendEjectGroupMemberReply(agentID, groupID, true);
979 }
980 else
981 {
982 IClientAPI client = GetActiveClient(agentID);
983
984 if (client != null)
985 {
986 agentName = client.Name;
987 regionInfo = client.Scene.RegionInfo;
988 client.SendEjectGroupMemberReply(agentID, groupID, true);
989 }
990 else
991 {
992 regionInfo = m_sceneList[0].RegionInfo;
993 UserAccount acc = m_sceneList[0].UserAccountService.GetUserAccount(regionInfo.ScopeID, agentID);
951 994
952 UserAccount account = m_sceneList[0].UserAccountService.GetUserAccount(remoteClient.Scene.RegionInfo.ScopeID, ejecteeID); 995 if (acc != null)
996 {
997 agentName = acc.FirstName + " " + acc.LastName;
998 }
999 else
1000 {
1001 agentName = "Unknown member";
1002 }
1003 }
1004 }
1005
1006 GroupRecord groupInfo = m_groupData.GetGroupRecord(agentID, groupID, null);
1007
1008 UserAccount account = m_sceneList[0].UserAccountService.GetUserAccount(regionInfo.ScopeID, ejecteeID);
953 if ((groupInfo == null) || (account == null)) 1009 if ((groupInfo == null) || (account == null))
954 { 1010 {
955 return; 1011 return;
@@ -959,23 +1015,22 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
959 GridInstantMessage msg = new GridInstantMessage(); 1015 GridInstantMessage msg = new GridInstantMessage();
960 1016
961 msg.imSessionID = UUID.Zero.Guid; 1017 msg.imSessionID = UUID.Zero.Guid;
962 msg.fromAgentID = GetRequestingAgentID(remoteClient).Guid; 1018 msg.fromAgentID = agentID.Guid;
963 // msg.fromAgentID = info.GroupID; 1019 // msg.fromAgentID = info.GroupID;
964 msg.toAgentID = ejecteeID.Guid; 1020 msg.toAgentID = ejecteeID.Guid;
965 //msg.timestamp = (uint)Util.UnixTimeSinceEpoch(); 1021 //msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
966 msg.timestamp = 0; 1022 msg.timestamp = 0;
967 msg.fromAgentName = remoteClient.Name; 1023 msg.fromAgentName = agentName;
968 msg.message = string.Format("You have been ejected from '{1}' by {0}.", remoteClient.Name, groupInfo.GroupName); 1024 msg.message = string.Format("You have been ejected from '{1}' by {0}.", agentName, groupInfo.GroupName);
969 msg.dialog = (byte)OpenMetaverse.InstantMessageDialog.MessageFromAgent; 1025 msg.dialog = (byte)OpenMetaverse.InstantMessageDialog.MessageFromAgent;
970 msg.fromGroup = false; 1026 msg.fromGroup = false;
971 msg.offline = (byte)0; 1027 msg.offline = (byte)0;
972 msg.ParentEstateID = 0; 1028 msg.ParentEstateID = 0;
973 msg.Position = Vector3.Zero; 1029 msg.Position = Vector3.Zero;
974 msg.RegionID = remoteClient.Scene.RegionInfo.RegionID.Guid; 1030 msg.RegionID = regionInfo.RegionID.Guid;
975 msg.binaryBucket = new byte[0]; 1031 msg.binaryBucket = new byte[0];
976 OutgoingInstantMessage(msg, ejecteeID); 1032 OutgoingInstantMessage(msg, ejecteeID);
977 1033
978
979 // Message to ejector 1034 // Message to ejector
980 // Interop, received special 210 code for ejecting a group member 1035 // Interop, received special 210 code for ejecting a group member
981 // this only works within the comms servers domain, and won't work hypergrid 1036 // this only works within the comms servers domain, and won't work hypergrid
@@ -985,26 +1040,26 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
985 1040
986 msg = new GridInstantMessage(); 1041 msg = new GridInstantMessage();
987 msg.imSessionID = UUID.Zero.Guid; 1042 msg.imSessionID = UUID.Zero.Guid;
988 msg.fromAgentID = GetRequestingAgentID(remoteClient).Guid; 1043 msg.fromAgentID = agentID.Guid;
989 msg.toAgentID = GetRequestingAgentID(remoteClient).Guid; 1044 msg.toAgentID = agentID.Guid;
990 msg.timestamp = 0; 1045 msg.timestamp = 0;
991 msg.fromAgentName = remoteClient.Name; 1046 msg.fromAgentName = agentName;
992 if (account != null) 1047 if (account != null)
993 { 1048 {
994 msg.message = string.Format("{2} has been ejected from '{1}' by {0}.", remoteClient.Name, groupInfo.GroupName, account.FirstName + " " + account.LastName); 1049 msg.message = string.Format("{2} has been ejected from '{1}' by {0}.", agentName, groupInfo.GroupName, account.FirstName + " " + account.LastName);
995 } 1050 }
996 else 1051 else
997 { 1052 {
998 msg.message = string.Format("{2} has been ejected from '{1}' by {0}.", remoteClient.Name, groupInfo.GroupName, "Unknown member"); 1053 msg.message = string.Format("{2} has been ejected from '{1}' by {0}.", agentName, groupInfo.GroupName, "Unknown member");
999 } 1054 }
1000 msg.dialog = (byte)210; //interop 1055 msg.dialog = (byte)210; //interop
1001 msg.fromGroup = false; 1056 msg.fromGroup = false;
1002 msg.offline = (byte)0; 1057 msg.offline = (byte)0;
1003 msg.ParentEstateID = 0; 1058 msg.ParentEstateID = 0;
1004 msg.Position = Vector3.Zero; 1059 msg.Position = Vector3.Zero;
1005 msg.RegionID = remoteClient.Scene.RegionInfo.RegionID.Guid; 1060 msg.RegionID = regionInfo.RegionID.Guid;
1006 msg.binaryBucket = new byte[0]; 1061 msg.binaryBucket = new byte[0];
1007 OutgoingInstantMessage(msg, GetRequestingAgentID(remoteClient)); 1062 OutgoingInstantMessage(msg, agentID);
1008 1063
1009 1064
1010 // SL sends out messages to everyone in the group 1065 // SL sends out messages to everyone in the group
@@ -1014,16 +1069,55 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1014 1069
1015 public void InviteGroupRequest(IClientAPI remoteClient, UUID groupID, UUID invitedAgentID, UUID roleID) 1070 public void InviteGroupRequest(IClientAPI remoteClient, UUID groupID, UUID invitedAgentID, UUID roleID)
1016 { 1071 {
1072 InviteGroup(remoteClient, GetRequestingAgentID(remoteClient), groupID, invitedAgentID, roleID);
1073 }
1074
1075 public void InviteGroup(IClientAPI remoteClient, UUID agentID, UUID groupID, UUID invitedAgentID, UUID roleID)
1076 {
1017 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 1077 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
1018 1078
1079 string agentName;
1080 RegionInfo regionInfo;
1081
1082 // remoteClient provided or just agentID?
1083 if (remoteClient != null)
1084 {
1085 agentName = remoteClient.Name;
1086 regionInfo = remoteClient.Scene.RegionInfo;
1087 }
1088 else
1089 {
1090 IClientAPI client = GetActiveClient(agentID);
1091
1092 if (client != null)
1093 {
1094 agentName = client.Name;
1095 regionInfo = client.Scene.RegionInfo;
1096 }
1097 else
1098 {
1099 regionInfo = m_sceneList[0].RegionInfo;
1100 UserAccount account = m_sceneList[0].UserAccountService.GetUserAccount(regionInfo.ScopeID, agentID);
1101
1102 if (account != null)
1103 {
1104 agentName = account.FirstName + " " + account.LastName;
1105 }
1106 else
1107 {
1108 agentName = "Unknown member";
1109 }
1110 }
1111 }
1112
1019 // Todo: Security check, probably also want to send some kind of notification 1113 // Todo: Security check, probably also want to send some kind of notification
1020 UUID InviteID = UUID.Random(); 1114 UUID InviteID = UUID.Random();
1021 1115
1022 m_groupData.AddAgentToGroupInvite(GetRequestingAgentID(remoteClient), InviteID, groupID, roleID, invitedAgentID); 1116 m_groupData.AddAgentToGroupInvite(agentID, InviteID, groupID, roleID, invitedAgentID);
1023 1117
1024 // Check to see if the invite went through, if it did not then it's possible 1118 // Check to see if the invite went through, if it did not then it's possible
1025 // the remoteClient did not validate or did not have permission to invite. 1119 // the remoteClient did not validate or did not have permission to invite.
1026 GroupInviteInfo inviteInfo = m_groupData.GetAgentToGroupInvite(GetRequestingAgentID(remoteClient), InviteID); 1120 GroupInviteInfo inviteInfo = m_groupData.GetAgentToGroupInvite(agentID, InviteID);
1027 1121
1028 if (inviteInfo != null) 1122 if (inviteInfo != null)
1029 { 1123 {
@@ -1035,19 +1129,19 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1035 1129
1036 msg.imSessionID = inviteUUID; 1130 msg.imSessionID = inviteUUID;
1037 1131
1038 // msg.fromAgentID = GetRequestingAgentID(remoteClient).Guid; 1132 // msg.fromAgentID = agentID.Guid;
1039 msg.fromAgentID = groupID.Guid; 1133 msg.fromAgentID = groupID.Guid;
1040 msg.toAgentID = invitedAgentID.Guid; 1134 msg.toAgentID = invitedAgentID.Guid;
1041 //msg.timestamp = (uint)Util.UnixTimeSinceEpoch(); 1135 //msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
1042 msg.timestamp = 0; 1136 msg.timestamp = 0;
1043 msg.fromAgentName = remoteClient.Name; 1137 msg.fromAgentName = agentName;
1044 msg.message = string.Format("{0} has invited you to join a group. There is no cost to join this group.", remoteClient.Name); 1138 msg.message = string.Format("{0} has invited you to join a group. There is no cost to join this group.", agentName);
1045 msg.dialog = (byte)OpenMetaverse.InstantMessageDialog.GroupInvitation; 1139 msg.dialog = (byte)OpenMetaverse.InstantMessageDialog.GroupInvitation;
1046 msg.fromGroup = true; 1140 msg.fromGroup = true;
1047 msg.offline = (byte)0; 1141 msg.offline = (byte)0;
1048 msg.ParentEstateID = 0; 1142 msg.ParentEstateID = 0;
1049 msg.Position = Vector3.Zero; 1143 msg.Position = Vector3.Zero;
1050 msg.RegionID = remoteClient.Scene.RegionInfo.RegionID.Guid; 1144 msg.RegionID = regionInfo.RegionID.Guid;
1051 msg.binaryBucket = new byte[20]; 1145 msg.binaryBucket = new byte[20];
1052 1146
1053 OutgoingInstantMessage(msg, invitedAgentID); 1147 OutgoingInstantMessage(msg, invitedAgentID);