mirror of
https://github.com/indig0fox/Arma3-AttendanceTracker.git/
synced 2025-12-08 09:51:47 -06:00
add hemtt support, major refactor
- no longer supports server events - can now more easily build using hemtt - extension vastly improved in both structure and functionality - tested on listen server - includes schema change
This commit is contained in:
24
addons/main/functions/fn_callbackHandler.sqf
Normal file
24
addons/main/functions/fn_callbackHandler.sqf
Normal file
@@ -0,0 +1,24 @@
|
||||
addMissionEventHandler ["ExtensionCallback", {
|
||||
params ["_name", "_function", "_data"];
|
||||
if !(_name isEqualTo "AttendanceTracker") exitWith {};
|
||||
|
||||
if (ATDebug && _function isNotEqualTo ":LOG:") then {
|
||||
diag_log format ["Raw callback: %1 _ %2", _function, _data];
|
||||
};
|
||||
|
||||
_dataArr = parseSimpleArray _data;
|
||||
if (count _dataArr < 1) exitWith {};
|
||||
|
||||
switch (_function) do {
|
||||
case ":LOG:": {
|
||||
diag_log formatText[
|
||||
"[Attendance Tracker] %1",
|
||||
_dataArr select 0
|
||||
];
|
||||
};
|
||||
default {
|
||||
[format["%1", _dataArr]] call attendanceTracker_fnc_log;
|
||||
};
|
||||
};
|
||||
true;
|
||||
}];
|
||||
19
addons/main/functions/fn_getMissionHash.sqf
Normal file
19
addons/main/functions/fn_getMissionHash.sqf
Normal file
@@ -0,0 +1,19 @@
|
||||
addMissionEventHandler ["ExtensionCallback", {
|
||||
params ["_extension", "_function", "_data"];
|
||||
if !(_extension isEqualTo "AttendanceTracker") exitWith {};
|
||||
if !(_function isEqualTo ":MISSION:HASH:") exitWith {};
|
||||
|
||||
_dataArr = parseSimpleArray _data;
|
||||
if (count _dataArr < 1) exitWith {};
|
||||
|
||||
_dataArr params ["_startTime", "_hash"];
|
||||
ATNamespace setVariable ["missionStartTime", call attendanceTracker_fnc_timestamp];
|
||||
ATNamespace setVariable ["missionHash", _hash];
|
||||
|
||||
removeMissionEventHandler [
|
||||
"ExtensionCallback",
|
||||
_thisEventHandler
|
||||
];
|
||||
}];
|
||||
|
||||
"AttendanceTracker" callExtension ":MISSION:HASH:";
|
||||
12
addons/main/functions/fn_getMissionInfo.sqf
Normal file
12
addons/main/functions/fn_getMissionInfo.sqf
Normal file
@@ -0,0 +1,12 @@
|
||||
createHashMapFromArray [
|
||||
["missionName", missionName],
|
||||
["missionStart", ATNamespace getVariable "missionStartTime"],
|
||||
["missionHash", ATNamespace getVariable "missionHash"],
|
||||
["briefingName", briefingName],
|
||||
["missionNameSource", missionNameSource],
|
||||
["onLoadName", getMissionConfigValue ["onLoadName", ""]],
|
||||
["author", getMissionConfigValue ["author", ""]],
|
||||
["serverName", serverName],
|
||||
["serverProfile", profileName],
|
||||
["worldName", toLower worldName]
|
||||
];
|
||||
27
addons/main/functions/fn_getSettings.sqf
Normal file
27
addons/main/functions/fn_getSettings.sqf
Normal file
@@ -0,0 +1,27 @@
|
||||
addMissionEventHandler ["ExtensionCallback", {
|
||||
params ["_extension", "_function", "_data"];
|
||||
if !(_extension isEqualTo "AttendanceTracker") exitWith {};
|
||||
if !(_function isEqualTo ":GET:SETTINGS:") exitWith {};
|
||||
|
||||
_dataArr = parseSimpleArray _data;
|
||||
diag_log format ["AT: Settings received: %1", _dataArr];
|
||||
if (count _dataArr < 1) exitWith {};
|
||||
|
||||
private _settingsJSON = _dataArr select 0;
|
||||
private _settingsNamespace = [_settingsJSON] call CBA_fnc_parseJSON;
|
||||
{
|
||||
ATNamespace setVariable [_x, _settingsNamespace getVariable _x];
|
||||
} forEach (allVariables _settingsNamespace);
|
||||
ATDebug = ATNamespace getVariable "debug";
|
||||
ATUpdateDelay = ATNamespace getVariable "dbUpdateInterval";
|
||||
// remove last character (unit of time) and parse to number
|
||||
ATUpdateDelay = parseNumber (ATUpdateDelay select [0, count ATUpdateDelay - 1]);
|
||||
|
||||
|
||||
removeMissionEventHandler [
|
||||
"ExtensionCallback",
|
||||
_thisEventHandler
|
||||
];
|
||||
}];
|
||||
|
||||
"AttendanceTracker" callExtension ":GET:SETTINGS:";
|
||||
28
addons/main/functions/fn_getWorldInfo.sqf
Normal file
28
addons/main/functions/fn_getWorldInfo.sqf
Normal file
@@ -0,0 +1,28 @@
|
||||
_world = ( configfile >> "CfgWorlds" >> worldName );
|
||||
_author = getText( _world >> "author" );
|
||||
_name = getText ( _world >> "description" );
|
||||
|
||||
_source = configSourceMod ( _world );
|
||||
|
||||
_workshopID = '';
|
||||
|
||||
{
|
||||
if ( ( _x#1 ) == _source ) then {
|
||||
_workshopID = _x#7;
|
||||
break;
|
||||
};
|
||||
} foreach getLoadedModsInfo;
|
||||
|
||||
// [_name, _author, _workshopID];
|
||||
_return = createHashMapFromArray [
|
||||
["author", _author],
|
||||
["workshopID", _workshopID],
|
||||
["displayName", _name],
|
||||
["worldName", toLower worldName],
|
||||
["worldNameOriginal", _name],
|
||||
["worldSize", worldSize],
|
||||
["latitude", -1 * getNumber( _world >> "latitude" )],
|
||||
["longitude", getNumber( _world >> "longitude" )]
|
||||
];
|
||||
[format["WorldInfo is: %1", _return]] call attendanceTracker_fnc_log;
|
||||
_return
|
||||
15
addons/main/functions/fn_log.sqf
Normal file
15
addons/main/functions/fn_log.sqf
Normal file
@@ -0,0 +1,15 @@
|
||||
params [
|
||||
["_message", "", [""]],
|
||||
["_level", "INFO", [""]],
|
||||
"_function"
|
||||
];
|
||||
|
||||
if (isNil "_message") exitWith {false};
|
||||
if (
|
||||
missionNamespace getVariable ["ATDebug", true] &&
|
||||
_level != "WARN" && _level != "ERROR"
|
||||
) exitWith {};
|
||||
|
||||
LOG_SYS(_level, _message);
|
||||
|
||||
true;
|
||||
1
addons/main/functions/fn_missionLoaded.sqf
Normal file
1
addons/main/functions/fn_missionLoaded.sqf
Normal file
@@ -0,0 +1 @@
|
||||
!(getClientStateNumber <= 5 || getClientStateNumber isEqualTo 11);
|
||||
63
addons/main/functions/fn_onPlayerConnected.sqf
Normal file
63
addons/main/functions/fn_onPlayerConnected.sqf
Normal file
@@ -0,0 +1,63 @@
|
||||
params ["_id", "_uid", "_name", "_jip", "_owner", "_idstr"];
|
||||
|
||||
[format ["(EventHandler) PlayerConnected fired: %1", _this], "DEBUG"] call attendanceTracker_fnc_log;
|
||||
|
||||
if !(call attendanceTracker_fnc_missionLoaded) exitWith {
|
||||
[format ["(EventHandler) PlayerConnected: Server is in Mission Asked, likely mission selection state. Skipping.."], "DEBUG"] call attendanceTracker_fnc_log;
|
||||
};
|
||||
|
||||
private _userInfo = (getUserInfo _idstr);
|
||||
if ((count _userInfo) isEqualTo 0) exitWith {
|
||||
[format ["(EventHandler) PlayerConnected: No user info found for %1", _idstr], "DEBUG"] call attendanceTracker_fnc_log;
|
||||
};
|
||||
|
||||
_userInfo params ["_playerID", "_ownerId", "_playerUID", "_profileName", "_displayName", "_steamName", "_clientState", "_isHC", "_adminState", "_networkInfo", "_unit"];
|
||||
if (_isHC) exitWith {
|
||||
[
|
||||
format [
|
||||
"(EventHandler) PlayerConnected: %1 is HC, skipping",
|
||||
_playerID
|
||||
],
|
||||
"DEBUG"
|
||||
] call attendanceTracker_fnc_log;
|
||||
};
|
||||
|
||||
// start CBA PFH
|
||||
[
|
||||
format [
|
||||
"(EventHandler) PlayerConnected: Starting CBA PFH for %1",
|
||||
_playerID
|
||||
],
|
||||
"DEBUG"
|
||||
] call attendanceTracker_fnc_log;
|
||||
|
||||
[
|
||||
{
|
||||
params ["_args", "_handle"];
|
||||
// check if player is still connected
|
||||
_args params ["_playerID", "_playerUID", "_profileName", "_steamName", "_jip", "_roleDescription"];
|
||||
private _userInfo = getUserInfo _playerID;
|
||||
private _clientStateNumber = 0;
|
||||
if (_userInfo isEqualTo []) exitWith {
|
||||
[_handle] call CBA_fnc_removePerFrameHandler;
|
||||
};
|
||||
|
||||
_clientStateNumber = _userInfo select 6;
|
||||
|
||||
if (_clientStateNumber < 6) exitWith {
|
||||
[format ["(EventHandler) PlayerConnected: %1 (UID) is no longer connected to the mission, exiting CBA PFH", _playerID], "DEBUG"] call attendanceTracker_fnc_log;
|
||||
[_handle] call CBA_fnc_removePerFrameHandler;
|
||||
};
|
||||
|
||||
_args call attendanceTracker_fnc_writePlayer;
|
||||
},
|
||||
ATUpdateDelay,
|
||||
[
|
||||
_playerID,
|
||||
_playerUID,
|
||||
_profileName,
|
||||
_steamName,
|
||||
_jip,
|
||||
roleDescription _unit
|
||||
]
|
||||
] call CBA_fnc_addPerFrameHandler;
|
||||
61
addons/main/functions/fn_postInit.sqf
Normal file
61
addons/main/functions/fn_postInit.sqf
Normal file
@@ -0,0 +1,61 @@
|
||||
#include "..\script_mod.hpp"
|
||||
|
||||
if (!isServer) exitWith {};
|
||||
|
||||
ATNamespace = false call CBA_fnc_createNamespace;
|
||||
ATDebug = true;
|
||||
"AttendanceTracker" callExtension ":START:";
|
||||
|
||||
|
||||
// we'll wait for the asynchronous init steps of the extension to finish, to confirm we have a DB connection and our config was loaded. If there are errors with either, the extension won't reply and initiate further during this mission.
|
||||
addMissionEventHandler ["ExtensionCallback", {
|
||||
params ["_name", "_function", "_data"];
|
||||
if !(_name isEqualTo "AttendanceTracker") exitWith {};
|
||||
if !(_function isEqualTo ":READY:") exitWith {};
|
||||
|
||||
call attendanceTracker_fnc_getMissionHash;
|
||||
call attendanceTracker_fnc_getSettings;
|
||||
|
||||
[
|
||||
{// wait until settings have been loaded from extension
|
||||
!isNil {ATNamespace getVariable "missionHash"} &&
|
||||
!isNil {ATDebug}
|
||||
},
|
||||
{
|
||||
|
||||
// get world and mission context
|
||||
ATNamespace setVariable [
|
||||
"worldContext",
|
||||
call attendanceTracker_fnc_getWorldInfo
|
||||
];
|
||||
ATNamespace setVariable [
|
||||
"missionContext",
|
||||
call attendanceTracker_fnc_getMissionInfo
|
||||
];
|
||||
|
||||
// write them to establish DB rows
|
||||
"AttendanceTracker" callExtension [
|
||||
":LOG:MISSION:",
|
||||
[
|
||||
[ATNamespace getVariable "missionContext"] call CBA_fnc_encodeJSON,
|
||||
[ATNamespace getVariable "worldContext"] call CBA_fnc_encodeJSON
|
||||
]
|
||||
];
|
||||
|
||||
// add player connected (to mission) handler
|
||||
addMissionEventHandler ["PlayerConnected", {
|
||||
_this call attendanceTracker_fnc_onPlayerConnected;
|
||||
}];
|
||||
},
|
||||
[],
|
||||
10, // 10 second timeout
|
||||
{ // timeout code
|
||||
["Failed to load settings", "ERROR"] call attendanceTracker_fnc_log;
|
||||
}
|
||||
] call CBA_fnc_waitUntilAndExecute;
|
||||
|
||||
removeMissionEventHandler [
|
||||
"ExtensionCallback",
|
||||
_thisEventHandler
|
||||
];
|
||||
}];
|
||||
24
addons/main/functions/fn_timestamp.sqf
Normal file
24
addons/main/functions/fn_timestamp.sqf
Normal file
@@ -0,0 +1,24 @@
|
||||
// (parseSimpleArray ("AttendanceTracker" callExtension "getTimestamp")) select 0;
|
||||
|
||||
// const time.RFC3339 untyped string = "2006-01-02T15:04:05Z07:00"
|
||||
|
||||
systemTimeUTC apply {if (_x < 10) then {"0" + str _x} else {str _x}} params [
|
||||
"_year",
|
||||
"_month",
|
||||
"_day",
|
||||
"_hour",
|
||||
"_minute",
|
||||
"_second",
|
||||
"_millisecond"
|
||||
];
|
||||
|
||||
format[
|
||||
"%1-%2-%3T%4:%5:%6Z",
|
||||
_year,
|
||||
_month,
|
||||
_day,
|
||||
_hour,
|
||||
_minute,
|
||||
_second
|
||||
];
|
||||
|
||||
21
addons/main/functions/fn_writePlayer.sqf
Normal file
21
addons/main/functions/fn_writePlayer.sqf
Normal file
@@ -0,0 +1,21 @@
|
||||
params [
|
||||
["_playerId", ""],
|
||||
["_playerUID", ""],
|
||||
["_profileName", ""],
|
||||
["_steamName", ""],
|
||||
["_isJIP", false, [true, false]],
|
||||
["_roleDescription", ""]
|
||||
];
|
||||
|
||||
private _hash = +(ATNamespace getVariable ["missionContext", createHashMap]);
|
||||
|
||||
_hash set ["playerId", _playerId];
|
||||
_hash set ["playerUID", _playerUID];
|
||||
_hash set ["profileName", _profileName];
|
||||
_hash set ["steamName", _steamName];
|
||||
_hash set ["isJIP", _isJIP];
|
||||
_hash set ["roleDescription", _roleDescription];
|
||||
|
||||
"AttendanceTracker" callExtension [":LOG:PRESENCE:", [[_hash] call CBA_fnc_encodeJSON]];
|
||||
|
||||
true;
|
||||
Reference in New Issue
Block a user