public async Task UpdateXp(SocketMessage messageParam) { if (messageParam.Author.IsBot) { return; } if (_noXpChannels.Contains(messageParam.Channel.Id)) { return; } ulong userId = messageParam.Author.Id; int waitTime = rand.Next(_xpMinCooldown, _xpMaxCooldown); float baseXp = rand.Next(_xpMinPerMessage, _xpMaxPerMessage); float bonusXp = 0; if (_xpCooldown.HasUser(userId)) { return; } int karma = _databaseService.GetUserKarma(userId); if (messageParam.Author.Activity != null) { if (Regex.Match(messageParam.Author.Activity.Name, "(Unity.+)").Length > 0) { bonusXp += baseXp / 4; } } bonusXp += baseXp * (1f + (karma / 100f)); //Reduce XP for members with no role if (((IGuildUser)messageParam.Author).RoleIds.Count < 2) { baseXp *= .9f; } //Lower xp for difference between level and karma uint level = _databaseService.GetUserLevel(userId); float reduceXp = 1f; if (karma < level) { reduceXp = 1 - Math.Min(.9f, (level - karma) * .05f); } int xpGain = (int)Math.Round((baseXp + bonusXp) * reduceXp); //Console.WriteLine($"basexp {baseXp} karma {karma} bonus {bonusXp}"); _xpCooldown.AddCooldown(userId, waitTime); //Console.WriteLine($"{_xpCooldown[id].Minute} {_xpCooldown[id].Second}"); if (!await _databaseService.UserExists(userId)) { _databaseService.AddNewUser((SocketGuildUser)messageParam.Author); } _databaseService.AddUserXp(userId, xpGain); _databaseService.AddUserUdc(userId, (int)Math.Round(xpGain * .15f)); _loggingService.LogXp(messageParam.Channel.Name, messageParam.Author.Username, baseXp, bonusXp, reduceXp, xpGain); await LevelUp(messageParam, userId); //TODO: add xp gain on website }
public async Task UpdateXp(SocketMessage messageParam) { if (messageParam.Author.IsBot) { return; } if (_noXpChannels.Contains(messageParam.Channel.Id)) { return; } var userId = messageParam.Author.Id; var waitTime = _rand.Next(_xpMinCooldown, _xpMaxCooldown); float baseXp = _rand.Next(_xpMinPerMessage, _xpMaxPerMessage); float bonusXp = 0; if (_xpCooldown.HasUser(userId)) { return; } var user = await _databaseService.Query().GetUser(userId.ToString()); if (user == null) { await _databaseService.AddNewUser((SocketGuildUser)messageParam.Author); user = await _databaseService.Query().GetUser(userId.ToString()); } if (messageParam.Author.Activity != null) { if (Regex.Match(messageParam.Author.Activity.Name, "(Unity.+)").Length > 0) { bonusXp += baseXp / 4; } } bonusXp += baseXp * (1f + user.Karma / 100f); //Reduce XP for members with no role if (((IGuildUser)messageParam.Author).RoleIds.Count < 2) { baseXp *= .9f; } //Lower xp for difference between level and karma var reduceXp = 1f; if (user.Karma < user.Level) { reduceXp = 1 - Math.Min(.9f, (user.Level - user.Karma) * .05f); } var xpGain = (int)Math.Round((baseXp + bonusXp) * reduceXp); //Console.WriteLine($"basexp {baseXp} karma {karma} bonus {bonusXp}"); _xpCooldown.AddCooldown(userId, waitTime); //Console.WriteLine($"{_xpCooldown[id].Minute} {_xpCooldown[id].Second}"); await _databaseService.Query().UpdateXp(userId.ToString(), user.Exp + (uint)xpGain); _loggingService.LogXp(messageParam.Channel.Name, messageParam.Author.Username, baseXp, bonusXp, reduceXp, xpGain); await LevelUp(messageParam, userId); }