コード例 #1
0
ファイル: ModerationCommands.cs プロジェクト: Oleuua/sotbot
        public async Task FleetPurge(CommandContext ctx, DiscordUser member, string duration = "1d", [RemainingText] string reason = "Не указана") //Блокирует возможность принять правила на время
        {
            var isFleetCaptain = ctx.Member.Roles.Contains(ctx.Guild.GetRole(Bot.BotSettings.FleetCaptainRole)) &&
                                 !Bot.IsModerator(ctx.Member) && !ctx.Member.Roles.Any(x => x.Id == Bot.BotSettings.HelperRole); //Только капитаны рейда, модераторы и хелперы не учитываются

            var durationTimeSpan = Utility.TimeSpanParse(duration);
            var id = RandomString.NextString(6);

            if (durationTimeSpan.TotalDays > 3 && isFleetCaptain) //Максимальное время блокировки капитанам 1day
            {
                durationTimeSpan = new TimeSpan(3, 0, 0, 0);
            }

            var reportEnd = DateTime.Now + durationTimeSpan;

            ReportSQL fleetPurge = null;
            var       reports    = ReportSQL.GetForUser(member.Id, ReportType.FleetPurge);

            if (reports.Any() && reports.First().ReportEnd > DateTime.Now)
            {
                fleetPurge           = reports.First();
                fleetPurge.ReportEnd = reportEnd;
            }
            else
            {
                fleetPurge = ReportSQL.Create(id,
                                              member.Id,
                                              ctx.Member.Id,
                                              reason,
                                              DateTime.Now,
                                              reportEnd,
                                              ReportType.FleetPurge);

                if (fleetPurge.ReportDuration.TotalSeconds < 1)
                {
                    await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Не удалось определить время!");

                    return;
                }
            }

            //Отправка в журнал
            await ctx.Channel.Guild.GetChannel(Bot.BotSettings.ModlogChannel).SendMessageAsync(
                "**Блокировка принятия правил рейда**\n\n" +
                $"**Модератор:** {ctx.Member}\n" +
                $"**Пользователь:** {member}\n" +
                $"**Дата:** {DateTime.Now:HH:mm:ss dd.MM.yyyy}\n" +
                $"**Снятие через:** {Utility.FormatTimespan(fleetPurge.ReportDuration)} | {fleetPurge.ReportEnd::HH:mm:ss dd.MM.yyyy}\n" +
                $"**Причина:** {reason}\n" +
                $"**ID:** {id}");

            //Ответное сообщение в чат
            await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Успешно отобрано право принять правила рейда {member.Mention}. " +
                                   $"Снятие через: {Utility.FormatTimespan(fleetPurge.ReportDuration)}!");
        }
コード例 #2
0
ファイル: ModerationCommands.cs プロジェクト: Oleuua/sotbot
        public async Task Purge(CommandContext ctx, DiscordUser member, string duration, [RemainingText] string reason = "Не указана") //Блокирует возможность принять правила на время
        {
            if (!Bot.IsModerator(ctx.Member))
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} У вас нет доступа к этой команде!");

                return;
            }

            var       id        = RandomString.NextString(6);
            var       reportEnd = DateTime.Now + Utility.TimeSpanParse(duration);
            ReportSQL purge     = null;

            //Возможна только одна блокировка, если уже существует то перезаписываем
            var reports = ReportSQL.GetForUser(member.Id, ReportType.CodexPurge);

            if (reports.Any() && reports.First().ReportEnd > DateTime.Now)
            {
                purge           = reports.First();
                purge.ReportEnd = reportEnd;
            }
            else
            {
                purge = ReportSQL.Create(id,
                                         member.Id,
                                         ctx.Member.Id,
                                         reason,
                                         DateTime.Now,
                                         reportEnd,
                                         ReportType.CodexPurge);

                if (purge.ReportDuration.TotalSeconds < 1)
                {
                    await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Не удалось определить время!");

                    return;
                }
            }

            //Отправка в журнал
            await ctx.Channel.Guild.GetChannel(Bot.BotSettings.ModlogChannel).SendMessageAsync(
                "**Блокировка доступа к рейдам**\n\n" +
                $"**Модератор:** {ctx.Member}\n" +
                $"**Пользователь:** {member}\n" +
                $"**Дата:** {DateTime.Now:HH:mm:ss dd.MM.yyyy}\n" +
                $"**Снятие через:** {Utility.FormatTimespan(purge.ReportDuration)} | {reportEnd:HH:mm:ss dd.MM.yyyy}\n" +
                $"**Причина:** {reason}\n" +
                $"**ID:** {id}");

            //Ответное сообщение в чат
            await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Успешно заблокирован доступ к рейдам {member.Mention}. " +
                                   $"Снятие через {Utility.FormatTimespan(purge.ReportDuration)}!");
        }
コード例 #3
0
ファイル: ModerationCommands.cs プロジェクト: Oleuua/sotbot
        public async Task Mute(CommandContext ctx, DiscordUser member, string duration, [RemainingText] string reason = "Не указана")
        {
            if (!Bot.IsModerator(ctx.Member))
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} У вас нет доступа к этой команде!");

                return;
            }

            var durationTimeSpan = Utility.TimeSpanParse(duration);
            var id        = RandomString.NextString(6);
            var reportEnd = DateTime.Now + durationTimeSpan;

            ReportSQL mute    = null;
            var       reports = ReportSQL.GetForUser(member.Id, ReportType.Mute);

            if (reports.Any() && reports.First().ReportEnd > DateTime.Now)
            {
                mute           = reports.First();
                mute.ReportEnd = reportEnd;
            }
            else
            {
                mute = ReportSQL.Create(id,
                                        member.Id,
                                        ctx.Member.Id,
                                        reason,
                                        DateTime.Now,
                                        reportEnd,
                                        ReportType.Mute);
            }

            //Отправка в журнал
            await ctx.Channel.Guild.GetChannel(Bot.BotSettings.ModlogChannel).SendMessageAsync(
                "**Мут**\n\n" +
                $"**От:** {ctx.Member}\n" +
                $"**Кому:** {member}\n" +
                $"**Дата:** {DateTime.Now}\n" +
                $"**Снятие через:** {Utility.FormatTimespan(mute.ReportDuration)}\n" +
                $"**Причина:** {reason}\n" +
                $"**ID:** {id}");

            //Ответное сообщение в чат
            await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Успешно выдан мут {member.Mention}. " +
                                   $"Снятие через: {Utility.FormatTimespan(mute.ReportDuration)}!");
        }
