Merge branch 'master' of opensimulator.org:/var/git/opensim

This commit is contained in:
Melanie Thielker
2016-07-04 03:37:45 +01:00
19 changed files with 245 additions and 198 deletions

View File

@@ -579,12 +579,6 @@ namespace OpenSim.Region.ClientStack.Linden
Enqueue(item, avatarID);
}
public void GroupMembership(AgentGroupDataUpdatePacket groupUpdate, UUID avatarID)
{
OSD item = EventQueueHelper.GroupMembership(groupUpdate);
Enqueue(item, avatarID);
}
public void GroupMembershipData(UUID receiverAgent, GroupMembershipData[] data)
{
OSD item = EventQueueHelper.GroupMembershipData(receiverAgent, data);

View File

@@ -333,40 +333,6 @@ namespace OpenSim.Region.ClientStack.Linden
return chatterBoxSessionAgentListUpdates;
}
public static OSD GroupMembership(AgentGroupDataUpdatePacket groupUpdatePacket)
{
OSDMap groupUpdate = new OSDMap();
groupUpdate.Add("message", OSD.FromString("AgentGroupDataUpdate"));
OSDMap body = new OSDMap();
OSDArray agentData = new OSDArray();
OSDMap agentDataMap = new OSDMap();
agentDataMap.Add("AgentID", OSD.FromUUID(groupUpdatePacket.AgentData.AgentID));
agentData.Add(agentDataMap);
body.Add("AgentData", agentData);
OSDArray groupData = new OSDArray();
foreach (AgentGroupDataUpdatePacket.GroupDataBlock groupDataBlock in groupUpdatePacket.GroupData)
{
OSDMap groupDataMap = new OSDMap();
groupDataMap.Add("ListInProfile", OSD.FromBoolean(false));
groupDataMap.Add("GroupID", OSD.FromUUID(groupDataBlock.GroupID));
groupDataMap.Add("GroupInsigniaID", OSD.FromUUID(groupDataBlock.GroupInsigniaID));
groupDataMap.Add("Contribution", OSD.FromInteger(groupDataBlock.Contribution));
groupDataMap.Add("GroupPowers", OSD.FromBinary(ulongToByteArray(groupDataBlock.GroupPowers)));
groupDataMap.Add("GroupName", OSD.FromString(Utils.BytesToString(groupDataBlock.GroupName)));
groupDataMap.Add("AcceptNotices", OSD.FromBoolean(groupDataBlock.AcceptNotices));
groupData.Add(groupDataMap);
}
body.Add("GroupData", groupData);
groupUpdate.Add("body", body);
return groupUpdate;
}
public static OSD GroupMembershipData(UUID receiverAgent, GroupMembershipData[] data)
{
OSDArray AgentData = new OSDArray(1);

View File

@@ -2755,44 +2755,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
public void SendGroupMembership(GroupMembershipData[] GroupMembership)
{
m_groupPowers.Clear();
AgentGroupDataUpdatePacket Groupupdate = new AgentGroupDataUpdatePacket();
AgentGroupDataUpdatePacket.GroupDataBlock[] Groups = new AgentGroupDataUpdatePacket.GroupDataBlock[GroupMembership.Length];
for (int i = 0; i < GroupMembership.Length; i++)
{
m_groupPowers[GroupMembership[i].GroupID] = GroupMembership[i].GroupPowers;
AgentGroupDataUpdatePacket.GroupDataBlock Group = new AgentGroupDataUpdatePacket.GroupDataBlock();
Group.AcceptNotices = GroupMembership[i].AcceptNotices;
Group.Contribution = GroupMembership[i].Contribution;
Group.GroupID = GroupMembership[i].GroupID;
Group.GroupInsigniaID = GroupMembership[i].GroupPicture;
Group.GroupName = Util.StringToBytes256(GroupMembership[i].GroupName);
Group.GroupPowers = GroupMembership[i].GroupPowers;
Groups[i] = Group;
}
Groupupdate.GroupData = Groups;
Groupupdate.AgentData = new AgentGroupDataUpdatePacket.AgentDataBlock();
Groupupdate.AgentData.AgentID = AgentId;
//OutPacket(Groupupdate, ThrottleOutPacketType.Task);
try
{
IEventQueue eq = Scene.RequestModuleInterface<IEventQueue>();
if (eq != null)
{
eq.GroupMembership(Groupupdate, this.AgentId);
}
}
catch (Exception ex)
{
m_log.Error("Unable to send group membership data via eventqueue - exception: " + ex.ToString());
m_log.Warn("sending group membership data via UDP");
OutPacket(Groupupdate, ThrottleOutPacketType.Task);
}
UpdateGroupMembership(GroupMembership);
SendAgentGroupDataUpdate(AgentId,GroupMembership);
}
public void SendPartPhysicsProprieties(ISceneEntity entity)
@@ -3423,41 +3388,35 @@ namespace OpenSim.Region.ClientStack.LindenUDP
public void SendAgentGroupDataUpdate(UUID avatarID, GroupMembershipData[] data)
{
if(avatarID != AgentId)
m_log.Debug("[CLIENT]: SendAgentGroupDataUpdate avatarID != AgentId");
IEventQueue eq = this.Scene.RequestModuleInterface<IEventQueue>();
// use UDP if no caps
if (eq == null)
if(eq != null)
{
SendGroupMembership(data);
eq.GroupMembershipData(avatarID,data);
}
OSDMap llsd = new OSDMap(3);
OSDArray AgentData = new OSDArray(1);
OSDMap AgentDataMap = new OSDMap(1);
AgentDataMap.Add("AgentID", OSD.FromUUID(this.AgentId));
AgentDataMap.Add("AvatarID", OSD.FromUUID(avatarID));
AgentData.Add(AgentDataMap);
llsd.Add("AgentData", AgentData);
OSDArray GroupData = new OSDArray(data.Length);
OSDArray NewGroupData = new OSDArray(data.Length);
foreach (GroupMembershipData m in data)
else
{
OSDMap GroupDataMap = new OSDMap(6);
OSDMap NewGroupDataMap = new OSDMap(1);
GroupDataMap.Add("GroupPowers", OSD.FromULong(m.GroupPowers));
GroupDataMap.Add("AcceptNotices", OSD.FromBoolean(m.AcceptNotices));
GroupDataMap.Add("GroupTitle", OSD.FromString(m.GroupTitle));
GroupDataMap.Add("GroupID", OSD.FromUUID(m.GroupID));
GroupDataMap.Add("GroupName", OSD.FromString(m.GroupName));
GroupDataMap.Add("GroupInsigniaID", OSD.FromUUID(m.GroupPicture));
NewGroupDataMap.Add("ListInProfile", OSD.FromBoolean(m.ListInProfile));
GroupData.Add(GroupDataMap);
NewGroupData.Add(NewGroupDataMap);
// use UDP if no caps
AgentGroupDataUpdatePacket Groupupdate = new AgentGroupDataUpdatePacket();
AgentGroupDataUpdatePacket.GroupDataBlock[] Groups = new AgentGroupDataUpdatePacket.GroupDataBlock[data.Length];
for (int i = 0; i < data.Length; i++)
{
AgentGroupDataUpdatePacket.GroupDataBlock Group = new AgentGroupDataUpdatePacket.GroupDataBlock();
Group.AcceptNotices = data[i].AcceptNotices;
Group.Contribution = data[i].Contribution;
Group.GroupID = data[i].GroupID;
Group.GroupInsigniaID = data[i].GroupPicture;
Group.GroupName = Util.StringToBytes256(data[i].GroupName);
Group.GroupPowers = data[i].GroupPowers;
Groups[i] = Group;
}
Groupupdate.GroupData = Groups;
Groupupdate.AgentData = new AgentGroupDataUpdatePacket.AgentDataBlock();
Groupupdate.AgentData.AgentID = avatarID;
OutPacket(Groupupdate, ThrottleOutPacketType.Task);
}
llsd.Add("GroupData", GroupData);
llsd.Add("NewGroupData", NewGroupData);
eq.Enqueue(BuildEvent("AgentGroupDataUpdate", llsd), this.AgentId);
}
public void SendJoinGroupReply(UUID groupID, bool success)
@@ -5642,9 +5601,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if (groupID == ActiveGroupId)
return ActiveGroupPowers;
if (m_groupPowers.ContainsKey(groupID))
return m_groupPowers[groupID];
lock(m_groupPowers)
{
if (m_groupPowers.ContainsKey(groupID))
return m_groupPowers[groupID];
}
return 0;
}
@@ -11011,7 +10972,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if (m_GroupsModule != null)
{
m_GroupsModule.ActivateGroup(this, activateGroupPacket.AgentData.GroupID);
m_GroupsModule.SendAgentGroupDataUpdate(this);
}
return true;
@@ -11136,11 +11096,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP
}
return true;
}
UUID lastGroupProfileRequestID = UUID.Zero;
double lastGroupProfileRequestTS = Util.GetTimeStampMS();
private bool HandleGroupProfileRequest(IClientAPI sender, Packet Pack)
{
if(m_GroupsModule == null)
return true;
GroupProfileRequestPacket groupProfileRequest =
(GroupProfileRequestPacket)Pack;
#region Packet Session and User Check
if (m_checkPackets)
{
@@ -11150,50 +11118,62 @@ namespace OpenSim.Region.ClientStack.LindenUDP
}
#endregion
if (m_GroupsModule != null)
UUID grpID = groupProfileRequest.GroupData.GroupID;
double ts = Util.GetTimeStampMS();
if(grpID == lastGroupProfileRequestID && ts - lastGroupProfileRequestTS < 10000)
return true;
lastGroupProfileRequestID = grpID;
lastGroupProfileRequestTS = ts;
GroupProfileReplyPacket groupProfileReply = (GroupProfileReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupProfileReply);
groupProfileReply.AgentData = new GroupProfileReplyPacket.AgentDataBlock();
groupProfileReply.GroupData = new GroupProfileReplyPacket.GroupDataBlock();
groupProfileReply.AgentData.AgentID = AgentId;
GroupProfileData d = m_GroupsModule.GroupProfileRequest(this,
groupProfileRequest.GroupData.GroupID);
if(d.GroupID == UUID.Zero) // don't send broken data
return true;
groupProfileReply.GroupData.GroupID = d.GroupID;
groupProfileReply.GroupData.Name = Util.StringToBytes256(d.Name);
groupProfileReply.GroupData.Charter = Util.StringToBytes1024(d.Charter);
groupProfileReply.GroupData.ShowInList = d.ShowInList;
groupProfileReply.GroupData.MemberTitle = Util.StringToBytes256(d.MemberTitle);
groupProfileReply.GroupData.PowersMask = d.PowersMask;
groupProfileReply.GroupData.InsigniaID = d.InsigniaID;
groupProfileReply.GroupData.FounderID = d.FounderID;
groupProfileReply.GroupData.MembershipFee = d.MembershipFee;
groupProfileReply.GroupData.OpenEnrollment = d.OpenEnrollment;
groupProfileReply.GroupData.Money = d.Money;
groupProfileReply.GroupData.GroupMembershipCount = d.GroupMembershipCount;
groupProfileReply.GroupData.GroupRolesCount = d.GroupRolesCount;
groupProfileReply.GroupData.AllowPublish = d.AllowPublish;
groupProfileReply.GroupData.MaturePublish = d.MaturePublish;
groupProfileReply.GroupData.OwnerRole = d.OwnerRole;
Scene scene = (Scene)m_scene;
if (scene.Permissions.IsGod(sender.AgentId) && (!sender.IsGroupMember(groupProfileRequest.GroupData.GroupID)))
{
GroupProfileReplyPacket groupProfileReply = (GroupProfileReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupProfileReply);
groupProfileReply.AgentData = new GroupProfileReplyPacket.AgentDataBlock();
groupProfileReply.GroupData = new GroupProfileReplyPacket.GroupDataBlock();
groupProfileReply.AgentData.AgentID = AgentId;
GroupProfileData d = m_GroupsModule.GroupProfileRequest(this,
groupProfileRequest.GroupData.GroupID);
groupProfileReply.GroupData.GroupID = d.GroupID;
groupProfileReply.GroupData.Name = Util.StringToBytes256(d.Name);
groupProfileReply.GroupData.Charter = Util.StringToBytes1024(d.Charter);
groupProfileReply.GroupData.ShowInList = d.ShowInList;
groupProfileReply.GroupData.MemberTitle = Util.StringToBytes256(d.MemberTitle);
groupProfileReply.GroupData.PowersMask = d.PowersMask;
groupProfileReply.GroupData.InsigniaID = d.InsigniaID;
groupProfileReply.GroupData.FounderID = d.FounderID;
groupProfileReply.GroupData.MembershipFee = d.MembershipFee;
groupProfileReply.GroupData.OpenEnrollment = d.OpenEnrollment;
groupProfileReply.GroupData.Money = d.Money;
groupProfileReply.GroupData.GroupMembershipCount = d.GroupMembershipCount;
groupProfileReply.GroupData.GroupRolesCount = d.GroupRolesCount;
groupProfileReply.GroupData.AllowPublish = d.AllowPublish;
groupProfileReply.GroupData.MaturePublish = d.MaturePublish;
groupProfileReply.GroupData.OwnerRole = d.OwnerRole;
Scene scene = (Scene)m_scene;
if (scene.Permissions.IsGod(sender.AgentId) && (!sender.IsGroupMember(groupProfileRequest.GroupData.GroupID)))
ScenePresence p;
if (scene.TryGetScenePresence(sender.AgentId, out p))
{
ScenePresence p;
if (scene.TryGetScenePresence(sender.AgentId, out p))
if (p.GodLevel >= 200)
{
if (p.GodLevel >= 200)
{
groupProfileReply.GroupData.OpenEnrollment = true;
groupProfileReply.GroupData.MembershipFee = 0;
}
groupProfileReply.GroupData.OpenEnrollment = true;
groupProfileReply.GroupData.MembershipFee = 0;
}
}
OutPacket(groupProfileReply, ThrottleOutPacketType.Task);
}
OutPacket(groupProfileReply, ThrottleOutPacketType.Task);
if(grpID == lastGroupProfileRequestID)
lastGroupProfileRequestTS = Util.GetTimeStampMS() - 7000;
return true;
}
private bool HandleGroupMembersRequest(IClientAPI sender, Packet Pack)
@@ -12955,23 +12935,57 @@ namespace OpenSim.Region.ClientStack.LindenUDP
public void RefreshGroupMembership()
{
if (m_GroupsModule != null)
lock(m_groupPowers)
{
GroupMembershipData[] GroupMembership =
if (m_GroupsModule != null)
{
GroupMembershipData[] GroupMembership =
m_GroupsModule.GetMembershipData(AgentId);
m_groupPowers.Clear();
if (GroupMembership != null)
{
for (int i = 0; i < GroupMembership.Length; i++)
m_groupPowers.Clear();
if (GroupMembership != null)
{
m_groupPowers[GroupMembership[i].GroupID] = GroupMembership[i].GroupPowers;
for (int i = 0; i < GroupMembership.Length; i++)
{
m_groupPowers[GroupMembership[i].GroupID] = GroupMembership[i].GroupPowers;
}
}
}
}
}
public void UpdateGroupMembership(GroupMembershipData[] data)
{
lock(m_groupPowers)
{
m_groupPowers.Clear();
if (data != null)
{
for (int i = 0; i < data.Length; i++)
m_groupPowers[data[i].GroupID] = data[i].GroupPowers;
}
}
}
public void GroupMembershipRemove(UUID GroupID)
{
lock(m_groupPowers)
{
if(m_groupPowers.ContainsKey(GroupID))
m_groupPowers.Remove(GroupID);
}
}
public void GroupMembershipAddReplace(UUID GroupID,ulong GroupPowers)
{
lock(m_groupPowers)
{
m_groupPowers[GroupID] = GroupPowers;
}
}
public string Report()
{
return m_udpClient.GetStats();