public static int ServerExp(this User user, Server server) { if (server.ServerExp?.Count() != null || server.ServerExp?.Count() != 0) { try { return(server.ServerExp?.First(x => x?.UserId == user.UserId)?.Exp ?? 0); } catch (InvalidOperationException) { var exp = new ServerExp { ServerId = server.ServerId, UserId = user.UserId, Exp = 0, LatestExp = 0, User = user }; if (server.ServerExp != null && server.ServerExp.Any(x => x.UserId == exp.UserId)) { DatabaseQueries.InsertOrReplaceAsync(exp); } ConsoleLogger.LogAsync($"User {user.UserId} in {server.ServerId} was not present " + $"in the guild's ServerExp list when attempting to load this value. " + $"They have now been added into the database under the ServerExp table.", LogLvl.DEBUG); return(0); } } return(0); }
/// <summary> /// Returns a <see cref="Tuple"/> containing two integers. The first is the user's Xp Rank in the <see cref="Server"/> /// passed to this method. The second is how many users have Xp in the <see cref="Server"/>. /// </summary> /// <param name="user"></param> /// <param name="server"></param> /// <returns></returns> public static (int, int) GetServerXpRank(this User user, Server server) { ServerExp exp = server.ServerExp.FirstOrDefault(x => x.UserId == user.UserId); int rank = server.ServerExp.OrderByDescending(x => x.Exp).ToList().IndexOf(exp); return(rank + 1, server.ServerExp.Count()); }
private static async Task <bool> CanGetExperience(IReadOnlyCollection <ServerExp> serverExp, Server server, User user) { ServerExp match = serverExp?.FirstOrDefault(x => x?.UserId == user?.UserId); if (match != null) { double twoMinutesAgo = DateTime.Now.AddSeconds(-120).ToOADate(); // ReSharper disable PossibleNullReferenceException return(twoMinutesAgo >= serverExp.FirstOrDefault(x => x.UserId == user.UserId).LatestExp); // ReSharper restore PossibleNullReferenceException } await DatabaseQueries.InsertAsync(new ServerExp { Exp = 0, LatestExp = 0, ServerId = server.ServerId, UserId = user.UserId }); return(true); }
public async Task Command() { User user = await DatabaseQueries.GetOrCreateUserAsync(Context.User.Id); Server server = await DatabaseQueries.GetOrCreateServerAsync(Context.Guild.Id); int userExp = user.Experience; ServerExp userServerExp = await user.GetServerExp(Context.Guild.Id); int globalRank = (await user.GetGlobalXpRankAsync()).Item1; int serverRank = user.GetServerXpRank(server).Item1; var dSb = new StringBuilder(); dSb.AppendLine(Context.User.Mention); dSb.AppendLine($"Global Exp: `{userExp:N0}` | Rank: `{globalRank:N0}`"); dSb.AppendLine($"{Context.Guild.Name} Exp: `{userServerExp.Exp:N0}` | Rank: `{serverRank:N0}`"); var embed = new KaguyaEmbedBuilder { Description = dSb.ToString() }; await SendEmbedAsync(embed); }
public static async Task TryAddExp(User user, Server server, ICommandContext context) { List <ServerExp> specificExps = await DatabaseQueries.GetAllForServerAsync <ServerExp>(server.ServerId); var userExpObj = new ServerExp(); // If the user can receive exp, give them between 5 and 8. if (!await CanGetExperience(specificExps, server, user)) { return; } if (user.IsBlacklisted || server.IsBlacklisted) { return; } SocketTextChannel levelAnnouncementChannel; if (server.LogLevelAnnouncements != 0) { levelAnnouncementChannel = await context.Guild.GetTextChannelAsync(server.LogLevelAnnouncements) as SocketTextChannel; } else { levelAnnouncementChannel = context.Channel as SocketTextChannel; } var r = new Random(); int exp = r.Next(5, 8); if (server.ServerExp != null) { userExpObj = server.ServerExp.FirstOrDefault(x => x.UserId == user.UserId); } else { userExpObj = new ServerExp { ServerId = server.ServerId, UserId = user.UserId, Exp = 0, LatestExp = 0 }; } var expObject = new ServerExp { ServerId = server.ServerId, UserId = user.UserId, Exp = userExpObj?.Exp ?? 0, LatestExp = 0 }; double oldLevel = ReturnLevel(server, user); expObject.Exp += exp; expObject.LatestExp = DateTime.Now.ToOADate(); await DatabaseQueries.InsertOrReplaceAsync(expObject); // We update server again below because we have to refresh the serverExp list. server = await DatabaseQueries.GetOrCreateServerAsync(server.ServerId); double newLevel = ReturnLevel(server, user); await ConsoleLogger.LogAsync( $"[Server Exp]: User {user.UserId}] has received {exp} exp. [Guild: {server.ServerId}] " + $"Total Exp: {expObject.Exp:N0}]", LogLvl.TRACE); if (HasLeveledUp((int)oldLevel, (int)newLevel)) { await ConsoleLogger.LogAsync( $"[Server Exp]: [Server {server.ServerId} | User {user.UserId}] has leveled up! [Level: {(int) newLevel} | Experience: {GetExpForUser(server, user)}]", LogLvl.INFO); // Don't send announcement if the channel is blacklisted. if (server.BlackListedChannels.Any(x => x.ChannelId == context.Channel.Id)) { return; } if (!server.LevelAnnouncementsEnabled) { return; } var xp = new XpImage(); Stream xpStream = await xp.GenerateXpImageStream(user, (SocketGuildUser)context.User, server); if (xpStream != null) { if (user.ExpChatNotificationType == ExpType.SERVER || user.ExpChatNotificationType == ExpType.BOTH) { if (levelAnnouncementChannel != null) { await levelAnnouncementChannel.SendFileAsync(xpStream, $"Kaguya_Xp_LevelUp.png", ""); } else { await context.Channel.SendFileAsync(xpStream, $"Kaguya_Xp_LevelUp.png", ""); } } if (user.ExpDmNotificationType == ExpType.SERVER || user.ExpDmNotificationType == ExpType.BOTH) { await context.User.SendFileAsync(xpStream, $"Kaguya_Xp_LevelUp.png", ""); } } // Server level-up reward stuffs. List <ServerRoleReward> serverRoleRewards = server.RoleRewards.ToList(); if (serverRoleRewards.Count > 0) { foreach (ServerRoleReward item in serverRoleRewards) { if (user.ServerLevel(server).Rounded(RoundDirection.DOWN) == item.Level) { IRole targetRole = context.Guild.Roles.First(x => x.Id == item.RoleId); // ReSharper disable PossibleNullReferenceException await(context.User as SocketGuildUser).AddRoleAsync(targetRole); await ConsoleLogger.LogAsync($"User {user.UserId} received level-up role reward in guild " + $"{server.ServerId}. Role Name: {targetRole.Name}", LogLvl.DEBUG); // ReSharper restore PossibleNullReferenceException } } } } }