コード例 #1
0
        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);
        }
コード例 #2
0
    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));
    }
コード例 #3
0
        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));
        }
コード例 #4
0
ファイル: Context.cs プロジェクト: guccigang17/PluralKit
        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);
        }
コード例 #5
0
ファイル: ReactionAdded.cs プロジェクト: xSke/PluralKit
    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);
    }