private async ValueTask HandlePingReaction(MessageReactionAddEvent evt, FullMessage msg) { if (!_bot.PermissionsIn(evt.ChannelId).HasFlag(PermissionSet.ManageMessages)) { return; } // Check if the "pinger" has permission to send messages in this channel // (if not, PK shouldn't send messages on their behalf) var member = await _rest.GetGuildMember(evt.GuildId !.Value, evt.UserId); var requiredPerms = PermissionSet.ViewChannel | PermissionSet.SendMessages; if (member == null || !_cache.PermissionsFor(evt.ChannelId, member).HasFlag(requiredPerms)) { return; } if (msg.System.PingsEnabled) { // If the system has pings enabled, go ahead var embed = new EmbedBuilder().Description($"[Jump to pinged message]({evt.JumpLink()})"); await _rest.CreateMessage(evt.ChannelId, new() { Content = $"Psst, **{msg.Member.DisplayName()}** (<@{msg.Message.Sender}>), you have been pinged by <@{evt.UserId}>.", Embed = embed.Build(), AllowedMentions = new AllowedMentions { Users = new[] { msg.Message.Sender } } }); } else { // If not, tell them in DMs (if we can) try { var dm = await _cache.GetOrCreateDmChannel(_rest, evt.UserId); await _rest.CreateMessage(dm.Id, new MessageRequest { Content = $"{Emojis.Error} {msg.Member.DisplayName()}'s system has disabled reaction pings. If you want to mention them anyway, you can copy/paste the following message:" }); await _rest.CreateMessage(dm.Id, new MessageRequest { Content = $"<@{msg.Message.Sender}>".AsCode() }); } catch (ForbiddenException) { } } await TryRemoveOriginalReaction(evt); }
public async Task <ILogEventEnricher> GetEnricher(int shardId, IGatewayEvent evt) { var props = new List <LogEventProperty> { new("ShardId", new ScalarValue(shardId)) }; if (_botConfig.Cluster != null) { props.Add(new LogEventProperty("ClusterId", new ScalarValue(_botConfig.Cluster.NodeName))); } var(guild, channel) = GetGuildChannelId(evt); var user = GetUserId(evt); var message = GetMessageId(evt); if (guild != null) { props.Add(new LogEventProperty("GuildId", new ScalarValue(guild.Value))); } if (channel != null) { props.Add(new LogEventProperty("ChannelId", new ScalarValue(channel.Value))); if (await _cache.TryGetChannel(channel.Value) != null) { var botPermissions = await _cache.PermissionsIn(channel.Value); props.Add(new LogEventProperty("BotPermissions", new ScalarValue(botPermissions))); } } if (message != null) { props.Add(new LogEventProperty("MessageId", new ScalarValue(message.Value))); } if (user != null) { props.Add(new LogEventProperty("UserId", new ScalarValue(user.Value))); } if (evt is MessageCreateEvent mce) { props.Add(new LogEventProperty("UserPermissions", new ScalarValue(await _cache.PermissionsFor(mce)))); } return(new Inner(props)); }
public ILogEventEnricher GetEnricher(Shard shard, IGatewayEvent evt) { var props = new List <LogEventProperty> { new("ShardId", new ScalarValue(shard.ShardId)), }; var(guild, channel) = GetGuildChannelId(evt); var user = GetUserId(evt); var message = GetMessageId(evt); if (guild != null) { props.Add(new("GuildId", new ScalarValue(guild.Value))); } if (channel != null) { props.Add(new("ChannelId", new ScalarValue(channel.Value))); if (_cache.TryGetChannel(channel.Value, out _)) { var botPermissions = _bot.PermissionsIn(channel.Value); props.Add(new("BotPermissions", new ScalarValue(botPermissions))); } } if (message != null) { props.Add(new("MessageId", new ScalarValue(message.Value))); } if (user != null) { props.Add(new("UserId", new ScalarValue(user.Value))); } if (evt is MessageCreateEvent mce) { props.Add(new("UserPermissions", new ScalarValue(_cache.PermissionsFor(mce)))); } return(new Inner(props)); }
public Context(ILifetimeScope provider, Shard shard, Guild?guild, Channel channel, MessageCreateEvent message, int commandParseOffset, PKSystem senderSystem, MessageContext messageContext, PermissionSet botPermissions) { _message = message; _shard = shard; _guild = guild; _channel = channel; _senderSystem = senderSystem; _messageContext = messageContext; _cache = provider.Resolve <IDiscordCache>(); _db = provider.Resolve <IDatabase>(); _repo = provider.Resolve <ModelRepository>(); _metrics = provider.Resolve <IMetrics>(); _provider = provider; _commandMessageService = provider.Resolve <CommandMessageService>(); _parameters = new Parameters(message.Content?.Substring(commandParseOffset)); _rest = provider.Resolve <DiscordApiClient>(); _cluster = provider.Resolve <Cluster>(); _botPermissions = botPermissions; _userPermissions = _cache.PermissionsFor(message); }
private async ValueTask HandlePingReaction(MessageReactionAddEvent evt, FullMessage msg) { if (!(await _cache.PermissionsIn(evt.ChannelId)).HasFlag(PermissionSet.ManageMessages)) { return; } // Check if the "pinger" has permission to send messages in this channel // (if not, PK shouldn't send messages on their behalf) var member = await _rest.GetGuildMember(evt.GuildId !.Value, evt.UserId); var requiredPerms = PermissionSet.ViewChannel | PermissionSet.SendMessages; if (member == null || !(await _cache.PermissionsFor(evt.ChannelId, member)).HasFlag(requiredPerms)) { return; } if (msg.Member == null) { return; } var config = await _repo.GetSystemConfig(msg.System.Id); if (config.PingsEnabled) { // If the system has pings enabled, go ahead await _rest.CreateMessage(evt.ChannelId, new MessageRequest { Content = $"Psst, **{msg.Member.DisplayName()}** (<@{msg.Message.Sender}>), you have been pinged by <@{evt.UserId}>.", Components = new[] { new MessageComponent { Type = ComponentType.ActionRow, Components = new[] { new MessageComponent { Style = ButtonStyle.Link, Type = ComponentType.Button, Label = "Jump", Url = evt.JumpLink() } } } }, AllowedMentions = new AllowedMentions { Users = new[] { msg.Message.Sender } } }); } else { // If not, tell them in DMs (if we can) try { var dm = await _dmCache.GetOrCreateDmChannel(evt.UserId); await _rest.CreateMessage(dm, new MessageRequest { Content = $"{Emojis.Error} {msg.Member.DisplayName()}'s system has disabled reaction pings. If you want to mention them anyway, you can copy/paste the following message:" }); await _rest.CreateMessage( dm, new MessageRequest { Content = $"<@{msg.Message.Sender}>".AsCode() } ); } catch (ForbiddenException) { } } await TryRemoveOriginalReaction(evt); }