This commit is contained in:
Madpeter 2024-06-28 23:15:07 +01:00
parent 6eaa112f81
commit f761eacbe9

View file

@ -1,8 +1,11 @@
using OpenMetaverse; using OpenMetaverse;
using OpenMetaverse.Rendering;
using SecondBotEvents.Config; using SecondBotEvents.Config;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Reflection.Metadata.Ecma335;
namespace SecondBotEvents.Services namespace SecondBotEvents.Services
{ {
@ -128,6 +131,7 @@ namespace SecondBotEvents.Services
if (GetClient() != null) if (GetClient() != null)
{ {
GetClient().Self.IM -= BotImMessage; GetClient().Self.IM -= BotImMessage;
GetClient().Groups.GroupMembersReply -= BotGroupMembers;
} }
} }
} }
@ -135,6 +139,125 @@ namespace SecondBotEvents.Services
protected void AttachEvents() protected void AttachEvents()
{ {
GetClient().Self.IM += BotImMessage; GetClient().Self.IM += BotImMessage;
GetClient().Groups.GroupMembersReply += BotGroupMembers;
GetClient().Groups.CurrentGroups += BotGroupsCurrent;
GetClient().Groups.RequestCurrentGroups();
}
protected void BotGroupsCurrent(object o, CurrentGroupsEventArgs e)
{
lock (GroupMembership) lock (GroupMembershipUpdated) lock(GroupNames)
{
foreach(Group G in e.Groups.Values)
{
if (GroupNames.ContainsKey(G.ID) == true)
{
continue;
}
GroupNames.Add(G.ID, G.Name);
GroupMembership.Add(G.ID, new List<UUID>());
GroupMembershipUpdated.Add(G.ID, 0);
}
}
}
protected Dictionary<UUID, List<UUID>> GroupMembership = new Dictionary<UUID, List<UUID>>();
protected Dictionary<UUID, string> GroupNames = new Dictionary<UUID, string>();
protected Dictionary<UUID, long> GroupMembershipUpdated = new Dictionary<UUID, long>();
protected long lastGroupMembershipUpdate = 0;
// request group membership updates max of once per 60 secs
// request membership update for group once every 15 mins
protected void GroupMembershipUpkeep()
{
lock (GroupMembershipUpdated)
{
long dif = SecondbotHelpers.UnixTimeNow() - lastGroupMembershipUpdate;
if (dif < 60)
{
return;
}
UUID updateGroup = UUID.Zero;
foreach (KeyValuePair<UUID, long> entry in GroupMembershipUpdated)
{
dif = SecondbotHelpers.UnixTimeNow() - entry.Value;
if (dif > (15 * 60))
{
updateGroup = entry.Key;
break;
}
}
if (updateGroup != UUID.Zero)
{
lastGroupMembershipUpdate = SecondbotHelpers.UnixTimeNow();
GroupMembershipUpdated[updateGroup] = SecondbotHelpers.UnixTimeNow();
GetClient().Groups.RequestGroupMembers(updateGroup);
}
}
}
protected void BotGroupMembers(object sender, GroupMembersReplyEventArgs e)
{
lock (GroupMembership) lock(GroupMembershipUpdated)
{
bool GroupLoaded = false;
if (GroupMembership.ContainsKey(e.GroupID) == true)
{
if (GroupMembership[e.GroupID].Count > 0)
{
GroupLoaded = true;
}
}
if (GroupLoaded == false)
{
foreach (GroupMember a in e.Members.Values)
{
GroupMembership[e.GroupID].Add(a.ID);
}
return;
}
List<UUID> joined = new List<UUID>();
List<UUID> tracked = new List<UUID>();
foreach (UUID a in GroupMembership[e.GroupID])
{
tracked.Add(a);
}
master.DataStoreService.GetAvatarNames(tracked);
foreach (UUID a in e.Members.Keys)
{
if (tracked.Contains(a) == true)
{
tracked.Remove(a);
continue;
}
joined.Add(a);
}
string groupname = "none";
if(GroupNames.ContainsKey(e.GroupID) == true)
{
groupname = GroupNames[e.GroupID];
}
foreach (UUID a in tracked)
{
// leave
GroupMembership[e.GroupID].Remove(a);
TriggerEvent("GroupMemberLeave", new Dictionary<string, string>() {
{ "groupuuid", e.GroupID.ToString()},
{ "groupname", groupname },
{ "avataruuid", a.ToString() }
});
}
foreach (UUID a in joined)
{
// join
GroupMembership[e.GroupID].Add(a);
TriggerEvent("GroupMemberJoin", new Dictionary<string, string>() {
{ "groupuuid", e.GroupID.ToString()},
{ "groupname", groupname },
{ "avataruuid", a.ToString() }
});
}
}
} }
protected string GetAvName(string avataruuid) protected string GetAvName(string avataruuid)
@ -224,26 +347,40 @@ namespace SecondBotEvents.Services
{ {
avataruuid = args["avataruuid"]; avataruuid = args["avataruuid"];
} }
Dictionary<string, string> values = new Dictionary<string, string>(); string groupuuid = "none";
values.Add("eventype", eventName); string groupname = "none";
values.Add("avatarname", GetAvName(avataruuid)); if (args.ContainsKey("groupuuid") == true)
values.Add("avatarparcel", GetAvParcel(avataruuid)); {
values.Add("botsim", GetClient().Network.CurrentSim.Name); groupuuid = args["groupuuid"];
values.Add("botparcel", GetBotParcel()); }
if (args.ContainsKey("groupname") == true)
{
groupname = args["groupname"];
}
List<int> AvPos = GetAvPos(avataruuid); List<int> AvPos = GetAvPos(avataruuid);
values.Add("avatarx", AvPos[0].ToString());
values.Add("avatary", AvPos[1].ToString());
values.Add("avatarz", AvPos[2].ToString());
values.Add("avatardistance", AvPos[3].ToString());
Vector3 A = GetClient().Self.SimPosition; Vector3 A = GetClient().Self.SimPosition;
List<int> BotPos = new List<int>() { (int)Math.Round(A.X), (int)Math.Round(A.Y), (int)Math.Round(A.Z) }; List<int> BotPos = new List<int>() { (int)Math.Round(A.X), (int)Math.Round(A.Y), (int)Math.Round(A.Z) };
values.Add("botx", AvPos[0].ToString()); Dictionary<string, string> values = new Dictionary<string, string>
values.Add("boty", AvPos[1].ToString()); {
values.Add("botz", AvPos[2].ToString()); { "eventype", eventName },
values.Add("clockhour", DateTime.Now.ToString("HH")); { "groupuuid", groupuuid },
values.Add("clockmin", DateTime.Now.ToString("mm")); { "groupname", groupname },
values.Add("dayofweek", ((int)DateTime.Now.DayOfWeek).ToString()); { "avatarname", GetAvName(avataruuid) },
{ "avatarparcel", GetAvParcel(avataruuid) },
{ "botsim", GetClient().Network.CurrentSim.Name },
{ "botparcel", GetBotParcel() },
{ "avatarx", AvPos[0].ToString() },
{ "avatary", AvPos[1].ToString() },
{ "avatarz", AvPos[2].ToString() },
{ "avatardistance", AvPos[3].ToString() },
{ "botx", AvPos[0].ToString() },
{ "boty", AvPos[1].ToString() },
{ "botz", AvPos[2].ToString() },
{ "clockhour", DateTime.Now.ToString("HH") },
{ "clockmin", DateTime.Now.ToString("mm") },
{ "dayofweek", ((int)DateTime.Now.DayOfWeek).ToString() }
};
if (avataruuid == null) if (avataruuid == null)
{ {
@ -474,6 +611,7 @@ namespace SecondBotEvents.Services
TrackAvatarsOnParcel(); TrackAvatarsOnParcel();
CleanLockouts(); CleanLockouts();
ClockEvent(); ClockEvent();
GroupMembershipUpkeep();
} }
public override string Status() public override string Status()