コード例 #1
0
        public async Task HandleNotificationAsync(PromotionActionCreatedNotification notification, CancellationToken cancellationToken)
        {
            // TODO: Temporary workaround, remove as part of auth rework.
            if (AuthorizationService.CurrentUserId is null)
            {
                await AuthorizationService.OnAuthenticatedAsync(await SelfUserProvider.GetSelfUserAsync());
            }

            if (await DesignatedChannelService.AnyDesignatedChannelAsync(notification.Data.GuildId, DesignatedChannelType.PromotionLog))
            {
                var message = await FormatPromotionLogEntryAsync(notification.Id);

                if (message == null)
                {
                    return;
                }

                await DesignatedChannelService.SendToDesignatedChannelsAsync(
                    await DiscordClient.GetGuildAsync(notification.Data.GuildId), DesignatedChannelType.PromotionLog, message);
            }

            if (await DesignatedChannelService.AnyDesignatedChannelAsync(notification.Data.GuildId, DesignatedChannelType.PromotionNotifications))
            {
                var embed = await FormatPromotionNotificationAsync(notification.Id, notification.Data);

                if (embed == null)
                {
                    return;
                }

                await DesignatedChannelService.SendToDesignatedChannelsAsync(
                    await DiscordClient.GetGuildAsync(notification.Data.GuildId), DesignatedChannelType.PromotionNotifications, "", embed);
            }
        }
コード例 #2
0
        private async Task TryPurgeInviteLinkAsync(IMessage message)
        {
            if
            (
                !(message.Author is IGuildUser author) || (author.Guild is null) ||
                !(message.Channel is IGuildChannel channel) || (channel.Guild is null)
            )
            {
                Log.Debug("Message {MessageId} was not in an IGuildChannel & IMessageChannel, or Author {Author} was not an IGuildUser",
                          message.Id, message.Author.Id);
                return;
            }

            var selfUser = await SelfUserProvider.GetSelfUserAsync();

            if (author.Id == selfUser.Id)
            {
                return;
            }

            var matches = _inviteLinkMatcher.Matches(message.Content);

            if (!matches.Any())
            {
                return;
            }

            if (await DesignatedChannelService.ChannelHasDesignationAsync(channel.Guild, channel, DesignatedChannelType.Unmoderated))
            {
                return;
            }

            if (await AuthorizationService.HasClaimsAsync(author, AuthorizationClaim.PostInviteLink))
            {
                Log.Debug("Message {MessageId} was skipped because the author {Author} has the PostInviteLink claim",
                          message.Id, message.Author.Id);
                return;
            }

            var invites = new List <IInvite>(matches.Count);

            foreach (var code in matches.Select(x => x.Groups["Code"].Value))
            {
                var invite = await DiscordClient.GetInviteAsync(code);

                invites.Add(invite);
            }

            // Allow invites to the guild in which the message was posted
            if (invites.All(x => x?.GuildId == author.GuildId))
            {
                Log.Debug("Message {MessageId} was skipped because the invite was to this server", message.Id);
                return;
            }

            Log.Debug("Message {MessageId} is going to be deleted", message.Id);

            await ModerationService.DeleteMessageAsync(message, "Unauthorized Invite Link", selfUser.Id);

            Log.Debug("Message {MessageId} was deleted because it contains an invite link", message.Id);

            await message.Channel.SendMessageAsync($"Sorry {author.Mention} your invite link has been removed - please don't post links to other guilds");
        }