private async Task ReactionAdded(Cacheable <IUserMessage, ulong> message, ISocketMessageChannel channel, SocketReaction reaction)
        {
            var user = reaction.User.Value.ToString();

            SupportingMethods.updateDocument(user, "reactionCount", 1);

            UserInfo userInfo = SupportingMethods.getUserInformation(user);

            if (userInfo != null)
            {
                if (userInfo.ReactionCount >= 250)
                {
                    await addRole(reaction.User.Value as SocketGuildUser, "Overreaction", channel.Id);
                }
                else if (userInfo.ReactionCount >= 100)
                {
                    await addRole(reaction.User.Value as SocketGuildUser, "Major reaction", channel.Id);
                }
                else if (userInfo.ReactionCount >= 50)
                {
                    await addRole(reaction.User.Value as SocketGuildUser, "Reactionary", channel.Id);
                }
                else if (userInfo.ReactionCount >= 25)
                {
                    await addRole(reaction.User.Value as SocketGuildUser, "Reactor", channel.Id);
                }
            }
            else
            {
                await createUserInDatabase(reaction.User.Value as SocketUser, channel.Id);
            }
        }
        public async Task checkMessageCountForRole(SocketUser user, ulong channelID)
        {
            string   userName = user.ToString();
            UserInfo userInfo = SupportingMethods.getUserInformation(userName);

            if (userInfo != null)
            {
                if (userInfo.IsBetaTester)
                {
                    await addRole(user as SocketGuildUser, "Beta Tester", channelID);
                }
                if (userInfo.NumberOfMessages >= 10000)
                {
                    await addRole(user as SocketGuildUser, "I wrote a novel", channelID);
                }
                else if (userInfo.NumberOfMessages >= 1000)
                {
                    await addRole(user as SocketGuildUser, "I could write a novel", channelID);
                }
                else if (userInfo.NumberOfMessages >= 100)
                {
                    await addRole(user as SocketGuildUser, "I'm liking this server", channelID);
                }
                else if (userInfo.NumberOfMessages >= 1)
                {
                    await addRole(user as SocketGuildUser, "Hi and Welcome!", channelID);
                }
            }
            else
            {
                await createUserInDatabase(user, channelID);
            }
        }
        public async Task getRoleDesc([Summary("The role to get the description for")] string roleName)
        {
            var selectedRole = Context.Guild.Roles.FirstOrDefault(x => SupportingMethods.stringEquals(x.Name, roleName));
            var allRoles     = SupportingMethods.LoadAllRolesFromServer();
            var role         = allRoles.Find(x => SupportingMethods.stringEquals(x.Name, selectedRole.Name));

            await ReplyAsync($"To get ***{role.Name}***\n\t-{role.Description}\n\t-Difficulty: {role.Difficulty}");
        }
        public async Task addRole(SocketGuildUser user, string roleName, ulong channelID)
        {
            var userName     = user as SocketUser;
            var currentGuild = user.Guild as SocketGuild;
            var role         = currentGuild.Roles.FirstOrDefault(x => SupportingMethods.stringEquals(x.Name, roleName));

            if (!user.Roles.Contains(role))
            {
                await Logger.Log(new LogMessage(LogSeverity.Info, $"{GetType().Name}.addRole", $"{userName} has earned {roleName}"));

                await(user as IGuildUser).AddRoleAsync(role);
                var channelName = client.GetChannel(channelID) as IMessageChannel;
                await channelName.SendMessageAsync($"{userName} has earned **{role.Name}**");
            }
        }
        public async Task getExpLeaderboard([Summary("Places to see on leaderboard")] int userCount = 10)
        {
            StringBuilder stringBuilder = new StringBuilder();

            stringBuilder.Append("```css\n");
            string titleString = "Username".PadRight(30) + "| Total Experience";

            stringBuilder.Append(titleString);
            stringBuilder.Append("\n".PadRight(titleString.Length, '-') + "\n");
            try {
                var allUsers = new Dictionary <SocketGuildUser, int>();

                foreach (var user in (await Context.Guild.GetUsersAsync()))
                {
                    if (!user.IsBot)
                    {
                        var      userName = user as SocketUser;
                        UserInfo userInfo = SupportingMethods.getUserInformation(userName.ToString());
                        if (userInfo != null)
                        {
                            allUsers.Add(user as SocketGuildUser, userInfo.Experience);
                        }
                    }
                }
                if (allUsers.Count > 0)
                {
                    var sortedDict = from entry in allUsers orderby entry.Value descending select entry;
                    int i          = 0;
                    foreach (var entry in sortedDict)
                    {
                        stringBuilder.Append(entry.Key.ToString().PadRight(30) + "|\t" + entry.Value + "\n");
                        ++i;
                        if (i >= userCount)
                        {
                            break;
                        }
                    }
                    stringBuilder.Append("```");
                    await ReplyAsync($"{stringBuilder.ToString()}");
                }
                else
                {
                    await ReplyAsync($"{GetType().Name}.getExpLeaderboard Unexpected Exception");
                }
            } catch (Exception ex) {
                await Logger.Log(new LogMessage(LogSeverity.Error, $"{GetType().Name}.getExpLeaderboard", "Unexpected Exception", ex));
            }
        }
        public async Task HandleCommandAsync(SocketMessage messageParam)
        {
            string userName    = "";
            string channelName = "";
            string guildName   = "";
            int    argPos      = 0;

            try {
                var msg = messageParam as SocketUserMessage;

                userName    = GetUserName(msg.Author);
                channelName = msg.Channel?.Name ?? "NULL";
                var context = new CommandContext(client, msg);
                guildName = context.Guild?.Name ?? "NULL";
                var channelID = msg.Channel.Id;
                await Logger.Log(new LogMessage(LogSeverity.Info, $"{GetType().Name}.HandleCommandAsync", $"HandleCommandAsync G: {guildName} C: {channelName} User: {userName}  Msg: {msg}"));

                if (!msg.Author.IsBot)
                {
                    SupportingMethods.updateDocument(userName, "numberOfMessages", 1);
                    SupportingMethods.updateDocument(userName, "experience", msg.Content.Length);
                    await checkMessageCountForRole(msg.Author, channelID);
                }

                if (msg == null)
                {
                    return;
                }
                else if (msg.HasCharPrefix(CommandPrefix, ref argPos))
                {
                    var result = await commands.ExecuteAsync(context, argPos);

                    if (!result.IsSuccess)                     // If execution failed, reply with the error message.
                    {
                        string message = "Command Failed: " + msg;
                        await Logger.Log(new LogMessage(LogSeverity.Error, $"{GetType().Name}.HandleCommandAsync", message));

                        await context.Channel.SendMessageAsync(message);
                    }
                }
            } catch (Exception e) {
                await Logger.Log(new LogMessage(LogSeverity.Error, $"{GetType().Name}.HandleCommandAsync", $"G:{guildName} C:{channelName} U:{userName} Unexpected Exception {e}", e));
            }
        }
 public async Task getExperience([Summary("The user to get exp total from")] SocketGuildUser userName = null)
 {
     try {
         if (userName == null)
         {
             userName = ((SocketGuildUser)Context.Message.Author);
         }
         var      user     = userName as SocketUser;
         UserInfo userInfo = SupportingMethods.getUserInformation(user.ToString());
         if (userInfo != null)
         {
             var currentExp = userInfo.Experience;
             var level      = Math.Round(Math.Pow(currentExp, 1 / 1.3) / 100);
             await ReplyAsync($"{user} has {currentExp} experience and is level {level}");
         }
     } catch (Exception ex) {
         await Logger.Log(new LogMessage(LogSeverity.Error, GetType().Name + ".getExperience", "Unexpected Exception", ex));
     }
 }
        public async Task reorderRoles()
        {
            var allRoles      = SupportingMethods.LoadAllRolesFromServer().OrderBy(x => x.Difficulty).ToList();
            var allGuildRoles = Context.Guild.Roles.ToList();

            foreach (var irole in allGuildRoles)
            {
                foreach (var role in allRoles)
                {
                    if (role.Name == irole.Name)
                    {
                        await irole.ModifyAsync(x => x.Position = allRoles.IndexOf(role) + 1);

                        break;
                    }
                }
            }

            await ReplyAsync($"Roles have been reordered");
        }
        public async Task createRoles()
        {
            List <string> currentGuildRoles = new List <string>();

            foreach (SocketRole guildRoles in ((SocketGuild)Context.Guild).Roles)
            {
                currentGuildRoles.Add(guildRoles.Name);
            }

            foreach (var role in SupportingMethods.LoadAllRolesFromServer())
            {
                if (!currentGuildRoles.Contains(role.Name))
                {
                    var randColor = new Color(rand.Next(0, 256), rand.Next(0, 256), rand.Next(0, 256));
                    await Context.Guild.CreateRoleAsync(role.Name, GuildPermissions.None, randColor);

                    await Logger.Log(new LogMessage(LogSeverity.Verbose, GetType().Name + ".createRoles", "Added role to server: " + role.Name));
                    await ReplyAsync($"Added role: {role.Name}\nHow to get: {role.Description}");
                }
            }
        }
        public async Task MainAsync()
        {
            Console.WriteLine("Which bot to run: ");
            string key = Console.ReadLine();

            if (key.Equals("debug"))
            {
                CommandPrefix = '?';
            }
            string token = GetKey.getKey(key);

            SupportingMethods.SetupMongoDatabase();
            SupportingMethods.SetupMongoCollection("userData");

            await commands.AddModulesAsync(Assembly.GetEntryAssembly());

            await client.LoginAsync(TokenType.Bot, token);

            await client.StartAsync();

            // Block this task until the program is closed.
            await Task.Delay(-1);
        }
 private async Task createUserInDatabase(SocketUser userName, ulong id)
 {
     SupportingMethods.createUserInDatabase(userName);
     await addRole(userName as SocketGuildUser, "Family", id);
 }