fix last change to support empty string group titles

This commit is contained in:
UbitUmarov
2025-04-30 20:03:06 +01:00
parent 83d3ce8a1a
commit 4918f91d41
2 changed files with 64 additions and 89 deletions

View File

@@ -34,11 +34,11 @@ using System.IO;
using System.Net;
using System.Threading;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using OpenMetaverse;
using OpenMetaverse.StructuredData;
using Nini.Config;
using log4net;
using OpenSim.Framework;
@@ -2058,28 +2058,23 @@ namespace OpenSim.Region.ClientStack.Linden
return;
}
OSDMap resp = new OSDMap();
bool fail = true;
IClientAPI client = null;
ScenePresence sp;
IGroupsModule m_GroupsModule;
OSDMap resp;
UUID groupID = UUID.Zero;
while(true)
{
m_GroupsModule = m_Scene.RequestModuleInterface<IGroupsModule>();
IGroupsModule m_GroupsModule = m_Scene.RequestModuleInterface<IGroupsModule>();
if(m_GroupsModule == null)
break;
m_Scene.TryGetScenePresence(m_AgentID, out sp);
m_Scene.TryGetScenePresence(m_AgentID, out ScenePresence sp);
if(sp == null || sp.IsChildAgent || sp.IsDeleted)
break;
if(sp.IsInTransit && !sp.IsInLocalTransit)
break;
client = sp.ControllingClient;
IClientAPI client = sp.ControllingClient;
OSDMap req;
try
@@ -2093,10 +2088,13 @@ namespace OpenSim.Region.ClientStack.Linden
}
OSD tmp;
if(!req.TryGetValue("group_id", out tmp) || !(tmp is OSDUUID))
if(!req.TryGetValue("group_id", out tmp) || tmp is not OSDUUID)
break;
groupID = tmp.AsUUID();
if(groupID.IsZero())
groupID = sp.ControllingClient.ActiveGroupId;
if(groupID.IsZero())
break;
@@ -2110,60 +2108,52 @@ namespace OpenSim.Region.ClientStack.Linden
int memberCount = members.Count;
Dictionary<string,int> titles = new Dictionary<string,int>();
ulong defaultPowers = 0;
Dictionary<string,int> titles = [];
Dictionary<ulong,int> powers = [];
// build titles array and index
roles.Sort(CompareRolesByMembersDesc);
int i = 0;
OSDArray osdtitles = new OSDArray();
OSDArray osdtitles = [];
foreach(GroupRolesData grd in roles)
{
ref int powerentry = ref CollectionsMarshal.GetValueRefOrAddDefault(powers, grd.Powers, out bool _);
powerentry++;
if(grd.Title == null)
continue;
if(i==0)
defaultPowers = grd.Powers;
if(!titles.ContainsKey(grd.Title))
{
if(!titles.ContainsKey(string.Empty))
{
titles[string.Empty] = i++;
osdtitles.Add(new OSDString(string.Empty));
}
}
else if(!titles.ContainsKey(grd.Title))
{
titles[grd.Title] = i++;
osdtitles.Add(new OSDString(grd.Title));
}
}
if(titles.Count == 0 && roles.Count > 0)
{
i = 0;
foreach(GroupRolesData grd in roles)
{
string fallbackTitle = grd.Name switch
{
"Owners" => "Owner",
"Everyone" => "Member",
_ => "Member"
};
if(i==0)
defaultPowers = grd.Powers;
if(!titles.ContainsKey(fallbackTitle))
{
titles[fallbackTitle] = i++;
osdtitles.Add(new OSDString(fallbackTitle));
}
}
}
if(titles.Count == 0)
break;
OSDMap osdmembers = new();
ulong defaultPowers = 0;
int maxPowers = -1;
foreach(KeyValuePair<ulong,int> kvp in powers)
{
if (kvp.Value > maxPowers)
{
defaultPowers = kvp.Key;
maxPowers = kvp.Value;
}
}
OSDMap osdmembers = [];
foreach(GroupMembersData gmd in members)
{
OSDMap m = new OSDMap();
OSDMap m = [];
if(gmd.OnlineStatus != null && gmd.OnlineStatus != "")
m["last_login"] = new OSDString(gmd.OnlineStatus);
if(gmd.AgentPowers != defaultPowers)
@@ -2173,7 +2163,7 @@ namespace OpenSim.Region.ClientStack.Linden
if(titles.TryGetValue(gmd.Title, out int value) && value != 0)
m["title"] = new OSDInteger(value);
}
else if(gmd.IsOwner && titles.TryGetValue("Owner", out int ovalue) && ovalue != 0)
else if(titles.TryGetValue(string.Empty, out int ovalue) && ovalue != 0)
m["title"] = new OSDInteger(ovalue);
if(gmd.IsOwner)
m["owner"] = new OSDString("true");
@@ -2183,30 +2173,35 @@ namespace OpenSim.Region.ClientStack.Linden
osdmembers[(gmd.AgentID).ToString()] = m;
}
OSDMap osddefaults = new OSDMap();
osddefaults["default_powers"] = new OSDString(defaultPowers.ToString("X"));
OSDMap osddefaults = new()
{
["default_powers"] = new OSDString(defaultPowers.ToString("X"))
};
resp["group_id"] = new OSDUUID(groupID);
resp["agent_id"] = new OSDUUID(m_AgentID);
resp["member_count"] = new OSDInteger(memberCount);
resp["defaults"] = osddefaults;
resp["titles"] = osdtitles;
resp["members"] = osdmembers;
resp = new OSDMap
{
["group_id"] = new OSDUUID(groupID),
["agent_id"] = new OSDUUID(m_AgentID),
["member_count"] = new OSDInteger(memberCount),
["defaults"] = osddefaults,
["titles"] = osdtitles,
["members"] = osdmembers
};
fail = false;
break;
httpResponse.RawBuffer = Util.UTF8NBGetbytes(OSDParser.SerializeLLSDXmlString(resp));
httpResponse.StatusCode = (int)HttpStatusCode.OK;
return;
}
if(fail)
resp = new()
{
resp["group_id"] = new OSDUUID(groupID);
resp["agent_id"] = new OSDUUID(m_AgentID);
resp["member_count"] = new OSDInteger(0);
resp["defaults"] = new OSDMap();
resp["titles"] = new OSDArray();
resp["members"] = new OSDMap();
}
["group_id"] = new OSDUUID(groupID),
["agent_id"] = new OSDUUID(m_AgentID),
["member_count"] = new OSDInteger(0),
["defaults"] = new OSDMap(),
["titles"] = new OSDArray(),
["members"] = new OSDMap()
};
httpResponse.RawBuffer = Util.UTF8NBGetbytes(OSDParser.SerializeLLSDXmlString(resp));
httpResponse.StatusCode = (int)HttpStatusCode.OK;
}

