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(); } }
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()); } }
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); } }
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} Пользователь не найден."); } }
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); } }