コード例 #4
0
ファイル: ModerationCommands.cs プロジェクト: Oleuua/sotbot
        public async Task VoiceMute(CommandContext ctx, DiscordMember member, string duration, [RemainingText] string reason = "Не указана")
        {
            if (!Bot.IsModerator(ctx.Member))
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} У вас нет доступа к этой команде!");

                return;
            }

            var durationTimeSpan = Utility.TimeSpanParse(duration);
            var id        = RandomString.NextString(6);
            var reportEnd = DateTime.Now + durationTimeSpan;

            ReportSQL mute    = null;
            var       reports = ReportSQL.GetForUser(member.Id, ReportType.VoiceMute);

            if (reports.Any() && reports.First().ReportEnd > DateTime.Now)
            {
                mute           = reports.First();
                mute.ReportEnd = reportEnd;
            }
            else
            {
                mute = ReportSQL.Create(id,
                                        member.Id,
                                        ctx.Member.Id,
                                        reason,
                                        DateTime.Now,
                                        reportEnd,
                                        ReportType.VoiceMute);
            }

            //Выдаем роль мута
            await member.GrantRoleAsync(ctx.Channel.Guild.GetRole(Bot.BotSettings.VoiceMuteRole));

            //Отправка сообщения в лс
            try
            {
                await member.SendMessageAsync(
                    $"**Вам выдан мут в голосовом чате**\n\n" +
                    $"**Снятие через:** {Utility.FormatTimespan(mute.ReportDuration)}\n" +
                    $"**Модератор:** {ctx.Member.Username}#{ctx.Member.Discriminator}\n" +
                    $"**Причина:** {reason}");
            }
            catch (UnauthorizedException)
            {
                //user can block the bot
            }

            //Отправка в журнал
            await ctx.Channel.Guild.GetChannel(Bot.BotSettings.ModlogChannel).SendMessageAsync(
                "**Мут в голосовом чате**\n\n" +
                $"**От:** {ctx.Member}\n" +
                $"**Кому:** {member}\n" +
                $"**Дата:** {DateTime.Now}\n" +
                $"**Снятие через:** {Utility.FormatTimespan(mute.ReportDuration)}\n" +
                $"**Причина:** {reason}");

            //Ответное сообщение в чат
            await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Успешно выдан мут в голосовом чате {member.Mention}. " +
                                   $"Снятие через: {Utility.FormatTimespan(mute.ReportDuration)}!");
        }
コード例 #5
0
ファイル: ModerationCommands.cs プロジェクト: Oleuua/sotbot
        public async Task FleetPurge(CommandContext ctx, DiscordMember member, string duration = "1d", [RemainingText] string reason = "Не указана") //Блокирует возможность принять правила на время
        {
            var isFleetCaptain = ctx.Member.Roles.Contains(ctx.Guild.GetRole(Bot.BotSettings.FleetCaptainRole)) &&
                                 !Bot.IsModerator(ctx.Member) && !ctx.Member.Roles.Any(x => x.Id == Bot.BotSettings.HelperRole); //Только капитаны рейда, модераторы и хелперы не учитываются

            //Проверка на кик модератора капитаном рейда
            if (Bot.IsModerator(member) && isFleetCaptain)
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Вы не можете исключить данного пользователя! <@&514282258958385152>");

                return;
            }

            var durationTimeSpan = Utility.TimeSpanParse(duration);
            var id = RandomString.NextString(6);

            if (durationTimeSpan.TotalDays > 3 && isFleetCaptain) //Максимальное время блокировки капитанам 1day
            {
                durationTimeSpan = new TimeSpan(3, 0, 0, 0);
            }

            var reportEnd = DateTime.Now + durationTimeSpan;

            ReportSQL fleetPurge = null;
            var       reports    = ReportSQL.GetForUser(member.Id, ReportType.FleetPurge);

            if (reports.Any() && reports.First().ReportEnd > DateTime.Now)
            {
                fleetPurge           = reports.First();
                fleetPurge.ReportEnd = reportEnd;
            }
            else
            {
                fleetPurge = ReportSQL.Create(id,
                                              member.Id,
                                              ctx.Member.Id,
                                              reason,
                                              DateTime.Now,
                                              reportEnd,
                                              ReportType.FleetPurge);

                if (fleetPurge.ReportDuration.TotalSeconds < 1)
                {
                    await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Не удалось определить время!");

                    return;
                }
            }

            //Убираем роль правил
            await member.RevokeRoleAsync(ctx.Channel.Guild.GetRole(Bot.BotSettings.FleetCodexRole));

            //Отправка сообщения в лс
            try
            {
                await member.SendMessageAsync(
                    $"**Доступ к рейдам заблокирован**\n" +
                    $"**Снятие через:** {Utility.FormatTimespan(fleetPurge.ReportDuration)}\n" +
                    $"**Модератор:** {ctx.Member.Username}#{ctx.Member.Discriminator}\n" +
                    $"**Причина:** {fleetPurge.Reason}");
            }
            catch (UnauthorizedException)
            {
                //user can block the bot
            }

            //Отправка в журнал
            await ctx.Channel.Guild.GetChannel(Bot.BotSettings.ModlogChannel).SendMessageAsync(
                "**Блокировка доступа к рейдам**\n\n" +
                $"**Модератор:** {ctx.Member}\n" +
                $"**Пользователь:** {member}\n" +
                $"**Дата:** {DateTime.Now:HH:mm:ss dd.MM.yyyy}\n" +
                $"**Снятие через:** {Utility.FormatTimespan(fleetPurge.ReportDuration)} | {fleetPurge.ReportEnd::HH:mm:ss dd.MM.yyyy}\n" +
                $"**Причина:** {reason}\n" +
                $"**ID:** {id}");

            //Ответное сообщение в чат
            await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Успешно заблокирован доступ к рейдам {member.Mention}. " +
                                   $"Снятие через: {Utility.FormatTimespan(fleetPurge.ReportDuration)}!");
        }
コード例 #6
0
ファイル: ModerationCommands.cs プロジェクト: Oleuua/sotbot
        public async Task Purge(CommandContext ctx, DiscordMember member, string duration, [RemainingText] string reason = "Не указана") //Блокирует возможность принять правила на время
        {
            if (!Bot.IsModerator(ctx.Member))
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} У вас нет доступа к этой команде!");

                return;
            }

            var       id        = RandomString.NextString(6);
            var       reportEnd = DateTime.Now + Utility.TimeSpanParse(duration);
            ReportSQL purge     = null;

            //Возможна только одна блокировка, если уже существует то перезаписываем
            var reports = ReportSQL.GetForUser(member.Id, ReportType.CodexPurge);

            if (reports.Any() && reports.First().ReportEnd > DateTime.Now)
            {
                purge           = reports.First();
                purge.ReportEnd = reportEnd;
            }
            else
            {
                purge = ReportSQL.Create(id,
                                         member.Id,
                                         ctx.Member.Id,
                                         reason,
                                         DateTime.Now,
                                         reportEnd,
                                         ReportType.CodexPurge);

                if (purge.ReportDuration.TotalSeconds < 1)
                {
                    await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Не удалось определить время!");

                    return;
                }
            }

            //Убираем роль правил
            await member.RevokeRoleAsync(ctx.Channel.Guild.GetRole(Bot.BotSettings.CodexRole));

            await member.GrantRoleAsync(ctx.Channel.Guild.GetRole(Bot.BotSettings.PurgeCodexRole));

            //Отправка сообщения в лс
            try
            {
                await member.SendMessageAsync(
                    $"**Еще раз внимательно прочитайте правила сервера**\n\n" +
                    $"**Возможность принять правила заблокирована**\n" +
                    $"**Снятие через** {Utility.FormatTimespan(purge.ReportDuration)}\n" +
                    $"**Модератор:** {ctx.Member.Username}#{ctx.Member.Discriminator}\n" +
                    $"**Причина:** {purge.Reason}");
            }
            catch (UnauthorizedException)
            {
                //user can block the bot
            }

            //Отправка в журнал
            await ctx.Channel.Guild.GetChannel(Bot.BotSettings.ModlogChannel).SendMessageAsync(
                "**Блокировка принятия правил**\n\n" +
                $"**Модератор:** {ctx.Member}\n" +
                $"**Пользователь:** {member}\n" +
                $"**Дата:** {DateTime.Now:HH:mm:ss dd.MM.yyyy}\n" +
                $"**Снятие через:** {Utility.FormatTimespan(purge.ReportDuration)} | {reportEnd:HH:mm:ss dd.MM.yyyy}\n" +
                $"**Причина:** {reason}\n" +
                $"**ID:** {id}");

            //Ответное сообщение в чат
            await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Успешно отобрано право принять правила {member.Mention}. " +
                                   $"Снятие через {Utility.FormatTimespan(purge.ReportDuration)}!");
        }
