Hopefully fix user cache error in ReactionAdd

This commit is contained in:
Ske 2020-06-24 16:47:34 +02:00
parent 3b47785aa0
commit 3e297178c7
2 changed files with 16 additions and 0 deletions

View File

@ -30,6 +30,11 @@ namespace PluralKit.Bot
// Only proxies in guild text channels
if (evt.Channel.Type != ChannelType.Text) return;
// Sometimes we get events from users that aren't in the user cache
// In that case we get a "broken" user object (where eg. calling IsBot throws an exception)
// We just ignore all of those for now, should be quite rare...
if (!evt.Client.TryGetCachedUser(evt.User.Id, out _)) return;
// Ignore reactions from bots (we can't DM them anyway)
if (evt.User.IsBot) return;

View File

@ -1,4 +1,5 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
@ -114,5 +115,15 @@ namespace PluralKit.Bot
// It's just here for consistency so we don't use the standard SendMessageAsync method >.>
public static Task<DiscordMessage> SendMessageFixedAsync(this DiscordMember member, string content = null, DiscordEmbed embed = null) =>
member.SendMessageAsync(content, embed: embed);
public static bool TryGetCachedUser(this DiscordClient client, ulong id, out DiscordUser user)
{
user = null;
var cache = (ConcurrentDictionary<ulong, DiscordUser>) typeof(BaseDiscordClient)
.GetProperty("UserCache", BindingFlags.Instance | BindingFlags.NonPublic)
?.GetValue(client);
return cache != null && cache.TryGetValue(id, out user);
}
}
}