fix cache error on system messages
This commit is contained in:
parent
e144571904
commit
28bcb35bb2
@ -11,15 +11,12 @@ namespace Myriad.Extensions
|
|||||||
public static class PermissionExtensions
|
public static class PermissionExtensions
|
||||||
{
|
{
|
||||||
public static PermissionSet PermissionsFor(this IDiscordCache cache, MessageCreateEvent message) =>
|
public static PermissionSet PermissionsFor(this IDiscordCache cache, MessageCreateEvent message) =>
|
||||||
PermissionsFor(cache, message.ChannelId, message.Author.Id, message.Member?.Roles, isWebhook: message.WebhookId != null);
|
PermissionsFor(cache, message.ChannelId, message.Author.Id, message.Member, isWebhook: message.WebhookId != null);
|
||||||
|
|
||||||
public static PermissionSet PermissionsFor(this IDiscordCache cache, ulong channelId, GuildMember member) =>
|
public static PermissionSet PermissionsFor(this IDiscordCache cache, ulong channelId, GuildMember member) =>
|
||||||
PermissionsFor(cache, channelId, member.User.Id, member.Roles);
|
PermissionsFor(cache, channelId, member.User.Id, member);
|
||||||
|
|
||||||
public static PermissionSet PermissionsFor(this IDiscordCache cache, ulong channelId, ulong userId, GuildMemberPartial member) =>
|
public static PermissionSet PermissionsFor(this IDiscordCache cache, ulong channelId, ulong userId, GuildMemberPartial? member, bool isWebhook = false)
|
||||||
PermissionsFor(cache, channelId, userId, member.Roles);
|
|
||||||
|
|
||||||
public static PermissionSet PermissionsFor(this IDiscordCache cache, ulong channelId, ulong userId, ICollection<ulong>? userRoles, bool isWebhook = false)
|
|
||||||
{
|
{
|
||||||
if (!cache.TryGetChannel(channelId, out var channel))
|
if (!cache.TryGetChannel(channelId, out var channel))
|
||||||
// todo: handle channel not found better
|
// todo: handle channel not found better
|
||||||
@ -35,26 +32,26 @@ namespace Myriad.Extensions
|
|||||||
if (isWebhook)
|
if (isWebhook)
|
||||||
return EveryonePermissions(guild);
|
return EveryonePermissions(guild);
|
||||||
|
|
||||||
return PermissionsFor(guild, rootChannel, userId, userRoles);
|
return PermissionsFor(guild, rootChannel, userId, member);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static PermissionSet EveryonePermissions(this Guild guild) =>
|
public static PermissionSet EveryonePermissions(this Guild guild) =>
|
||||||
guild.Roles.FirstOrDefault(r => r.Id == guild.Id)?.Permissions ?? PermissionSet.Dm;
|
guild.Roles.FirstOrDefault(r => r.Id == guild.Id)?.Permissions ?? PermissionSet.Dm;
|
||||||
|
|
||||||
public static PermissionSet PermissionsFor(Guild guild, Channel channel, MessageCreateEvent msg) =>
|
public static PermissionSet PermissionsFor(Guild guild, Channel channel, MessageCreateEvent msg) =>
|
||||||
PermissionsFor(guild, channel, msg.Author.Id, msg.Member?.Roles);
|
PermissionsFor(guild, channel, msg.Author.Id, msg.Member);
|
||||||
|
|
||||||
public static PermissionSet PermissionsFor(Guild guild, Channel channel, ulong userId,
|
public static PermissionSet PermissionsFor(Guild guild, Channel channel, ulong userId, GuildMemberPartial? member)
|
||||||
ICollection<ulong>? roleIds)
|
|
||||||
{
|
{
|
||||||
if (channel.Type == Channel.ChannelType.Dm)
|
if (channel.Type == Channel.ChannelType.Dm)
|
||||||
return PermissionSet.Dm;
|
return PermissionSet.Dm;
|
||||||
|
|
||||||
if (roleIds == null)
|
if (member == null)
|
||||||
throw new ArgumentException($"User roles must be specified for guild channels");
|
// this happens with system (Discord platform-owned) users - they're not actually in the guild, so there is no member object.
|
||||||
|
return EveryonePermissions(guild);
|
||||||
|
|
||||||
var perms = GuildPermissions(guild, userId, roleIds);
|
var perms = GuildPermissions(guild, userId, member.Roles);
|
||||||
perms = ApplyChannelOverwrites(perms, channel, userId, roleIds);
|
perms = ApplyChannelOverwrites(perms, channel, userId, member.Roles);
|
||||||
|
|
||||||
if ((perms & PermissionSet.Administrator) == PermissionSet.Administrator)
|
if ((perms & PermissionSet.Administrator) == PermissionSet.Administrator)
|
||||||
return PermissionSet.All;
|
return PermissionSet.All;
|
||||||
|
@ -83,7 +83,7 @@ namespace PluralKit.Bot
|
|||||||
if (channel.GuildId != null)
|
if (channel.GuildId != null)
|
||||||
{
|
{
|
||||||
var member = _guildMembers.GetValueOrDefault(channel.GuildId.Value);
|
var member = _guildMembers.GetValueOrDefault(channel.GuildId.Value);
|
||||||
return _cache.PermissionsFor(channelId, _cluster.User?.Id ?? default, member?.Roles);
|
return _cache.PermissionsFor(channelId, _cluster.User?.Id ?? default, member);
|
||||||
}
|
}
|
||||||
|
|
||||||
return PermissionSet.Dm;
|
return PermissionSet.Dm;
|
||||||
|
@ -158,7 +158,7 @@ namespace PluralKit.Bot {
|
|||||||
foreach (var channel in await _rest.GetGuildChannels(guild.Id))
|
foreach (var channel in await _rest.GetGuildChannels(guild.Id))
|
||||||
{
|
{
|
||||||
var botPermissions = _bot.PermissionsIn(channel.Id);
|
var botPermissions = _bot.PermissionsIn(channel.Id);
|
||||||
var userPermissions = PermissionExtensions.PermissionsFor(guild, channel, ctx.Author.Id, senderGuildUser.Roles);
|
var userPermissions = PermissionExtensions.PermissionsFor(guild, channel, ctx.Author.Id, senderGuildUser);
|
||||||
|
|
||||||
if ((userPermissions & PermissionSet.ViewChannel) == 0)
|
if ((userPermissions & PermissionSet.ViewChannel) == 0)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user