Exemple #1
0
 public LevelingUser(ulong id, int xp, int level, LevelingServer server, DateTimeOffset lastMessageTime)
 {
     Id                   = id;
     CurrentXP            = xp;
     Level                = level;
     Server               = server;
     LastMessageTimestamp = lastMessageTime;
     FlushData();
 }
Exemple #2
0
 public LevelingUser(ulong id, LevelingServer server)
 {
     Id                   = id;
     Level                = 0;
     CurrentXP            = 5; //The user is created after one message, which means 5 XP
     LastMessageTimestamp = DateTimeOffset.Now;
     Server               = server;
     FlushData();
 }
Exemple #3
0
        public static void AddServer(ulong Id)
        {
            if (Servers.ContainsKey(Id))
            {
                return;
            }
            LevelingServer server = new LevelingServer(Id);

            Servers.Add(Id, server);
            FlushServerList();
        }
Exemple #4
0
        public async Task Rank(CommandContext ctx, [Description("The user to check the rank for.")] string user = null)
        {
            if (!LevelingData.Servers.ContainsKey(ctx.Guild.Id))
            {
                await ctx.RespondAsync("Leveling is not enabled for this server.\nUse `%enableleveling` if you wish to enable it.");

                return;
            }
            try
            {
                DiscordMember Member = null;
                if (user == null)
                {
                    Member = ctx.Member;
                }
                else
                {
                    try
                    {
                        Member = await ctx.Guild.FindMemberAsync(user);
                    }
                    catch
                    {
                        await ctx.RespondAsync("I couldn't find that user. Try making sure they're in the server?");
                    }
                }
                LevelingServer lvlServer = LevelingData.Servers[ctx.Guild.Id];
                LevelingUser   lvlUser   = LevelingData.Servers[ctx.Guild.Id].Users[Member.Id];
                lvlServer.SortUsersByRank();
                DiscordEmbedBuilder eb = new DiscordEmbedBuilder();
                eb.WithTitle($"{Member.Username}'s Level");
                eb.WithThumbnail(Member.AvatarUrl);
                eb.WithColor(Utils.CBOrange);
                //This looks bad
                //and it is
                eb.WithDescription($"Level **{lvlUser.Level}**\n{lvlUser.CurrentXP}/{lvlServer.XPNeededForLevel(lvlUser.Level + 1)} XP\nServer rank: **{lvlServer.UsersByRank.IndexOf(lvlServer.UsersByRank.FirstOrDefault(x => x.Id == lvlUser.Id)) + 1}/{lvlServer.UsersByRank.Count}**");
                //eb.WithFooter("This is a beta. Server rankings are coming soon.");
                await ctx.RespondAsync(embed : eb.Build());
            }
            catch
            {
                if (user == null)
                {
                    await ctx.RespondAsync("Either this server hasn't set up ranking, or you aren't ranked!");
                }
                else
                {
                    await ctx.RespondAsync("Either this server hasn't set up ranking, or that user isn't ranked!");
                }
            }
        }
Exemple #5
0
        public async Task Leaderboard(CommandContext ctx, int page = 1)
        {
            if (!LevelingData.Servers.ContainsKey(ctx.Guild.Id))
            {
                await ctx.RespondAsync("Leveling is not enabled for this server.\nUse `%enableleveling` if you wish to enable it.");

                return;
            }
            if (page < 1)
            {
                await ctx.RespondAsync("Invalid page number!");
            }
            LevelingServer levelingServer = LevelingData.Servers[ctx.Guild.Id];

            levelingServer.SortUsersByRank();
            if (page == 1)
            {
                int usersToShow        = levelingServer.UsersByRank.Count < 20 ? levelingServer.UsersByRank.Count : 20;
                DiscordEmbedBuilder eb = new DiscordEmbedBuilder
                {
                    Title       = $"{ctx.Guild.Name} Leveling Leaderboard",
                    Description = $"**Showing the top {usersToShow} users**"
                };
                for (int i = 0; i < usersToShow; i++)
                {
                    LevelingUser user = levelingServer.UsersByRank[i];
                    eb.Description += $"\n**{i + 1}.** \t<@!{user.Id}> | Level **{user.Level}** | {user.CurrentXP}/{levelingServer.XPNeededForLevel(user.Level + 1)} XP";
                }
                eb.WithColor(Utils.CBOrange);
                await ctx.RespondAsync(embed : eb.Build());
            }
            else
            {
                DiscordEmbedBuilder eb = new DiscordEmbedBuilder
                {
                    Title       = $"{ctx.Guild.Name} Leveling Leaderboard",
                    Description = $"**Showing page {page}**"
                };
                if (levelingServer.UsersByRank.Count < 20 * (int)(page - 1))
                {
                    await ctx.RespondAsync("No users to show on that page!");
                }
                int usersToShow = levelingServer.UsersByRank.Count - (page - 1 * 20) < 20 ? levelingServer.UsersByRank.Count - (page - 1 * 20) : 20;
                for (int i = (20 * (page - 1)); i < (20 * (page - 1)) + 20; i++)
                {
                    LevelingUser user = levelingServer.UsersByRank[i];
                    eb.Description += $"\n**{i + 1},** \t<@!{user.Id}> | Level **{user.Level}** | {user.CurrentXP}/{levelingServer.XPNeededForLevel(user.Level + 1)} XP";
                }
            }
        }
