private static async Task Discord_GuildMemberAdded(DSharpPlus.EventArgs.GuildMemberAddEventArgs e)
        {
            //Check if this user has any outstanding bans or mutes
            DiscordUserData data = BotTools.GetUserDataById(e.Member.Id);

            if (data.temp_banned.CheckIfActive())
            {
                await BanTools.OnBannedMemberJoined(data, e.Guild, e.Member);

                return;
            }
        }
        public static async Task OnCommand(DSharpPlus.EventArgs.MessageCreateEventArgs e, string prefix, string content)
        {
            //Get Discord member and user data
            DiscordMember member = await e.Guild.GetMemberAsync(e.Author.Id);

            DiscordUserData data = BotTools.GetUserDataById(e.Author.Id);

            data.latest_name = $"{e.Author.Username}#{e.Author.Discriminator}";

            //Identify the permission level of this member
            DiscordPermissionLevel perms = DiscordPermissionLevel.Default;

            if (member.Roles.Where(x => x.Id == Program.config.muted_role).Count() > 0)
            {
                perms = DiscordPermissionLevel.Moderator;
            }
            if (member.Roles.Where(x => x.Id == Program.config.admin_role).Count() > 0)
            {
                perms = DiscordPermissionLevel.Admin;
            }

            //Now, find a command we can use.
            foreach (var c in commands)
            {
                if (c.prefix.ToLower() != prefix.ToLower())
                {
                    continue;
                }
                if (c.requiredLevel > perms)
                {
                    //Tell the user that they're not allowed to do that.
                    await OnCommandAuthFailed(e, c);

                    return;
                }
                try
                {
                    await c.callback(e, prefix, content, member, perms, data);
                } catch (Exception ex)
                {
                    //Failed!
                    Program.LogMessage("cmd-error", ex.Message + ex.StackTrace);
                    await OnCommandExceptionFailed(e, c, ex);
                }
            }
        }
        private static async Task Discord_MessageCreated(DSharpPlus.EventArgs.MessageCreateEventArgs e)
        {
            //Check if this a command
            try
            {
                string message = e.Message.Content;
                if (message.StartsWith(config.command_prefix[0]) && !e.Author.IsBot && e.Guild != null)
                {
                    //Get the command
                    message = message.Substring(1);
                    int indexOfBreak = message.IndexOf(' ');
                    if (indexOfBreak != -1)
                    {
                        string prefix = message.Substring(0, indexOfBreak).TrimEnd(' ');
                        message = message.Substring(indexOfBreak).TrimStart(' ');
                        await CommandProcessor.OnCommand(e, prefix, message);
                    }
                    else
                    {
                        await CommandProcessor.OnCommand(e, message, "");
                    }
                }
            } catch (Exception ex)
            {
                Console.WriteLine(ex.Message + ex.StackTrace);
            }

            if (e.Guild != null)
            {
                //Get the member data and update if needed
                DiscordUserData data = BotTools.GetUserDataById(e.Author.Id);
                string          name = $"{e.Author.Username}#{e.Author.Discriminator}";
                if (data.latest_name != name)
                {
                    data.latest_name = name;
                    data.Save();
                }
            }
        }