public LevelingUser(ulong id, int xp, int level, LevelingServer server, DateTimeOffset lastMessageTime) { Id = id; CurrentXP = xp; Level = level; Server = server; LastMessageTimestamp = lastMessageTime; FlushData(); }
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(); }
public static void AddServer(ulong Id) { if (Servers.ContainsKey(Id)) { return; } LevelingServer server = new LevelingServer(Id); Servers.Add(Id, server); FlushServerList(); }
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!"); } } }
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"; } } }
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()); }
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); } } } }