Refactor KnownAvatar into helper methods

Extract avatar lookup logic from KnownAvatar into three methods: SyncAvatarsHashMap (sync local avatar map), KnownAvatarUUID (check by UUID via UUIDNameReply), and KnownAvatarName (check by display name via AvatarPickerReply). Reworked KnownAvatar to call SyncAvatarsHashMap and then validate using the new helpers, returning false for UUID.Zero and avoiding the previous always-true outcome. Preserves event subscription/teardown and timeout waits while clarifying visibility (protected helpers, public KnownAvatar) and cleaning up callback logic.
This commit is contained in:
Madpeter 2026-02-05 22:18:20 +00:00
parent d77a7f0f62
commit 27d5e29487

View file

@ -607,7 +607,7 @@ namespace SecondBotEvents.Services
* lookup the avatar * lookup the avatar
*/ */
public bool KnownAvatar(string name, UUID avatarId) protected void SyncAvatarsHashMap()
{ {
int currentHash = GetClient().Network.CurrentSim.ObjectsAvatars.GetHashCode(); int currentHash = GetClient().Network.CurrentSim.ObjectsAvatars.GetHashCode();
if (currentHash != ObjectsAvatarsHash) if (currentHash != ObjectsAvatarsHash)
@ -619,65 +619,91 @@ namespace SecondBotEvents.Services
AddAvatar(A.ID, A.Name); AddAvatar(A.ID, A.Name);
} }
} }
if (avatarId != UUID.Zero) }
{
if(avatarsName2Key.ContainsValue(avatarId) == false)
{
bool hasReply = false;
AutoResetEvent fetchEvent = new(false);
void callback(object sender, UUIDNameReplyEventArgs e)
{
foreach (KeyValuePair<UUID, string> av in e.Names)
{
if (av.Key == avatarId)
{
hasReply = true;
fetchEvent.Set();
}
}
}
GetClient().Avatars.UUIDNameReply += callback;
GetClient().Avatars.RequestAvatarName(avatarId);
fetchEvent.WaitOne(1000, false); protected bool KnownAvatarUUID(UUID avatarId)
GetClient().Avatars.UUIDNameReply -= callback; {
return hasReply; if (avatarsName2Key.ContainsValue(avatarId) == true)
} {
return true; return true;
} }
bool hasReply = false;
AutoResetEvent fetchEvent = new(false);
void callback(object sender, UUIDNameReplyEventArgs e)
{
foreach (KeyValuePair<UUID, string> av in e.Names)
{
if (av.Key == avatarId)
{
hasReply = true;
fetchEvent.Set();
}
}
}
GetClient().Avatars.UUIDNameReply += callback;
GetClient().Avatars.RequestAvatarName(avatarId);
fetchEvent.WaitOne(1000, false);
GetClient().Avatars.UUIDNameReply -= callback;
return hasReply;
}
protected bool KnownAvatarName(string name)
{
if (name == null)
{
return false;
}
string[] bits = name.Split(' '); string[] bits = name.Split(' ');
if (bits.Length == 1) if (bits.Length == 1)
{ {
name += " Resident"; name += " Resident";
} }
if (avatarsName2Key.ContainsKey(name) == false) if (avatarsName2Key.ContainsKey(name) == true)
{ {
UUID wantedReplyID = UUID.SecureRandom(); return true;
}
bool hasReply = false; UUID wantedReplyID = UUID.SecureRandom();
AutoResetEvent fetchEvent = new(false);
void callback(object sender, AvatarPickerReplyEventArgs e) bool hasReply = false;
AutoResetEvent fetchEvent = new(false);
void callback(object sender, AvatarPickerReplyEventArgs e)
{
if (e.QueryID == wantedReplyID)
{ {
if (e.QueryID == wantedReplyID) foreach (KeyValuePair<UUID, string> av in e.Avatars)
{ {
foreach (KeyValuePair<UUID, string> av in e.Avatars) if (av.Value == name)
{ {
if (av.Value == name) hasReply = true;
{ fetchEvent.Set();
hasReply = true;
fetchEvent.Set();
}
} }
} }
} }
GetClient().Avatars.AvatarPickerReply += callback;
GetClient().Avatars.RequestAvatarNameSearch(name, wantedReplyID);
fetchEvent.WaitOne(1000, false);
GetClient().Avatars.AvatarPickerReply -= callback;
return hasReply;
} }
return true; GetClient().Avatars.AvatarPickerReply += callback;
GetClient().Avatars.RequestAvatarNameSearch(name, wantedReplyID);
fetchEvent.WaitOne(1000, false);
GetClient().Avatars.AvatarPickerReply -= callback;
return hasReply;
}
public bool KnownAvatar(string name, UUID avatarId)
{
SyncAvatarsHashMap();
if (avatarId == UUID.Zero)
{
return false;
}
if(KnownAvatarUUID(avatarId) == true)
{
return true;
}
if(KnownAvatarName(name) == true)
{
return true;
}
return false;
} }
public void GetAvatarNames(List<UUID> avatars) public void GetAvatarNames(List<UUID> avatars)