aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorSnoopy Pfeffer2012-03-27 22:30:02 +0200
committerSnoopy Pfeffer2012-03-27 22:30:02 +0200
commit19837ff4dd8b01cf1f0a458cafc02c56be48bf66 (patch)
treed9e8bf835e92442c0020a653a4a4e6c2ba325c76
parentMerge branch 'master' of ssh://snoopy@opensimulator.org/var/git/opensim (diff)
downloadopensim-SC_OLD-19837ff4dd8b01cf1f0a458cafc02c56be48bf66.zip
opensim-SC_OLD-19837ff4dd8b01cf1f0a458cafc02c56be48bf66.tar.gz
opensim-SC_OLD-19837ff4dd8b01cf1f0a458cafc02c56be48bf66.tar.bz2
opensim-SC_OLD-19837ff4dd8b01cf1f0a458cafc02c56be48bf66.tar.xz
Two new scripting functions osInviteToGroup(userID) and osEjectFromGroup(userID) that invite/eject users to/from groups the object containing the script is set to. These functions also work for closed groups.
-rw-r--r--OpenSim/Region/Framework/Interfaces/IGroupsModule.cs2
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs122
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs69
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs3
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs10
5 files changed, 183 insertions, 23 deletions
diff --git a/OpenSim/Region/Framework/Interfaces/IGroupsModule.cs b/OpenSim/Region/Framework/Interfaces/IGroupsModule.cs
index 4c501f6..6885327 100644
--- a/OpenSim/Region/Framework/Interfaces/IGroupsModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IGroupsModule.cs
@@ -93,7 +93,9 @@ namespace OpenSim.Region.Framework.Interfaces
93 void JoinGroupRequest(IClientAPI remoteClient, UUID GroupID); 93 void JoinGroupRequest(IClientAPI remoteClient, UUID GroupID);
94 void LeaveGroupRequest(IClientAPI remoteClient, UUID GroupID); 94 void LeaveGroupRequest(IClientAPI remoteClient, UUID GroupID);
95 void EjectGroupMemberRequest(IClientAPI remoteClient, UUID GroupID, UUID EjecteeID); 95 void EjectGroupMemberRequest(IClientAPI remoteClient, UUID GroupID, UUID EjecteeID);
96 void EjectGroupMember(IClientAPI remoteClient, UUID agentID, UUID GroupID, UUID EjecteeID);
96 void InviteGroupRequest(IClientAPI remoteClient, UUID GroupID, UUID InviteeID, UUID RoleID); 97 void InviteGroupRequest(IClientAPI remoteClient, UUID GroupID, UUID InviteeID, UUID RoleID);
98 void InviteGroup(IClientAPI remoteClient, UUID agentID, UUID GroupID, UUID InviteeID, UUID RoleID);
97 void NotifyChange(UUID GroupID); 99 void NotifyChange(UUID GroupID);
98 } 100 }
99} \ No newline at end of file 101} \ No newline at end of file
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
index ea5d805..2a15e5d 100644
--- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
@@ -957,17 +957,55 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
957 957
958 public void EjectGroupMemberRequest(IClientAPI remoteClient, UUID groupID, UUID ejecteeID) 958 public void EjectGroupMemberRequest(IClientAPI remoteClient, UUID groupID, UUID ejecteeID)
959 { 959 {
960 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 960 EjectGroupMember(remoteClient, GetRequestingAgentID(remoteClient), groupID, ejecteeID);
961 }
961 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);
962 966
963 // Todo: Security check? 967 // Todo: Security check?
964 m_groupData.RemoveAgentFromGroup(GetRequestingAgentID(remoteClient), ejecteeID, groupID); 968 m_groupData.RemoveAgentFromGroup(agentID, ejecteeID, groupID);
965 969
966 remoteClient.SendEjectGroupMemberReply(GetRequestingAgentID(remoteClient), groupID, true); 970 string agentName;
971 RegionInfo regionInfo;
967 972
968 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);
994
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);
969 1007
970 UserAccount account = m_sceneList[0].UserAccountService.GetUserAccount(remoteClient.Scene.RegionInfo.ScopeID, ejecteeID); 1008 UserAccount account = m_sceneList[0].UserAccountService.GetUserAccount(regionInfo.ScopeID, ejecteeID);
971 if ((groupInfo == null) || (account == null)) 1009 if ((groupInfo == null) || (account == null))
972 { 1010 {
973 return; 1011 return;
@@ -977,23 +1015,22 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
977 GridInstantMessage msg = new GridInstantMessage(); 1015 GridInstantMessage msg = new GridInstantMessage();
978 1016
979 msg.imSessionID = UUID.Zero.Guid; 1017 msg.imSessionID = UUID.Zero.Guid;
980 msg.fromAgentID = GetRequestingAgentID(remoteClient).Guid; 1018 msg.fromAgentID = agentID.Guid;
981 // msg.fromAgentID = info.GroupID; 1019 // msg.fromAgentID = info.GroupID;
982 msg.toAgentID = ejecteeID.Guid; 1020 msg.toAgentID = ejecteeID.Guid;
983 //msg.timestamp = (uint)Util.UnixTimeSinceEpoch(); 1021 //msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
984 msg.timestamp = 0; 1022 msg.timestamp = 0;
985 msg.fromAgentName = remoteClient.Name; 1023 msg.fromAgentName = agentName;
986 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);
987 msg.dialog = (byte)OpenMetaverse.InstantMessageDialog.MessageFromAgent; 1025 msg.dialog = (byte)OpenMetaverse.InstantMessageDialog.MessageFromAgent;
988 msg.fromGroup = false; 1026 msg.fromGroup = false;
989 msg.offline = (byte)0; 1027 msg.offline = (byte)0;
990 msg.ParentEstateID = 0; 1028 msg.ParentEstateID = 0;
991 msg.Position = Vector3.Zero; 1029 msg.Position = Vector3.Zero;
992 msg.RegionID = remoteClient.Scene.RegionInfo.RegionID.Guid; 1030 msg.RegionID = regionInfo.RegionID.Guid;
993 msg.binaryBucket = new byte[0]; 1031 msg.binaryBucket = new byte[0];
994 OutgoingInstantMessage(msg, ejecteeID); 1032 OutgoingInstantMessage(msg, ejecteeID);
995 1033
996
997 // Message to ejector 1034 // Message to ejector
998 // Interop, received special 210 code for ejecting a group member 1035 // Interop, received special 210 code for ejecting a group member
999 // 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
@@ -1003,26 +1040,26 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1003 1040
1004 msg = new GridInstantMessage(); 1041 msg = new GridInstantMessage();
1005 msg.imSessionID = UUID.Zero.Guid; 1042 msg.imSessionID = UUID.Zero.Guid;
1006 msg.fromAgentID = GetRequestingAgentID(remoteClient).Guid; 1043 msg.fromAgentID = agentID.Guid;
1007 msg.toAgentID = GetRequestingAgentID(remoteClient).Guid; 1044 msg.toAgentID = agentID.Guid;
1008 msg.timestamp = 0; 1045 msg.timestamp = 0;
1009 msg.fromAgentName = remoteClient.Name; 1046 msg.fromAgentName = agentName;
1010 if (account != null) 1047 if (account != null)
1011 { 1048 {
1012 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);
1013 } 1050 }
1014 else 1051 else
1015 { 1052 {
1016 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");
1017 } 1054 }
1018 msg.dialog = (byte)210; //interop 1055 msg.dialog = (byte)210; //interop
1019 msg.fromGroup = false; 1056 msg.fromGroup = false;
1020 msg.offline = (byte)0; 1057 msg.offline = (byte)0;
1021 msg.ParentEstateID = 0; 1058 msg.ParentEstateID = 0;
1022 msg.Position = Vector3.Zero; 1059 msg.Position = Vector3.Zero;
1023 msg.RegionID = remoteClient.Scene.RegionInfo.RegionID.Guid; 1060 msg.RegionID = regionInfo.RegionID.Guid;
1024 msg.binaryBucket = new byte[0]; 1061 msg.binaryBucket = new byte[0];
1025 OutgoingInstantMessage(msg, GetRequestingAgentID(remoteClient)); 1062 OutgoingInstantMessage(msg, agentID);
1026 1063
1027 1064
1028 // SL sends out messages to everyone in the group 1065 // SL sends out messages to everyone in the group
@@ -1032,16 +1069,55 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1032 1069
1033 public void InviteGroupRequest(IClientAPI remoteClient, UUID groupID, UUID invitedAgentID, UUID roleID) 1070 public void InviteGroupRequest(IClientAPI remoteClient, UUID groupID, UUID invitedAgentID, UUID roleID)
1034 { 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 {
1035 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);
1036 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
1037 // 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
1038 UUID InviteID = UUID.Random(); 1114 UUID InviteID = UUID.Random();
1039 1115
1040 m_groupData.AddAgentToGroupInvite(GetRequestingAgentID(remoteClient), InviteID, groupID, roleID, invitedAgentID); 1116 m_groupData.AddAgentToGroupInvite(agentID, InviteID, groupID, roleID, invitedAgentID);
1041 1117
1042 // 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
1043 // 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.
1044 GroupInviteInfo inviteInfo = m_groupData.GetAgentToGroupInvite(GetRequestingAgentID(remoteClient), InviteID); 1120 GroupInviteInfo inviteInfo = m_groupData.GetAgentToGroupInvite(agentID, InviteID);
1045 1121
1046 if (inviteInfo != null) 1122 if (inviteInfo != null)
1047 { 1123 {
@@ -1053,19 +1129,19 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1053 1129
1054 msg.imSessionID = inviteUUID; 1130 msg.imSessionID = inviteUUID;
1055 1131
1056 // msg.fromAgentID = GetRequestingAgentID(remoteClient).Guid; 1132 // msg.fromAgentID = agentID.Guid;
1057 msg.fromAgentID = groupID.Guid; 1133 msg.fromAgentID = groupID.Guid;
1058 msg.toAgentID = invitedAgentID.Guid; 1134 msg.toAgentID = invitedAgentID.Guid;
1059 //msg.timestamp = (uint)Util.UnixTimeSinceEpoch(); 1135 //msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
1060 msg.timestamp = 0; 1136 msg.timestamp = 0;
1061 msg.fromAgentName = remoteClient.Name; 1137 msg.fromAgentName = agentName;
1062 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);
1063 msg.dialog = (byte)OpenMetaverse.InstantMessageDialog.GroupInvitation; 1139 msg.dialog = (byte)OpenMetaverse.InstantMessageDialog.GroupInvitation;
1064 msg.fromGroup = true; 1140 msg.fromGroup = true;
1065 msg.offline = (byte)0; 1141 msg.offline = (byte)0;
1066 msg.ParentEstateID = 0; 1142 msg.ParentEstateID = 0;
1067 msg.Position = Vector3.Zero; 1143 msg.Position = Vector3.Zero;
1068 msg.RegionID = remoteClient.Scene.RegionInfo.RegionID.Guid; 1144 msg.RegionID = regionInfo.RegionID.Guid;
1069 msg.binaryBucket = new byte[20]; 1145 msg.binaryBucket = new byte[20];
1070 1146
1071 OutgoingInstantMessage(msg, invitedAgentID); 1147 OutgoingInstantMessage(msg, invitedAgentID);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index 2ecd890..a5dcba4 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -2980,5 +2980,74 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2980 2980
2981 return String.Empty; 2981 return String.Empty;
2982 } 2982 }
2983
2984 /// <summary>
2985 /// Invite user to the group this object is set to
2986 /// </summary>
2987 /// <param name="agentId"></param>
2988 /// <returns></returns>
2989 public LSL_Integer osInviteToGroup(LSL_Key agentId)
2990 {
2991 CheckThreatLevel(ThreatLevel.VeryLow, "osInviteToGroup");
2992 m_host.AddScriptLPS(1);
2993
2994 UUID agent = new UUID(agentId);
2995
2996 // groups module is required
2997 IGroupsModule groupsModule = m_ScriptEngine.World.RequestModuleInterface<IGroupsModule>();
2998 if (groupsModule == null) return ScriptBaseClass.FALSE;
2999
3000 // object has to be set to a group, but not group owned
3001 if (m_host.GroupID == UUID.Zero || m_host.GroupID == m_host.OwnerID) return ScriptBaseClass.FALSE;
3002
3003 // object owner has to be in that group and required permissions
3004 GroupMembershipData member = groupsModule.GetMembershipData(m_host.GroupID, m_host.OwnerID);
3005 if (member == null || (member.GroupPowers & (ulong)GroupPowers.Invite) == 0) return ScriptBaseClass.FALSE;
3006
3007 // check if agent is in that group already
3008 //member = groupsModule.GetMembershipData(agent, m_host.GroupID, agent);
3009 //if (member != null) return ScriptBaseClass.FALSE;
3010
3011 // invited agent has to be present in this scene
3012 if (World.GetScenePresence(agent) == null) return ScriptBaseClass.FALSE;
3013
3014 groupsModule.InviteGroup(null, m_host.OwnerID, m_host.GroupID, agent, UUID.Zero);
3015
3016 return ScriptBaseClass.TRUE;
3017 }
3018
3019 /// <summary>
3020 /// Eject user from the group this object is set to
3021 /// </summary>
3022 /// <param name="agentId"></param>
3023 /// <returns></returns>
3024 public LSL_Integer osEjectFromGroup(LSL_Key agentId)
3025 {
3026 CheckThreatLevel(ThreatLevel.VeryLow, "osEjectFromGroup");
3027 m_host.AddScriptLPS(1);
3028
3029 UUID agent = new UUID(agentId);
3030
3031 // groups module is required
3032 IGroupsModule groupsModule = m_ScriptEngine.World.RequestModuleInterface<IGroupsModule>();
3033 if (groupsModule == null) return ScriptBaseClass.FALSE;
3034
3035 // object has to be set to a group, but not group owned
3036 if (m_host.GroupID == UUID.Zero || m_host.GroupID == m_host.OwnerID) return ScriptBaseClass.FALSE;
3037
3038 // object owner has to be in that group and required permissions
3039 GroupMembershipData member = groupsModule.GetMembershipData(m_host.GroupID, m_host.OwnerID);
3040 if (member == null || (member.GroupPowers & (ulong)GroupPowers.Eject) == 0) return ScriptBaseClass.FALSE;
3041
3042 // agent has to be in that group
3043 //member = groupsModule.GetMembershipData(agent, m_host.GroupID, agent);
3044 //if (member == null) return ScriptBaseClass.FALSE;
3045
3046 // ejectee can be offline
3047
3048 groupsModule.EjectGroupMember(null, m_host.OwnerID, m_host.GroupID, agent);
3049
3050 return ScriptBaseClass.TRUE;
3051 }
2983 } 3052 }
2984} \ No newline at end of file 3053} \ No newline at end of file
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
index 8f9efc0..30bd3ef 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
@@ -231,5 +231,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
231 LSL_String osUnixTimeToTimestamp(long time); 231 LSL_String osUnixTimeToTimestamp(long time);
232 232
233 LSL_String osGetInventoryDesc(string item); 233 LSL_String osGetInventoryDesc(string item);
234
235 LSL_Integer osInviteToGroup(LSL_Key agentId);
236 LSL_Integer osEjectFromGroup(LSL_Key agentId);
234 } 237 }
235} 238}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
index 09e5992..680cefb4 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
@@ -868,5 +868,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
868 { 868 {
869 return m_OSSL_Functions.osGetInventoryDesc(item); 869 return m_OSSL_Functions.osGetInventoryDesc(item);
870 } 870 }
871
872 public LSL_Integer osInviteToGroup(LSL_Key agentId)
873 {
874 return m_OSSL_Functions.osInviteToGroup(agentId);
875 }
876
877 public LSL_Integer osEjectFromGroup(LSL_Key agentId)
878 {
879 return m_OSSL_Functions.osEjectFromGroup(agentId);
880 }
871 } 881 }
872} 882}