Ejemplo n.º 1
0
        public ActionResult Add(long playerId, string from)
        {
            var blacklistEntryToRemove = new BlacklistEntry(playerId, from);

            _blacklistEntryAdder.Add("ns2", blacklistEntryToRemove);
            TempData["Success"] = string.Format("{0} blacklisted from {1}.", playerId, from);
            return(RedirectToAction("Manage"));
        }
Ejemplo n.º 2
0
        public async Task Check(CommandContext ctx)
        {
            await ctx.RespondAsync(
                $"{Bot.BotSettings.OkEmoji} Запущена проверка всех зарегистрированных аккаунтов. Она может занять некоторое время.");

            await ctx.TriggerTypingAsync();

            var blacklist = BlacklistEntry.GetAll();
            var message   = "**Следующие учётные записи были добавлены в чёрный список:**\n";

            /*
             * Algorythm:
             * 1) Get all BL entries
             * 2) For each BL entry:
             * 2.1) Get all accounts with the same IP.
             * 2.2) If is not the same account, then add to banlist
             */

            foreach (var entry in blacklist)
            {
                var webUser = WebUser.GetByDiscordId(entry.DiscordId);
                if (webUser == null)
                {
                    continue;
                }
                foreach (var ip in webUser.Ips)
                {
                    var sameIp = WebUser.GetUsersByIp(ip);
                    foreach (var sameIpUser in sameIp)
                    {
                        if (!BlacklistEntry.IsBlacklisted(sameIpUser.UserId))
                        {
                            string id = RandomString.NextString(6);
                            BlacklistEntry.Create(id, sameIpUser.UserId, sameIpUser.Username, sameIpUser.LastXbox,
                                                  DateTime.Now, ctx.Client.CurrentUser.Id, "Автоматическая блокировка системой защиты",
                                                  "");
                            message +=
                                $"• {sameIpUser.Username} ({sameIpUser.UserId}) - совпадение по IP c баном {entry.Id} ({webUser.Username})\n";
                            try
                            {
                                var member = await ctx.Guild.GetMemberAsync(sameIpUser.UserId);

                                await member.RevokeRoleAsync(ctx.Guild.GetRole(Bot.BotSettings.FleetCodexRole));
                            }
                            catch
                            {
                            }
                        }
                    }
                }
            }


            await ctx.RespondAsync(message);
        }
 public void SaveBlacklistEntry(BlacklistEntry BlacklistEntry)
 {
     if (BlacklistEntry.Id == 0)
     {
         context.BlacklistEntries.Add(BlacklistEntry);
     }
     else
     {
         var editMe = context.BlacklistEntries.Find(BlacklistEntry.Id);
         if (editMe != null)
         {
             // dbEntry.Name = BlacklistEntry.Name;
             // dbEntry.Message = BlacklistEntry.Message;
             // dbEntry.TimeStamp = BlacklistEntry.TimeStamp;
         }
     }
     context.SaveChanges();
 }
Ejemplo n.º 4
0
        public static string TogglePlayerBlacklist(Player creator, Player receiver)
        {
            IBlacklistEntryRepository repo = new EFBlacklistEntryRepository();
            var entry = repo.BlacklistEntries.FirstOrDefault(e => e.CreatorMembershipId == creator.MembershipId && e.TargetMembershipId == receiver.MembershipId);

            if (entry != null)
            {
                repo.DeleteBlacklistEntry(entry.Id);
                return(receiver.GetFullName() + " has been REMOVED from your blacklist.");
            }
            else
            {
                var newentry = new BlacklistEntry
                {
                    CreatorMembershipId = creator.MembershipId,
                    TargetMembershipId  = receiver.MembershipId,
                    Timestamp           = DateTime.UtcNow,
                    BlacklistLevel      = 1
                };
                repo.SaveBlacklistEntry(newentry);
                return(receiver.GetFullName() + " has been ADDED to your blacklist.");
            }
        }
