public async Task New(CommandContext ctx, [Description("Уникальное имя корабля")][RemainingText]
                              string name)
        {
            var doc = XDocument.Load("actions.xml");

            foreach (var action in doc.Element("actions").Elements("action"))
            {
                if (Convert.ToUInt64(action.Value) == ctx.Member.Id)
                {
                    await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Вы не можете снова создать корабль!");

                    return;
                }
            }

            var ship = Ship.Create(name, 0, 0);

            ship.AddMember(ctx.Member.Id, MemberType.Owner);

            ShipList.SaveToXML(Bot.BotSettings.ShipXML);

            doc.Element("actions").Add(new XElement("action", ctx.Member.Id, new XAttribute("type", "ship")));
            doc.Save("actions.xml");

            await ctx.Guild.GetChannel(Bot.BotSettings.PrivateRequestsChannel)
            .SendMessageAsync($"**Запрос на создание корабля**\n\n" +
                              $"**От:** {ctx.Member.Mention} ({ctx.Member.Id})\n" +
                              $"**Название:** {name}\n" +
                              $"**Время:** {DateTime.Now.ToUniversalTime()}\n\n" +
                              $"Отправьте `{Bot.BotSettings.Prefix}confirm {name}` для подтверждения, или " +
                              $"`{Bot.BotSettings.Prefix}decline {name}` для отказа.");

            await ctx.RespondAsync(
                $"{Bot.BotSettings.OkEmoji} Успешно отправлен запрос на создание корабля **{name}**!");
        }
        public async Task Leave(CommandContext ctx, [Description("Корабль")][RemainingText]
                                string name)
        {
            if (!ShipList.Ships[name].Members.ContainsKey(ctx.Member.Id))
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Вы не являетесь членом этого корабля!");

                return;
            }

            if (ShipList.Ships[name].Members[ctx.Member.Id].Type == MemberType.Owner)
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Вы должны передать права владельца корабля прежде чем покинуть его!");

                return;
            }

            if (!ShipList.Ships[name].Members[ctx.Member.Id].Status)
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Чтобы отклонить приглашение используйте команду `!no`!");

                return;
            }

            ShipList.Ships[name].RemoveMember(ctx.Member.Id);
            ShipList.SaveToXML(Bot.BotSettings.ShipXML);

            await ctx.Member.RevokeRoleAsync(ctx.Guild.GetRole(ShipList.Ships[name].Role));

            await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Вы покинули корабль **{name}**!");
        }
        public async Task Invite(CommandContext ctx, [Description("Участник")] DiscordMember member)
        {
            var ship = ShipList.GetOwnedShip(ctx.Member.Id);

            if (ship == null)
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Вы не являетесь владельцем корабля!");

                return;
            }

            if (ctx.Member == member)
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Нельзя пригласить самого себя!");

                return;
            }

            ship.AddMember(member.Id);
            ShipList.SaveToXML(Bot.BotSettings.ShipXML);

            await member.SendMessageAsync(
                $"Вы были приглашены на корабль **{ship.Name}** участником **{ctx.Member.Username}**! Отправьте " +
                $"`{Bot.BotSettings.Prefix}yes {ship.Name}` для принятия приглашения, или `{Bot.BotSettings.Prefix}no {ship.Name}` для отказа.");

            await ctx.RespondAsync(
                $"{Bot.BotSettings.OkEmoji} Успешно отправлено приглашение участнику {member.Username}!");
        }
        public async Task ADelete(CommandContext ctx, [RemainingText] string name)
        {
            if (!ShipList.Ships.ContainsKey(name))
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Не найден корабль с названием **{name}**!");

                return;
            }

            var ship = ShipList.Ships[name];

            var role    = ctx.Guild.GetRole(ship.Role);
            var channel = ctx.Guild.GetChannel(ship.Channel);

            DiscordMember owner = null;

            foreach (var member in ship.Members.Values)
            {
                if (member.Type == MemberType.Owner)
                {
                    owner = await ctx.Guild.GetMemberAsync(member.Id);

                    break;
                }
            }

            ship.Delete();
            ShipList.SaveToXML(Bot.BotSettings.ShipXML);

            await ctx.Guild.DeleteRoleAsync(role);

            await channel.DeleteAsync();

            var doc = XDocument.Load("actions.xml");

            foreach (var action in doc.Element("actions").Elements("action"))
            {
                if (owner != null && Convert.ToUInt64(action.Value) == owner.Id)
                {
                    action.Remove();
                }
            }
            doc.Save("actions.xml");

            await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Успешно удален корабль!");

            await ctx.Guild.GetChannel(Bot.BotSettings.ModlogChannel).SendMessageAsync(
                $"**Удаление корабля**\n\n" +
                $"**Модератор:** {ctx.Member}\n" +
                $"**Корабль:** {name}\n" +
                $"**Владелец:** {owner}\n" +
                $"**Дата:** {DateTime.Now.ToUniversalTime()} UTC");
        }
        public async Task No(CommandContext ctx, [Description("Корабль")][RemainingText] string name)
        {
            var ship = ShipList.Ships[name];

            if (!ship.IsInvited(ctx.Member.Id))
            {
                await ctx.RespondAsync(
                    $"{Bot.BotSettings.ErrorEmoji} Вы не были приглашены присоединиться к этому кораблю!");

                return;
            }

            ship.RemoveMember(ctx.Member.Id);
            ShipList.SaveToXML(Bot.BotSettings.ShipXML);

            await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Вы успешно отклонили приглашение на корабль **{name}**!");
        }
        public async Task Confirm(CommandContext ctx, [Description("Название корабля")][RemainingText]
                                  string name)
        {
            if (!ShipList.Ships.ContainsKey(name))
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Не найден корабль с названием **{name}**!");

                return;
            }

            if (ShipList.Ships[name].Status)
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Корабль с названием **{name}** уже активирован!");

                return;
            }

            var role = await ctx.Guild.CreateRoleAsync($"☠{name}☠", null, new DiscordColor("7e41ad"), true, true);

            var channel = await ctx.Guild.CreateChannelAsync($"☠{name}☠", ChannelType.Voice,
                                                             ctx.Guild.GetChannel(Bot.BotSettings.PrivateCategory), Bot.BotSettings.Bitrate);

            await channel.AddOverwriteAsync(role, Permissions.UseVoice, Permissions.None);

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

            var member = await ctx.Guild.GetMemberAsync(ShipList.Ships[name].Members.ToArray()[0].Value.Id);

            await member.GrantRoleAsync(role);

            ShipList.Ships[name].SetChannel(channel.Id);
            ShipList.Ships[name].SetRole(role.Id);
            ShipList.Ships[name].SetStatus(true);
            ShipList.Ships[name].SetMemberStatus(member.Id, true);

            ShipList.SaveToXML(Bot.BotSettings.ShipXML);

            await member.SendMessageAsync(
                $"{Bot.BotSettings.OkEmoji} Запрос на создание корабля **{name}** был подтвержден администратором **{ctx.Member.Username}**");

            await ctx.RespondAsync(
                $"{Bot.BotSettings.OkEmoji} Вы успешно подтвердили запрос на создание корабля **{name}**!");
        }
        public async Task Kick(CommandContext ctx, [Description("Участник")] DiscordMember member)
        {
            var ship = ShipList.GetOwnedShip(ctx.Member.Id);

            if (ship == null)
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Вы не являетесь владельцем корабля!");

                return;
            }

            if (ctx.Member == member)
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Нельзя выгнать самого себя!");

                return;
            }

            if (!ship.Members.ContainsKey(member.Id))
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Этот участник не является членом вашего корабля!");

                return;
            }

            if (!ship.Members[member.Id].Status)
            {
                await ctx.RespondAsync(
                    $"{Bot.BotSettings.ErrorEmoji} Используйте команду `!uninvite [DiscordMember]`, чтобы отозвать приглашение!");

                return;
            }

            ship.RemoveMember(member.Id);
            await member.RevokeRoleAsync(ctx.Guild.GetRole(ship.Role));

            ShipList.SaveToXML(Bot.BotSettings.ShipXML);

            await ctx.RespondAsync(
                $"{Bot.BotSettings.OkEmoji} Вы выгнали участника **{member.Username}** с корабля **{ship.Name}**!");

            await member.SendMessageAsync($"Капитан **{ctx.Member.Username}** выгнал вас с корабля **{ship.Name}**!");
        }
        public async Task Yes(CommandContext ctx, [Description("Корабль")][RemainingText] string name)
        {
            var ship = ShipList.Ships[name];

            if (!ship.IsInvited(ctx.Member.Id))
            {
                await ctx.RespondAsync(
                    $"{Bot.BotSettings.ErrorEmoji} Вы не были приглашены присоединиться к этому кораблю!");

                return;
            }

            ship.SetMemberStatus(ctx.Member.Id, true);
            ShipList.SaveToXML(Bot.BotSettings.ShipXML);

            await ctx.Member.GrantRoleAsync(ctx.Guild.GetRole(ship.Role));

            await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Добро пожаловать на борт корабля **{name}**!");
        }
        public async Task Decline(CommandContext ctx, [Description("Название корабля")][RemainingText]
                                  string name)
        {
            if (!ShipList.Ships.ContainsKey(name))
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Не найден корабль с названием **{name}**!");

                return;
            }

            if (ShipList.Ships[name].Status)
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Корабль с названием **{name}** уже активирован!");

                return;
            }

            var member = await ctx.Guild.GetMemberAsync(ShipList.Ships[name].Members.ToArray()[0].Value.Id);

            ShipList.Ships[name].Delete();
            ShipList.SaveToXML(Bot.BotSettings.ShipXML);

            var doc = XDocument.Load("actions.xml");

            foreach (var action in doc.Element("actions").Elements("action"))
            {
                if (Convert.ToUInt64(action.Value) == member.Id)
                {
                    action.Remove();
                }
            }
            doc.Save("actions.xml");

            await member.SendMessageAsync(
                $"{Bot.BotSettings.OkEmoji} Запрос на создание корабля **{name}** был отклонен администратором **{ctx.Member.Username}**");

            await ctx.RespondAsync(
                $"{Bot.BotSettings.OkEmoji} Вы успешно отклонили запрос на создание корабля **{name}**!");
        }
        public async Task Prune(CommandContext ctx)
        {
            var ship = ShipList.GetOwnedShip(ctx.Member.Id);

            if (ship == null)
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Вы не являетесь владельцем корабля!");

                return;
            }

            List <ulong> toBePruned = new List <ulong>();

            foreach (var member in ship.Members)
            {
                try
                {
                    var m = await ctx.Guild.GetMemberAsync(member.Value.Id);
                }
                catch (NotFoundException)
                {
                    toBePruned.Add(member.Value.Id);
                }
            }

            int i = 0;

            foreach (var member in toBePruned)
            {
                ship.RemoveMember(member);
                ++i;
            }

            ShipList.SaveToXML(Bot.BotSettings.ShipXML);

            await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Успешно завершена очистка! Было удалено **{i}** человек.");
        }
        public async Task Rename(CommandContext ctx, [RemainingText][Description("Новое название")]
                                 string name)
        {
            var ship = ShipList.GetOwnedShip(ctx.Member.Id);

            if (ship == null)
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Вы не являетесь владельцем корабля!");

                return;
            }

            ship.Rename(name);
            ShipList.SaveToXML(Bot.BotSettings.ShipXML);
            ShipList.ReadFromXML(Bot.BotSettings.ShipXML); //костыль адовый

            name = "☠" + name + "☠";

            await ctx.Guild.UpdateRoleAsync(ctx.Guild.GetRole(ship.Role), name);

            await ctx.Guild.GetChannel(ship.Channel).ModifyAsync(name);

            await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Успешно переименован корабль!");
        }