예제 #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();
            }
        }
예제 #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());
            }
        }