Ejemplo n.º 1
0
        public async Task InviteDelete(CommandContext ctx)
        {
            //Удаляем сообщение с командой
            try
            {
                await ctx.Message.DeleteAsync();
            }
            catch (NotFoundException) { }

            try
            {
                //Проверка если пользователь в канале
                if (ctx.Member.VoiceState == null ||
                    ctx.Member.VoiceState.Channel.Id == Bot.BotSettings.WaitingRoom)
                {
                    await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Вы должны быть в голосовом канале!");

                    return;
                }
            }
            catch (NullReferenceException)
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Вы должны быть в голосовом канале!");

                return;
            }

            var channel = ctx.Member.VoiceState?.Channel;

            if (VoiceListener.FindChannelInvites.ContainsKey(channel.Id))
            {
                try
                {
                    var embedMessage = await ctx.Guild.GetChannel(Bot.BotSettings.FindChannel).GetMessageAsync(VoiceListener.FindChannelInvites[channel.Id]);

                    ctx.Client.Logger.LogDebug(BotLoggerEvents.Commands, $"Удаление ембеда в поиске игроков!");
                    await embedMessage.DeleteAsync();
                }
                catch (NotFoundException) { }

                VoiceListener.FindChannelInvites.Remove(channel.Id);
                await VoiceListener.SaveFindChannelMessagesAsync();
            }
        }
Ejemplo n.º 2
0
        public async Task Invite(CommandContext ctx, [Description("Описание (На афину, на форт и т.д.)"), RemainingText] string description)
        {
            //Проверка на использование канала с поиском игроков
            if (ctx.Channel.Id != Bot.BotSettings.FindChannel)
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Команда может использоваться только в канале поиска игроков!");

                return;
            }

            //Удаляем сообщение с командой
            try
            {
                await ctx.Message.DeleteAsync();
            }
            catch { }

            try
            {
                //Проверка если пользователь в канале
                if (ctx.Member.VoiceState == null ||
                    ctx.Member.VoiceState.Channel.Id == Bot.BotSettings.WaitingRoom)
                {
                    await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Вы должны быть в голосовом канале!");

                    return;
                }
            }
            catch (NullReferenceException)
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Вы должны быть в голосовом канале!");

                return;
            }


            //Проверка на условия голосового канала
            var channel = ctx.Member.VoiceState?.Channel;

            if (channel.Users.Count() >= channel.UserLimit)
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Ваш канал уже заполнен!");

                return;
            }

            await ctx.TriggerTypingAsync();

            var invite = await channel.CreateInviteAsync();

            var usersNeeded = channel.UserLimit - channel.Users.Count();


            string embedThumbnail;

            //Если канал в категории рейда, вставляем картинку с рейдом и проверяем если это обычный канал рейда (в нём 1 лишний слот, его мы игнорируем)
            if (channel.Parent.Name.StartsWith("Рейд"))
            {
                if (channel.Name.StartsWith("Рейд"))
                {
                    usersNeeded = Math.Max(0, (usersNeeded - 1));
                }

                embedThumbnail = usersNeeded switch
                {
                    0 => Bot.BotSettings.ThumbnailFull,
                    _ => Bot.BotSettings.ThumbnailRaid
                };
            }
            //Если это не канал рейда, вставляем подходящую картинку по слотам, или NA если число другое
            else
            {
                embedThumbnail = usersNeeded switch
                {
                    0 => Bot.BotSettings.ThumbnailFull,
                    1 => Bot.BotSettings.ThumbnailOne,
                    2 => Bot.BotSettings.ThumbnailTwo,
                    3 => Bot.BotSettings.ThumbnailThree,
                    _ => Bot.BotSettings.ThumbnailNA
                };
            }

            //Собираем данные для эмбеда
            var content = "";

            content += ($"{DiscordEmoji.FromName(ctx.Client, ":loudspeaker:")} {description}\n\n");

            var slotsCount = 1;

            foreach (var member in channel.Users)
            {
                if (content.Length > 1900 || slotsCount > 15)
                {
                    content += $"{DiscordEmoji.FromName(ctx.Client, ":arrow_heading_down:")} и еще {channel.Users.Count() - slotsCount + 1}.\n";
                    break;
                }
                else
                {
                    content += $"{DiscordEmoji.FromName(ctx.Client, ":doubloon:")} {member.Mention}\n";
                    slotsCount++;
                }
            }

            for (int i = 0; i < usersNeeded; i++)
            {
                if (content.Length > 1900 || slotsCount > 15)
                {
                    if (i != 0) //Без этого сообщение будет отправлено вместе с тем что выше
                    {
                        content += $"{DiscordEmoji.FromName(ctx.Client, ":arrow_heading_down:")} и еще {channel.UserLimit - slotsCount + 1} свободно.\n";
                    }
                    break;
                }
                else
                {
                    content += $"{DiscordEmoji.FromName(ctx.Client, ":gold:")} ☐\n";
                    slotsCount++;
                }
            }

            content += $"\n**Подключиться:** {invite}";

            //Embed
            var embed = new DiscordEmbedBuilder
            {
                Description = content,
                Color       = new DiscordColor("#e67e22")
            };

            embed.WithAuthor($"{channel.Name}", url: invite.ToString(), iconUrl: ctx.Member.AvatarUrl);
            embed.WithThumbnail(embedThumbnail);
            embed.WithTimestamp(DateTime.Now);
            embed.WithFooter($"В поиске команды. +{usersNeeded}");

            //Проверка если сообщение было уже отправлено
            if (!VoiceListener.FindChannelInvites.ContainsKey(channel.Id))
            {
                var msg = await ctx.RespondAsync(embed : embed.Build());

                //Добавялем в словарь связку канал - сообщение и сохраняем в файл
                VoiceListener.FindChannelInvites[channel.Id] = msg.Id;

                await VoiceListener.SaveFindChannelMessagesAsync();
            }
            else
            {
                var embedMessage = await ctx.Channel.GetMessageAsync(VoiceListener.FindChannelInvites[channel.Id]);

                await embedMessage.ModifyAsync(embed : embed.Build());
            }
        }
