diff --git a/@AttendanceTracker.7z b/@AttendanceTracker.7z index 78fa082..add65da 100644 Binary files a/@AttendanceTracker.7z and b/@AttendanceTracker.7z differ diff --git a/@AttendanceTracker/addons/AttendanceTracker.pbo b/@AttendanceTracker/addons/AttendanceTracker.pbo index 2ce3d4e..8ee6545 100644 Binary files a/@AttendanceTracker/addons/AttendanceTracker.pbo and b/@AttendanceTracker/addons/AttendanceTracker.pbo differ diff --git a/@AttendanceTracker/addons/AttendanceTracker/config.cpp b/@AttendanceTracker/addons/AttendanceTracker/config.cpp index 5f908e4..c93dd66 100644 --- a/@AttendanceTracker/addons/AttendanceTracker/config.cpp +++ b/@AttendanceTracker/addons/AttendanceTracker/config.cpp @@ -21,7 +21,8 @@ class CfgFunctions { class logMissionEvent {}; class logServerEvent {}; class timestamp {}; - class getHash {}; + class getMissionHash {}; + class getWorldInfo {}; }; }; }; \ No newline at end of file diff --git a/@AttendanceTracker/addons/AttendanceTracker/functions/fn_callbackHandler.sqf b/@AttendanceTracker/addons/AttendanceTracker/functions/fn_callbackHandler.sqf index 860ba44..9e5f076 100644 --- a/@AttendanceTracker/addons/AttendanceTracker/functions/fn_callbackHandler.sqf +++ b/@AttendanceTracker/addons/AttendanceTracker/functions/fn_callbackHandler.sqf @@ -61,13 +61,13 @@ addMissionEventHandler ["ExtensionCallback", { }; case "writeMissionInfo": { if (_response#0 == "MISSION_ID") then { - AttendanceTracker_missionId = parseNumber _response; + AttendanceTracker_missionId = parseNumber (_response#1); }; }; case "writeAttendance": { if (_response#0 == "ATT_LOG") then { _response params ["_netId", "_rowId"]; - ((AttendanceTracker getVariable ["allUsers", createHashMap]) get _netId) set ["_rowID", _rowID]; + ((AttendanceTracker getVariable ["allUsers", createHashMap]) get _netId) append _rowID; }; }; default { diff --git a/@AttendanceTracker/addons/AttendanceTracker/functions/fn_eventHandlers.sqf b/@AttendanceTracker/addons/AttendanceTracker/functions/fn_eventHandlers.sqf index fe610f9..55b399d 100644 --- a/@AttendanceTracker/addons/AttendanceTracker/functions/fn_eventHandlers.sqf +++ b/@AttendanceTracker/addons/AttendanceTracker/functions/fn_eventHandlers.sqf @@ -5,8 +5,14 @@ [format ["(EventHandler) OnUserConnected fired: %1", _this], "DEBUG"] call attendanceTracker_fnc_log; private _userInfo = (getUserInfo _networkId); + if (isNil "_userInfo") exitWith { + [format ["(EventHandler) OnUserConnected: No user info found for %1", _networkId], "DEBUG"] call attendanceTracker_fnc_log; + }; + _userInfo params ["_playerID", "_ownerId", "_playerUID", "_profileName", "_displayName", "_steamName", "_clientState", "_isHC", "_adminState", "_networkInfo", "_unit"]; - if (_isHC) exitWith {}; + if (_isHC) exitWith { + [format ["(EventHandler) OnUserConnected: %1 is HC, skipping", _playerID], "DEBUG"] call attendanceTracker_fnc_log; + }; (AttendanceTracker getVariable ["allUsers", createHashMap]) set [_networkId, _userInfo]; [ @@ -16,7 +22,7 @@ _profileName, _steamName, nil // send rowId on d/c only - ] call attendanceTracker_fnc_writeAttendance; + ] call attendanceTracker_fnc_logServerEvent; }], ["OnUserDisconnected", { @@ -25,10 +31,14 @@ [format ["(EventHandler) OnUserDisconnected fired: %1", _this], "DEBUG"] call attendanceTracker_fnc_log; private _userInfo = (AttendanceTracker getVariable ["allUsers", createHashMap]) get _networkId; - if (isNil "_userInfo") exitWith {}; + if (isNil "_userInfo") exitWith { + [format ["(EventHandler) OnUserDisconnected: No user info found for %1", _networkId], "DEBUG"] call attendanceTracker_fnc_log; + }; _userInfo params ["_playerID", "_ownerId", "_playerUID", "_profileName", "_displayName", "_steamName", "_clientState", "_isHC", "_adminState", "_networkInfo", "_unit", "_rowId"]; - if (_isHC) exitWith {}; + if (_isHC) exitWith { + [format ["(EventHandler) OnUserDisconnected: %1 is HC, skipping", _playerID], "DEBUG"] call attendanceTracker_fnc_log; + }; [ "Server", @@ -37,7 +47,7 @@ _profileName, _steamName, (if (!isNil "_rowId") then {_rowId} else {nil}) // send rowId on d/c only - ] call attendanceTracker_fnc_writeAttendance; + ] call attendanceTracker_fnc_logServerEvent; }], ["PlayerConnected", { params ["_id", "_uid", "_name", "_jip", "_owner", "_idstr"]; @@ -45,10 +55,14 @@ [format ["(EventHandler) PlayerConnected fired: %1", _this], "DEBUG"] call attendanceTracker_fnc_log; private _userInfo = (getUserInfo _idstr); - if (isNil "_userInfo") exitWith {}; + if (isNil "_userInfo") 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 {}; + if (_isHC) exitWith { + [format ["(EventHandler) PlayerConnected: %1 is HC, skipping", _playerID], "DEBUG"] call attendanceTracker_fnc_log; + }; (AttendanceTracker getVariable ["allUsers", createHashMap]) set [_playerID, _userInfo]; [ @@ -74,7 +88,9 @@ }; _userInfo params ["_playerID", "_ownerId", "_playerUID", "_profileName", "_displayName", "_steamName", "_clientState", "_isHC", "_adminState", "_networkInfo", "_unit", "_rowId"]; - if (_isHC) exitWith {}; + if (_isHC) exitWith { + [format ["(EventHandler) HandleDisconnect: %1 is HC, skipping", _playerID], "DEBUG"] call attendanceTracker_fnc_log; + }; [ "Mission", diff --git a/@AttendanceTracker/addons/AttendanceTracker/functions/fn_logServerEvent.sqf b/@AttendanceTracker/addons/AttendanceTracker/functions/fn_logServerEvent.sqf index 2d72a74..6f7ec6a 100644 --- a/@AttendanceTracker/addons/AttendanceTracker/functions/fn_logServerEvent.sqf +++ b/@AttendanceTracker/addons/AttendanceTracker/functions/fn_logServerEvent.sqf @@ -9,7 +9,7 @@ params [ private _hash = + (AttendanceTracker getVariable ["missionContext", createHashMap]); -_hash set ["networkId", netID player] +_hash set ["networkId", netID player]; _hash set ["eventType", _eventType]; _hash set ["playerId", _playerId]; _hash set ["playerUID", _playerUID]; diff --git a/@AttendanceTracker/addons/AttendanceTracker/functions/fn_timestamp.sqf b/@AttendanceTracker/addons/AttendanceTracker/functions/fn_timestamp.sqf index e53f794..b578b47 100644 --- a/@AttendanceTracker/addons/AttendanceTracker/functions/fn_timestamp.sqf +++ b/@AttendanceTracker/addons/AttendanceTracker/functions/fn_timestamp.sqf @@ -8,7 +8,7 @@ systemTimeUTC params [ "_day", "_hour", "_minute", - "_second" + "_second", "_millisecond" ]; diff --git a/extension/AttendanceTracker_x64.dll b/extension/AttendanceTracker_x64.dll index fe528f5..53c41e5 100644 Binary files a/extension/AttendanceTracker_x64.dll and b/extension/AttendanceTracker_x64.dll differ diff --git a/extension/main.go b/extension/main.go index e53ce27..2d4cf52 100644 --- a/extension/main.go +++ b/extension/main.go @@ -18,7 +18,6 @@ import ( "os" "path" "runtime" - "strconv" "strings" "time" "unsafe" @@ -38,6 +37,8 @@ var ATTENDANCE_TABLE string = "attendance" var MISSIONS_TABLE string = "missions" var WORLDS_TABLE string = "worlds" +// ! TODO make a hash to save key:netId from A3 value:rowId from join event + var ATConfig AttendanceTrackerConfig type AttendanceTrackerConfig struct { @@ -117,7 +118,7 @@ func getMissionHash() string { hash := md5.Sum([]byte(time.Now().Format("2006-01-02 15:04:05"))) // convert to string - hashString := fmt.Sprintf("%x", hash) + hashString := fmt.Sprintf(`%x`, hash) writeLog(functionName, fmt.Sprintf(`["Mission hash: %s", "INFO"]`, hashString)) return hashString } @@ -260,7 +261,7 @@ type MissionInfo struct { func writeMissionInfo(missionInfo string) { functionName := "writeMissionInfo" - writeLog(functionName, fmt.Sprintf(`["%s", "DEBUG"]`, missionInfo)) + // writeLog(functionName, fmt.Sprintf(`["%s", "DEBUG"]`, missionInfo)) // missionInfo is json, parse it var mi MissionInfo fixedString := fixEscapeQuotes(trimQuotes(missionInfo)) @@ -271,15 +272,9 @@ func writeMissionInfo(missionInfo string) { } // get MySQL friendly datetime - // first, convert string to int - missionStartTime, err := strconv.ParseInt(mi.MissionStart, 10, 64) - if err != nil { - writeLog(functionName, fmt.Sprintf(`["%s", "ERROR"]`, err)) - return - } - t := time.Unix(0, missionStartTime).Format("2006-01-02 15:04:05") + // write to log - writeLog(functionName, fmt.Sprintf(`["MissionName:%s BriefingName:%s MissionNameSource:%s OnLoadName:%s Author:%s ServerName:%s ServerProfile:%s MissionStart:%s MissionHash:%s", "INFO"]`, mi.MissionName, mi.BriefingName, mi.MissionNameSource, mi.OnLoadName, mi.Author, mi.ServerName, mi.ServerProfile, t, mi.MissionHash)) + writeLog(functionName, fmt.Sprintf(`["MissionName:%s BriefingName:%s MissionNameSource:%s OnLoadName:%s Author:%s ServerName:%s ServerProfile:%s MissionStart:%s MissionHash:%s", "INFO"]`, mi.MissionName, mi.BriefingName, mi.MissionNameSource, mi.OnLoadName, mi.Author, mi.ServerName, mi.ServerProfile, mi.MissionStart, mi.MissionHash)) // write to database // every mission is unique, so insert it