Ejemplo n.º 5
0
        private Task InitCommands()
        {
            Command <TUser> newCommand = null;

// !global
            newCommand                     = new Command <TUser>("global");
            newCommand.Type                = CommandType.Standard;
            newCommand.Description         = "Display all teh numbers.";
            newCommand.RequiredPermissions = PermissionType.OwnerOnly;
            newCommand.OnExecute          += async e => {
                StringBuilder shards      = new StringBuilder();
                GlobalContext dbContext   = GlobalContext.Create(this.DbConfig.GetDbConnectionString());
                Shard         globalCount = new Shard();
                foreach (Shard shard in dbContext.Shards)
                {
                    globalCount.ServerCount       += shard.ServerCount;
                    globalCount.UserCount         += shard.UserCount;
                    globalCount.MemoryUsed        += shard.MemoryUsed;
                    globalCount.ThreadsActive     += shard.ThreadsActive;
                    globalCount.MessagesTotal     += shard.MessagesTotal;
                    globalCount.MessagesPerMinute += shard.MessagesPerMinute;
                    globalCount.OperationsRan     += shard.OperationsRan;
                    globalCount.OperationsActive  += shard.OperationsActive;
                    globalCount.Disconnects       += shard.Disconnects;

                    shards.AppendLine(shard.GetStatsString());
                }

                string message = "Server Status: <http://status.botwinder.info>\n\n" +
                                 $"Global Servers: `{globalCount.ServerCount}`\n" +
                                 $"Global Members `{globalCount.UserCount}`\n" +
                                 $"Global Allocated data Memory: `{globalCount.MemoryUsed} MB`\n" +
                                 $"Global Threads: `{globalCount.ThreadsActive}`\n" +
                                 $"Global Messages received: `{globalCount.MessagesTotal}`\n" +
                                 $"Global Messages per minute: `{globalCount.MessagesPerMinute}`\n" +
                                 $"Global Operations ran: `{globalCount.OperationsRan}`\n" +
                                 $"Global Operations active: `{globalCount.OperationsActive}`\n" +
                                 $"Global Disconnects: `{globalCount.Disconnects}`\n" +
                                 $"\n**Shards: `{dbContext.Shards.Count()}`**\n\n" +
                                 $"{shards.ToString()}";

                await SendMessageToChannel(e.Channel, message);
            };
            this.Commands.Add(newCommand.Id, newCommand);

// !getServer
            newCommand                     = new Command <TUser>("getServer");
            newCommand.Type                = CommandType.Standard;
            newCommand.Description         = "Display some info about specific server with id/name, or owners id/username.";
            newCommand.RequiredPermissions = PermissionType.OwnerOnly;
            newCommand.OnExecute          += async e => {
                if (string.IsNullOrEmpty(e.TrimmedMessage))
                {
                    await SendMessageToChannel(e.Channel, "Requires parameters.");

                    return;
                }

                guid id;
                guid.TryParse(e.TrimmedMessage, out id);
                StringBuilder             response     = new StringBuilder();
                IEnumerable <ServerStats> foundServers = null;
                if (!(foundServers = ServerContext.Create(this.DbConfig.GetDbConnectionString()).ServerStats.Where(s =>
                                                                                                                   s.ServerId == id || s.OwnerId == id ||
                                                                                                                   s.ServerName.ToLower().Contains($"{e.TrimmedMessage.ToLower()}") ||
                                                                                                                   s.OwnerName.ToLower().Contains($"{e.TrimmedMessage.ToLower()}")
                                                                                                                   )).Any())
                {
                    await SendMessageToChannel(e.Channel, "Server not found.");

                    return;
                }

                if (foundServers.Count() > 5)
                {
                    response.AppendLine("__**Found more than 5 servers!**__\n");
                }

                foreach (ServerStats server in foundServers.Take(5))
                {
                    response.AppendLine(server.ToString());
                    response.AppendLine();
                }

                await SendMessageToChannel(e.Channel, response.ToString());
            };
            this.Commands.Add(newCommand.Id, newCommand);

// !getInvite
            newCommand                     = new Command <TUser>("getInvite");
            newCommand.Type                = CommandType.Standard;
            newCommand.Description         = "Get an invite url with serverid.";
            newCommand.RequiredPermissions = PermissionType.OwnerOnly;
            newCommand.OnExecute          += async e => {
                guid         id;
                ServerConfig foundServer = null;
                if (string.IsNullOrEmpty(e.TrimmedMessage) ||
                    !guid.TryParse(e.TrimmedMessage, out id) ||
                    (foundServer = ServerContext.Create(this.DbConfig.GetDbConnectionString()).ServerConfigurations.FirstOrDefault(s => s.ServerId == id)) == null)
                {
                    await SendMessageToChannel(e.Channel, "Server not found.");

                    return;
                }

                if (string.IsNullOrEmpty(foundServer.InviteUrl))
                {
                    await SendMessageToChannel(e.Channel, "I don't have permissions to create this InviteUrl.");

                    return;
                }

                await SendMessageToChannel(e.Channel, foundServer.InviteUrl);
            };
            this.Commands.Add(newCommand.Id, newCommand);

// !maintenance
            newCommand                     = new Command <TUser>("maintenance");
            newCommand.Type                = CommandType.Standard;
            newCommand.Description         = "Performe maintenance";
            newCommand.RequiredPermissions = PermissionType.OwnerOnly;
            newCommand.OnExecute          += async e => {
                await SendMessageToChannel(e.Channel, "Okay, this may take a while...");
                await LogMaintenanceAndExit();
            };
            this.Commands.Add(newCommand.Id, newCommand);

// !restart
            newCommand                     = new Command <TUser>("restart");
            newCommand.Type                = CommandType.Standard;
            newCommand.Description         = "Shut down the bot.";
            newCommand.RequiredPermissions = PermissionType.OwnerOnly;
            newCommand.OnExecute          += async e => {
                await SendMessageToChannel(e.Channel, "bai");

                await Task.Delay(1000);

                Environment.Exit(0);
            };
            this.Commands.Add(newCommand.Id, newCommand);
            this.Commands.Add("shutdown", newCommand.CreateAlias("shutdown"));

// !getExceptions
            newCommand                     = new Command <TUser>("getExceptions");
            newCommand.Type                = CommandType.Standard;
            newCommand.Description         = "Get a list of exceptions.";
            newCommand.RequiredPermissions = PermissionType.OwnerOnly;
            newCommand.OnExecute          += async e => {
                StringBuilder response = new StringBuilder();
                if (string.IsNullOrEmpty(e.TrimmedMessage) || !int.TryParse(e.TrimmedMessage, out int n) || n <= 0)
                {
                    n = 5;
                }

                GlobalContext dbContext = GlobalContext.Create(this.DbConfig.GetDbConnectionString());
                foreach (ExceptionEntry exception in dbContext.Exceptions.Skip(Math.Max(0, dbContext.Exceptions.Count() - n)))
                {
                    response.AppendLine(exception.GetMessage());
                }

                string responseString = response.ToString();
                if (string.IsNullOrWhiteSpace(responseString))
                {
                    responseString = "I did not record any errors :stuck_out_tongue:";
                }
                await SendMessageToChannel(e.Channel, responseString);
            };
            this.Commands.Add(newCommand.Id, newCommand);

// !getException
            newCommand                     = new Command <TUser>("getException");
            newCommand.Type                = CommandType.Standard;
            newCommand.Description         = "Get an exception stack for specific ID.";
            newCommand.RequiredPermissions = PermissionType.OwnerOnly;
            newCommand.OnExecute          += async e => {
                string         responseString = "I couldn't find that exception.";
                ExceptionEntry exception      = null;
                GlobalContext  dbContext      = GlobalContext.Create(this.DbConfig.GetDbConnectionString());
                if (!string.IsNullOrEmpty(e.TrimmedMessage) && int.TryParse(e.TrimmedMessage, out int id) && (exception = dbContext.Exceptions.FirstOrDefault(ex => ex.Id == id)) != null)
                {
                    responseString = exception.GetStack();
                }

                await SendMessageToChannel(e.Channel, responseString);
            };
            this.Commands.Add(newCommand.Id, newCommand);

// !blacklist
            newCommand                     = new Command <TUser>("blacklist");
            newCommand.Type                = CommandType.Standard;
            newCommand.Description         = "Add or remove an ID to or from the blacklist.";
            newCommand.RequiredPermissions = PermissionType.OwnerOnly;
            newCommand.OnExecute          += async e => {
                guid   id             = 0;
                string responseString = "Invalid parameters.";
                if (e.MessageArgs == null || e.MessageArgs.Length < 2 || !guid.TryParse(e.MessageArgs[1], out id))
                {
                    if (!e.Message.MentionedUsers.Any())
                    {
                        await SendMessageToChannel(e.Channel, responseString);

                        return;
                    }

                    id = e.Message.MentionedUsers.First().Id;
                }

                GlobalContext dbContext = GlobalContext.Create(this.DbConfig.GetDbConnectionString());
                ServerStats   server    = ServerContext.Create(this.DbConfig.GetDbConnectionString()).ServerStats
                                          .FirstOrDefault(s => s.ServerId == id || s.OwnerId == id);
                switch (e.MessageArgs[0])
                {
                case "add":
                    if (dbContext.Blacklist.Any(b => b.Id == id))
                    {
                        responseString = "That ID is already blacklisted.";
                        break;
                    }

                    dbContext.Blacklist.Add(new BlacklistEntry()
                    {
                        Id = id
                    });
                    dbContext.SaveChanges();
                    responseString = server == null ? "Done." : server.ServerId == id ?
                                     $"I'll be leaving `{server.OwnerName}`'s server `{server.ServerName}` shortly." :
                                     $"All of `{server.OwnerName}`'s servers are now blacklisted.";
                    break;

                case "remove":
                    BlacklistEntry entry = dbContext.Blacklist.FirstOrDefault(b => b.Id == id);
                    if (entry == null)
                    {
                        responseString = "That ID was not blacklisted.";
                        break;
                    }

                    dbContext.Blacklist.Remove(entry);
                    dbContext.SaveChanges();
                    responseString = server == null ? "Done." : server.ServerId == id ?
                                     $"Entry for `{server.OwnerName}`'s server `{server.ServerName}` was removed from the balcklist." :
                                     $"Entries for all `{server.OwnerName}`'s servers were removed from the blacklist.";
                    break;

                default:
                    responseString = "Invalid keyword.";
                    break;
                }

                await SendMessageToChannel(e.Channel, responseString);
            };
            this.Commands.Add(newCommand.Id, newCommand);

// !subscriber
            newCommand                     = new Command <TUser>("subscriber");
            newCommand.Type                = CommandType.Standard;
            newCommand.Description         = "Add or remove an ID to or from the subscribers, use with optional bonus or premium parameter.";
            newCommand.RequiredPermissions = PermissionType.OwnerOnly;
            newCommand.OnExecute          += async e => {
                guid   id             = 0;
                string responseString = "Invalid parameters.";
                if (e.MessageArgs == null || e.MessageArgs.Length < 2 ||
                    !guid.TryParse(e.MessageArgs[1], out id))
                {
                    if (!e.Message.MentionedUsers.Any())
                    {
                        await SendMessageToChannel(e.Channel, responseString);

                        return;
                    }

                    id = e.Message.MentionedUsers.First().Id;
                }

                GlobalContext dbContext  = GlobalContext.Create(this.DbConfig.GetDbConnectionString());
                Subscriber    subscriber = dbContext.Subscribers.FirstOrDefault(s => s.UserId == id);
                switch (e.MessageArgs[0])                //Nope - mentioned users above mean that there is a parameter.
                {
                case "add":
                    if (subscriber == null)
                    {
                        dbContext.Subscribers.Add(subscriber = new Subscriber()
                        {
                            UserId = id
                        });
                    }

                    for (int i = 2; i < e.MessageArgs.Length; i++)
                    {
                        subscriber.HasBonus  = subscriber.HasBonus || e.MessageArgs[i] == "bonus";
                        subscriber.IsPremium = subscriber.IsPremium || e.MessageArgs[i] == "premium";
                    }

                    dbContext.SaveChanges();
                    responseString = "Done.";
                    break;

                case "remove":
                    if (subscriber == null)
                    {
                        responseString = "That ID was not a subscriber.";
                        break;
                    }

                    responseString = "Done.";
                    if (e.MessageArgs.Length < 3)
                    {
                        dbContext.Subscribers.Remove(subscriber);
                        break;
                    }

                    for (int i = 2; i < e.MessageArgs.Length; i++)
                    {
                        subscriber.HasBonus  = subscriber.HasBonus && e.MessageArgs[i] != "bonus";
                        subscriber.IsPremium = subscriber.IsPremium && e.MessageArgs[i] != "premium";
                    }

                    dbContext.SaveChanges();
                    break;

                default:
                    responseString = "Invalid keyword.";
                    break;
                }

                await SendMessageToChannel(e.Channel, responseString);
            };
            this.Commands.Add(newCommand.Id, newCommand);

// !partner
            newCommand                     = new Command <TUser>("partner");
            newCommand.Type                = CommandType.Standard;
            newCommand.Description         = "Add or remove an ID to or from the partners, use with optional premium parameter.";
            newCommand.RequiredPermissions = PermissionType.OwnerOnly;
            newCommand.OnExecute          += async e => {
                guid   id             = 0;
                string responseString = "Invalid parameters.";
                if (e.MessageArgs == null || e.MessageArgs.Length < 2 ||
                    !guid.TryParse(e.MessageArgs[1], out id))
                {
                    if (!e.Message.MentionedUsers.Any())
                    {
                        await SendMessageToChannel(e.Channel, responseString);

                        return;
                    }

                    id = e.Message.MentionedUsers.First().Id;
                }

                GlobalContext   dbContext = GlobalContext.Create(this.DbConfig.GetDbConnectionString());
                PartneredServer partner   = dbContext.PartneredServers.FirstOrDefault(s => s.ServerId == id);
                switch (e.MessageArgs[0])                //Nope - mentioned users above mean that there is a parameter.
                {
                case "add":
                    if (partner == null)
                    {
                        dbContext.PartneredServers.Add(partner = new PartneredServer()
                        {
                            ServerId = id
                        });
                    }

                    if (e.MessageArgs.Length > 2)
                    {
                        partner.IsPremium = partner.IsPremium || e.MessageArgs[2] == "premium";
                    }

                    dbContext.SaveChanges();
                    responseString = "Done.";
                    break;

                case "remove":
                    if (partner == null)
                    {
                        responseString = "That ID was not a partner.";
                        break;
                    }

                    responseString = "Done.";
                    if (e.MessageArgs.Length < 3)
                    {
                        dbContext.PartneredServers.Remove(partner);
                        break;
                    }

                    if (e.MessageArgs.Length > 2)
                    {
                        partner.IsPremium = partner.IsPremium && e.MessageArgs[2] != "premium";
                    }

                    dbContext.SaveChanges();
                    break;

                default:
                    responseString = "Invalid keyword.";
                    break;
                }

                await SendMessageToChannel(e.Channel, responseString);
            };
            this.Commands.Add(newCommand.Id, newCommand);

// !operations
            newCommand                     = new Command <TUser>("operations");
            newCommand.Type                = CommandType.Standard;
            newCommand.Description         = "Display info about all queued or running operations on your server.";
            newCommand.RequiredPermissions = PermissionType.ServerOwner | PermissionType.Admin;
            newCommand.OnExecute          += async e => {
                StringBuilder response      = new StringBuilder();
                bool          allOperations = IsGlobalAdmin(e.Message.Author.Id);

                response.AppendLine($"Total operations in the queue: `{this.CurrentOperations.Count}`");
                if (allOperations)
                {
                    response.AppendLine($"Currently allocated data Memory: `{(GC.GetTotalMemory(false) / 1000000f):#0.00} MB`");
                }

                response.AppendLine();
                lock (this.OperationsLock)
                {
                    foreach (Operation <TUser> op in this.CurrentOperations)
                    {
                        if (!allOperations && op.CommandArgs.Server.Id != e.Server.Id)
                        {
                            continue;
                        }

                        response.AppendLine(op.ToString());
                        if (allOperations)
                        {
                            response.AppendLine($"Server: `{op.CommandArgs.Server.Guild.Name}`\n" +
                                                $"ServerID: `{op.CommandArgs.Server.Id}`\n" +
                                                $"Allocated DataMemory: `{op.AllocatedMemoryStarted:#0.00} MB`\n");
                        }
                    }
                }

                string responseString = response.ToString();
                if (string.IsNullOrEmpty(responseString))
                {
                    responseString = "There are no operations running.";
                }

                await SendMessageToChannel(e.Channel, responseString);
            };
            this.Commands.Add(newCommand.Id, newCommand);

// !cancel
            newCommand                     = new Command <TUser>("cancel");
            newCommand.Type                = CommandType.Standard;
            newCommand.Description         = "Cancel queued or running operation - use in the same channel, and with the name of the command as parameter. (nuke, archive, etc...)";
            newCommand.RequiredPermissions = PermissionType.ServerOwner | PermissionType.Admin;
            newCommand.OnExecute          += async e => {
                string            responseString = "Operation not found.";
                Operation <TUser> operation      = null;

                if (!string.IsNullOrEmpty(e.TrimmedMessage) &&
                    (operation = this.CurrentOperations.FirstOrDefault(
                         op => op.CommandArgs.Channel.Id == e.Channel.Id &&
                         op.CommandArgs.Command.Id == e.TrimmedMessage)) != null)
                {
                    responseString = "Operation canceled:\n\n" + operation.ToString();
                }

                await SendMessageToChannel(e.Channel, responseString);
            };
            this.Commands.Add(newCommand.Id, newCommand);

// !say
            newCommand                     = new Command <TUser>("say");
            newCommand.Type                = CommandType.Standard;
            newCommand.Description         = "Make the bot say something!";
            newCommand.RequiredPermissions = PermissionType.SubModerator;
            newCommand.DeleteRequest       = true;
            newCommand.IsBonusCommand      = true;
            newCommand.OnExecute          += async e => {
                if (string.IsNullOrWhiteSpace(e.TrimmedMessage))
                {
                    return;
                }
                await SendMessageToChannel(e.Channel, e.TrimmedMessage);
            };
            this.Commands.Add(newCommand.Id, newCommand);

// !ping
            newCommand                     = new Command <TUser>("ping");
            newCommand.Type                = CommandType.Standard;
            newCommand.Description         = "Measure how long does it take to receive a message and handle it as a command.";
            newCommand.RequiredPermissions = PermissionType.Everyone;
            newCommand.OnExecute          += async e => {
                TimeSpan time           = DateTime.UtcNow - Utils.GetTimeFromId(e.Message.Id);
                string   responseString = "`" + time.TotalMilliseconds.ToString("#00") + "`ms";
                await SendMessageToChannel(e.Channel, responseString);
            };
            this.Commands.Add(newCommand.Id, newCommand);

// !help
            newCommand                     = new Command <TUser>("help");
            newCommand.Type                = CommandType.Standard;
            newCommand.Description         = "PMs a list of Custom Commands for the server if used without a parameter. Use with a parameter to search for specific commands.";
            newCommand.RequiredPermissions = PermissionType.Everyone;
            newCommand.OnExecute          += async e => {
                StringBuilder response       = new StringBuilder("Please refer to the website documentation for the full list of features and commands: <http://botwinder.info/docs>\n\n");
                StringBuilder commandStrings = new StringBuilder();

                bool          isSpecific         = !string.IsNullOrWhiteSpace(e.TrimmedMessage);
                string        prefix             = e.Server.Config.CommandPrefix;
                List <string> includedCommandIds = new List <string>();
                int           count = 0;

                void AddCustomAlias(string commandId)
                {
                    List <CustomAlias> aliases = e.Server.CustomAliases.Values.Where(a => a.CommandId == commandId).ToList();
                    int aliasCount             = aliases.Count;

                    if (aliasCount > 0)
                    {
                        commandStrings.Append(aliasCount == 1 ? " **-** Custom Alias: " : " **-** Custom Aliases: ");
                        for (int i = 0; i < aliasCount; i++)
                        {
                            commandStrings.Append((i == 0 ? "`" : i == aliasCount - 1 ? " and `" : ", `") +
                                                  prefix + aliases[i].Alias + "`");
                        }
                    }
                    commandStrings.AppendLine();
                }

                void AddCommand(Command <TUser> cmd)
                {
                    commandStrings.AppendLine($"\n```diff\n{(cmd.CanExecute(this, e.Server, e.Channel, e.Message.Author as SocketGuildUser) ? "+" : "-")}" +
                                              $"  {prefix}{cmd.Id}```" +
                                              $" **-** {cmd.Description}");
                    if (cmd.Aliases != null && cmd.Aliases.Any())
                    {
                        int aliasCount = cmd.Aliases.Count;
                        commandStrings.Append(aliasCount == 1 ? " **-** Alias: " : " **-** Aliases: ");
                        for (int i = 0; i < aliasCount; i++)
                        {
                            commandStrings.Append((i == 0 ? "`" : i == aliasCount - 1 ? " and `" : ", `") +
                                                  prefix + cmd.Aliases[i] + "`");
                        }
                        commandStrings.AppendLine();
                    }

                    AddCustomAlias(cmd.Id);
                }

                void AddCustomCommand(CustomCommand cmd)
                {
                    commandStrings.AppendLine($"\n```diff\n{(cmd.CanExecute(this, e.Server, e.Channel, e.Message.Author as SocketGuildUser) ? "+" : "-")}" +
                                              $"  {prefix}{cmd.CommandId}```" +
                                              $" **-** {cmd.Description}");

                    AddCustomAlias(cmd.CommandId);
                }

                if (isSpecific)
                {
                    string expression = e.TrimmedMessage.Replace(" ", "|") + ")\\w*";
                    if (e.MessageArgs.Length > 1)
                    {
                        expression += "(" + expression;
                    }
                    Regex regex = new Regex($"\\w*({expression}", RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(10f));

                    foreach (Command <TUser> cmd in e.Server.Commands.Values)
                    {
                        if (!cmd.IsHidden &&
                            cmd.RequiredPermissions != PermissionType.OwnerOnly &&
                            regex.Match(cmd.Id).Success)
                        {
                            Command <TUser> command = cmd;
                            if (cmd.IsAlias && e.Server.Commands.ContainsKey(cmd.ParentId))
                            {
                                command = e.Server.Commands[cmd.ParentId];
                            }

                            if (includedCommandIds.Contains(command.Id))
                            {
                                continue;
                            }

                            if (++count > 5)
                            {
                                break;
                            }

                            AddCommand(cmd);
                        }
                    }

                    foreach (CustomCommand cmd in e.Server.CustomCommands.Values)
                    {
                        if (regex.Match(cmd.CommandId).Success)                          //Chances are that it's gonna fail more often.
                        {
                            if (includedCommandIds.Contains(cmd.CommandId))
                            {
                                continue;
                            }

                            if (++count > 5)
                            {
                                break;
                            }

                            AddCustomCommand(cmd);
                        }
                    }

                    foreach (CustomAlias alias in e.Server.CustomAliases.Values)
                    {
                        if (regex.Match(alias.Alias).Success)                          //Chances are that it's gonna fail more often.
                        {
                            if (includedCommandIds.Contains(alias.CommandId))
                            {
                                continue;
                            }

                            if (++count > 5)
                            {
                                break;
                            }

                            if (e.Server.Commands.ContainsKey(alias.CommandId))
                            {
                                AddCommand(e.Server.Commands[alias.CommandId]);
                            }
                            else if (e.Server.CustomCommands.ContainsKey(alias.CommandId))
                            {
                                AddCustomCommand(e.Server.CustomCommands[alias.CommandId]);
                            }
                        }
                    }

                    if (count == 0)
                    {
                        response.AppendLine("I did not find any commands matching your search expression.");
                    }
                    else
                    {
                        if (count > 5)
                        {
                            response.AppendLine("I found too many commands matching your search expression. **Here are the first five:**");
                        }

                        response.Append(commandStrings.ToString());
                    }
                }
                else                 //Not specific - PM CustomCommands.
                {
                    foreach (CustomCommand cmd in e.Server.CustomCommands.Values)
                    {
                        if (includedCommandIds.Contains(cmd.CommandId))
                        {
                            continue;
                        }

                        if (++count > 5)
                        {
                            break;
                        }

                        AddCustomCommand(cmd);
                    }

                    response.AppendLine("I've PMed you the Custom Commands for this server.");
                    await e.Message.Author.SendMessageSafe(commandStrings.ToString());
                }

                await SendMessageToChannel(e.Channel, response.ToString());
            };
            this.Commands.Add(newCommand.Id, newCommand);

/*
 * // !command
 *                      newCommand = new Command<TUser>("command");
 *                      newCommand.Type = CommandType.Standard;
 *                      newCommand.Description = "";
 *                      newCommand.RequiredPermissions = PermissionType.OwnerOnly;
 *                      newCommand.OnExecute += async e => {
 *                              string responseString = "";
 *                              await SendMessageToChannel(e.Channel, responseString);
 *                      };
 *                      this.Commands.Add(newCommand.Id, newCommand);
 *
 */
            return(Task.CompletedTask);
        }
