mantis 8598: filter dead groups from group search. honor querystart request. Viewers are very broken on this, seems protocol was made by someone with no idea about lludp

This commit is contained in:
UbitUmarov
2019-10-13 16:41:38 +01:00
parent 2c1909a873
commit 0273baaef6
3 changed files with 40 additions and 10 deletions

View File

@@ -230,15 +230,22 @@ namespace OpenSim.Groups
if (d.Data.ContainsKey("Location") && d.Data["Location"] != string.Empty)
continue;
int nmembers = m_Database.MemberCount(d.GroupID);
if(nmembers == 0)
continue;
DirGroupsReplyData g = new DirGroupsReplyData();
g.groupID = d.GroupID;
if (d.Data.ContainsKey("Name"))
g.groupName = d.Data["Name"];
else
{
m_log.DebugFormat("[Groups]: Key Name not found");
continue;
}
g.members = m_Database.MemberCount(d.GroupID);
g.groupID = d.GroupID;
g.members = nmembers;
groups.Add(g);
}

View File

@@ -3850,19 +3850,17 @@ namespace OpenSim.Region.ClientStack.LindenUDP
packet.QueryData = new DirGroupsReplyPacket.QueryDataBlock();
packet.QueryData.QueryID = queryID;
packet.QueryReplies = new DirGroupsReplyPacket.QueryRepliesBlock[
data.Length];
packet.QueryReplies = new DirGroupsReplyPacket.QueryRepliesBlock[data.Length];
int i = 0;
foreach (DirGroupsReplyData d in data)
{
packet.QueryReplies[i] = new DirGroupsReplyPacket.QueryRepliesBlock();
packet.QueryReplies[i].GroupID = d.groupID;
packet.QueryReplies[i].GroupName =
Utils.StringToBytes(d.groupName);
packet.QueryReplies[i].GroupName = Util.StringToBytes(d.groupName, 35);
packet.QueryReplies[i].Members = d.members;
packet.QueryReplies[i].SearchOrder = d.searchOrder;
i++;
++i;
}
OutPacket(packet, ThrottleOutPacketType.Task);

View File

@@ -186,10 +186,35 @@ namespace OpenSim.Region.CoreModules.Framework.Search
if (string.IsNullOrEmpty(queryText))
remoteClient.SendDirGroupsReply(queryID, new DirGroupsReplyData[0]);
// TODO: This currently ignores pretty much all the query flags including Mature and sort order
remoteClient.SendDirGroupsReply(queryID, m_GroupsService.FindGroups(remoteClient, queryText).ToArray());
}
List<DirGroupsReplyData> answer = m_GroupsService.FindGroups(remoteClient, queryText);
if(answer.Count == 0)
{
remoteClient.SendDirGroupsReply(queryID, new DirGroupsReplyData[0]);
return;
}
// filter out groups with no members
DirGroupsReplyData[] result = new DirGroupsReplyData[answer.Count];
int count = 0;
foreach(DirGroupsReplyData dgrd in answer)
{
if(dgrd.members > 0)
result[count++] = dgrd;
}
answer = null;
// viewers don't sent sorting, so results they show are a nice mess
if ((queryStart > 0) && (queryStart < count))
{
int len = count - queryStart;
DirGroupsReplyData[] tmp = new DirGroupsReplyData[len];
Array.Copy(result, queryStart, tmp, 0, len);
result = tmp;
}
// TODO: This currently ignores pretty much all the query flags including Mature and sort order
remoteClient.SendDirGroupsReply(queryID, result);
}
}
#endregion Event Handlers