Ejemplo n.º 3
0
        public async Task EventCheck(CommandContext ctx, DiscordMessage message, DiscordEmoji reaction)
        {
            await ctx.Message.DeleteAsync();

            await ctx.TriggerTypingAsync();

            var allReactions = new List <DiscordUser>();
            var reactions    = await message.GetReactionsAsync(reaction);

            while (reactions.Count() != 0)
            {
                allReactions.AddRange(reactions);
                reactions = await message.GetReactionsAsync(reaction, after : reactions.Last().Id);
            }

            var allReactionsMembers = await Task.WhenAll(allReactions.Select(async x =>
            {
                try
                {
                    await Task.Delay(400);
                    return(await ctx.Guild.GetMemberAsync(x.Id));
                } catch { }
                return(null);
            }));

            var reactionsList = allReactionsMembers.OrderByDescending(x => x.CreationTimestamp).Select(x => $"C: **{x.CreationTimestamp:dd.MM.yyyy}** J: **{x.JoinedAt:dd.MM.yyyy}** V: **{VoiceListener.GetUpdatedVoiceTime(x.Id)}** \n" +
                                                                                                       $"{x.Username} ({x.Id})").ToList();

            var members_pagination = Utility.GeneratePagesInEmbeds(reactionsList, $"Список проголосовавших (По дате создания аккаунта).");

            var interactivity = ctx.Client.GetInteractivity();

            if (members_pagination.Count() > 1)
            {
                await interactivity.SendPaginatedMessageAsync(await ctx.Member.CreateDmChannelAsync(), ctx.User, members_pagination, timeoutoverride : TimeSpan.FromMinutes(5));
            }
            else
            {
                await ctx.Member.SendMessageAsync(embed : members_pagination.First().Embed);
            }
        }
Ejemplo n.º 4
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} Пользователь не найден.");
                }
            }
Ejemplo n.º 5
0
        private static void Main()
        {
            //Attempt to change the app.config at run time to set the ChromeUserDataDirectory to the user's path via Environment.UserName
            Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

            config.AppSettings.Settings["ChromeUserDataDirectory"].Value = $"C:\\Users\\{Environment.UserName}\\AppData\\Local\\Google\\Chrome\\User Data";
            config.Save(ConfigurationSaveMode.Modified);

            _handler = ConsoleEventCallback;
            SetConsoleCtrlHandler(_handler, true);
            var chromeDriverTerminator    = new ChromeDriverTerminator();
            var chromeDriverCreator       = new ChromeDriverCreator();
            var internetConnectionChecker = new InternetConnectionChecker();
            SpeechRecognitionEngine speechRecognitionEngine = new SpeechRecognitionEngine(SpeechRecognitionEngine.InstalledRecognizers().First(x => x.Culture.ToString() == "en-US"));
            var voiceListener = new VoiceListener(speechRecognitionEngine);

            chromeDriverTerminator.TerminateAll();
            _driver = chromeDriverCreator.Create(ConfigurationManager.AppSettings["ChromeUserDataDirectory"]);
            var pingPlotterWindowStateChanger = new PingPlotterWindowStateChanger(new WindowStateChanger());
            var tabLoader       = new TabLoader(_driver, pingPlotterWindowStateChanger);
            var pageInitializer = new PageInitializer(_driver);
            var tabSwitcher     = new TabSwitcher(voiceListener, _driver);

            _tourGuide = new TourGuide(internetConnectionChecker, tabLoader, pageInitializer, pingPlotterWindowStateChanger, tabSwitcher);
            var pages = Pages.OrderBy(x => "https://reg.usps.com/entreg/LoginAction_input?app=Phoenix&appURL=https://informeddelivery.usps.com".Equals(x.Url) ? 0 : 1).ToList();

            try {
                _tourGuide.Guide(pages, _driver, OnLoadingPage, OnShowingPage, OnInitializingPage, OnExpired, OnError);

                void OnInitializingPage(int pageNumber, Page page)
                {
                    OnVerbingPage(pageNumber, page, "Initializing");
                }

                void OnLoadingPage(int pageNumber, Page page)
                {
                    OnVerbingPage(pageNumber, page, "Loading");
                }

                void OnShowingPage(int pageNumber, Page page)
                {
                    OnVerbingPage(pageNumber, page, "Showing");
                }

                void OnVerbingPage(int pageNumber, Page page, string verb)
                {
                    Console.WriteLine($"{DateTime.Now}: {verb} ({pageNumber}/{pages.Count}): '{page.Url}'");
                }

                void OnExpired(Page page)
                {
                    Console.WriteLine($"{DateTime.Now}: Expired: '{page.Url}'");
                }

                void OnError(Page page, Exception exception)
                {
                    Console.WriteLine($"ERROR - {DateTime.Now}: {exception}");
                    Thread.Sleep(5000);
                }
            }
            catch (Exception e) {
                Console.WriteLine($"Program {DateTime.Now}: {e}");
                Thread.Sleep(20000);
                ConsoleEventCallback(CtrlCloseEvent);
                Environment.Exit(1);
            }
        }