diff --git a/addons/db/XEH_PREP.hpp b/addons/db/XEH_PREP.hpp index 3957e2c..afe3877 100644 --- a/addons/db/XEH_PREP.hpp +++ b/addons/db/XEH_PREP.hpp @@ -20,8 +20,10 @@ PREP(listSet); PREP(pubSubFetch); PREP(pubSubHandler); PREP(processQueue); +PREP(publish); PREP(saveDB); PREP(scheduler); PREP(set); PREP(setup); +PREP(subscribe); PREP(test); \ No newline at end of file diff --git a/addons/db/functions/fnc_publish.sqf b/addons/db/functions/fnc_publish.sqf new file mode 100644 index 0000000..5757cfa --- /dev/null +++ b/addons/db/functions/fnc_publish.sqf @@ -0,0 +1,49 @@ +#include "script_component.hpp" +/* + * Function: dragonfly_db_fnc_publish + * Author: Creedcoder, J. Schmidt + * Edit: 07.15.2024 + * Copyright © 2024 Creedcoder, J. Schmidt, All rights reserved + * + * Do not edit without permission! + * + * This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. + * To view a copy of this license, vist https://creativecommons.org/licenses/by-nc-sa/4.0/ or send a letter to Creative Commons, + * PO Box 1866, Mountain View, CA 94042 + * + * [Description] + * Publish a message to a DragonflyDB channel. + * The message will be routed through the CBA event system based on the subscription event type. + * + * Arguments: + * 0: STRING - Channel name to publish to (default: "") + * 1: ARRAY|STRING|NUMBER|BOOL - Data to publish (default: []) + * + * Return Value: + * BOOLEAN - True if successful, false otherwise + * + * Examples: + * ["global_chat", "Hello world!"] call dragonfly_db_fnc_publish + * ["mission_updates", ["task_01", "SUCCEEDED", [2, 3, 4]]] call dragonfly_db_fnc_publish + * + * Public: Yes + */ + +params [ + ["_channel", "", [""]], + ["_message", [], [[], "", 0, true]] +]; + +if (_channel isEqualTo "") exitWith { + diag_log text format ["ArmaDragonflyClient: 'dragonfly_db_fnc_publish' Invalid Input for Channel '%1'", _channel]; + false +}; + +private _args = [_channel, _message]; +private _formattedArgs = _args apply { if (_x isEqualType "") then { str _x } else { _x } }; +private _extensionArgs = _formattedArgs joinString ","; +private _result = "ArmaDragonflyClient" callExtension ["publish", [_extensionArgs]]; + +diag_log text format ["ArmaDragonflyClient: 'dragonfly_db_fnc_publish' Published message to channel '%1': '%2'", _channel, _message]; + +true \ No newline at end of file diff --git a/addons/db/functions/fnc_subscribe.sqf b/addons/db/functions/fnc_subscribe.sqf new file mode 100644 index 0000000..643e9f7 --- /dev/null +++ b/addons/db/functions/fnc_subscribe.sqf @@ -0,0 +1,71 @@ +#include "script_component.hpp" +/* + * Function: dragonfly_db_fnc_subscribe + * Author: J. Schmidt + * Edit: 07.15.2024 + * Copyright © 2024 J. Schmidt, All rights reserved + * + * Do not edit without permission! + * + * This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. + * To view a copy of this license, vist https://creativecommons.org/licenses/by-nc-sa/4.0/ or send a letter to Creative Commons, + * PO Box 1866, Mountain View, CA 94042 + * + * [Description] + * Subscribe to a DragonflyDB channel for real-time updates. + * Uses CBA event system for message handling. + * + * Arguments: + * 0: STRING - Channel name to subscribe to (default: "") + * 1: STRING - Event type: "global", "local", "server", or "remote" (default: "global") + * 2: STRING - CBA event name to trigger when messages are received (default: "") + * 3: STRING - NetID of target to receive messages (only needed for "remote" event type) (default: nil) + * + * Return Value: + * BOOLEAN - True if successful, false otherwise + * + * Examples: + * ["global_chat", "global", "myChatEvent"] call dragonfly_db_fnc_subscribe + * ["player_notifications", "remote", "playerNotificationEvent", netId player] call dragonfly_db_fnc_subscribe + * + * Public: Yes + */ + +params [ + ["_channel", "", [""]], + ["_eventType", "global", [""]], + ["_eventName", "", [""]], + ["_target", nil, [""]] +]; + +if (_channel isEqualTo "") exitWith { + diag_log text format ["ArmaDragonflyClient: 'dragonfly_db_fnc_subscribe' Invalid Input for Channel '%1'", _channel]; + false +}; + +if (!(_eventType in ["global", "local", "server", "remote"])) exitWith { + diag_log text format ["ArmaDragonflyClient: 'dragonfly_db_fnc_subscribe' Invalid Input for Event Type '%1'", _eventType]; + false +}; + +if (_eventType isEqualTo "remote" && (isNil "_target" || _target isEqualTo "")) exitWith { + diag_log text format ["ArmaDragonflyClient: 'dragonfly_db_fnc_subscribe' Invalid Input for Target NetID '%1'", _target]; + false +}; + +if (_eventName isEqualTo "") exitWith { + diag_log text format ["ArmaDragonflyClient: 'dragonfly_db_fnc_subscribe' Invalid Input for Event Name '%1'", _eventName]; + false +}; + +private _args = [_channel, _eventType, _eventName]; + +if (!isNil "_target") then { _args pushBack _target; }; + +private _formattedArgs = _args apply { if (_x isEqualType "") then { str _x } else { _x } }; +private _extensionArgs = _formattedArgs joinString ","; +private _result = "ArmaDragonflyClient" callExtension ["subscribe", [_extensionArgs]]; + +diag_log text format ["ArmaDragonflyClient: 'dragonfly_db_fnc_subscribe' Subscribed to channel '%1' with event type '%2' and event name '%3'", _channel, _eventType, _eventName]; + +true \ No newline at end of file diff --git a/extension/bin/Release/net8.0/linux-x64/publish/ArmaDragonflyClient_x64.so b/extension/bin/Release/net8.0/linux-x64/publish/ArmaDragonflyClient_x64.so index fa0aa30..76059fd 100644 Binary files a/extension/bin/Release/net8.0/linux-x64/publish/ArmaDragonflyClient_x64.so and b/extension/bin/Release/net8.0/linux-x64/publish/ArmaDragonflyClient_x64.so differ diff --git a/extension/bin/Release/net8.0/win-x64/publish/ArmaDragonflyClient_x64.dll b/extension/bin/Release/net8.0/win-x64/publish/ArmaDragonflyClient_x64.dll index 2bc5cb9..a2a335b 100644 Binary files a/extension/bin/Release/net8.0/win-x64/publish/ArmaDragonflyClient_x64.dll and b/extension/bin/Release/net8.0/win-x64/publish/ArmaDragonflyClient_x64.dll differ diff --git a/extension/src/Main.cs b/extension/src/Main.cs index 213106f..5bb1607 100644 --- a/extension/src/Main.cs +++ b/extension/src/Main.cs @@ -208,74 +208,74 @@ namespace ArmaDragonflyClient switch (func.ToLower()) { - case "get": - HandleGetOperation(_id, argsArr, argc); - WriteOutput(output, $"[\"{_id}_get\",{argsArr[1]}]"); - return 100; - case "set": - HandleSetOperation(argsArr); - WriteOutput(output, "Async"); - return 200; - case "del": - HandleDelOperation(argsArr); - WriteOutput(output, "Async"); - return 200; - case "listadd": - HandleListAddOperation(argsArr, argc); - WriteOutput(output, "Async"); - return 200; - case "listidx": - HandleListIdxOperation(_id, argsArr, argc); - WriteOutput(output, $"[\"{_id}_listidx\",{argsArr[2]}]"); - return 100; - case "listlen": - HandleListLenOperation(_id, argsArr); - WriteOutput(output, $"[\"{_id}_listlen\"]"); - return 100; - case "listrem": - HandleListRemOperation(argsArr); - WriteOutput(output, "Async"); - return 200; - case "listrng": - HandleListRngOperation(_id, argsArr, argc); - WriteOutput(output, $"[\"{_id}_listrng\",{argsArr[3]}]"); - return 100; - case "listset": - HandleListSetOperation(argsArr); - WriteOutput(output, "Async"); - return 200; - case "hset": - HandleHSetOperation(argsArr, argc); - WriteOutput(output, "Async"); - return 200; - case "hsetid": - HandleHSetIdOperation(argsArr, argc); - WriteOutput(output, "Async"); - return 200; - case "hget": - HandleHGetOperation(_id, argsArr, argc); - WriteOutput(output, $"[\"{_id}_hget\",{argsArr[1]}]"); - return 100; - case "hgetid": - HandleHGetIdOperation(_id, argsArr, argc); - WriteOutput(output, $"[\"{_id}_hgetid\",{argsArr[2]}]"); - return 100; - case "hgetall": - HandleHGetAllOperation(_id, argsArr, argc); - WriteOutput(output, $"[\"{_id}_hgetall\",{argsArr[0]}]"); - return 100; - case "hgetallid": - HandleHGetAllIdOperation(_id, argsArr, argc); - WriteOutput(output, $"[\"{_id}_hgetallid\",{argsArr[1]}]"); - return 100; - case "hdel": - HandleHDelOperation(argsArr); - WriteOutput(output, "Async"); - return 200; - case "hdelid": - HandleHDelIdOperation(argsArr); - WriteOutput(output, "Async"); - return 200; + case "get": + HandleGetOperation(_id, argsArr, argc); + WriteOutput(output, $"[\"{_id}_get\",{argsArr[1]}]"); + return 100; + case "set": + HandleSetOperation(argsArr); + WriteOutput(output, "Async"); + return 200; + case "del": + HandleDelOperation(argsArr); + WriteOutput(output, "Async"); + return 200; + case "listadd": + HandleListAddOperation(argsArr, argc); + WriteOutput(output, "Async"); + return 200; + case "listidx": + HandleListIdxOperation(_id, argsArr, argc); + WriteOutput(output, $"[\"{_id}_listidx\",{argsArr[2]}]"); + return 100; + case "listlen": + HandleListLenOperation(_id, argsArr); + WriteOutput(output, $"[\"{_id}_listlen\"]"); + return 100; + case "listrem": + HandleListRemOperation(argsArr); + WriteOutput(output, "Async"); + return 200; + case "listrng": + HandleListRngOperation(_id, argsArr, argc); + WriteOutput(output, $"[\"{_id}_listrng\",{argsArr[3]}]"); + return 100; + case "listset": + HandleListSetOperation(argsArr); + WriteOutput(output, "Async"); + return 200; + case "hset": + HandleHSetOperation(argsArr, argc); + WriteOutput(output, "Async"); + return 200; + case "hsetid": + HandleHSetIdOperation(argsArr, argc); + WriteOutput(output, "Async"); + return 200; + case "hget": + HandleHGetOperation(_id, argsArr, argc); + WriteOutput(output, $"[\"{_id}_hget\",{argsArr[1]}]"); + return 100; + case "hgetid": + HandleHGetIdOperation(_id, argsArr, argc); + WriteOutput(output, $"[\"{_id}_hgetid\",{argsArr[2]}]"); + return 100; + case "hgetall": + HandleHGetAllOperation(_id, argsArr, argc); + WriteOutput(output, $"[\"{_id}_hgetall\",{argsArr[0]}]"); + return 100; + case "hgetallid": + HandleHGetAllIdOperation(_id, argsArr, argc); + WriteOutput(output, $"[\"{_id}_hgetallid\",{argsArr[1]}]"); + return 100; + case "hdel": + HandleHDelOperation(argsArr); + WriteOutput(output, "Async"); + return 200; + case "hdelid": + HandleHDelIdOperation(argsArr); + WriteOutput(output, "Async"); + return 200; case "publish": HandlePublishOperation(_id, argsArr); WriteOutput(output, $"[\"{_id}_publish\"]"); @@ -292,12 +292,12 @@ namespace ArmaDragonflyClient HandleSetupOperation(argsArr, argc); WriteOutput(output, "Connection settings updated"); return 100; - case "version": - WriteOutput(output, ADC_VERSION); - return 100; - default: - WriteOutput(output, "Available Functions: get, set, del, listadd, listidx, listlen, listrem, listrng, listset, hset, hsetid, hget, hgetid, hgetall, hgetallid, hdel, hdelid, savedb, setup, version"); - return -1; + case "version": + WriteOutput(output, ADC_VERSION); + return 100; + default: + WriteOutput(output, "Available Functions: get, set, del, listadd, listidx, listlen, listrem, listrng, listset, hset, hsetid, hget, hgetid, hgetall, hgetallid, hdel, hdelid, publish, subscribe, savedb, setup, version"); + return -1; } }