Exemple #6
0
        public async Task LevelingSettings(CommandContext ctx)
        {
            if (!LevelingData.Servers.ContainsKey(ctx.Guild.Id))
            {
                await ctx.RespondAsync("Leveling is not enabled for this server.\nUse `%enableleveling` if you wish to enable it.");

                return;
            }
            LevelingServer      lvlServer = LevelingData.Servers[ctx.Guild.Id];
            DiscordEmbedBuilder eb        = new DiscordEmbedBuilder();

            eb.WithTitle($"Leveling Settings for {ctx.Guild.Name}");
            if (lvlServer.LevelUpChannel != null)
            {
                eb.AddField("Level-Up Channel", $"<#{lvlServer.LevelUpChannel}>");
            }
            eb.AddField("XP Cooldown", $"{lvlServer.XPCooldown}");
            eb.AddField("XP Per Level", $"{lvlServer.XPPerLevel}", true);
            eb.AddField("Min XP Per Message", $"{lvlServer.MinXPPerMessage}");
            eb.AddField("Max XP Per Message", $"{lvlServer.MaxXPPerMessage}", true);
            eb.WithColor(Utils.CBOrange);
            await ctx.RespondAsync(eb.Build());
        }
Exemple #7
0
        public static void LoadDatabase()
        {
            Servers = new Dictionary <ulong, LevelingServer>();
            KONNode node = KONParser.Default.Parse(File.ReadAllText($@"{Utils.levelingDataPath}/LevelingDatabase.cb"));

            /*foreach(KONNode childNode in node.Children)
             * {
             *  if(childNode.Name == "SERVER")
             *  {
             *      LevelingServer server = new LevelingServer(ulong.Parse(childNode.Values["id"]));
             *  }
             * }*/
            foreach (KONArray array in node.Arrays)
            {
                if (array.Name == "SERVERS")
                {
                    foreach (ulong item in array.Items)
                    {
                        KONNode        serverIndex = KONParser.Default.Parse(SensitiveInformation.DecryptDataFile(File.ReadAllText($@"{Utils.levelingDataPath}/Server_{item}/Index.cb")));
                        LevelingServer server      = new LevelingServer(item);
                        if (serverIndex.Values.ContainsKey("levelUpChannel"))
                        {
                            server.SetLevelUpChannel((ulong)serverIndex.Values["levelUpChannel"]);
                        }
                        if (serverIndex.Values.ContainsKey("xpCooldown"))
                        {
                            server.XPCooldown = (int)serverIndex.Values["xpCooldown"];
                        }
                        if (serverIndex.Values.ContainsKey("xpPerLevel"))
                        {
                            server.XPPerLevel = (int)serverIndex.Values["xpPerLevel"];
                        }
                        if (serverIndex.Values.ContainsKey("minXPPerMessage"))
                        {
                            server.MinXPPerMessage = (int)serverIndex.Values["minXPPerMessage"];
                        }
                        if (serverIndex.Values.ContainsKey("maxXPPerMessage"))
                        {
                            server.MaxXPPerMessage = (int)serverIndex.Values["maxXPPerMessage"];
                        }
                        foreach (KONNode childNode in serverIndex.Children)
                        {
                            if (childNode.Name == "ROLES")
                            {
                                foreach (KONNode childNode2 in childNode.Children)
                                {
                                    server.RoleRewards.Add((int)childNode2.Values["level"], (ulong)childNode2.Values["id"]);
                                }
                            }
                        }
                        foreach (KONArray array1 in serverIndex.Arrays)
                        {
                            if (array1.Name == "USERS")
                            {
                                foreach (ulong Item in array1.Items)
                                {
                                    bool ok = Utils.TryLoadDatabaseNode($@"{Utils.levelingDataPath}/Server_{item}/User_{Item}.cb", out KONNode userNode);
                                    if (!ok)
                                    {
                                        continue;
                                    }
                                    LevelingUser user = new LevelingUser(Item, (int)userNode.Values["xp"], (int)userNode.Values["level"], server, DateTimeOffset.FromUnixTimeSeconds((long)userNode.Values["lastMessageTime"]));
                                    server.Users.Add(Item, user);
                                    server.UsersByRank.Add(user);
                                }
                            }
                        }
                        server.SortUsersByRank();
                        Servers.Add(server.Id, server);
                    }
                }
            }
        }