コード例 #7
0
        public static async Task ClientOnMessageReactionAdded(DiscordClient client, MessageReactionAddEventArgs e)
        {
            var discordUser = await client.GetUserAsync(e.User.Id);

            if (discordUser.IsBot)
            {
                return;
            }

            //Проверка если сообщение с принятием правил сообщества
            if (e.Message.Id == Bot.BotSettings.CodexMessageId && e.Emoji.GetDiscordName() == ":white_check_mark:")
            {
                //При надобности добавить кулдаун

                /*if (EmojiCooldowns.ContainsKey(e.User)) // проверка на кулдаун
                 *  if ((EmojiCooldowns[e.User] - DateTime.Now).Seconds > 0) return;
                 *
                 * // если проверка успешно пройдена, добавим пользователя
                 * // в словарь кулдаунов
                 * EmojiCooldowns[e.User] = DateTime.Now.AddSeconds(Bot.BotSettings.FastCooldown);*/

                //Проверка на purge
                var       hasPurge   = false;
                ReportSQL validPurge = null;
                foreach (var purge in ReportSQL.GetForUser(discordUser.Id, ReportType.CodexPurge))
                {
                    if (purge.ReportEnd > DateTime.Now)
                    {
                        validPurge = purge;
                        hasPurge   = true;
                        break;
                    }
                }

                if (hasPurge)
                {
                    var moderator = await e.Channel.Guild.GetMemberAsync(validPurge.Moderator);

                    try
                    {
                        await(await e.Guild.GetMemberAsync(discordUser.Id)).SendMessageAsync(
                            "**Возможность принять правила заблокирована**\n" +
                            $"**Снятие через:** {Utility.FormatTimespan(DateTime.Now - validPurge.ReportEnd)}\n" +
                            $"**Модератор:** {moderator.Username}#{moderator.Discriminator}\n" +
                            $"**Причина:** {validPurge.Reason}\n");
                    }

                    catch (UnauthorizedException)
                    {
                        //user can block the bot
                    }
                    return;
                }

                //Выдаем роль правил
                var member = await e.Guild.GetMemberAsync(discordUser.Id);

                //Проверка времени входа на сервер.
                if (member.JoinedAt > DateTime.Now.AddMinutes(-10))
                {
                    try
                    {
                        await member.SendMessageAsync(
                            $"{Bot.BotSettings.ErrorEmoji} Для принятия правил вы должны находиться на сервере минимум " +
                            $"**{Utility.FormatTimespan(TimeSpan.FromMinutes(10))}**.");

                        await e.Message.DeleteReactionAsync(DiscordEmoji.FromName(client, ":white_check_mark:"), member);
                    }
                    catch (UnauthorizedException) { }
                    return;
                }

                if (!member.Roles.Contains(e.Channel.Guild.GetRole(Bot.BotSettings.CodexRole)))
                {
                    //Выдаем роль правил
                    await member.GrantRoleAsync(e.Channel.Guild.GetRole(Bot.BotSettings.CodexRole));

                    //Убираем роль блокировки правил
                    await member.RevokeRoleAsync(e.Channel.Guild.GetRole(Bot.BotSettings.PurgeCodexRole));

                    client.Logger.LogInformation(BotLoggerEvents.Event, $"Пользователь {discordUser.Username}#{discordUser.Discriminator} ({discordUser.Id}) подтвердил прочтение правил через реакцию.");
                }

                return;
            }

            //Проверка если сообщение с принятием правил рейда
            if (e.Message.Id == Bot.BotSettings.FleetCodexMessageId && e.Emoji.GetDiscordName() == ":white_check_mark:")
            {
                //Проверка на purge
                var       hasPurge   = false;
                ReportSQL validPurge = null;
                foreach (var purge in ReportSQL.GetForUser(discordUser.Id, ReportType.FleetPurge))
                {
                    if (purge.ReportEnd > DateTime.Now)
                    {
                        validPurge = purge;
                        hasPurge   = true;
                        break;
                    }
                }

                if (hasPurge)
                {
                    var moderator = await e.Channel.Guild.GetMemberAsync(validPurge.Moderator);

                    try
                    {
                        await(await e.Guild.GetMemberAsync(discordUser.Id)).SendMessageAsync(
                            "**Возможность принять правила заблокирована**\n" +
                            $"**Снятие через:** {Utility.FormatTimespan(DateTime.Now - validPurge.ReportEnd)}\n" +
                            $"**Модератор:** {moderator.Username}#{moderator.Discriminator}\n" +
                            $"**Причина:** {validPurge.Reason}\n");
                    }

                    catch (UnauthorizedException)
                    {
                        //user can block the bot
                    }
                    return;
                } //Удаляем блокировку если истекла

                var member = await e.Guild.GetMemberAsync(discordUser.Id);

                //Проверка времени входа на сервер.
                if (member.JoinedAt > DateTime.Now.AddDays(-Bot.BotSettings.FleetDateOffset))
                {
                    await member.SendMessageAsync(
                        $"{Bot.BotSettings.ErrorEmoji} Для получения доступа к рейдам вы должны находиться на сервере " +
                        $"**{Utility.FormatTimespan(TimeSpan.FromDays(Bot.BotSettings.FleetDateOffset))}**.");

                    await e.Message.DeleteReactionAsync(DiscordEmoji.FromName(client, ":white_check_mark:"), member);

                    return;
                }

                var voiceTime = VoiceListener.GetUpdatedVoiceTime(e.User.Id);
                //Проверка на время проведенное в голосовых каналах
                if (voiceTime < TimeSpan.FromHours(Bot.BotSettings.FleetVoiceTimeOffset))
                {
                    await member.SendMessageAsync(
                        $"{Bot.BotSettings.ErrorEmoji} Для получения доступа к рейдам вы должны провести " +
                        $"**{Utility.FormatTimespan(TimeSpan.FromHours(Bot.BotSettings.FleetVoiceTimeOffset))}** в голосовых каналах. " +
                        $"Ваше время: **{Utility.FormatTimespan(voiceTime)}**");

                    await e.Message.DeleteReactionAsync(DiscordEmoji.FromName(client, ":white_check_mark:"), member);

                    return;
                }

                //Проверка на регистрацию и привязку Xbox

                var webUser = WebUser.GetByDiscordId(member.Id);
                if (webUser == null)
                {
                    await member.SendMessageAsync(
                        $"{Bot.BotSettings.ErrorEmoji} Для получения доступа к рейдам вам нужно авторизоваться с помощью Discord на сайте {Bot.BotSettings.WebURL}login.");

                    await e.Message.DeleteReactionAsync(DiscordEmoji.FromName(client, ":white_check_mark:"), member);

                    return;
                }

                if (webUser.LastXbox == "")
                {
                    await member.SendMessageAsync($"{Bot.BotSettings.ErrorEmoji} Для получения доступа к рейдам вы должны привязать Xbox к своему аккаунту, затем перейдите по ссылке " +
                                                  $"{Bot.BotSettings.WebURL}xbox - это обновит базу данных.");

                    await e.Message.DeleteReactionAsync(DiscordEmoji.FromName(client, ":white_check_mark:"), member);

                    return;
                }

                // Проверка ЧС

                if (BlacklistEntry.IsBlacklisted(member.Id) || BlacklistEntry.IsBlacklistedXbox(webUser.LastXbox))
                {
                    await member.SendMessageAsync(
                        $"{Bot.BotSettings.ErrorEmoji} Вы находитесь в чёрном списке рейдов и вам навсегда ограничен доступ к ним.");

                    return;
                }

                //Выдаем роль правил рейда
                if (!member.Roles.Any(x => x.Id == Bot.BotSettings.FleetCodexRole))
                {
                    await member.GrantRoleAsync(e.Channel.Guild.GetRole(Bot.BotSettings.FleetCodexRole));

                    await e.Guild.GetChannel(Bot.BotSettings.FleetLogChannel)
                    .SendMessageAsync($"{DiscordEmoji.FromName(client, ":new:")} Пользователь **{e.User.Username}#{e.User.Discriminator}** ({e.User.Id}) получил роль рейда. **Xbox:** {webUser.LastXbox}.");

                    client.Logger.LogInformation(BotLoggerEvents.Event, $"Пользователь {discordUser.Username}#{discordUser.Discriminator} ({discordUser.Id}) подтвердил прочтение правил рейда.");
                }

                return;
            }

            //Проверка на сообщение эмиссарства
            if (e.Message.Id == Bot.BotSettings.EmissaryMessageId)
            {
                await e.Message.DeleteReactionAsync(e.Emoji, discordUser);

                if (EmojiCooldowns.ContainsKey(discordUser)) // проверка на кулдаун
                {
                    if ((EmojiCooldowns[discordUser] - DateTime.Now).Seconds > 0)
                    {
                        return;
                    }
                }

                // если проверка успешно пройдена, добавим пользователя
                // в словарь кулдаунов
                EmojiCooldowns[discordUser] = DateTime.Now.AddSeconds(Bot.BotSettings.FastCooldown);

                //Проверка у пользователя уже существующих ролей эмисарства и их удаление
                var member = await e.Guild.GetMemberAsync(discordUser.Id);

                member.Roles.Where(x => x.Id == Bot.BotSettings.EmissaryGoldhoadersRole ||
                                   x.Id == Bot.BotSettings.EmissaryTradingCompanyRole ||
                                   x.Id == Bot.BotSettings.EmissaryOrderOfSoulsRole ||
                                   x.Id == Bot.BotSettings.EmissaryAthenaRole ||
                                   x.Id == Bot.BotSettings.EmissaryReaperBonesRole ||
                                   x.Id == Bot.BotSettings.HuntersRole).ToList()
                .ForEach(async x => await member.RevokeRoleAsync(x));

                //Выдаем роль в зависимости от реакции
                switch (e.Emoji.GetDiscordName())
                {
                case ":moneybag:":
                    await member.GrantRoleAsync(e.Channel.Guild.GetRole(Bot.BotSettings.EmissaryGoldhoadersRole));

                    break;

                case ":pig:":
                    await member.GrantRoleAsync(e.Channel.Guild.GetRole(Bot.BotSettings.EmissaryTradingCompanyRole));

                    break;

                case ":skull:":
                    await member.GrantRoleAsync(e.Channel.Guild.GetRole(Bot.BotSettings.EmissaryOrderOfSoulsRole));

                    break;

                case ":gem:":
                    await member.GrantRoleAsync(e.Channel.Guild.GetRole(Bot.BotSettings.EmissaryAthenaRole));

                    break;

                case ":skull_crossbones:":
                    await member.GrantRoleAsync(e.Channel.Guild.GetRole(Bot.BotSettings.EmissaryReaperBonesRole));

                    break;

                case ":fish:":
                    await member.GrantRoleAsync(e.Channel.Guild.GetRole(Bot.BotSettings.HuntersRole));

                    break;

                default:
                    break;
                }
                //Отправка в лог
                client.Logger.LogInformation(BotLoggerEvents.Event, $"{discordUser.Username}#{discordUser.Discriminator} получил новую роль эмиссарства.");

                return;
            }

            if (e.Message.Channel != null)
            {
                //Проверка на голосование
                if (e.Message.Channel.Id == Bot.BotSettings.VotesChannel)
                {
                    var vote = Vote.GetByMessageId(e.Message.Id);

                    await e.Message.DeleteReactionAsync(e.Emoji, discordUser);

                    // Проверка на окончание голосования
                    if (DateTime.Now > vote.End)
                    {
                        return;
                    }

                    // Проверка на предыдущий голос
                    if (vote.Voters.ContainsKey(discordUser.Id))
                    {
                        return;
                    }

                    if (e.Emoji.GetDiscordName() == ":white_check_mark:")
                    {
                        vote.Voters.Add(discordUser.Id, true);
                        ++vote.Yes;
                    }
                    else
                    {
                        vote.Voters.Add(discordUser.Id, false);
                        ++vote.No;
                    }

                    var total = vote.Voters.Count;

                    var author = await e.Guild.GetMemberAsync(vote.Author);

                    var embed = Utility.GenerateVoteEmbed(
                        author,
                        DiscordColor.Yellow,
                        vote.Topic,
                        vote.End,
                        vote.Voters.Count,
                        vote.Yes,
                        vote.No,
                        vote.Id);

                    Vote.Save(Bot.BotSettings.VotesXML);

                    await e.Message.ModifyAsync(embed : embed);

                    await(await e.Guild.GetMemberAsync(discordUser.Id)).SendMessageAsync($"{Bot.BotSettings.OkEmoji} Спасибо, ваш голос учтён!");
                }

                // Private ship confirmation message
                if (e.Channel.Id == Bot.BotSettings.PrivateRequestsChannel)
                {
                    var ship = PrivateShip.GetByRequest(e.Message.Id);
                    if (ship != null && ship.Channel == 0)
                    {
                        if (e.Emoji == DiscordEmoji.FromName(client, ":white_check_mark:"))
                        {
                            var channel = await e.Guild.CreateChannelAsync($"☠{ship.Name}☠", ChannelType.Voice,
                                                                           e.Guild.GetChannel(Bot.BotSettings.PrivateCategory), bitrate : Bot.BotSettings.Bitrate);

                            await channel.AddOverwriteAsync(e.Guild.GetRole(Bot.BotSettings.CodexRole),
                                                            Permissions.AccessChannels);

                            await channel.AddOverwriteAsync(e.Guild.EveryoneRole, Permissions.None, Permissions.UseVoice);

                            ship.Channel   = channel.Id;
                            ship.CreatedAt = DateTime.Now;
                            ship.LastUsed  = DateTime.Now;

                            var captain = (from member in ship.GetMembers()
                                           where member.Role == PrivateShipMemberRole.Captain
                                           select member).First();
                            var captainMember = await e.Guild.GetMemberAsync(captain.MemberId);

                            await channel.AddOverwriteAsync(captainMember, Permissions.UseVoice);

                            captain.Status = true;

                            await e.Channel.SendMessageAsync(
                                $"{Bot.BotSettings.OkEmoji} Администратор {e.User.Mention} подтвердил запрос на создание " +
                                $"корабля **{ship.Name}**.");

                            try
                            {
                                await captainMember.SendMessageAsync(
                                    $"{Bot.BotSettings.OkEmoji} Администратор **{e.User.Username}#{e.User.Discriminator}** " +
                                    $"подтвердил твой запрос на создание корабля **{ship.Name}**.");
                            }
                            catch (UnauthorizedException)
                            {
                            }
                        }
                        else if (e.Emoji == DiscordEmoji.FromName(client, ":no_entry:"))
                        {
                            var captain = (from member in ship.GetMembers()
                                           where member.Role == PrivateShipMemberRole.Captain
                                           select member).First();
                            var captainMember = await e.Guild.GetMemberAsync(captain.MemberId);

                            PrivateShip.Delete(ship.Name);
                            await e.Channel.SendMessageAsync(
                                $"{Bot.BotSettings.OkEmoji} Администратор {e.User.Mention} отклонил запрос на создание " +
                                $"корабля **{ship.Name}**.");

                            try
                            {
                                await captainMember.SendMessageAsync(
                                    $"{Bot.BotSettings.ErrorEmoji} Администратор **{e.User.Username}#{e.User.Discriminator}** " +
                                    $"отклонил твой запрос на создание корабля **{ship.Name}**.");
                            }
                            catch (UnauthorizedException)
                            {
                            }
                        }

                        await e.Message.DeleteAllReactionsAsync();
                    }
                }
            }
        }
