Beispiel #1
0
        public async Task Invite(CommandContext ctx, [Description("Участник")] DiscordMember member)
        {
            var ship = PrivateShip.GetOwnedShip(ctx.Member.Id);

            if (ship == null || ship.GetCaptain().Status == false)
            {
                await ctx.RespondAsync(
                    $"{Bot.BotSettings.ErrorEmoji} Ты не являешься владельцем корабля или твой запрос ещё не был подтвержден.");

                return;
            }

            if (ship.GetMembers().Any(m => m.MemberId == member.Id))
            {
                await ctx.RespondAsync(
                    $"{Bot.BotSettings.ErrorEmoji} Пользователь уже приглашен или является участником корабля.");

                return;
            }

            ship.AddMember(member.Id, PrivateShipMemberRole.Member, false);
            try
            {
                await member.SendMessageAsync(
                    $"Ты был приглашён присоединиться к кораблю **{ship.Name}**. Используй в канале для команд " +
                    $"`!p yes {ship.Name}`, чтобы принять приглашение, или `!p no {ship.Name}`, чтобы отклонить его.");
            }
            catch (UnauthorizedException)
            {
            }

            await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Приглашение успешно отправлено.");
        }
Beispiel #2
0
        public async Task Invite(CommandContext ctx, [Description("Участник")] DiscordMember member, [Description("Корабль (необязательно для капитанов)")]
                                 [RemainingText] string shipName)
        {
            PrivateShip ship = null;

            if (string.IsNullOrEmpty(shipName))
            {
                ship = PrivateShip.GetOwnedShip(ctx.Member.Id);
                if (ship == null)
                {
                    await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Ты не являешься капитаном. Офицеры могут использовать команду " +
                                           $"`!p invite участник название корабля`");

                    return;
                }
            }
            else
            {
                ship = PrivateShip.Get(shipName);
                if (ship == null)
                {
                    await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Указанный корабль не был найден!");

                    return;
                }
            }

            var requesterMember = ship.GetMember(ctx.Member.Id);

            if (requesterMember == null ||
                (requesterMember.Role != PrivateShipMemberRole.Officer && requesterMember.Role != PrivateShipMemberRole.Captain))
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Ты не являешься офицером или капитаном на данном корабле");

                return;
            }

            if (ship.GetMembers().Any(m => m.MemberId == member.Id))
            {
                await ctx.RespondAsync(
                    $"{Bot.BotSettings.ErrorEmoji} Пользователь уже приглашен или является участником корабля.");

                return;
            }

            ship.AddMember(member.Id, PrivateShipMemberRole.Member, false);
            try
            {
                await member.SendMessageAsync(
                    $":envelope: Ты был приглашён присоединиться к кораблю **{ship.Name}**. Используй в канале для команд " +
                    $"`!p yes {ship.Name}`, чтобы принять приглашение, или `!p no {ship.Name}`, чтобы отклонить его.");
            }
            catch (UnauthorizedException)
            {
            }

            await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Приглашение успешно отправлено.");
        }
Beispiel #3
0
        public async Task New(CommandContext ctx, [Description("Уникальное имя корабля")][RemainingText] string name)
        {
            // check if user already has a ship
            if (PrivateShip.GetOwnedShip(ctx.Member.Id) != null)
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Ты уже являешься владельцем корабля.");

                return;
            }

            var requestTime = DateTime.Now;

            // check if the ship name is not set
            if (string.IsNullOrEmpty(name))
            {
                await ctx.RespondAsync(
                    $"{Bot.BotSettings.ErrorEmoji} Ты не указал имя корабля: `!p new название корабля`");

                return;
            }

            // check if there is a ship with the same name
            if (PrivateShip.Get(name) != null)
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Корабль с таким именем уже существует.");

                return;
            }

            // create a new ship
            var ship = PrivateShip.Create(name, requestTime, 0);

            ship.AddMember(ctx.Member.Id, PrivateShipMemberRole.Captain, false);

            // create a request message
            var requestsChannel = ctx.Guild.GetChannel(Bot.BotSettings.PrivateRequestsChannel);
            var requestText     = "**Запрос на создание корабля**\n\n" +
                                  $"**От:** {ctx.Member.Mention} ({ctx.Member.Id})\n" +
                                  $"**Название:** {name}\n" +
                                  $"**Время:** {DateTime.Now}\n\n" +
                                  $"Используйте :white_check_mark: для подтверждения или :no_entry: для отказа.";
            var message = await requestsChannel.SendMessageAsync(requestText);

            await message.CreateReactionAsync(DiscordEmoji.FromName(ctx.Client, ":white_check_mark:"));

            await message.CreateReactionAsync(DiscordEmoji.FromName(ctx.Client, ":no_entry:"));

            ship.RequestMessage = message.Id;

            // notify user
            await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Запрос успешно отправлен");
        }
Beispiel #4
0
            private static string GetPrivateShip(ulong userId)
            {
                var ship = PrivateShip.GetOwnedShip(userId);

                if (ship == null)
                {
                    return(null);
                }
                else
                {
                    return(ship.Name);
                }
            }
