コード例 #1
0
        public async Task HandleAsync(MemberLeftEventArgs args)
        {
            using var ctx = new AdminDatabaseContext(_provider);
            var guild = await ctx.GetOrCreateGuildAsync(args.Guild.Id);

            if (string.IsNullOrWhiteSpace(guild.Goodbye))
            {
                return;
            }

            var goodbye = await guild.Goodbye.FormatPlaceHoldersAsync(
                AdminCommandContext.MockContext(guild.Language, _provider, args.User, args.Guild));

            if (!(await ctx.GetLoggingChannelAsync(args.Guild.Id, LogType.Goodbye) is { } channel))
            {
                return;
            }

            if (JsonEmbed.TryParse(goodbye, out var embed))
            {
                await channel.SendMessageAsync(embed.Text ?? string.Empty, embed : embed.ToLocalEmbed());

                return;
            }

            await channel.SendMessageAsync(goodbye);
        }
コード例 #2
0
        public async Task HandleAsync(ReactionsClearedEventArgs args)
        {
            if (!(args.Channel is CachedTextChannel channel))
            {
                return;
            }

            using var ctx = new AdminDatabaseContext(_provider);
            var star = await ctx.GetSpecialEmojiAsync(channel.Guild.Id, EmojiType.Star);

            if (!args.Reactions.HasValue || !args.Reactions.Value.ContainsKey(star)) // TODO: ContainsKey works for Equals?
            {
                return;
            }

            if (!(await ctx.Starboard.FindAsync(args.Message.Id) is { } entry))
            {
                return;
            }

            ctx.Starboard.Remove(entry);
            await ctx.SaveChangesAsync();

            await args.Client.DeleteMessageAsync(entry.EntryChannelId, entry.EntryMessageId);
        }
コード例 #3
0
        public async Task HandleAsync(MessageReceivedEventArgs args)
        {
            if (!(args.Message is CachedUserMessage message))
            {
                return;
            }

            using var ctx = new AdminDatabaseContext(_provider);
            if (string.IsNullOrWhiteSpace(message.Content) || message.Author.IsBot ||
                !(message.Channel is CachedTextChannel channel))
            {
                return;
            }

            var completedHighlights = new List <ulong>();

            foreach (var highlight in ctx.Highlights.Where(x => x.UserId != message.Author.Id &&
                                                           Regex.IsMatch(message.Content, $@"\b{x.Text}\b", RegexOptions.IgnoreCase)))
            {
                if (completedHighlights.Contains(highlight.UserId) ||
                    highlight.GuildId.HasValue && highlight.GuildId != channel.Guild.Id)
                {
                    continue;
                }

                if (channel.Guild.GetMember(highlight.UserId) is { } member&&
                    member.GetPermissionsFor(channel).ViewChannel&&
                    channel.GetMessages().OrderByDescending(x => x.Id)
                    .Where(x => DateTimeOffset.UtcNow - x.Id.CreatedAt < TimeSpan.FromMinutes(15))
                    .Take(50).All(x => x.Author.Id != highlight.UserId))
                {
                    var user = await ctx.GetOrCreateGlobalUserAsync(highlight.UserId);

                    if (user.HighlightBlacklist.Contains(message.Author.Id) ||
                        user.HighlightBlacklist.Contains(message.Channel.Id))
                    {
                        continue;
                    }

                    var target = await _client.GetUserAsync(highlight.UserId);

                    var builder = new LocalEmbedBuilder()
                                  .WithSuccessColor()
                                  .WithAuthor(_localization.Localize(user.Language, "highlight_trigger_author",
                                                                     message.Author.Tag, message.Channel), message.Author.GetAvatarUrl())
                                  .WithDescription(new StringBuilder()
                                                   .AppendNewline(message.Content.TrimTo(LocalEmbedBuilder.MAX_DESCRIPTION_LENGTH - 50))
                                                   .AppendNewline()
                                                   .AppendNewline($"[{_localization.Localize(user.Language, "info_jumpmessage")}]({message.JumpUrl})")
                                                   .ToString())
                                  .WithTimestamp(message.Id.CreatedAt);

                    _ = target.SendMessageAsync(_localization.Localize(user.Language, "highlight_trigger_text",
                                                                       channel.Guild.Name.Sanitize()), embed: builder.Build());

                    completedHighlights.Add(highlight.UserId);
                }
            }
        }