コード例 #8
0
            public async Task WhoIs(CommandContext ctx, [Description("Пользователь"), RemainingText] DiscordUser user)
            {
                if (user.Id == 261137595965243393)
                {
                    Random random = new Random();
                    int    value  = random.Next(100);
                    if (value < 30)
                    {
                        await ctx.RespondAsync("https://media.giphy.com/media/eKrgVyZ7zLvJrgZNZn/giphy.gif");

                        return;
                    }
                }

                await ctx.TriggerTypingAsync();

                try
                {
                    DiscordMember member = null;
                    try
                    {
                        member = await ctx.Guild.GetMemberAsync(user.Id);
                    }
                    catch (NotFoundException)
                    {
                        // is not a member of the guild
                    }

                    //Сбор информации в переменные
                    var ban       = GetBansInfo(user.Id);
                    var warnings  = WarnSQL.GetForUser(user.Id).Count;
                    var reports   = ReportSQL.GetForUser(user.Id);
                    var webUser   = WebUser.GetByDiscordId(user.Id);
                    var voiceTime = VoiceListener.GetUpdatedVoiceTime(user.Id);

                    //Создание эмбеда
                    var embed = new DiscordEmbedBuilder();
                    embed.WithAuthor($"{user.Username}#{user.Discriminator}", iconUrl: user.AvatarUrl);
                    embed.WithThumbnail(user.AvatarUrl);

                    //Статус на сервере
                    if (ban != null)
                    {
                        embed.WithColor(new DiscordColor("#c0392b"));
                        embed.WithDescription($"Забанен до {ban}.");
                    }
                    else if (member == null)
                    {
                        embed.WithColor(new DiscordColor("#e67e22"));
                        embed.WithDescription("Не является участником.");
                    }
                    else
                    {
                        embed.WithColor(new DiscordColor("#27ae60"));
                        embed.WithDescription("Участник сервера.");
                    }


                    //1 Row - ID, Username
                    embed.AddFieldOrDefault("ID", user.Id.ToString(), true);
                    if (member != null)
                    {
                        embed.AddFieldOrDefault("Имя на сервере", member.Mention, true);
                    }
                    embed.NewInlineRow();

                    //2 Row - Creation and join dates, VoiceTime
                    embed.AddFieldOrDefault("Создан", user.CreationTimestamp.ToString("HH:mm:ss \n dd.MM.yyyy"), true);
                    if (member != null)
                    {
                        embed.AddFieldOrDefault("Присоединился", member.JoinedAt.ToString("HH:mm:ss \n dd.MM.yyyy"), true);
                    }
                    embed.AddFieldOrDefault("Время в каналах", $"{(voiceTime.Days * 24) + voiceTime.Hours}:{voiceTime.Minutes}", true);

                    //3 Row - WebUser info
                    if (webUser != null)
                    {
                        embed.AddFieldOrDefault("Привязка", "Да", true);
                        embed.AddFieldOrEmpty("Страна", GetCountryFlag(webUser.LastIp), true);
                        if (!string.IsNullOrEmpty(webUser.LastXbox))
                        {
                            embed.AddFieldOrDefault("Xbox", webUser.LastXbox.ToString(), true);
                        }
                        else
                        {
                            embed.AddFieldOrDefault("Xbox", "Нет", true);
                        }
                    }
                    embed.NewInlineRow();

                    //4 Row - Donate info
                    embed.AddFieldOrReplace("Донат", GetDonationInfo(user.Id), "Нет", true);
                    embed.AddFieldOrReplace("Подписка", GetSubscriptionInfo(user.Id), "Нет", true);
                    embed.AddFieldOrReplace("Приватный корабль", GetPrivateShip(user.Id), "Нет", true);
                    embed.NewInlineRow();

                    //5 Row - Reports info
                    embed.AddFieldOrDefault("Предупреждения", $":pencil: {warnings}", true);
                    embed.AddFieldOrDefault("Правила", GetCodexInfo(reports, member), true);
                    embed.AddFieldOrDefault("Правила рейда", GetFleetCodexInfo(reports, member), true);
                    embed.AddFieldOrDefault("Мут", $"{GetMutesInfo(reports)}", true);
                    embed.AddFieldOrDefault("Голосовой мут", $"{GetVoiceMutesInfo(reports)}", true);
                    embed.NewInlineRow();

                    //6 Row - Note
                    if (Note.Notes.ContainsKey(user.Id))
                    {
                        embed.AddFieldOrDefault("Заметка", Note.Notes[user.Id].Content);
                    }

                    embed.WithFooter("(*) Не принял после разблокировки");

                    var message = await ctx.RespondAsync(embed : embed.Build());

                    //Реакция на вывод сообщения с предупреждениями
                    if (warnings > 0)
                    {
                        var interactivity = ctx.Client.GetInteractivity();

                        var emoji = DiscordEmoji.FromName(ctx.Client, ":pencil:");

                        await message.CreateReactionAsync(emoji);

                        var em = await interactivity.WaitForReactionAsync(xe => xe.Emoji == emoji, message, ctx.User, TimeSpan.FromSeconds(60));

                        if (!em.TimedOut)
                        {
                            await ctx.TriggerTypingAsync();

                            var command = $"whois wl {user.Id}";

                            var cmds = ctx.CommandsNext;

                            // Ищем команду и извлекаем параметры.
                            var cmd = cmds.FindCommand(command, out var customArgs);

                            // Создаем фейковый контекст команды.
                            var fakeContext = cmds.CreateFakeContext(ctx.Member, ctx.Channel, command, ctx.Prefix, cmd, customArgs);

                            // Выполняем команду за пользователя.
                            await cmds.ExecuteCommandAsync(fakeContext);
                        }
                        else
                        {
                            await message.DeleteAllReactionsAsync();
                        }
                    }
                }
                catch (NotFoundException)
                {
                    await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Пользователь не найден.");
                }
            }