Beispiel #5
0
        public async Task Kick(CommandContext ctx, [Description("Участник")] DiscordMember member)
        {
            var ship = PrivateShip.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;
            }

            var members  = ship.GetMembers();
            var selected = members.Find(m => m.MemberId == member.Id);

            if (selected == null)
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Этого участника нет на корабле.");

                return;
            }

            ship.RemoveMember(selected.MemberId);
            await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Ты успешно выгнал участника с корабля.");

            try
            {
                if (selected.Status)
                {
                    await ctx.Guild.GetChannel(ship.Channel).AddOverwriteAsync(member);

                    await member.SendMessageAsync($"Капитан **{ctx.Member.DisplayName}#{ctx.Member.Discriminator}** " +
                                                  $"выгнал тебя с корабля **{ship.Name}**");
                }
                else
                {
                    await member.SendMessageAsync($"Капитан **{ctx.Member.DisplayName}#{ctx.Member.Discriminator}** " +
                                                  $"отменил твоё приглашение на корабль **{ship.Name}**");
                }
            }
            catch (UnauthorizedException)
            {
            }
        }
Beispiel #6
0
        public async Task Transfer(CommandContext ctx, [Description("Новый капитан")] DiscordMember member)
        {
            var ship = PrivateShip.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;
            }

            var members    = ship.GetMembers();
            var oldCaptain = members.Find(m => m.Role == PrivateShipMemberRole.Captain);
            var newCaptain = members.Find(m => m.MemberId == member.Id);

            if (newCaptain == null)
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Нельзя передать права пользователю, которого нет на твоём корабле");

                return;
            }


            newCaptain.Role = PrivateShipMemberRole.Captain;
            if (oldCaptain != null)
            {
                oldCaptain.Role = PrivateShipMemberRole.Member;
            }

            await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Ты успешно передал должность капитана");

            try
            {
                await member.SendMessageAsync($"Ты был назначен капитаном корабля **{ship.Name}**");

                return;
            }
            catch (UnauthorizedException)
            {
            }
        }
Beispiel #7
0
        public async Task List(CommandContext ctx)
        {
            var ship = PrivateShip.GetOwnedShip(ctx.Member.Id);

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

                return;
            }

            var members = ship.GetMembers().OrderByDescending(m => m.Role).ToList();

            await ctx.Channel.TriggerTypingAsync();

            var memberList = new List <string>();

            foreach (var member in members)
            {
                DiscordMember discordMember = null;
                try
                {
                    discordMember = await ctx.Guild.GetMemberAsync(member.MemberId);
                }
                catch (NotFoundException)
                {
                    continue;
                }

                var type = PrivateShipMember.RoleEnumToStringRu(member.Role);

                memberList.Add($"{type} {discordMember.DisplayName}#{discordMember.Discriminator}.");
            }

            var interactivity     = ctx.Client.GetInteractivity();
            var membersPagination = Utility.GeneratePagesInEmbeds(memberList, $"Список членов экипажа вашего корабля.");

            if (memberList.Count() > 1)
            {
                await interactivity.SendPaginatedMessageAsync(ctx.Channel, ctx.User, membersPagination, timeoutoverride : TimeSpan.FromMinutes(5));
            }
            else
            {
                await ctx.RespondAsync(embed : membersPagination.First().Embed);
            }
        }
Beispiel #8
0
        public async Task Rename(CommandContext ctx, [RemainingText][Description("Новое название")]
                                 string name)
        {
            var ship = PrivateShip.GetOwnedShip(ctx.Member.Id);

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

                return;
            }

            ship.Name = name;
            name      = "☠" + name + "☠";
            await ctx.Guild.GetChannel(ship.Channel).ModifyAsync(x => x.Name = name);

            await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Успешно переименован корабль");
        }
Beispiel #9
0
        public async Task Demote(CommandContext ctx, [Description("Офицер")] DiscordMember member)
        {
            var ship = PrivateShip.GetOwnedShip(ctx.Member.Id);

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

                return;
            }

            // check if the specified member is a ship member
            var shipMember = ship.GetMember(member.Id);

            if (shipMember == null || !shipMember.Status)
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Этого участника нет на корабле");

                return;
            }

            // check if the specified member is not an officer
            if (shipMember.Role != PrivateShipMemberRole.Officer)
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Участник не является офицером");

                return;
            }

            shipMember.Role = PrivateShipMemberRole.Member;
            try
            {
                await member.SendMessageAsync($":arrow_down: Ты был снят с должности офицера на корабле **{ship.Name}**");
            }
            catch (UnauthorizedException)
            {
            }

            await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Участник был снят с должности офицера");
        }
