From 991ee5019aea8dfd01c83b1940806f5c30939dbb Mon Sep 17 00:00:00 2001 From: Jacob Schmidt Date: Sat, 10 May 2025 17:50:21 -0500 Subject: [PATCH] feat: Enhance admin and bank event handling with improved logging This commit refines the event handling for both admin and bank functionalities, ensuring better clarity and consistency in logging. Key changes include: - Updated event names in admin handling to follow a consistent naming convention. - Improved parameter handling in admin event functions, ensuring validation checks are in place. - Enhanced logging messages to provide clearer context regarding the source of events and actions taken. - Introduced bank event handling for deposit, transfer, withdrawal, and balance inquiries, with appropriate validation and logging. These changes aim to improve the maintainability and readability of the codebase while ensuring robust event management. --- addons/admin/XEH_preInit_server.sqf | 32 ++-- addons/admin/functions/fnc_initAdmin.sqf | 2 +- .../admin/functions/fnc_verifyAdminStore.sqf | 2 +- addons/bank/XEH_PREP.hpp | 4 +- addons/bank/XEH_preInit_server.sqf | 69 ++++++- addons/bank/functions/fnc_initBank.sqf | 2 +- addons/bank/functions/fnc_initBankStore.sqf | 178 ++++++++++++++++++ addons/bank/functions/fnc_verifyBankStore.sqf | 32 ++++ 8 files changed, 300 insertions(+), 21 deletions(-) create mode 100644 addons/bank/functions/fnc_initBankStore.sqf create mode 100644 addons/bank/functions/fnc_verifyBankStore.sqf diff --git a/addons/admin/XEH_preInit_server.sqf b/addons/admin/XEH_preInit_server.sqf index 58cdb5b..8286200 100644 --- a/addons/admin/XEH_preInit_server.sqf +++ b/addons/admin/XEH_preInit_server.sqf @@ -4,53 +4,53 @@ call FUNC(initAdmin); call FUNC(initAdminStore); [QGVAR(handleEvents), { - params ["_event", "_params"]; + params ["_event", "_data"]; - diag_log format ["[FORGE: Admin] Received event: %1 with params: %2", _event, _params]; + diag_log format ["[FORGE::Server::Admin::XEH_preInit] Received event: %1 with data: %2", _event, _data]; switch (_event) do { - case "advanceAll": { + case "ADMIN::ADVANCE::ALL": { private _adminStore = call FUNC(verifyAdminStore); - _params params ["_amount"]; + _data params [["_amount", 0, [0]]]; - if (isNil "_amount") exitWith { diag_log "Amount cannot be empty!"; }; + if (_amount isEqualTo 0) exitWith { diag_log "[FORGE::Server::Admin::XEH_preInit::advanceAll] Invalid amount!"; }; _adminStore call ["handleTransfer", ["advanceAll", _amount]]; }; - case "handlePayday": { + case "ADMIN::PAYDAY": { private _adminStore = call FUNC(verifyAdminStore); _adminStore call ["handleTransfer", ["payday"]]; }; - case "handleTransfer": { + case "ADMIN::TRANSFER": { private _adminStore = call FUNC(verifyAdminStore); - _params params ["_condition", "_amount", "_uid"]; + _data params [["_condition", "", [""]], ["_amount", 0, [0]], ["_uid", "", [""]]]; - if (isNil "_condition") exitWith { diag_log "Condition cannot be empty!"; }; + if (_condition isEqualTo "" || _amount isEqualTo 0 || _uid isEqualTo "") exitWith { diag_log "[FORGE::Server::Admin::XEH_preInit::handleTransfer] Invalid condition, amount, or UID!"; }; _adminStore call ["handleTransfer", [_condition, _amount, _uid]]; }; - case "sendMessage": { + case "ADMIN::SEND::MESSAGE": { private _adminStore = call FUNC(verifyAdminStore); - _params params ["_uid", "_message"]; + _data params [["_uid", "", [""]], ["_message", "", [""]]]; - if (isNil "_message") exitWith { diag_log "Message cannot be empty!"; }; + if (_message isEqualTo "") exitWith { diag_log "[FORGE::Server::Admin::XEH_preInit::sendMessage] Invalid message!"; }; if (_uid isEqualTo "") then { _adminStore call ["broadcastMessage", [_message]]; } else { _adminStore call ["sendMessage", [_uid, _message]]; }; }; - case "updatePaygrade": { + case "ADMIN::UPDATE::PAYGRADE": { private _adminStore = call FUNC(verifyAdminStore); - _params params ["_uid", "_paygrade"]; + _data params [["_uid", "", [""]], ["_paygrade", "", [""]]]; - if (_uid isEqualTo "" && _paygrade isEqualTo "") exitWith { diag_log "UID or Paygrade cannot be empty!"; }; + if (_uid isEqualTo "" || _paygrade isEqualTo "") exitWith { diag_log "[FORGE::Server::Admin::XEH_preInit::updatePaygrade] Invalid UID or paygrade!"; }; _adminStore call ["updatePaygrade", [_uid, _paygrade]]; }; default { - diag_log format ["Unknown event: %1 with params: %2", _event, _params]; + diag_log format ["[FORGE::Server::Admin::XEH_preInit] Unknown event: %1 with data: %2", _event, _data]; }; }; }] call CFUNC(addEventHandler); \ No newline at end of file diff --git a/addons/admin/functions/fnc_initAdmin.sqf b/addons/admin/functions/fnc_initAdmin.sqf index 5ce6fed..b33c316 100644 --- a/addons/admin/functions/fnc_initAdmin.sqf +++ b/addons/admin/functions/fnc_initAdmin.sqf @@ -13,6 +13,6 @@ _cpof allowDamage false; _cpof setVariable ["isCPOF", true, true]; - diag_log text format ["[FORGE Admin] ClassName: '%1' Pos: '%2' Dir: '%3'", _className, _pos, _dir]; + diag_log text format ["[FORGE::Server::Admin::initAdmin] ClassName: '%1' Pos: '%2' Dir: '%3'", _className, _pos, _dir]; } forEach ("true" configClasses (missionConfigFile >> "CfgCpofs" >> "cpofs")); \ No newline at end of file diff --git a/addons/admin/functions/fnc_verifyAdminStore.sqf b/addons/admin/functions/fnc_verifyAdminStore.sqf index abeb71a..13cf73a 100644 --- a/addons/admin/functions/fnc_verifyAdminStore.sqf +++ b/addons/admin/functions/fnc_verifyAdminStore.sqf @@ -26,7 +26,7 @@ private _store = GETMVAR(FORGE_ADMIN_STORE_REG,nil); if (isNil "_store") then { _store = call FUNC(initAdminStore); - diag_log text "[FORGE Admin] Admin store initialized"; + diag_log text "[FORGE::Server::Admin::verifyAdminStore] Admin store initialized"; }; _store \ No newline at end of file diff --git a/addons/bank/XEH_PREP.hpp b/addons/bank/XEH_PREP.hpp index cd973be..361db66 100644 --- a/addons/bank/XEH_PREP.hpp +++ b/addons/bank/XEH_PREP.hpp @@ -1 +1,3 @@ -PREP(initBank); \ No newline at end of file +PREP(initBank); +PREP(initBankStore); +PREP(verifyBankStore); \ No newline at end of file diff --git a/addons/bank/XEH_preInit_server.sqf b/addons/bank/XEH_preInit_server.sqf index 78bb8cd..18c26aa 100644 --- a/addons/bank/XEH_preInit_server.sqf +++ b/addons/bank/XEH_preInit_server.sqf @@ -1,3 +1,70 @@ #include "script_component.hpp" -call FUNC(initBank); \ No newline at end of file +call FUNC(initBank); +call FUNC(initBankStore); + +[QGVAR(handleEvents), { + params ["_event", "_data"]; + + diag_log text format ["[FORGE::Server::Bank::XEH_preInit] Received event: '%1' with data: '%2'", _event, _data]; + + switch (_event) do { + case "BANK::DEPOSIT": { + private _bankStore = call FUNC(verifyBankStore); + _data params [["_uid", "", [""]], ["_amount", 0, [0]]]; + + if (_uid isEqualTo "" || _amount isEqualTo 0) exitWith { diag_log "[FORGE::Server::Bank::XEH_preInit::handleDeposit] Invalid UID and amount!"; }; + + _bankStore call ["deposit", [_uid, _amount]]; + }; + case "BANK::TRANSFER": { + private _bankStore = call FUNC(verifyBankStore); + _data params [["_fromUid", "", [""]], ["_toUid", "", [""]], ["_amount", 0, [0]]]; + + if (_fromUid isEqualTo "" || _toUid isEqualTo "" || _amount isEqualTo 0) exitWith { diag_log "[FORGE::Server::Bank::XEH_preInit::handleTransfer] Invalid UIDs and amount!"; }; + + _bankStore call ["transfer", [_fromUid, _toUid, _amount]]; + }; + case "BANK::WITHDRAW": { + private _bankStore = call FUNC(verifyBankStore); + _data params [["_uid", "", [""]], ["_amount", 0, [0]]]; + + if (_uid isEqualTo "" || _amount isEqualTo 0) exitWith { diag_log "[FORGE::Server::Bank::XEH_preInit::handleWithdraw] Invalid UID and amount!"; }; + + _bankStore call ["withdraw", [_uid, _amount]]; + }; + case "BANK::GET::BALANCE": { + private _bankStore = call FUNC(verifyBankStore); + _data params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE::Server::Bank::XEH_preInit::handleGetBalance] Invalid UID, UID cannot be empty!"; }; + + _bankStore call ["getBalance", [_uid]]; + }; + case "BANK::GET::CASH": { + private _bankStore = call FUNC(verifyBankStore); + _data params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE::Server::Bank::XEH_preInit::handleGetCash] Invalid UID, UID cannot be empty!"; }; + + _bankStore call ["getCash", [_uid]]; + }; + case "BANK::HANDLE::PLAYER::LOAD": { + private _bankStore = call FUNC(verifyBankStore); + _data params [["_uid", "", [""]], ["_bankValue", 0, [0]], ["_cashValue", 0, [0]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE::Server::Bank::XEH_preInit::handlePlayerLoad] Invalid UID, UID cannot be empty!"; }; + + _bankStore call ["handlePlayerLoad", [_uid, _bankValue, _cashValue]]; + }; + case "BANK::GET::TRANSACTION::HISTORY": { + private _bankStore = call FUNC(verifyBankStore); + _data params [["_uid", "", [""]], ["_limit", 10, [0]]]; + + _bankStore call ["getTransactionHistory", [_uid, _limit]]; + }; + default { + diag_log format ["[FORGE::Server::Bank::XEH_preInit] Unknown event: %1 with data: %2", _event, _data]; + }; + }; +}] call CFUNC(addEventHandler); \ No newline at end of file diff --git a/addons/bank/functions/fnc_initBank.sqf b/addons/bank/functions/fnc_initBank.sqf index 33d6331..589c0ed 100644 --- a/addons/bank/functions/fnc_initBank.sqf +++ b/addons/bank/functions/fnc_initBank.sqf @@ -26,5 +26,5 @@ _bank setVariable ["BIS_enableRandomization", false]; }; - diag_log text format ["[FORGE Bank] ClassName: '%1' Pos: '%2' Dir: '%3'", _className, _pos, _dir]; + diag_log text format ["[FORGE::Server::Bank::initBank] ClassName: '%1' Pos: '%2' Dir: '%3'", _className, _pos, _dir]; } forEach ("true" configClasses (missionConfigFile >> "CfgBanks" >> "banks")); \ No newline at end of file diff --git a/addons/bank/functions/fnc_initBankStore.sqf b/addons/bank/functions/fnc_initBankStore.sqf new file mode 100644 index 0000000..b4aa6a8 --- /dev/null +++ b/addons/bank/functions/fnc_initBankStore.sqf @@ -0,0 +1,178 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Initializes a server-side bank store interface for managing banking operations. + * Provides CRUD operations for bank data, including database persistence. + * + * Arguments: + * None + * + * Return Value: + * Bank store object + * + * Example: + * private _bankStore = call forge_server_bank_fnc_initBank; + * _bankStore call ["deposit", [getPlayerUID player, 1000]]; + * + * Public: Yes + */ + +private _bankStore = createHashMapObject [[ + ["#type", "IBankStore"], + ["#create", { + _self set ["accounts", createHashMap]; + _self set ["transactions", []]; + _self set ["isLoaded", true]; + + true + }], + ["handlePlayerLoad", { + params [["_uid", "", [""]], ["_bankValue", 0, [0]], ["_cashValue", 0, [0]]]; + + if (_uid isEqualTo "") exitWith { false }; + + _self call ["updateAccount", [_uid, _bankValue, _cashValue]]; + + diag_log text format ["[FORGE::Server::Bank::Store::handlePlayerLoad] Loaded player data for '%1' - Bank: '%2', Cash: '%3'", _uid, _bankValue, _cashValue]; + + true + }], + ["updateAccount", { + params [["_uid", "", [""]], ["_bankValue", 0, [0]], ["_cashValue", 0, [0]], ["_isSave", false, [false]]]; + + if (_uid isEqualTo "") exitWith { false }; + + private _accounts = _self get "accounts"; + private _account = _accounts getOrDefault [_uid, createHashMap]; + + _account set ["bank", _bankValue]; + _account set ["cash", _cashValue]; + + _accounts set [_uid, _account]; + _self set ["accounts", _accounts]; + + if (_isSave) then { + ["hsetid", _uid, "bank", -1, [_bankValue]] call dragonfly_db_fnc_addTask; + ["hsetid", _uid, "cash", -1, [_cashValue]] call dragonfly_db_fnc_addTask; + }; + + diag_log text format ["[FORGE::Server::Bank::Store::updateAccount] Updated player data for '%1' - Bank: '%2', Cash: '%3'", _uid, _bankValue, _cashValue]; + + true + }], + ["getBalance", { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { 0 }; + + private _accounts = _self get "accounts"; + private _account = _accounts getOrDefault [_uid, createHashMap]; + + _account getOrDefault ["bank", 0] + }], + ["getCash", { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { 0 }; + + private _accounts = _self get "accounts"; + private _account = _accounts getOrDefault [_uid, createHashMap]; + + _account getOrDefault ["cash", 0] + }], + ["deposit", { + params [["_uid", "", [""]], ["_amount", 0, [0]]]; + + if (_uid isEqualTo "" || _amount <= 0) exitWith { false }; + + private _accounts = _self get "accounts"; + private _account = _accounts getOrDefault [_uid, createHashMap]; + private _currentCash = _account getOrDefault ["cash", 0]; + private _currentBalance = _account getOrDefault ["bank", 0]; + + if (_currentCash < _amount) exitWith { false }; + + private _newBalance = _currentBalance + _amount; + private _newCash = _currentCash - _amount; + + _self call ["updateAccount", [_uid, _newBalance, _newCash, true]]; + + private _transactions = _self get "transactions"; + + _transactions pushBack [_uid, "deposit", _amount, time]; + _self set ["transactions", _transactions]; + + true + }], + ["withdraw", { + params [["_uid", "", [""]], ["_amount", 0, [0]]]; + + if (_uid isEqualTo "" || _amount <= 0) exitWith { false }; + + private _accounts = _self get "accounts"; + private _account = _accounts getOrDefault [_uid, createHashMap]; + private _currentBalance = _account getOrDefault ["bank", 0]; + private _currentCash = _account getOrDefault ["cash", 0]; + + if (_currentBalance < _amount) exitWith { false }; + + private _newBalance = _currentBalance - _amount; + private _newCash = _currentCash + _amount; + + _self call ["updateAccount", [_uid, _newBalance, _newCash, true]]; + + private _transactions = _self get "transactions"; + + _transactions pushBack [_uid, "withdraw", _amount, time]; + _self set ["transactions", _transactions]; + + true + }], + ["transfer", { + params [["_fromUid", "", [""]], ["_toUid", "", [""]], ["_amount", 0, [0]]]; + + if (_fromUid isEqualTo "" || _toUid isEqualTo "" || _amount <= 0) exitWith { false }; + + private _accounts = _self get "accounts"; + private _fromAccount = _accounts getOrDefault [_fromUid, createHashMap]; + private _toAccount = _accounts getOrDefault [_toUid, createHashMap]; + private _fromBalance = _fromAccount getOrDefault ["bank", 0]; + private _toBalance = _toAccount getOrDefault ["bank", 0]; + + if (_fromBalance < _amount) exitWith { false }; + + _self call ["updateAccount", [_fromUid, _fromBalance - _amount, 0, true]]; + _self call ["updateAccount", [_toUid, _toBalance + _amount, 0, true]]; + + private _transactions = _self get "transactions"; + + _transactions pushBack [_fromUid, "transfer_out", _amount, time, _toUid]; + _transactions pushBack [_toUid, "transfer_in", _amount, time, _fromUid]; + _self set ["transactions", _transactions]; + + true + }], + ["getTransactionHistory", { + params [["_uid", "", [""]], ["_limit", 10, [0]]]; + + private _transactions = _self get "transactions"; + private _filteredTransactions = []; + + if (_uid isEqualTo "") then { + _filteredTransactions = _transactions; + } else { + { + if ((_x select 0) == _uid) then { _filteredTransactions pushBack _x; }; + } forEach _transactions; + }; + + _filteredTransactions sort false; + _filteredTransactions resize (_limit min (count _filteredTransactions)); + + _filteredTransactions + }] +]]; + +SETMVAR(FORGE_BANK_STORE_REG,_bankStore); +GETMVAR(FORGE_BANK_STORE_REG,_bankStore); \ No newline at end of file diff --git a/addons/bank/functions/fnc_verifyBankStore.sqf b/addons/bank/functions/fnc_verifyBankStore.sqf new file mode 100644 index 0000000..b532b1a --- /dev/null +++ b/addons/bank/functions/fnc_verifyBankStore.sqf @@ -0,0 +1,32 @@ +#include "..\script_component.hpp" + +/* + * Function: forge_server_bank_fnc_verifyBankStore + * Author: IDSolutions + * + * [Description] + * Ensures the bank store is initialized and returns the store object. + * Acts as a singleton accessor for the bank store interface. + * If the store doesn't exist yet, it initializes it first. + * + * Arguments: + * None + * + * Return Value: + * Bank Store - The bank store interface object + * + * Example: + * private _bankStore = call forge_server_bank_fnc_verifyBankStore + * + * Public: No + */ + +private _store = GETMVAR(FORGE_BANK_STORE_REG,nil); + +if (isNil "_store") then { + _store = call FUNC(initBankStore); + + diag_log text "[FORGE::Server::Bank::verifyBankStore] Bank store initialized"; +}; + +_store \ No newline at end of file