aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs')
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs144
1 files changed, 119 insertions, 25 deletions
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
index b60cd42..2a15e5d 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);