示例#1
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();
                    }
                }
            }
        }