reworked the extension init/de-init logic to be asynchronous

This commit is contained in:
2023-04-14 11:17:41 -07:00
parent 5d30b1931c
commit 6cf4297ab9
6 changed files with 108 additions and 63 deletions

View File

@@ -2,7 +2,7 @@ class CfgPatches {
class RangerMetrics {
units[] = {};
weapons[] = {};
requiredVersion = 0.1;
requiredVersion = 2.10;
requiredAddons[] = {};
author[] = {"EagleTrooper","Gary","IndigoFox"};
authorUrl = "http://example.com";
@@ -10,6 +10,13 @@ class CfgPatches {
};
class CfgFunctions {
class RangerMetrics_callback {
class functions {
file = "\RangerMetrics\functions\callbackHandlers";
class callbackHandler {};
class loadSettings {};
};
};
class RangerMetrics_event {
class functions {
file = "\RangerMetrics\functions\capture\EHOnly";
@@ -23,7 +30,7 @@ class CfgFunctions {
class MarkerUpdated {};
class milsim_serverEfficiency {};
};
}
};
class RangerMetrics_cDefinitions {
class functions {
file = "\RangerMetrics\functions\captureDefinitions";
@@ -62,7 +69,6 @@ class CfgFunctions {
class log {};
class queue {};
class send {};
class callbackHandler {};
class sendClientPoll {};
class startServerPoll {};
class classHandlers {};

View File

@@ -0,0 +1,45 @@
params ["_name", "_function", "_data"];
if !(_name == "RangerMetrics") exitWith {};
// Validate data param
if (isNil "_data") then {_data = ""};
if (_data isEqualTo "") exitWith {
[
format ["Callback empty data: %1", _function],
"WARN"
] call RangerMetrics_fnc_log;
false;
};
// Parse response from string array
private "_response";
try {
diag_log format ["Raw callback: %1: %2", _function, _data];
_response = parseSimpleArray _data;
} catch {
[
format ["Callback invalid data: %1: %2", _function, _data],
"WARN"
] call RangerMetrics_fnc_log;
};
switch (_function) do {
case "deinitExtension": {
diag_log format ["RangerMetrics: deinitExtension: %1", _response];
// Our first call is deinitExtension. When we received a single "true" value, we can then run init processes for the extension connections.
if ((_response select 0) isEqualTo true) then {
"RangerMetrics" callExtension "initExtension";
} else {
_response call RangerMetrics_fnc_log;
};
};
case "loadSettings": {
// Load settings
_response call RangerMetrics_callback_fnc_loadSettings;
};
default {
_response call RangerMetrics_fnc_log;
}
}

View File

@@ -0,0 +1,33 @@
private _data = _this;
switch (_data select 0) do {
case "CREATED SETTINGS": {
[
"settings.json did not exist and has been created - you will need to update it with your own settings before the addon will initialize further.",
"ERROR"
] call RangerMetrics_fnc_log;
};
case "SETTINGS LOADED": {
RangerMetrics_settings = createHashMapFromArray (_data # 1);
[
format [
"Settings loaded successfully from JSON. %1",
RangerMetrics_settings
],
"INFO"
] call RangerMetrics_fnc_log;
// send server profile name to all clients with JIP, so HC or player reporting knows what server it's connected to
if (isServer) then {
["RangerMetrics_serverProfileName", profileName] remoteExecCall ["setVariable", 0, true];
RangerMetrics_serverProfileName = profileName;
};
};
default {
[
_data select 0,
"INFO"
] call RangerMetrics_fnc_log;
};
};

View File

@@ -1,14 +0,0 @@
params ["_name", "_function", "_data"];
if (_name == "RangerMetrics") then {
if (isNil "_data") then {_data = ""};
try {
if (_data isEqualType "") exitWith {
_data = parseSimpleArray _data;
_data call RangerMetrics_fnc_log;
};
diag_log format ["Callback unsupported type: %1: %2", _function, _data];
} catch {
_data = format ["%1", _data];
};
};

View File

@@ -19,49 +19,18 @@ RangerMetrics_sendBatchHandle = scriptNull;
[format ["CBA detected: %1", RangerMetrics_cbaPresent]] call RangerMetrics_fnc_log;
["Initializing v0.1"] call RangerMetrics_fnc_log;
// load settings from extension / settings.json
private _settingsLoaded = "RangerMetrics" callExtension "loadSettings";
// if (isNil "_settingsLoaded") exitWith {
// ["Extension not found, disabling"] call RangerMetrics_fnc_log;
// RangerMetrics_run = false;
// };
if (_settingsLoaded isEqualTo [] || _settingsLoaded isEqualTo "") exitWith {
["Failed to load settings, exiting", "ERROR"] call RangerMetrics_fnc_log;
};
_settingsLoaded = parseSimpleArray (_settingsLoaded);
[format["Settings loaded: %1", _settingsLoaded]] call RangerMetrics_fnc_log;
RangerMetrics_settings = createHashMap;
RangerMetrics_settings set [
"influxDB",
createHashMapFromArray [
["host", _settingsLoaded#1],
["org", _settingsLoaded#2]
]
];
RangerMetrics_settings set [
"arma3",
createHashMapFromArray [
["refreshRateMs", _settingsLoaded#3]
]
// Create listener - extension calls are async, so we need to listen for the response
addMissionEventHandler [
"ExtensionCallback",
RangerMetrics_callback_fnc_callbackHandler
];
// Deinit to start fresh. See callback handler for the remainder of async init code
"RangerMetrics" callExtension "deinitExtension";
// connect to DB, extension is now ready
private _dbConnection = "RangerMetrics" callExtension "connectToInflux";
if (_dbConnection isEqualTo "") exitWith {
["Failed to connect to InfluxDB, disabling"] call RangerMetrics_fnc_log;
};
_response = parseSimpleArray _dbConnection;
(_response) call RangerMetrics_fnc_log;
systemChat str _response;
// send server profile name to all clients with JIP, so HC or player reporting knows what server it's connected to
if (isServer) then {
["RangerMetrics_serverProfileName", profileName] remoteExecCall ["setVariable", 0, true];
RangerMetrics_serverProfileName = profileName;
};
if (true) exitWith {};
// define the metrics to capture by sideloading definition files
@@ -158,10 +127,7 @@ RangerMetrics_captureDefinitions = createHashMapFromArray [
[] spawn {
sleep 1;
isNil {
addMissionEventHandler [
"ExtensionCallback",
RangerMetrics_fnc_callbackHandler
];
// set up CBA class inits if CBA loaded
call RangerMetrics_fnc_classHandlers;