Ejemplo n.º 6
0
        public static async Task ClientOnMessageReactionAdded(DiscordClient client, MessageReactionAddEventArgs e)
        {
            var discordUser = await client.GetUserAsync(e.User.Id);

            if (discordUser.IsBot)
            {
                return;
            }

            //Проверка если сообщение с принятием правил сообщества
            if (e.Message.Id == Bot.BotSettings.CodexMessageId && e.Emoji.GetDiscordName() == ":white_check_mark:")
            {
                //При надобности добавить кулдаун

                /*if (EmojiCooldowns.ContainsKey(e.User)) // проверка на кулдаун
                 *  if ((EmojiCooldowns[e.User] - DateTime.Now).Seconds > 0) return;
                 *
                 * // если проверка успешно пройдена, добавим пользователя
                 * // в словарь кулдаунов
                 * EmojiCooldowns[e.User] = DateTime.Now.AddSeconds(Bot.BotSettings.FastCooldown);*/

                //Проверка на purge
                var       hasPurge   = false;
                ReportSQL validPurge = null;
                foreach (var purge in ReportSQL.GetForUser(discordUser.Id, ReportType.CodexPurge))
                {
                    if (purge.ReportEnd > DateTime.Now)
                    {
                        validPurge = purge;
                        hasPurge   = true;
                        break;
                    }
                }

                if (hasPurge)
                {
                    var moderator = await e.Channel.Guild.GetMemberAsync(validPurge.Moderator);

                    try
                    {
                        await(await e.Guild.GetMemberAsync(discordUser.Id)).SendMessageAsync(
                            "**Возможность принять правила заблокирована**\n" +
                            $"**Снятие через:** {Utility.FormatTimespan(DateTime.Now - validPurge.ReportEnd)}\n" +
                            $"**Модератор:** {moderator.Username}#{moderator.Discriminator}\n" +
                            $"**Причина:** {validPurge.Reason}\n");
                    }

                    catch (UnauthorizedException)
                    {
                        //user can block the bot
                    }
                    return;
                }

                //Выдаем роль правил
                var member = await e.Guild.GetMemberAsync(discordUser.Id);

                //Проверка времени входа на сервер.
                if (member.JoinedAt > DateTime.Now.AddMinutes(-10))
                {
                    try
                    {
                        await member.SendMessageAsync(
                            $"{Bot.BotSettings.ErrorEmoji} Для принятия правил вы должны находиться на сервере минимум " +
                            $"**{Utility.FormatTimespan(TimeSpan.FromMinutes(10))}**.");

                        await e.Message.DeleteReactionAsync(DiscordEmoji.FromName(client, ":white_check_mark:"), member);
                    }
                    catch (UnauthorizedException) { }
                    return;
                }

                if (!member.Roles.Contains(e.Channel.Guild.GetRole(Bot.BotSettings.CodexRole)))
                {
                    //Выдаем роль правил
                    await member.GrantRoleAsync(e.Channel.Guild.GetRole(Bot.BotSettings.CodexRole));

                    //Убираем роль блокировки правил
                    await member.RevokeRoleAsync(e.Channel.Guild.GetRole(Bot.BotSettings.PurgeCodexRole));

                    client.Logger.LogInformation(BotLoggerEvents.Event, $"Пользователь {discordUser.Username}#{discordUser.Discriminator} ({discordUser.Id}) подтвердил прочтение правил через реакцию.");
                }

                return;
            }

            //Проверка если сообщение с принятием правил рейда
            if (e.Message.Id == Bot.BotSettings.FleetCodexMessageId && e.Emoji.GetDiscordName() == ":white_check_mark:")
            {
                //Проверка на purge
                var       hasPurge   = false;
                ReportSQL validPurge = null;
                foreach (var purge in ReportSQL.GetForUser(discordUser.Id, ReportType.FleetPurge))
                {
                    if (purge.ReportEnd > DateTime.Now)
                    {
                        validPurge = purge;
                        hasPurge   = true;
                        break;
                    }
                }

                if (hasPurge)
                {
                    var moderator = await e.Channel.Guild.GetMemberAsync(validPurge.Moderator);

                    try
                    {
                        await(await e.Guild.GetMemberAsync(discordUser.Id)).SendMessageAsync(
                            "**Возможность принять правила заблокирована**\n" +
                            $"**Снятие через:** {Utility.FormatTimespan(DateTime.Now - validPurge.ReportEnd)}\n" +
                            $"**Модератор:** {moderator.Username}#{moderator.Discriminator}\n" +
                            $"**Причина:** {validPurge.Reason}\n");
                    }

                    catch (UnauthorizedException)
                    {
                        //user can block the bot
                    }
                    return;
                } //Удаляем блокировку если истекла

                var member = await e.Guild.GetMemberAsync(discordUser.Id);

                //Проверка времени входа на сервер.
                if (member.JoinedAt > DateTime.Now.AddDays(-Bot.BotSettings.FleetDateOffset))
                {
                    await member.SendMessageAsync(
                        $"{Bot.BotSettings.ErrorEmoji} Для получения доступа к рейдам вы должны находиться на сервере " +
                        $"**{Utility.FormatTimespan(TimeSpan.FromDays(Bot.BotSettings.FleetDateOffset))}**.");

                    await e.Message.DeleteReactionAsync(DiscordEmoji.FromName(client, ":white_check_mark:"), member);

                    return;
                }

                var voiceTime = VoiceListener.GetUpdatedVoiceTime(e.User.Id);
                //Проверка на время проведенное в голосовых каналах
                if (voiceTime < TimeSpan.FromHours(Bot.BotSettings.FleetVoiceTimeOffset))
                {
                    await member.SendMessageAsync(
                        $"{Bot.BotSettings.ErrorEmoji} Для получения доступа к рейдам вы должны провести " +
                        $"**{Utility.FormatTimespan(TimeSpan.FromHours(Bot.BotSettings.FleetVoiceTimeOffset))}** в голосовых каналах. " +
                        $"Ваше время: **{Utility.FormatTimespan(voiceTime)}**");

                    await e.Message.DeleteReactionAsync(DiscordEmoji.FromName(client, ":white_check_mark:"), member);

                    return;
                }

                //Проверка на регистрацию и привязку Xbox

                var webUser = WebUser.GetByDiscordId(member.Id);
                if (webUser == null)
                {
                    await member.SendMessageAsync(
                        $"{Bot.BotSettings.ErrorEmoji} Для получения доступа к рейдам вам нужно авторизоваться с помощью Discord на сайте {Bot.BotSettings.WebURL}login.");

                    await e.Message.DeleteReactionAsync(DiscordEmoji.FromName(client, ":white_check_mark:"), member);

                    return;
                }

                if (webUser.LastXbox == "")
                {
                    await member.SendMessageAsync($"{Bot.BotSettings.ErrorEmoji} Для получения доступа к рейдам вы должны привязать Xbox к своему аккаунту, затем перейдите по ссылке " +
                                                  $"{Bot.BotSettings.WebURL}xbox - это обновит базу данных.");

                    await e.Message.DeleteReactionAsync(DiscordEmoji.FromName(client, ":white_check_mark:"), member);

                    return;
                }

                // Проверка ЧС

                if (BlacklistEntry.IsBlacklisted(member.Id) || BlacklistEntry.IsBlacklistedXbox(webUser.LastXbox))
                {
                    await member.SendMessageAsync(
                        $"{Bot.BotSettings.ErrorEmoji} Вы находитесь в чёрном списке рейдов и вам навсегда ограничен доступ к ним.");

                    return;
                }

                //Выдаем роль правил рейда
                if (!member.Roles.Any(x => x.Id == Bot.BotSettings.FleetCodexRole))
                {
                    await member.GrantRoleAsync(e.Channel.Guild.GetRole(Bot.BotSettings.FleetCodexRole));

                    await e.Guild.GetChannel(Bot.BotSettings.FleetLogChannel)
                    .SendMessageAsync($"{DiscordEmoji.FromName(client, ":new:")} Пользователь **{e.User.Username}#{e.User.Discriminator}** ({e.User.Id}) получил роль рейда. **Xbox:** {webUser.LastXbox}.");

                    client.Logger.LogInformation(BotLoggerEvents.Event, $"Пользователь {discordUser.Username}#{discordUser.Discriminator} ({discordUser.Id}) подтвердил прочтение правил рейда.");
                }

                return;
            }

            //Проверка на сообщение эмиссарства
            if (e.Message.Id == Bot.BotSettings.EmissaryMessageId)
            {
                await e.Message.DeleteReactionAsync(e.Emoji, discordUser);

                if (EmojiCooldowns.ContainsKey(discordUser)) // проверка на кулдаун
                {
                    if ((EmojiCooldowns[discordUser] - DateTime.Now).Seconds > 0)
                    {
                        return;
                    }
                }

                // если проверка успешно пройдена, добавим пользователя
                // в словарь кулдаунов
                EmojiCooldowns[discordUser] = DateTime.Now.AddSeconds(Bot.BotSettings.FastCooldown);

                //Проверка у пользователя уже существующих ролей эмисарства и их удаление
                var member = await e.Guild.GetMemberAsync(discordUser.Id);

                member.Roles.Where(x => x.Id == Bot.BotSettings.EmissaryGoldhoadersRole ||
                                   x.Id == Bot.BotSettings.EmissaryTradingCompanyRole ||
                                   x.Id == Bot.BotSettings.EmissaryOrderOfSoulsRole ||
                                   x.Id == Bot.BotSettings.EmissaryAthenaRole ||
                                   x.Id == Bot.BotSettings.EmissaryReaperBonesRole ||
                                   x.Id == Bot.BotSettings.HuntersRole).ToList()
                .ForEach(async x => await member.RevokeRoleAsync(x));

                //Выдаем роль в зависимости от реакции
                switch (e.Emoji.GetDiscordName())
                {
                case ":moneybag:":
                    await member.GrantRoleAsync(e.Channel.Guild.GetRole(Bot.BotSettings.EmissaryGoldhoadersRole));

                    break;

                case ":pig:":
                    await member.GrantRoleAsync(e.Channel.Guild.GetRole(Bot.BotSettings.EmissaryTradingCompanyRole));

                    break;

                case ":skull:":
                    await member.GrantRoleAsync(e.Channel.Guild.GetRole(Bot.BotSettings.EmissaryOrderOfSoulsRole));

                    break;

                case ":gem:":
                    await member.GrantRoleAsync(e.Channel.Guild.GetRole(Bot.BotSettings.EmissaryAthenaRole));

                    break;

                case ":skull_crossbones:":
                    await member.GrantRoleAsync(e.Channel.Guild.GetRole(Bot.BotSettings.EmissaryReaperBonesRole));

                    break;

                case ":fish:":
                    await member.GrantRoleAsync(e.Channel.Guild.GetRole(Bot.BotSettings.HuntersRole));

                    break;

                default:
                    break;
                }
                //Отправка в лог
                client.Logger.LogInformation(BotLoggerEvents.Event, $"{discordUser.Username}#{discordUser.Discriminator} получил новую роль эмиссарства.");

                return;
            }

            if (e.Message.Channel != null)
            {
                //Проверка на голосование
                if (e.Message.Channel.Id == Bot.BotSettings.VotesChannel)
                {
                    var vote = Vote.GetByMessageId(e.Message.Id);

                    await e.Message.DeleteReactionAsync(e.Emoji, discordUser);

                    // Проверка на окончание голосования
                    if (DateTime.Now > vote.End)
                    {
                        return;
                    }

                    // Проверка на предыдущий голос
                    if (vote.Voters.ContainsKey(discordUser.Id))
                    {
                        return;
                    }

                    if (e.Emoji.GetDiscordName() == ":white_check_mark:")
                    {
                        vote.Voters.Add(discordUser.Id, true);
                        ++vote.Yes;
                    }
                    else
                    {
                        vote.Voters.Add(discordUser.Id, false);
                        ++vote.No;
                    }

                    var total = vote.Voters.Count;

                    var author = await e.Guild.GetMemberAsync(vote.Author);

                    var embed = Utility.GenerateVoteEmbed(
                        author,
                        DiscordColor.Yellow,
                        vote.Topic,
                        vote.End,
                        vote.Voters.Count,
                        vote.Yes,
                        vote.No,
                        vote.Id);

                    Vote.Save(Bot.BotSettings.VotesXML);

                    await e.Message.ModifyAsync(embed : embed);

                    await(await e.Guild.GetMemberAsync(discordUser.Id)).SendMessageAsync($"{Bot.BotSettings.OkEmoji} Спасибо, ваш голос учтён!");
                }

                // Private ship confirmation message
                if (e.Channel.Id == Bot.BotSettings.PrivateRequestsChannel)
                {
                    var ship = PrivateShip.GetByRequest(e.Message.Id);
                    if (ship != null && ship.Channel == 0)
                    {
                        if (e.Emoji == DiscordEmoji.FromName(client, ":white_check_mark:"))
                        {
                            var channel = await e.Guild.CreateChannelAsync($"☠{ship.Name}☠", ChannelType.Voice,
                                                                           e.Guild.GetChannel(Bot.BotSettings.PrivateCategory), bitrate : Bot.BotSettings.Bitrate);

                            await channel.AddOverwriteAsync(e.Guild.GetRole(Bot.BotSettings.CodexRole),
                                                            Permissions.AccessChannels);

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

                            ship.Channel   = channel.Id;
                            ship.CreatedAt = DateTime.Now;
                            ship.LastUsed  = DateTime.Now;

                            var captain = (from member in ship.GetMembers()
                                           where member.Role == PrivateShipMemberRole.Captain
                                           select member).First();
                            var captainMember = await e.Guild.GetMemberAsync(captain.MemberId);

                            await channel.AddOverwriteAsync(captainMember, Permissions.UseVoice);

                            captain.Status = true;

                            await e.Channel.SendMessageAsync(
                                $"{Bot.BotSettings.OkEmoji} Администратор {e.User.Mention} подтвердил запрос на создание " +
                                $"корабля **{ship.Name}**.");

                            try
                            {
                                await captainMember.SendMessageAsync(
                                    $"{Bot.BotSettings.OkEmoji} Администратор **{e.User.Username}#{e.User.Discriminator}** " +
                                    $"подтвердил твой запрос на создание корабля **{ship.Name}**.");
                            }
                            catch (UnauthorizedException)
                            {
                            }
                        }
                        else if (e.Emoji == DiscordEmoji.FromName(client, ":no_entry:"))
                        {
                            var captain = (from member in ship.GetMembers()
                                           where member.Role == PrivateShipMemberRole.Captain
                                           select member).First();
                            var captainMember = await e.Guild.GetMemberAsync(captain.MemberId);

                            PrivateShip.Delete(ship.Name);
                            await e.Channel.SendMessageAsync(
                                $"{Bot.BotSettings.OkEmoji} Администратор {e.User.Mention} отклонил запрос на создание " +
                                $"корабля **{ship.Name}**.");

                            try
                            {
                                await captainMember.SendMessageAsync(
                                    $"{Bot.BotSettings.ErrorEmoji} Администратор **{e.User.Username}#{e.User.Discriminator}** " +
                                    $"отклонил твой запрос на создание корабля **{ship.Name}**.");
                            }
                            catch (UnauthorizedException)
                            {
                            }
                        }

                        await e.Message.DeleteAllReactionsAsync();
                    }
                }
            }
        }