View File

@@ -11692,23 +11692,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
for (int i = 0; i < blockCount; i++)
{
GroupMembersData m = members[indx++];
string title;
if(m.Title == null)
{
if(m.IsOwner)
title = "Owner";
else
title = "Member";
}
else
title = m.Title;
groupMembersReply.MemberData[i] = new GroupMembersReplyPacket.MemberDataBlock
{
AgentID = m.AgentID,
Contribution = m.Contribution,
OnlineStatus = Util.StringToBytes256(m.OnlineStatus),
AgentPowers = m.AgentPowers,
Title = Util.StringToBytes256(title),
Title = m.Title == null ? [] : Util.StringToBytes256(m.Title),
IsOwner = m.IsOwner
};
}
@@ -11738,22 +11729,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
int i = 0;
foreach (GroupRolesData d in titles)
{
string title;
if(d.Title == null)
{
if("Owners".Equals(d.Name))
title = "Owner";
else
title = "Member";
}
else
title = d.Title;
groupRolesReply.RoleData[i] = new GroupRoleDataReplyPacket.RoleDataBlock
{
RoleID = d.RoleID,
Name = Util.StringToBytes256(d.Name),
Title = Util.StringToBytes256(title),
Title = d.Title == null ? [] : Util.StringToBytes256(d.Title),
Description = Util.StringToBytes1024(d.Description),
Powers = d.Powers,
Members = (uint)d.Members