コード例 #4
0
        public async Task HandleAsync(MessageReceivedEventArgs args)
        {
            if (!(args.Message is CachedUserMessage message) ||
                message.Author.IsBot || string.IsNullOrWhiteSpace(message.Content))
            {
                return;
            }

            var prefixes = new List <string> {
                _config.DefaultPrefix
            };

            LocalizedLanguage language;

            using var ctx = new AdminDatabaseContext(_provider);

            if (message.Channel is IGuildChannel guildChannel)
            {
                Guild guild = null;
                if (!_languages.TryGetValue(guildChannel.GuildId, out language))
                {
                    guild = await ctx.GetOrCreateGuildAsync(guildChannel.GuildId);

                    _languages[guild.Id] = language = guild.Language;
                }

                if (!_guildPrefixes.TryGetValue(guildChannel.GuildId, out var customPrefixes))
                {
                    guild ??= await ctx.GetOrCreateGuildAsync(guildChannel.GuildId);

                    _guildPrefixes[guild.Id] = customPrefixes = guild.CustomPrefixes;
                }

                prefixes.AddRange(customPrefixes);
            }
            else if (!_languages.TryGetValue(message.Author.Id, out language))
            {
                var user = await ctx.GetOrCreateGlobalUserAsync(message.Author.Id);

                _languages[user.Id] = language = user.Language;
            }

            if (!CommandUtilities.HasAnyPrefix(message.Content, prefixes, StringComparison.OrdinalIgnoreCase,
                                               out var prefix, out var input))
            {
                return;
            }

            var     context = new AdminCommandContext(message, prefix, language, _provider);
            IResult result;

            if (!context.IsPrivate && await ctx.CommandAliases
                .FirstOrDefaultAsync(x => x.GuildId == context.Guild.Id &&
                                     input.StartsWith(x.Alias,
                                                      StringComparison.InvariantCultureIgnoreCase)) is { } alias)
            {
                result = await _commands.ExecuteAsync(alias, input, context);
            }
コード例 #5
0
        private async Task CycleStatusAsync()
        {
            using var ctx = new AdminDatabaseContext(_provider);
            var statuses = await ctx.Statuses.ToListAsync();

            if (statuses.Count == 0)
            {
                return;
            }

            var status = statuses.GetRandomElement(_random);
            await _client.SetPresenceAsync(new LocalActivity(status.Text, status.Type));
        }
コード例 #6
0
        private async Task SendRemindersAsync()
        {
            using var ctx = new AdminDatabaseContext(_provider);
            var now = DateTimeOffset.UtcNow;

            foreach (var reminder in ctx.Reminders.Where(x => now >= x.Ending))
            {
                var user = await _client.GetOrDownloadUserAsync(reminder.AuthorId);

                var language = reminder.GuildId.HasValue
                    ? (await ctx.GetOrCreateGuildAsync(reminder.GuildId.Value)).Language
                    : (await ctx.GetOrCreateGlobalUserAsync(reminder.AuthorId)).Language;

                var builder = new LocalEmbedBuilder()
                              .WithSuccessColor()
                              .WithDescription(string.Join('\n',
                                                           (reminder.Text ?? string.Empty).TrimTo(LocalEmbedBuilder.MAX_DESCRIPTION_LENGTH - 50),
                                                           Markdown.Link(_localization.Localize(language, "info_jumpmessage"),
                                                                         $"https://discordapp.com/channels/{reminder.GuildId?.ToString() ?? "@me"}/{reminder.ChannelId}/{reminder.MessageId}")));

                try
                {
                    if (!reminder.GuildId.HasValue)
                    {
                        await user.SendMessageAsync(
                            _localization.Localize(language, "reminder_trigger",
                                                   (reminder.Ending - reminder.CreatedAt).HumanizeFormatted(_localization, language,
                                                                                                            TimeUnit.Second, true)), embed : builder.Build());

                        continue;
                    }

                    await _client.GetGuild(reminder.GuildId.Value).GetTextChannel(reminder.ChannelId).SendMessageAsync(
                        _localization.Localize(language, "reminder_trigger",
                                               (reminder.Ending - reminder.CreatedAt).HumanizeFormatted(_localization, language,
                                                                                                        TimeUnit.Second, true)), embed: builder.Build());
                }
                catch { /* ignored */ }
                finally
                {
                    ctx.Reminders.Remove(reminder);
                }
            }

            await ctx.SaveChangesAsync();
        }
コード例 #7
0
        public async Task HandleAsync(MemberJoinedEventArgs args)
        {
            using var ctx = new AdminDatabaseContext(_provider);
            var guild = await ctx.GetOrCreateGuildAsync(args.Member.Guild.Id);

            if (string.IsNullOrWhiteSpace(guild.Greeting))
            {
                return;
            }

            var greeting = await guild.Greeting.FormatPlaceHoldersAsync(
                AdminCommandContext.MockContext(guild.Language, _provider, args.Member, args.Member.Guild));

            var hasEmbed = JsonEmbed.TryParse(greeting, out var embed);

            if (guild.DmGreeting)
            {
                if (hasEmbed)
                {
                    _ = args.Member.SendMessageAsync(embed.Text ?? string.Empty, embed: embed.ToLocalEmbed());
                }
                else
                {
                    _ = args.Member.SendMessageAsync(greeting);
                }

                return;
            }

            if (!(await ctx.GetLoggingChannelAsync(args.Member.Guild.Id, LogType.Greeting) is { } channel))
            {
                return;
            }

            if (hasEmbed)
            {
                await channel.SendMessageAsync(embed.Text ?? string.Empty, embed : embed.ToLocalEmbed());

                return;
            }

            await channel.SendMessageAsync(greeting);
        }
コード例 #8
0
        public async Task HandleAsync(MessagesBulkDeletedEventArgs args)
        {
            using var ctx = new AdminDatabaseContext(_provider);
            foreach (var id in args.Messages.Select(x => x.Id))
            {
                if (!(await ctx.Starboard.FirstOrDefaultAsync(x => x.MessageId == id ||
                                                              x.EntryMessageId == id) is { } entry))
                {
                    continue;
                }

                ctx.Starboard.Remove(entry);
                await ctx.SaveChangesAsync();

                if (id != entry.EntryMessageId)
                {
                    await args.Client.DeleteMessageAsync(entry.EntryChannelId, entry.EntryMessageId);
                }
            }
        }
コード例 #9
0
        public async Task HandleAsync(MessageDeletedEventArgs args)
        {
            if (!(args.Channel is CachedTextChannel channel))
            {
                return;
            }

            using var ctx = new AdminDatabaseContext(_provider);
            if (!(await ctx.Starboard.FirstOrDefaultAsync(x => x.MessageId == args.Message.Id ||
                                                          x.EntryMessageId == args.Message.Id) is { } entry))
            {
                return;
            }

            ctx.Starboard.Remove(entry);
            await ctx.SaveChangesAsync();

            if (args.Message.Id != entry.EntryMessageId)
            {
                await args.Client.DeleteMessageAsync(entry.EntryChannelId, entry.EntryMessageId);
            }
        }