Ejemplo n.º 7
0
 protected bool Equals(BlacklistEntry other)
 {
     return(PlayerId == other.PlayerId && string.Equals(From, other.From));
 }
Ejemplo n.º 8
0
 public async Task Remove(CommandContext ctx, string id)
 {
     BlacklistEntry.Remove(id);
     await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Успешно удалена запись!");
 }
Ejemplo n.º 9
0
        public async Task Add(CommandContext ctx)
        {
            var embed = new DiscordEmbedBuilder();

            embed.Description = "**Добавление записи в чёрный список**\n";
            embed.WithAuthor(ctx.Member.Username + "#" + ctx.Member.Discriminator, iconUrl: ctx.Member.AvatarUrl);
            embed.Color = DiscordColor.Orange;

            embed.WithFooter(
                "Отправьте ID пользователя. Если неизвестно, отправьте `нет`, для отмены отправьте `отмена`");

            var status = await ctx.RespondAsync(embed : embed.Build());

            var interactivity = ctx.Client.GetInteractivity();

            // запрашиваем ID пользователя
            var userId =
                await interactivity.WaitForMessageAsync(m => m.Author.Id == ctx.Member.Id, TimeSpan.FromMinutes(1));

            if (userId.Result == null || userId.Result.Content.ToLower().Contains("отмена"))
            {
                await ctx.Message.DeleteAsync();

                await status.DeleteAsync();

                if (userId.Result != null)
                {
                    await userId.Result.DeleteAsync();
                }
                return;
            }

            DiscordUser user = null;

            // ищем пользователя
            if (userId.Result.Content != "нет")
            {
                try
                {
                    user = await ctx.Client.GetUserAsync(Convert.ToUInt64(userId.Result.Content));
                }
                catch
                {
                    await status.DeleteAsync();

                    await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Не удалось найти данного пользователя!");

                    return;
                }
            }

            await userId.Result.DeleteAsync();

            if (user == null)
            {
                embed.AddField("Пользователь", "Неизвестен");
            }
            else
            {
                embed.AddField("Пользователь", user.Username + "#" + user.Discriminator, true);
                embed.AddField("ID", user.Id.ToString(), true);
                embed.WithThumbnail(user.AvatarUrl);
            }

            embed.WithFooter("Отправьте Xbox пользователя. Если неизвестно, отправьте `нет`, для отмены отправьте `отмена`");

            status = await status.ModifyAsync(embed : embed.Build());

            // запрашиваем xbox пользователя

            var xbox =
                await interactivity.WaitForMessageAsync(m => m.Author.Id == ctx.Member.Id, TimeSpan.FromMinutes(1));

            if (xbox.Result == null || xbox.Result.Content.ToLower().Contains("отмена"))
            {
                await ctx.Message.DeleteAsync();

                await status.DeleteAsync();

                if (xbox.Result != null)
                {
                    await xbox.Result.DeleteAsync();
                }
                return;
            }

            var xboxSql = "";

            if (xbox.Result.Content.ToLower().Contains("нет"))
            {
                embed.AddField("Xbox", "Неизвестен", false);
            }
            else
            {
                embed.AddField("Xbox", xbox.Result.Content, false);
                xboxSql = xbox.Result.Content;
            }

            embed.WithFooter("Отправьте причину добавления в чёрный список, для отмены отправьте `отмена`");

            await xbox.Result.DeleteAsync();

            status = await status.ModifyAsync(embed : embed.Build());

            // запрашиваем причину

            var reason =
                await interactivity.WaitForMessageAsync(m => m.Author.Id == ctx.Member.Id, TimeSpan.FromMinutes(1));

            if (reason.Result == null || reason.Result.Content.ToLower().Contains("отмена"))
            {
                await ctx.Message.DeleteAsync();

                await status.DeleteAsync();

                if (reason.Result != null)
                {
                    await reason.Result.DeleteAsync();
                }
                return;
            }

            var reasonSql = reason.Result.Content;

            embed.AddField("Причина", reason.Result.Content, false);

            embed.WithFooter(
                "Отправьте дополнительную информацию (например, ссылки на доказательства), иначе отправьте `нет` или для отмены отправьте `отмена`");

            await reason.Result.DeleteAsync();

            status = await status.ModifyAsync(embed : embed.Build());

            // запрашиваем допольнительную информацию

            var additional =
                await interactivity.WaitForMessageAsync(m => m.Author.Id == ctx.Member.Id, TimeSpan.FromMinutes(1));

            if (additional.Result == null || additional.Result.Content.ToLower().Contains("отмена"))
            {
                await ctx.Message.DeleteAsync();

                await status.DeleteAsync();

                if (additional.Result != null)
                {
                    await additional.Result.DeleteAsync();
                }
                return;
            }

            var additionalSql = "";

            if (additional.Result.Content == "нет")
            {
                embed.AddField("Дополнительно", "Не указано", false);
            }
            else
            {
                embed.AddField("Дополнительно", additional.Result.Content, false);
                additionalSql = additional.Result.Content;
            }

            var id = RandomString.NextString(6);

            embed.WithFooter("Готово! ID записи: " + id);
            embed.Color = DiscordColor.SpringGreen;

            await additional.Result.DeleteAsync();

            status = await status.ModifyAsync(embed : embed.Build());

            var userIdSql   = user == null ? 0 : user.Id;
            var usernameSql = user == null ? "" : user.Username + "#" + user.Discriminator;

            var entry =
                BlacklistEntry.Create(id, userIdSql, usernameSql, xboxSql, DateTime.Now, ctx.Member.Id, reasonSql, additionalSql);

            try
            {
                var member = await ctx.Guild.GetMemberAsync(userIdSql);

                await member.RevokeRoleAsync(ctx.Guild.GetRole(Bot.BotSettings.FleetCodexRole));
            }
            catch
            {
            }

            await ctx.Guild.GetChannel(Bot.BotSettings.ModlogChannel).SendMessageAsync(
                "**Добавление записи в ЧС**\n\n" +
                $"**Модератор:** {ctx.Member}\n" +
                $"**Дата:** {DateTime.Now}\n" +
                $"**ID:** {id}\n" +
                $"**Пользователь:** {usernameSql} ({userIdSql})\n" +
                $"**Xbox:** {xboxSql}\n" +
                $"**Причина:** {reasonSql}\n" +
                $"**Дополнительно:** {additionalSql}\n");
        }