コード例 #9
0
        private static async void CheckExpiredReports(object sender, ElapsedEventArgs e)
        {
            Client.Logger.LogDebug(BotLoggerEvents.Timers, $"CheckExpiredReports running");

            var guild = await Client.GetGuildAsync(Bot.BotSettings.Guild);

            //Check for expired bans
            var toUnban = BanSQL.GetExpiredBans();

            if (toUnban.Any())
            {
                var bans = await guild.GetBansAsync();

                foreach (var ban in toUnban)
                {
                    for (int i = 0; i < bans.Count; ++i)
                    {
                        if (bans[i].User.Id == ban.User)
                        {
                            Client.Logger.LogDebug(BotLoggerEvents.Timers, $"Попытка снятия бана {ban}");
                            await guild.UnbanMemberAsync(ban.User);

                            var user = await Client.GetUserAsync(ban.User);

                            await guild.GetChannel(Bot.BotSettings.ModlogChannel).SendMessageAsync(
                                "**Снятие бана**\n\n" +
                                $"**Модератор:** {Client.CurrentUser.Username}\n" +
                                $"**Пользователь:** {user}\n" +
                                $"**Дата:** {DateTime.Now}\n");

                            Client.Logger.LogInformation(BotLoggerEvents.Timers, $"Пользователь {user} был разбанен.");
                            break;
                        }
                    }
                }
            }

            //Check for expired mutes
            var reports = ReportSQL.GetExpiredReports();

            foreach (var report in reports)
            {
                if (report.ReportType == ReportType.Mute)
                {
                    Client.Logger.LogDebug(BotLoggerEvents.Timers, $"Попытка снятия блокировки {report}");
                    try
                    {
                        var user = await guild.GetMemberAsync(report.User);

                        await user.RevokeRoleAsync(guild.GetRole(Bot.BotSettings.MuteRole), "Unmuted");
                    }
                    catch (NotFoundException)
                    {
                        //Пользователь не найден
                    }
                    ReportSQL.Delete(report.Id);
                }
                else if (report.ReportType == ReportType.VoiceMute)
                {
                    Client.Logger.LogDebug(BotLoggerEvents.Timers, $"Попытка снятия блокировки {report}");
                    try
                    {
                        var user = await guild.GetMemberAsync(report.User);

                        await user.RevokeRoleAsync(guild.GetRole(Bot.BotSettings.VoiceMuteRole), "Unmuted");
                    }
                    catch (NotFoundException)
                    {
                        //Пользователь не найден
                    }
                    ReportSQL.Delete(report.Id);
                }
            }
        }
