Compare commits

..

1 Commits

Author SHA1 Message Date
Eduardo Leonardo
5325caa970 Merge 76bcb5bb85 into 10a4691429 2025-10-20 15:57:54 +00:00
2 changed files with 167 additions and 168 deletions

View File

@@ -2,20 +2,19 @@
namespace WeaponPaints namespace WeaponPaints
{ {
public class Database public class Database
{ {
private readonly Func<IDatabaseConnection> _connectionFactory; private readonly IDatabaseConnection _connection;
public Database(Func<IDatabaseConnection> connectionFactory) public Database(IDatabaseConnection connection)
{ {
_connectionFactory = connectionFactory; _connection = connection;
} }
public async Task<IDatabaseConnection> GetConnectionAsync() public async Task<IDatabaseConnection> GetConnectionAsync()
{ {
var connection = _connectionFactory(); await _connection.OpenAsync();
await connection.OpenAsync(); return _connection;
return connection; }
} }
}
} }

View File

@@ -13,173 +13,173 @@ namespace WeaponPaints;
[MinimumApiVersion(338)] [MinimumApiVersion(338)]
public partial class WeaponPaints : BasePlugin, IPluginConfig<WeaponPaintsConfig> public partial class WeaponPaints : BasePlugin, IPluginConfig<WeaponPaintsConfig>
{ {
internal static WeaponPaints Instance { get; private set; } = new(); internal static WeaponPaints Instance { get; private set; } = new();
public WeaponPaintsConfig Config { get; set; } = new(); public WeaponPaintsConfig Config { get; set; } = new();
private static WeaponPaintsConfig _config { get; set; } = new(); private static WeaponPaintsConfig _config { get; set; } = new();
public override string ModuleAuthor => "Nereziel & daffyy"; public override string ModuleAuthor => "Nereziel & daffyy";
public override string ModuleDescription => "Skin, gloves, agents and knife selector, standalone and web-based"; public override string ModuleDescription => "Skin, gloves, agents and knife selector, standalone and web-based";
public override string ModuleName => "WeaponPaints"; public override string ModuleName => "WeaponPaints";
public override string ModuleVersion => "3.2a"; public override string ModuleVersion => "3.2a";
public override void Load(bool hotReload) public override void Load(bool hotReload)
{ {
// Hardcoded hotfix needs to be changed later (Not needed 17.09.2025) // Hardcoded hotfix needs to be changed later (Not needed 17.09.2025)
//if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) //if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
// Patch.PerformPatch("0F 85 ? ? ? ? 31 C0 B9 ? ? ? ? BA ? ? ? ? 66 0F EF C0 31 F6 31 FF 48 C7 45 ? ? ? ? ? 48 C7 45 ? ? ? ? ? 48 C7 45 ? ? ? ? ? 48 C7 45 ? ? ? ? ? 0F 29 45 ? 48 C7 45 ? ? ? ? ? C7 45 ? ? ? ? ? 66 89 45 ? E8 ? ? ? ? 41 89 C5 85 C0 0F 8E", "90 90 90 90 90 90"); // Patch.PerformPatch("0F 85 ? ? ? ? 31 C0 B9 ? ? ? ? BA ? ? ? ? 66 0F EF C0 31 F6 31 FF 48 C7 45 ? ? ? ? ? 48 C7 45 ? ? ? ? ? 48 C7 45 ? ? ? ? ? 48 C7 45 ? ? ? ? ? 0F 29 45 ? 48 C7 45 ? ? ? ? ? C7 45 ? ? ? ? ? 66 89 45 ? E8 ? ? ? ? 41 89 C5 85 C0 0F 8E", "90 90 90 90 90 90");
//else //else
// Patch.PerformPatch("74 ? 48 8D 0D ? ? ? ? FF 15 ? ? ? ? EB ? BA", "EB"); // Patch.PerformPatch("74 ? 48 8D 0D ? ? ? ? FF 15 ? ? ? ? EB ? BA", "EB");
Instance = this;
Instance = this; if (hotReload)
{
OnMapStart(string.Empty);
GPlayerWeaponsInfo.Clear();
GPlayersKnife.Clear();
GPlayersGlove.Clear();
GPlayersAgent.Clear();
GPlayersPin.Clear();
GPlayersMusic.Clear();
if (hotReload) foreach (var player in Enumerable
{ .OfType<CCSPlayerController>(Utilities.GetPlayers().TakeWhile(_ => WeaponSync != null))
OnMapStart(string.Empty); .Where(player => player.IsValid &&
!string.IsNullOrEmpty(player.IpAddress) && player is
{ IsBot: false, Connected: PlayerConnectedState.PlayerConnected }))
{
var playerInfo = new PlayerInfo
{
UserId = player.UserId,
Slot = player.Slot,
Index = (int)player.Index,
SteamId = player?.SteamID.ToString(),
Name = player?.PlayerName,
IpAddress = player?.IpAddress?.Split(":")[0]
};
GPlayerWeaponsInfo.Clear(); _ = Task.Run(async () =>
GPlayersKnife.Clear(); {
GPlayersGlove.Clear(); if (WeaponSync != null) await WeaponSync.GetPlayerData(playerInfo);
GPlayersAgent.Clear(); });
GPlayersPin.Clear(); }
GPlayersMusic.Clear(); }
foreach (var player in Enumerable Utility.LoadSkinsFromFile(ModuleDirectory + $"/data/skins_{_config.SkinsLanguage}.json", Logger);
.OfType<CCSPlayerController>(Utilities.GetPlayers().TakeWhile(_ => WeaponSync != null)) Utility.LoadGlovesFromFile(ModuleDirectory + $"/data/gloves_{_config.SkinsLanguage}.json", Logger);
.Where(player => player.IsValid && Utility.LoadAgentsFromFile(ModuleDirectory + $"/data/agents_{_config.SkinsLanguage}.json", Logger);
!string.IsNullOrEmpty(player.IpAddress) && player is Utility.LoadMusicFromFile(ModuleDirectory + $"/data/music_{_config.SkinsLanguage}.json", Logger);
{ IsBot: false, Connected: PlayerConnectedState.PlayerConnected })) Utility.LoadPinsFromFile(ModuleDirectory + $"/data/collectibles_{_config.SkinsLanguage}.json", Logger);
{
var playerInfo = new PlayerInfo
{
UserId = player.UserId,
Slot = player.Slot,
Index = (int)player.Index,
SteamId = player?.SteamID.ToString(),
Name = player?.PlayerName,
IpAddress = player?.IpAddress?.Split(":")[0]
};
_ = Task.Run(async () => RegisterListeners();
{ }
if (WeaponSync != null) await WeaponSync.GetPlayerData(playerInfo);
});
}
}
Utility.LoadSkinsFromFile(ModuleDirectory + $"/data/skins_{_config.SkinsLanguage}.json", Logger); public void OnConfigParsed(WeaponPaintsConfig config)
Utility.LoadGlovesFromFile(ModuleDirectory + $"/data/gloves_{_config.SkinsLanguage}.json", Logger); {
Utility.LoadAgentsFromFile(ModuleDirectory + $"/data/agents_{_config.SkinsLanguage}.json", Logger); Config = config;
Utility.LoadMusicFromFile(ModuleDirectory + $"/data/music_{_config.SkinsLanguage}.json", Logger); _config = config;
Utility.LoadPinsFromFile(ModuleDirectory + $"/data/collectibles_{_config.SkinsLanguage}.json", Logger);
RegisterListeners(); // Validar configurações de banco de dados
} if (config.DatabaseType.ToLower() == "mysql")
{
if (config.DatabaseHost.Length < 1 || config.DatabaseName.Length < 1 || config.DatabaseUser.Length < 1)
{
Logger.LogError("You need to setup MySQL Database credentials in \"configs/plugins/WeaponPaints/WeaponPaints.json\"!");
Unload(false);
return;
}
}
else if (config.DatabaseType.ToLower() == "sqlite")
{
if (string.IsNullOrEmpty(config.DatabasePath))
{
Logger.LogError("You need to setup SQLite Database path in \"configs/plugins/WeaponPaints/WeaponPaints.json\"!");
Unload(false);
return;
}
}
else
{
Logger.LogError("Invalid DatabaseType. Use 'mysql' or 'sqlite'.");
Unload(false);
return;
}
public void OnConfigParsed(WeaponPaintsConfig config) if (!File.Exists(Path.GetDirectoryName(Path.GetDirectoryName(ModuleDirectory)) + "/gamedata/weaponpaints.json"))
{ {
Config = config; Logger.LogError("You need to upload \"weaponpaints.json\" to \"gamedata directory\"!");
_config = config; Unload(false);
return;
}
// Criar conexão baseada no tipo de banco
IDatabaseConnection connection;
if (config.DatabaseType.ToLower() == "mysql")
{
var builder = new MySqlConnectionStringBuilder
{
Server = config.DatabaseHost,
UserID = config.DatabaseUser,
Password = config.DatabasePassword,
Database = config.DatabaseName,
Port = (uint)config.DatabasePort,
Pooling = true,
MaximumPoolSize = 640,
};
connection = new MySQLConnection(builder.ConnectionString, Logger);
}
else // SQLite
{
// Garantir que o diretório existe
var dbPath = Path.GetFullPath(config.DatabasePath);
var dbDirectory = Path.GetDirectoryName(dbPath);
if (!string.IsNullOrEmpty(dbDirectory) && !Directory.Exists(dbDirectory))
{
Directory.CreateDirectory(dbDirectory);
}
var connectionString = $"Data Source={dbPath}";
Logger.LogInformation($"[WeaponPaints] SQLite database path: {dbPath}");
connection = new SQLiteConnection(connectionString, Logger);
}
// Validar configurações de banco de dados Database = new Database(connection);
if (config.DatabaseType.ToLower() == "mysql")
{
if (config.DatabaseHost.Length < 1 || config.DatabaseName.Length < 1 || config.DatabaseUser.Length < 1)
{
Logger.LogError("You need to setup MySQL Database credentials in \"configs/plugins/WeaponPaints/WeaponPaints.json\"!");
Unload(false);
return;
}
}
else if (config.DatabaseType.ToLower() == "sqlite")
{
if (string.IsNullOrEmpty(config.DatabasePath))
{
Logger.LogError("You need to setup SQLite Database path in \"configs/plugins/WeaponPaints/WeaponPaints.json\"!");
Unload(false);
return;
}
}
else
{
Logger.LogError("Invalid DatabaseType. Use 'mysql' or 'sqlite'.");
Unload(false);
return;
}
if (!File.Exists(Path.GetDirectoryName(Path.GetDirectoryName(ModuleDirectory)) + "/gamedata/weaponpaints.json")) Utility.Config = config;
{ Task.Run(async () => await Utility.CheckDatabaseTables());
Logger.LogError("You need to upload \"weaponpaints.json\" to \"gamedata directory\"!"); _localizer = Localizer;
Unload(false); Utility.ShowAd(ModuleVersion);
return; Task.Run(async () => await Utility.CheckVersion(ModuleVersion, Logger));
} }
// Criar factory de conexão baseada no tipo de banco public override void OnAllPluginsLoaded(bool hotReload)
Func<IDatabaseConnection> connectionFactory; {
if (config.DatabaseType.ToLower() == "mysql") try
{ {
var builder = new MySqlConnectionStringBuilder MenuApi = MenuCapability.Get();
{
Server = config.DatabaseHost, if (Config.Additional.KnifeEnabled)
UserID = config.DatabaseUser, SetupKnifeMenu();
Password = config.DatabasePassword, if (Config.Additional.SkinEnabled)
Database = config.DatabaseName, SetupSkinsMenu();
Port = (uint)config.DatabasePort, if (Config.Additional.GloveEnabled)
Pooling = true, SetupGlovesMenu();
MaximumPoolSize = 640, if (Config.Additional.AgentEnabled)
}; SetupAgentsMenu();
connectionFactory = () => new MySQLConnection(builder.ConnectionString, Logger); if (Config.Additional.MusicEnabled)
} SetupMusicMenu();
else // SQLite if (Config.Additional.PinsEnabled)
{ SetupPinsMenu();
// Garantir que o diretório existe
var dbPath = Path.GetFullPath(config.DatabasePath); RegisterCommands();
var dbDirectory = Path.GetDirectoryName(dbPath); }
if (!string.IsNullOrEmpty(dbDirectory) && !Directory.Exists(dbDirectory)) catch (Exception)
{ {
Directory.CreateDirectory(dbDirectory); MenuApi = null;
} Logger.LogError("Error while loading required plugins");
throw;
var connectionString = $"Data Source={dbPath}"; }
Logger.LogInformation($"[WeaponPaints] SQLite database path: {dbPath}"); }
connectionFactory = () => new SQLiteConnection(connectionString, Logger);
}
Database = new Database(connectionFactory);
Utility.Config = config;
Task.Run(async () => await Utility.CheckDatabaseTables());
_localizer = Localizer;
Utility.ShowAd(ModuleVersion);
Task.Run(async () => await Utility.CheckVersion(ModuleVersion, Logger));
}
public override void OnAllPluginsLoaded(bool hotReload)
{
try
{
MenuApi = MenuCapability.Get();
if (Config.Additional.KnifeEnabled)
SetupKnifeMenu();
if (Config.Additional.SkinEnabled)
SetupSkinsMenu();
if (Config.Additional.GloveEnabled)
SetupGlovesMenu();
if (Config.Additional.AgentEnabled)
SetupAgentsMenu();
if (Config.Additional.MusicEnabled)
SetupMusicMenu();
if (Config.Additional.PinsEnabled)
SetupPinsMenu();
RegisterCommands();
}
catch (Exception)
{
MenuApi = null;
Logger.LogError("Error while loading required plugins");
throw;
}
}
} }