Beispiel #10
0
        public async Task Promote(CommandContext ctx, [Description("Новый офицер")] DiscordMember member)
        {
            var ship = PrivateShip.GetOwnedShip(ctx.Member.Id);

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

                return;
            }

            // check if the specified member is a ship member
            var shipMember = ship.GetMember(member.Id);

            if (shipMember == null || !shipMember.Status)
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Нельзя назначить офицером пользователя, которого нет на корабле");

                return;
            }

            // check if the specified member is not an officer already
            if (shipMember.Role == PrivateShipMemberRole.Officer)
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Пользователь уже является офицером");

                return;
            }

            shipMember.Role = PrivateShipMemberRole.Officer;
            try
            {
                await member.SendMessageAsync($":arrow_up: Ты был назначен офицером на корабле **{ship.Name}**");
            }
            catch (UnauthorizedException)
            {
            }

            await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Участник был успешно назначен офицером");
        }
Beispiel #11
0
        public async Task List(CommandContext ctx, [Description("Название корабля (необязательно для капитанов)")][RemainingText] string shipName = null)
        {
            PrivateShip ship = null;

            if (string.IsNullOrEmpty(shipName))
            {
                ship = PrivateShip.GetOwnedShip(ctx.Member.Id);
                if (ship == null)
                {
                    await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Ты не являешься капитаном. Офицеры могут использовать команду " +
                                           $"`!p list название корабля`");

                    return;
                }
            }
            else
            {
                ship = PrivateShip.Get(shipName);
                if (ship == null)
                {
                    await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Указанный корабль не был найден!");

                    return;
                }
            }

            var requesterMember = ship.GetMember(ctx.Member.Id);

            if (requesterMember == null ||
                (requesterMember.Role != PrivateShipMemberRole.Officer && requesterMember.Role != PrivateShipMemberRole.Captain))
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Ты не являешься офицером или капитаном на данном корабле");

                return;
            }

            var members = ship.GetMembers().OrderByDescending(m => m.Role).ToList();

            await ctx.Channel.TriggerTypingAsync();

            var memberList = new List <string>();

            foreach (var member in members)
            {
                DiscordMember discordMember = null;
                try
                {
                    discordMember = await ctx.Guild.GetMemberAsync(member.MemberId);
                }
                catch (NotFoundException)
                {
                    continue;
                }

                var type = PrivateShipMember.RoleEnumToStringRu(member.Role);

                memberList.Add($"{type} {discordMember.DisplayName}#{discordMember.Discriminator}." + (member.Status ? null : " Приглашён."));
            }

            var interactivity     = ctx.Client.GetInteractivity();
            var membersPagination = Utility.GeneratePagesInEmbeds(memberList, $"Список членов экипажа вашего корабля.");

            if (memberList.Count() > 1)
            {
                //await interactivity.SendPaginatedMessageAsync(ctx.Channel, ctx.User, membersPagination, timeoutoverride: TimeSpan.FromMinutes(5));
                await interactivity.SendPaginatedMessageAsync(
                    channel : await ctx.Member.CreateDmChannelAsync(),
                    user : ctx.User,
                    pages : membersPagination,
                    behaviour : PaginationBehaviour.Ignore,
                    deletion : ButtonPaginationBehavior.DeleteButtons,
                    token : default);
Beispiel #12
0
        public async Task Kick(CommandContext ctx, [Description("Участник")] DiscordMember member, [RemainingText][Description("Название корабля (необязательно для капитанов)")] string shipName)
        {
            PrivateShip ship = null;

            if (string.IsNullOrEmpty(shipName))
            {
                ship = PrivateShip.GetOwnedShip(ctx.Member.Id);
                if (ship == null)
                {
                    await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Ты не являешься капитаном. Офицеры могут использовать команду " +
                                           $"`!p kick участник название корабля`");

                    return;
                }
            }
            else
            {
                ship = PrivateShip.Get(shipName);
                if (ship == null)
                {
                    await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Указанный корабль не был найден!");

                    return;
                }
            }

            var requesterMember = ship.GetMember(ctx.Member.Id);

            if (requesterMember == null ||
                (requesterMember.Role != PrivateShipMemberRole.Officer && requesterMember.Role != PrivateShipMemberRole.Captain))
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Ты не являешься офицером или капитаном на данном корабле");

                return;
            }

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

                return;
            }

            var members  = ship.GetMembers();
            var selected = members.Find(m => m.MemberId == member.Id);

            if (selected == null)
            {
                await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Этого участника нет на корабле.");

                return;
            }

            ship.RemoveMember(selected.MemberId);
            await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Ты успешно выгнал участника с корабля.");

            try
            {
                string title = requesterMember.Role == PrivateShipMemberRole.Captain ? "Капитан" : "Офицер";
                if (selected.Status)
                {
                    await ctx.Guild.GetChannel(ship.Channel).AddOverwriteAsync(member);

                    await member.SendMessageAsync($":right_facing_fist: {title} **{ctx.Member.DisplayName}#{ctx.Member.Discriminator}** " +
                                                  $"выгнал тебя с корабля **{ship.Name}**");
                }
                else
                {
                    await member.SendMessageAsync($":right_facing_fist: {title} **{ctx.Member.DisplayName}#{ctx.Member.Discriminator}** " +
                                                  $"отменил твоё приглашение на корабль **{ship.Name}**");
                }
            }
            catch (UnauthorizedException)
            {
            }
        }