コード例 #10
0
ファイル: GuildMessageListener.cs プロジェクト: Oleuua/sotbot
        public static async Task LogOnMessageCreated(DiscordClient client, MessageCreateEventArgs e)
        {
            if (e.Guild != null)
            {
                //TODO: REMOVE THIS -> Автобан за гифку
                if (e.Message.Content == "https://media.discordapp.net/attachments/741675549612572793/782183382850600960/not_spoiler.gif" ||
                    e.Message.Content.Contains("https://media.discordapp.net/attachments/741675549612572793/782183382850600960/not_spoiler.gif") ||
                    e.Message.Content.Contains("not_spoiler.gif"))
                {
                    var member = await e.Guild.GetMemberAsync(e.Author.Id);

                    await member.BanAsync(1);
                }

                if (e.Channel.Id == Bot.BotSettings.CodexReserveChannel)
                {
                    if (!Bot.IsModerator(await e.Guild.GetMemberAsync(e.Author.Id)))
                    {
                        await e.Message.DeleteAsync();
                    }

                    //Проверка на purge
                    var       hasPurge   = false;
                    ReportSQL validPurge = null;
                    foreach (var purge in ReportSQL.GetForUser(e.Message.Author.Id, ReportType.CodexPurge))
                    {
                        if (purge.ReportEnd > DateTime.Now)
                        {
                            validPurge = purge;
                            hasPurge   = true;
                            break;
                        }
                    }

                    if (hasPurge)
                    {
                        var moderator = await e.Channel.Guild.GetMemberAsync(validPurge.Moderator);

                        try
                        {
                            await((DiscordMember)e.Author).SendMessageAsync(
                                "**Возможность принять правила заблокирована**\n" +
                                $"**Снятие через:** {Utility.FormatTimespan(DateTime.Now - validPurge.ReportEnd)}\n" +
                                $"**Модератор:** {moderator.Username}#{moderator.Discriminator}\n" +
                                $"**Причина:** {validPurge.Reason}\n");
                        }

                        catch (UnauthorizedException)
                        {
                            //user can block the bot
                        }
                        return;
                    }

                    //Выдаем роль правил
                    var member = await e.Guild.GetMemberAsync(e.Author.Id);

                    //Проверка времени входа на сервер.
                    if (member.JoinedAt > DateTime.Now.AddMinutes(-10))
                    {
                        try
                        {
                            await member.SendMessageAsync(
                                $"{Bot.BotSettings.ErrorEmoji} Для принятия правил вы должны находиться на сервере минимум " +
                                $"**{Utility.FormatTimespan(TimeSpan.FromMinutes(10))}**.");

                            await e.Message.DeleteReactionAsync(DiscordEmoji.FromName(client, ":white_check_mark:"), member);
                        }
                        catch (UnauthorizedException) { }
                        return;
                    }
                    else if (!member.Roles.Contains(e.Channel.Guild.GetRole(Bot.BotSettings.CodexRole)))
                    {
                        //Выдаем роль правил
                        await member.GrantRoleAsync(e.Channel.Guild.GetRole(Bot.BotSettings.CodexRole));

                        //Убираем роль блокировки правил
                        await member.RevokeRoleAsync(e.Channel.Guild.GetRole(Bot.BotSettings.PurgeCodexRole));

                        client.Logger.LogInformation(BotLoggerEvents.Event, $"Пользователь {e.Author.Username}#{e.Author.Discriminator} ({e.Author.Id}) подтвердил прочтение правил через сообщение.");
                    }
                }

                if (e.Message.Attachments.Count > 0 && !e.Message.Author.IsBot)
                {
                    var message = $"**Автор:** {e.Message.Author}\n" +
                                  $"**Канал:**  {e.Message.Channel}\n" +
                                  $"**Сообщение:** {e.Message.Id}\n" +
                                  $"**Вложение:**\n";

                    using (var wClient = new WebClient())
                    {
                        var attachment = e.Message.Attachments[0]; //проверить: не может быть больше 1 вложения в сообщении
                        var file       = $"generated/attachments/{attachment.FileName}";
                        wClient.DownloadFile(attachment.Url, file);

                        //TODO: REMOVE THIS -> Автобан за гифку
                        if ((new FileInfo(file).Length) == 1058939)
                        {
                            var member = await e.Guild.GetMemberAsync(e.Author.Id);

                            await member.BanAsync(1);
                        }
                        //TODO
                        else
                        {
                            var logMessage = await e.Guild.GetChannel(Bot.BotSettings.AttachmentsLog).SendFileAsync(file, message);

                            File.Delete(file);

                            using (var fs = new FileStream("generated/attachments_messages.csv", FileMode.Append))
                                using (var sw = new StreamWriter(fs))
                                    await sw.WriteLineAsync($"{e.Message.Id},{logMessage.Id}");
                        }
                    }
                }

                if (e.Message.Content.StartsWith("> "))
                {
                    if (Bot.IsModerator(await e.Guild.GetMemberAsync(e.Author.Id)))
                    {
                        var messageStrings = e.Message.Content.Split('\n');
                        var command        = "";
                        foreach (var str in messageStrings)
                        {
                            if (str.StartsWith("<@"))
                            {
                                command = str;
                                break;
                            }
                        }

                        var args     = command.Split(' ');
                        var receiver = args[0];
                        var action   = args[1];

                        switch (action)
                        {
                        case "w":
                            await e.Message.DeleteAsync();

                            Bot.RunCommand(client, CommandType.Warn, args, e.Message);
                            return;

                        default:
                            return;
                        }
                    }
                }

                //Чистка сообщений в канале поиска игроков
                if (e.Channel.Id == Bot.BotSettings.FindChannel && e.Message.Embeds.Count() == 0 && !e.Message.Pinned)
                {
                    //Проверка если сообщение содержит команду, если нет то отправляем инструкцию в лс.
                    if (!e.Message.Content.StartsWith(Bot.BotSettings.Prefix) && !e.Author.IsBot)
                    {
                        try
                        {
                            await((DiscordMember)e.Author).SendMessageAsync($"{Bot.BotSettings.ErrorEmoji} Для создания приглашения в свой канал, введите команду `!invite [текст]`\n" +
                                                                            $"Полный гайд в закрепленных сообщениях в канале <#{Bot.BotSettings.FindChannel}>.");
                        }
                        catch { }
                    }

                    var delete = new Timer(5000);
                    delete.Elapsed += async(sender, args) =>
                    {
                        try
                        {
                            if (!e.Message.Pinned)
                            {
                                await e.Message.DeleteAsync();
                            }
                        }
                        catch { }

                        delete.Stop();
                        delete.Close();
                    };
                    delete.Enabled = true;
                }
            }
        }
