108 lines
4.4 KiB
C#
108 lines
4.4 KiB
C#
using System;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using System.Threading.Channels;
|
|
using System.Threading.Tasks;
|
|
using ChaosBot.Models;
|
|
using ChaosBot.Repositories;
|
|
using Discord.Commands;
|
|
using Discord.WebSocket;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using NLog;
|
|
|
|
namespace ChaosBot.Discord.Services
|
|
{
|
|
public class ExperienceHandler
|
|
{
|
|
private static readonly ILogger _logger = Program.Logger;
|
|
|
|
public static async void addXP(SocketCommandContext context)
|
|
{
|
|
try
|
|
{
|
|
using (ChaosbotContext dbContext = new ChaosbotContext())
|
|
{
|
|
IQueryable<Experience> ctxUser = dbContext.ExperiencePoints;
|
|
IQueryable<Experience> usrXp = ctxUser
|
|
.Where(p => p.DiscordGuildId.Equals(context.Guild.Id))
|
|
.Where(p => p.DiscordUserId.Equals(context.User.Id));
|
|
|
|
Experience usrNewXp;
|
|
if (usrXp.Any())
|
|
{
|
|
usrNewXp = usrXp.First();
|
|
|
|
if(DateTime.Now >= usrNewXp.LastUpdated.AddMinutes(1))
|
|
{
|
|
usrNewXp.Amount = usrNewXp.Amount + Convert.ToUInt64(new Random().Next(15, 26));
|
|
|
|
usrNewXp.DiscordGuildId = context.Guild.Id;
|
|
usrNewXp.DiscordUserId = context.User.Id;
|
|
usrNewXp.LastUpdated = DateTime.Now;
|
|
usrNewXp.Level = usrNewXp.Level;
|
|
|
|
ulong newLevel = await checkLevel(usrNewXp, context);
|
|
|
|
if(newLevel > usrNewXp.Level)
|
|
usrNewXp.Level = newLevel;
|
|
|
|
await dbContext.ExperiencePoints.Upsert(usrNewXp)
|
|
.On(x => new {x.DiscordGuildId, x.DiscordUserId}).RunAsync();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
usrNewXp = new Experience();
|
|
usrNewXp.Amount = Convert.ToUInt64(new Random().Next(15, 26));
|
|
|
|
usrNewXp.DiscordGuildId = context.Guild.Id;
|
|
usrNewXp.DiscordUserId = context.User.Id;
|
|
usrNewXp.LastUpdated = DateTime.Now;
|
|
usrNewXp.Level = 0;
|
|
|
|
await dbContext.ExperiencePoints.Upsert(usrNewXp)
|
|
.On(x => new { x.DiscordGuildId, x.DiscordUserId}).RunAsync();
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_logger.Error(
|
|
$"{MethodBase.GetCurrentMethod().ReflectedType.FullName}: Exception [{ex}] thrown, <[{ex.Message}]>.");
|
|
}
|
|
}
|
|
|
|
public static async Task<ulong> checkLevel(Experience usrExperience, SocketCommandContext context)
|
|
{
|
|
ulong curLevel = 0;
|
|
|
|
try
|
|
{
|
|
// var xp_to_desired_level = 5 / 6 * desired_level * (2 * desired_level * desired_level + 27 * desired_level + 91);
|
|
|
|
ulong nextLevelXP = 5 / 6 * usrExperience.Level * (2 * usrExperience.Level * usrExperience.Level + 27 * usrExperience.Level + 91);
|
|
|
|
if (usrExperience.Amount > nextLevelXP)
|
|
{
|
|
curLevel = usrExperience.Level + 1;
|
|
string ConfigSet = ConfigurationRepository.GetValue<string>("LevelUp:Channel", usrExperience.DiscordGuildId, "false");
|
|
if (ConfigSet != "false")
|
|
{
|
|
ulong channelId = Convert.ToUInt64(ConfigSet.Substring(2, ConfigSet.Length - 3));
|
|
await context.Guild.GetTextChannel(channelId).SendMessageAsync(
|
|
$"Grats <@{usrExperience.DiscordUserId}>! You have reached level {curLevel} :wot:");
|
|
}
|
|
else
|
|
await context.Channel.SendMessageAsync($"Grats <@{usrExperience.DiscordUserId}>! You have reached level {curLevel} :wot:");
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_logger.Error(
|
|
$"{MethodBase.GetCurrentMethod().ReflectedType.FullName}: Exception [{ex}] thrown, <[{ex.Message}]>.");
|
|
}
|
|
|
|
return curLevel;
|
|
}
|
|
}
|
|
} |