Merged projects with plugins and modules

This commit is contained in:
2024-07-22 01:18:00 +03:00
parent 1fd065f4c2
commit 8ace51c840
59 changed files with 1669 additions and 73 deletions

View File

@@ -0,0 +1,52 @@
using Discord;
using DiscordBotCore;
using DiscordBotCore.Interfaces;
using DiscordBotCore.Others;
namespace LevelingSystem;
internal class LevelCommand: DBCommand
{
public string Command => "level";
public List<string> Aliases => ["lvl", "rank"];
public string Description => "Display tour current level";
public string Usage => "level";
public bool requireAdmin => false;
public async void ExecuteServer(DbCommandExecutingArguments args)
{
if(Variables.Database is null)
{
Application.CurrentApplication.Logger.Log("Database is not initialized", this, LogType.Warning);
return;
}
object[]? user = await Variables.Database.ReadDataArrayAsync($"SELECT * FROM Levels WHERE UserID=@userId",
new KeyValuePair<string, object>("userId", args.Context.Message.Author.Id));
if (user is null)
{
await args.Context.Channel.SendMessageAsync("You are now unranked !");
return;
}
var level = (int)user[1];
var exp = (int)user[2];
var builder = new EmbedBuilder();
var r = new Random();
builder.WithColor(r.Next(256), r.Next(256), r.Next(256));
builder.AddField("Current Level", level, true)
.AddField("Current EXP", exp, true)
.AddField("Required Exp", (level * 8 + 24).ToString(), true);
builder.WithTimestamp(DateTimeOffset.Now);
builder.WithAuthor(args.Context.Message.Author);
await args.Context.Channel.SendMessageAsync(embed: builder.Build());
}
}

View File

@@ -0,0 +1,83 @@
using Discord.WebSocket;
using DiscordBotCore;
using DiscordBotCore.Database;
using DiscordBotCore.Interfaces;
using static LevelingSystem.Variables;
namespace LevelingSystem;
internal class LevelEvent : DBEvent
{
public string Name => "Leveling System Event Handler";
public string Description => "The Leveling System Event Handler";
public bool RequireOtherThread => false;
public async void Start(DiscordSocketClient client)
{
Directory.CreateDirectory(DataFolder);
await Task.Delay(200);
Database = new SqlDatabase(DataFolder + "Users.db");
await Database.Open();
if (!File.Exists(DataFolder + "Settings.txt"))
{
GlobalSettings = new Settings
{
SecondsToWaitBetweenMessages = 5,
MaxExp = 7,
MinExp = 1
};
await DiscordBotCore.Others.JsonManager.SaveToJsonFile(DataFolder + "Settings.txt", GlobalSettings);
}
else
GlobalSettings = await DiscordBotCore.Others.JsonManager.ConvertFromJson<Settings>(DataFolder + "Settings.txt");
if (!await Database.TableExistsAsync("Levels"))
await Database.CreateTableAsync("Levels", "UserID VARCHAR(128)", "Level INT", "EXP INT");
if (!await Database.TableExistsAsync("Users"))
await Database.CreateTableAsync("Users", "UserID VARCHAR(128)", "UserMention VARCHAR(128)", "Username VARCHAR(128)", "Discriminator VARCHAR(128)");
client.MessageReceived += ClientOnMessageReceived;
}
private async Task ClientOnMessageReceived(SocketMessage arg)
{
if (arg.Author.IsBot || arg.IsTTS || arg.Content.StartsWith(Application.CurrentApplication.ApplicationEnvironmentVariables["prefix"]))
return;
if (WaitingList.ContainsKey(arg.Author.Id) && WaitingList[arg.Author.Id] > DateTime.Now.AddSeconds(-GlobalSettings.SecondsToWaitBetweenMessages))
return;
var userID = arg.Author.Id.ToString();
object[] userData = await Database.ReadDataArrayAsync($"SELECT * FROM Levels WHERE userID='{userID}'");
if (userData is null)
{
await Database.ExecuteAsync($"INSERT INTO Levels (UserID, Level, EXP) VALUES ('{userID}', 1, 0)");
await Database.ExecuteAsync($"INSERT INTO Users (UserID, UserMention) VALUES ('{userID}', '{arg.Author.Mention}')");
return;
}
var level = (int)userData[1];
var exp = (int)userData[2];
var random = new Random().Next(GlobalSettings.MinExp, GlobalSettings.MaxExp);
if (exp + random >= level * 8 + 24)
{
await Database.ExecuteAsync($"UPDATE Levels SET Level={level + 1}, EXP={random - (level * 8 + 24 - exp)} WHERE UserID='{userID}'");
await arg.Channel.SendMessageAsync($"{arg.Author.Mention} has leveled up to level {level + 1}!");
}
else await Database.ExecuteAsync($"UPDATE Levels SET EXP={exp + random} WHERE UserID='{userID}'");
WaitingList.Add(arg.Author.Id, DateTime.Now);
}
}

View File

@@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\DiscordBotCore\DiscordBotCore.csproj" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,20 @@
using DiscordBotCore.Interfaces;
using DiscordBotCore.Others;
using DiscordBotCore.Others.Actions;
namespace LevelingSystem;
public class ReloadAction: ICommandAction
{
public string ActionName => "LevelingSystemReload";
public string? Description => "Reloads the Leveling System config file";
public string? Usage => "LevelingSystemReload";
public InternalActionRunType RunType => InternalActionRunType.OnCall;
public IEnumerable<InternalActionOption> ListOfOptions => [];
public async Task Execute(string[]? args)
{
Variables.GlobalSettings = await JsonManager.ConvertFromJson<Settings>(Variables.DataFolder + "Settings.txt");
}
}

View File

@@ -0,0 +1,19 @@
using DiscordBotCore;
using DiscordBotCore.Database;
namespace LevelingSystem;
public class Settings
{
public int SecondsToWaitBetweenMessages { get; set; }
public int MinExp { get; set; }
public int MaxExp { get; set; }
}
internal static class Variables
{
internal static readonly string DataFolder = Application.GetResourceFullPath("LevelingSystem/");
internal static SqlDatabase? Database;
internal static readonly Dictionary<ulong, DateTime> WaitingList = new();
internal static Settings GlobalSettings = new();
}