コード例 #11
0
        public static async Task ClientOnGuildMemberAdded(DiscordClient client, GuildMemberAddEventArgs e)
        {
            //Проверка на бан
            var userBans      = BanSQL.GetForUser(e.Member.Id);
            var unexpiredBans = new List <BanSQL>();

            foreach (var ban in userBans)
            {
                if (ban.UnbanDateTime > DateTime.Now)
                {
                    unexpiredBans.Add(ban);
                }
            }
            if (unexpiredBans.Any())
            {
                var message = "**У вас есть неистёкшие блокировки на этом сервере:** \n";
                foreach (var ban in unexpiredBans)
                {
                    message +=
                        $"• **Причина:** {ban.Reason}. **Истекает через** {Utility.FormatTimespan(ban.UnbanDateTime - DateTime.Now)} | {ban.UnbanDateTime:dd.MM.yyyy HH:mm:ss}\n";
                }

                try
                {
                    await e.Member.SendMessageAsync(message);
                }
                catch (UnauthorizedException)
                {
                    // if bot is in user's blacklist
                }

                await e.Member.BanAsync();

                return;
            }

            //Проверка на mute
            var reports = ReportSQL.GetForUser(e.Member.Id).Where(x => x.ReportEnd > DateTime.Now);

            if (reports.Any())
            {
                var blocksMessage = "**У вас есть неистекшие блокировки на этом сервере!**\n";
                foreach (var report in reports)
                {
                    string blockType = report.ReportType switch
                    {
                        ReportType.Mute => "Мут",
                        ReportType.CodexPurge => "Блокировка принятия правил",
                        ReportType.FleetPurge => "Блокировка рейдов",
                        ReportType.VoiceMute => "Мут в голосовых каналах",
                        _ => ""
                    };
                    blocksMessage += $"• **{blockType}:** истекает через {Utility.FormatTimespan(report.ReportEnd - DateTime.Now)}\n";

                    if (report.ReportType == ReportType.Mute)
                    {
                        await e.Member.GrantRoleAsync(e.Guild.GetRole(Bot.BotSettings.MuteRole));
                    }
                    else if (report.ReportType == ReportType.VoiceMute)
                    {
                        await e.Member.GrantRoleAsync(e.Guild.GetRole(Bot.BotSettings.VoiceMuteRole));
                    }
                    else if (report.ReportType == ReportType.CodexPurge)
                    {
                        await e.Member.GrantRoleAsync(e.Guild.GetRole(Bot.BotSettings.PurgeCodexRole));
                    }
                }

                try
                {
                    await e.Member.SendMessageAsync(blocksMessage);
                }
                catch (UnauthorizedException)
                {
                }
            }

            //Выдача доступа к приватным кораблям
            try
            {
                var ships = PrivateShip.GetUserShip(e.Member.Id);
                foreach (var ship in ships)
                {
                    await e.Guild.GetChannel(ship.Channel).AddOverwriteAsync(e.Member, Permissions.UseVoice);
                }
            }
            catch (Exception ex)
            {
                client.Logger.LogWarning(BotLoggerEvents.Event, $"Ошибка при выдаче доступа к приватному кораблю. \n{ex.Message}\n{ex.StackTrace}");
            }

            var invites      = Invites.AsReadOnly().ToList();   //Сохраняем список старых инвайтов в локальную переменную
            var guildInvites = await e.Guild.GetInvitesAsync(); //Запрашиваем новый список инвайтов

            Invites = guildInvites.ToList();                    //Обновляю список инвайтов

            try
            {
                await e.Member.SendMessageAsync($"**Привет, {e.Member.Mention}!\n**" +
                                                "Мы рады что ты присоединился к нашему сообществу :wink:!\n\n" +
                                                "Прежде чем приступать к игре, прочитай и прими правила в канале <#435486626551037963>.\n" +
                                                "После принятия можешь ознакомиться с гайдом по боту в канале <#476430819011985418>.\n" +
                                                "Если у тебя есть какие-то вопросы, не стесняйся писать администрации через бота. (Команда `!support`).\n\n" +
                                                "**Удачной игры!**");
            }
            catch (UnauthorizedException)
            {
                //Пользователь заблокировал бота
            }

            // Выдача ролей, которые были у участника перед выходом.
            if (UsersLeftList.Users.ContainsKey(e.Member.Id))
            {
                foreach (var role in UsersLeftList.Users[e.Member.Id].Roles)
                {
                    try
                    {
                        await e.Member.GrantRoleAsync(e.Guild.GetRole(role));
                    }
                    catch (NotFoundException)
                    {
                    }
                }

                UsersLeftList.Users.Remove(e.Member.Id);
                UsersLeftList.SaveToXML(Bot.BotSettings.UsersLeftXML);
            }

            //Определение инвайта
            try
            {
                //Находит обновившийся инвайт по количеству приглашений
                //Вызывает NullReferenceException в случае если ссылка только для одного использования
                var updatedInvite = guildInvites.ToList().Find(g => invites.Find(i => i.Code == g.Code).Uses < g.Uses);

                //Если не удалось определить инвайт, значит его нет в новых так как к.во использований ограничено и он был удален
                if (updatedInvite == null)
                {
                    updatedInvite = invites.Where(p => guildInvites.All(p2 => p2.Code != p.Code))                    //Ищем удаленный инвайт
                                    .Where(x => (x.CreatedAt.AddSeconds(x.MaxAge) < DateTimeOffset.Now))             //Проверяем если он не истёк
                                    .FirstOrDefault();                                                               //С такими условиями будет только один такой инвайт
                }

                if (updatedInvite != null)
                {
                    await e.Guild.GetChannel(Bot.BotSettings.UserlogChannel)
                    .SendMessageAsync(
                        $"**Участник присоединился:** {e.Member.Username}#{e.Member.Discriminator} ({e.Member.Id}) используя " +
                        $"приглашение {updatedInvite.Code} от участника {updatedInvite.Inviter.Username}#{updatedInvite.Inviter.Discriminator}. ");

                    client.Logger.LogInformation(BotLoggerEvents.Event, $"Участник {e.Member.Username}#{e.Member.Discriminator} ({e.Member.Id}) присоединился к серверу. " +
                                                 $"Приглашение: {updatedInvite.Code} от участника {updatedInvite.Inviter.Username}#{updatedInvite.Inviter.Discriminator}.");

                    //Проверяем если пригласивший уже существует, если нет то создаем
                    if (!InviterList.Inviters.ContainsKey(updatedInvite.Inviter.Id))
                    {
                        Inviter.Create(updatedInvite.Inviter.Id, e.Member.IsBot);
                    }

                    //Проверяем если пользователь был ранее приглашен другими и обновляем активность, если нет то вносим в список
                    if (InviterList.Inviters.ToList().Exists(x => x.Value.Referrals.ContainsKey(e.Member.Id)))
                    {
                        InviterList.Inviters.ToList().Where(x => x.Value.Referrals.ContainsKey(e.Member.Id)).ToList()
                        .ForEach(x => x.Value.UpdateReferral(e.Member.Id, true));
                    }
                    else
                    {
                        InviterList.Inviters[updatedInvite.Inviter.Id].AddReferral(e.Member.Id);
                    }

                    InviterList.SaveToXML(Bot.BotSettings.InviterXML);
                    //Обновление статистики приглашений
                    await LeaderboardCommands.UpdateLeaderboard(e.Guild);
                }
                else
                {
                    var guildInvite = await e.Guild.GetVanityInviteAsync();

                    if (guildInvite.Uses > GuildInviteUsage)
                    {
                        GuildInviteUsage = guildInvite.Uses;
                        await e.Guild.GetChannel(Bot.BotSettings.UserlogChannel).SendMessageAsync(
                            $"**Участник присоединился:** {e.Member.Username}#{e.Member.Discriminator} ({e.Member.Id}). " +
                            $"Используя персональную ссылку **{guildInvite.Code}**.");

                        client.Logger.LogInformation(BotLoggerEvents.Event, $"Участник {e.Member.Username}#{e.Member.Discriminator} ({e.Member.Id}) присоединился к серверу. Используя персональную ссылку {guildInvite.Code}.");
                    }
                    else
                    {
                        await e.Guild.GetChannel(Bot.BotSettings.UserlogChannel)
                        .SendMessageAsync(
                            $"**Участник присоединился:** {e.Member.Username}#{e.Member.Discriminator} ({e.Member.Id}). " +
                            $"Приглашение не удалось определить.");

                        client.Logger.LogInformation(BotLoggerEvents.Event, $"Участник {e.Member.Username}#{e.Member.Discriminator} ({e.Member.Id}) присоединился к серверу. Приглашение не удалось определить.");
                    }
                }
            }
            catch (Exception ex)
            {
                await e.Guild.GetChannel(Bot.BotSettings.UserlogChannel)
                .SendMessageAsync(
                    $"**Участник присоединился:** {e.Member.Username}#{e.Member.Discriminator} ({e.Member.Id}). " +
                    $"При попытке отследить инвайт произошла ошибка.");

                client.Logger.LogInformation(BotLoggerEvents.Event, $"Участник {e.Member.Username}#{e.Member.Discriminator} ({e.Member.Id}) присоединился к серверу. Приглашение не удалось определить.",
                                             DateTime.Now);

                client.Logger.LogWarning(BotLoggerEvents.Event, "Не удалось определить приглашение.",
                                         DateTime.Now);

                var errChannel = e.Guild.GetChannel(Bot.BotSettings.ErrorLog);

                var message = "**Ошибка при логгинге инвайта**\n" +
                              $"**Пользователь:** {e.Member}\n" +
                              $"**Исключение:** {ex.GetType()}:{ex.Message}\n" +
                              $"**Трассировка стека:** \n```{ex.StackTrace}```\n" +
                              $"{ex}";

                await errChannel.SendMessageAsync(message);
            }

            //Обновляем статус бота
            await Bot.UpdateBotStatusAsync(client, e.Guild);
        }