internal async Task AddExperienceAsync(KaosUser user, int amount) { var multiplier = await GetExperienceMultiplierAsync(user); var newXp = (int)(user.Experience + (amount * multiplier)); try { var newRank = await GetKaosRankAsync(user.Rank + 1); if (newXp < newRank.RequiredExperience) { await SetExperienceAsync(user, newXp); return; } if (newXp >= newRank.RequiredExperience) { await SetExperienceAsync(user, newXp - newRank.RequiredExperience); await RankUpAsync(user); await AddExperienceAsync(user, 0); return; } } catch (EntityNotFoundException) { return; } }
internal async Task <List <KaosTribe> > GetTribesAsync(KaosUser user) { var tribes = new List <KaosTribe>(); var sql = $"SELECT TribeList FROM pvpve_players WHERE SteamId = @SteamId"; using (IDbConnection connection = new MySqlConnection(ConnectionString)) { var tribeString = await connection.QueryFirstOrDefaultAsync <string>(sql, new { SteamId = user.SteamId }); if (tribeString == null) { return(tribes); } var tribeIdList = tribeString.Split(',').Where(s => !string.IsNullOrWhiteSpace(s)).ToList(); foreach (string tribeId in tribeIdList) { var sql2 = $"SELECT * FROM pvpve_tribes WHERE ID = @Id"; var tribe = await connection.QueryFirstOrDefaultAsync <KaosTribe>(sql2, new { Id = tribeId }); if (tribe == null) { Console.WriteLine("Tribe from tribe list could not be found in tribes database"); continue; } tribe.Client = this; tribes.Add(tribe); } return(tribes); } }
internal async Task SetTribeRankAsync(KaosUser user, int size) { try { var rank = await GetTribeRankFromSize(size); var perms = await GetPermissionGroupsAsync(user); var ranks = Config.TribeRanks; if (perms.Contains(rank.PermissionGroup)) { return; } foreach (KaosTribeRank element in ranks) { if (perms.Contains(element.PermissionGroup)) { await RemovePermissionGroupAsync(user, element.PermissionGroup); } } await AddPermissionGroupAsync(user, rank.PermissionGroup); } catch (EntityNotFoundException) { return; } }
internal async Task RemoveExperienceMultiplierAsync(KaosUser user, string type) { var sql = $"DELETE FROM experienceboosts WHERE SteamId = @SteamId AND Type = @Type"; using (IDbConnection connection = new MySqlConnection(ConnectionString)) { var query = await connection.QueryAsync <ExperienceBoost>(sql, new { SteamId = user.SteamId, Type = type }); } }
internal async Task SetTribeListAsync(KaosUser user, string list) { var sql = $"UPDATE pvpve_players SET TribeList = @TribeList WHERE SteamId = @SteamId"; using (IDbConnection connection = new MySqlConnection(ConnectionString)) { await connection.ExecuteAsync(sql, new { TribeList = list, SteamId = user.SteamId }); } }
private async Task SetPointsAsync(KaosUser user, int amount) { var sql = $"UPDATE arkshopplayers SET Points = @Amount WHERE SteamId = @SteamId"; using (IDbConnection connection = new MySqlConnection(ConnectionString)) { await connection.ExecuteAsync(sql, new { Amount = amount, SteamId = user.SteamId }); } }
private async Task SetExperienceAsync(KaosUser user, int value) { user.Experience = value; var sql = $"UPDATE players SET Experience = @Value WHERE SteamId = @SteamId"; using (IDbConnection connection = new MySqlConnection(ConnectionString)) { await connection.ExecuteAsync(sql, new { Value = value, SteamId = user.SteamId }); } }
internal async Task RemoveExperienceAsync(KaosUser user, int amount) { if (user.Experience < amount) { await SetExperienceAsync(user, 0); } else { await SetExperienceAsync(user, user.Experience - amount); } }
internal async Task <int> GetPointsAsync(KaosUser user) { var sql = $"SELECT Points FROM arkshopplayers WHERE SteamId = @SteamId"; using (IDbConnection connection = new MySqlConnection(ConnectionString)) { var points = await connection.QueryFirstOrDefaultAsync <int>(sql, new { SteamId = user.SteamId }); return(points); } }
private async Task SetPermissionGroupsAsync(KaosUser user, List <string> groups) { var perms = $"{string.Join(',', groups)},"; var sql = $"UPDATE players SET PermissionGroups = @Groups WHERE SteamId = @SteamID"; using (IDbConnection connection = new MySqlConnection(ConnectionString)) { await connection.ExecuteAsync(sql, new { Groups = perms, SteamId = user.SteamId }); } }
internal async Task <List <string> > GetPermissionGroupsAsync(KaosUser user) { var sql = $"SELECT PermissionGroups FROM players WHERE SteamId = @SteamID"; using (IDbConnection connection = new MySqlConnection(ConnectionString)) { var query = await connection.QueryFirstOrDefaultAsync <string>(sql, new { SteamId = user.SteamId }); var perms = query.Split(',').Where(s => !string.IsNullOrWhiteSpace(s)); return(perms.ToList()); } }
internal async Task RemovePermissionGroupAsync(KaosUser user, string group) { var perms = await GetPermissionGroupsAsync(user); if (perms.Contains(group) == false) { return; } perms.Remove(group); await SetPermissionGroupsAsync(user, perms); }
protected virtual void OnUserRankUp(KaosUser user, KaosPlayerRank rank) { if (UserRankedUp == null) { return; } UserRankedUp(this, new UserRankUpEventArgs() { Rank = rank, User = user }); }
internal async Task RemovePointsAsync(KaosUser user, int amount) { var points = await GetPointsAsync(user); if (points < amount) { await SetPointsAsync(user, 0); } else { await SetPointsAsync(user, points - amount); } }
internal async Task SetRankAsync(KaosUser user, KaosPlayerRank rank) { var oldRank = await GetKaosRankAsync(user.Rank); await RemovePermissionGroupAsync(user, oldRank.PermissionGroup); await AddPermissionGroupAsync(user, rank.PermissionGroup); var sql = $"UPDATE players SET Rank = @Rank WHERE SteamId = @SteamId"; using (IDbConnection connection = new MySqlConnection(ConnectionString)) { await connection.ExecuteAsync(sql, new { Rank = rank.Id, SteamId = user.SteamId }); } }
internal async Task <int> GetMaxTribeSizeAsync(KaosUser user) { var sizes = new List <int> { 1 }; var tribes = await GetTribesAsync(user); foreach (KaosTribe tribe in tribes) { var size = await tribe.GetTribeSizeAsync(); sizes.Add(size); } return(sizes.Max()); }
internal async Task AddPermissionGroupAsync(KaosUser user, string group) { var perms = await GetPermissionGroupsAsync(user); if (perms.Contains(group)) { return; } if (string.IsNullOrWhiteSpace(group)) { return; } perms.Add(group); await SetPermissionGroupsAsync(user, perms); }
internal async Task <KaosPlayerRank> GetRankPermissionGroupAsync(KaosUser user) { var perms = await GetPermissionGroupsAsync(user); var ranks = Config.PlayerRanks; ranks.Reverse(); foreach (KaosPlayerRank rank in ranks) { if (perms.Contains(rank.PermissionGroup)) { return(rank); } } throw new EntityNotFoundException("User has no permission group of any rank"); }
internal async Task DeRankAsync(KaosUser user) { try { var oldRank = await GetKaosRankAsync(user.Rank); var newRank = await GetKaosRankAsync(user.Rank - 1); await SetRankAsync(user, newRank); await RemovePermissionGroupAsync(user, oldRank.PermissionGroup); await AddPermissionGroupAsync(user, newRank.PermissionGroup); } catch (EntityNotFoundException) { return; } }
internal async Task <double> GetExperienceMultiplierAsync(KaosUser user) { double multiplier = 1; var sql = $"SELECT * FROM experienceboosts WHERE SteamId = @SteamId"; using (IDbConnection connection = new MySqlConnection(ConnectionString)) { var query = await connection.QueryAsync <ExperienceBoost>(sql, new { SteamId = user.SteamId }); foreach (ExperienceBoost boost in query) { multiplier = multiplier * boost.Multiplier; } } return(multiplier); }
internal async Task <List <string> > GetTribeIdsAsync(KaosUser user) { var Ids = new List <string>(); var sql = $"SELECT TribeList FROM pvpve_players WHERE SteamId = @SteamId"; using (IDbConnection connection = new MySqlConnection(ConnectionString)) { var tribeString = await connection.QueryFirstOrDefaultAsync <string>(sql, new { SteamId = user.SteamId }); if (string.IsNullOrWhiteSpace(tribeString)) { return(Ids); } Ids = tribeString.Split(',').Where(s => !string.IsNullOrWhiteSpace(s)).ToList(); return(Ids); } }
internal async Task <KaosPlayerRank> GetRankAsync(KaosUser user) { try { var sql = $"SELECT Rank FROM players WHERE SteamId = @SteamId"; using (IDbConnection connection = new MySqlConnection(ConnectionString)) { var rankId = await connection.QueryFirstOrDefaultAsync <int>(sql, new { SteamId = user.SteamId }); var rank = await GetKaosRankAsync(rankId); return(rank); } } catch (EntityNotFoundException) { throw new EntityNotFoundException("Rank of user was not found in Config"); } }
internal async Task TebexRankCheckAsync(KaosUser user) { try { var permRank = await GetRankPermissionGroupAsync(user); var rank = await GetRankAsync(user); if (rank.Id >= permRank.Id) { return; } await SetRankAsync(user, permRank); await SetExperienceAsync(user, 0); } catch (EntityNotFoundException) { return; } }
internal async Task <KaosStats> GetStatsAsync(KaosUser user) { var sql = $"SELECT * FROM advancedachievements_playerdata WHERE SteamId = @SteamId"; using (IDbConnection connection = new MySqlConnection(ConnectionString)) { var stats = await connection.QueryFirstOrDefaultAsync <KaosStats>(sql, new { SteamId = user.SteamId }); if (stats == null) { throw new EntityNotFoundException("The specified player has no stat entry"); } double ratio = stats.PlayerKills; if (stats.DeathByPlayer != 0) { ratio = Math.Round((double)stats.PlayerKills / (double)stats.DeathByPlayer, 2); } stats.KillDeathRatio = ratio; return(stats); } }
internal async Task <ulong> GetDiscordIdAsync(KaosUser user) { var sql = $"SELECT * FROM discordaddonplayers WHERE SteamId = @SteamId"; using (IDbConnection connection = new MySqlConnection(ConnectionString)) { var discordAddonPlayer = await connection.QueryFirstOrDefaultAsync <DiscordAddonPlayer>(sql, new { SteamId = user.SteamId }); if (discordAddonPlayer == null) { throw new EntityNotFoundException("User with specified Steam ID not found in database"); } if (discordAddonPlayer.discid == null) { throw new UserNotVerifiedException("User with specified Steam ID not verified with Discord"); } else { return((ulong)discordAddonPlayer.discid); } } }
internal async Task TribeMergeFixAsync(KaosUser user, string tribeName, string mapName) { try { var tribe = await GetTribeAsync(tribeName, mapName); var Ids = await GetTribeIdsAsync(user); if (Ids.Contains(tribe.Id.ToString())) { return; } else { Ids.Add(tribe.Id.ToString()); await SetTribeListAsync(user, string.Join(',', Ids)); } } catch (EntityNotFoundException) { return; } }
internal async Task AddExperienceMultiplierAsync(KaosUser user, double multiplier, string type, int duration) { var date = DateTime.Now.AddMinutes(duration); var query = $"SELECT * FROM experienceboosts WHERE SteamId = @SteamId AND Type = @Type"; var insert = $"INSERT INTO experienceboosts (SteamId, Multiplier, Type, ExpiryDate) Values (@SteamId, @Multiplier, @Type, @ExpiryDate)"; var update = $"UPDATE experienceboosts SET ExpiryDate = @ExpiryDate, Multiplier = @Multiplier WHERE SteamId = @SteamId AND Type = @Type"; using (IDbConnection connection = new MySqlConnection(ConnectionString)) { var boost = await connection.QueryFirstOrDefaultAsync(query, new { SteamId = user.SteamId, Type = type }); if (boost != null) { //If boost type already present, refresh expiry date await connection.ExecuteAsync(update, new { ExpiryDate = date, Multiplier = multiplier, SteamId = user.SteamId, Type = type }); return; } else { await connection.ExecuteAsync(insert, new { SteamId = user.SteamId, Multiplier = multiplier, Type = type, ExpiryDate = date }); } } }