feat(db): Add pub/sub interface functions for DragonflyDB
Add two new functions to interface with DragonflyDB pub/sub system: - fnc_subscribe.sqf: Subscribe to channels with CBA event routing - fnc_publish.sqf: Publish messages to channels These functions integrate with the existing pubSubHandler to route messages through CBA's event system using 'global', 'local', 'server', and 'remote' event types. Both functions include proper input validation, error handling, and detailed documentation with examples.
This commit is contained in:
parent
3f01040e16
commit
38639b50c7
@ -20,8 +20,10 @@ PREP(listSet);
|
|||||||
PREP(pubSubFetch);
|
PREP(pubSubFetch);
|
||||||
PREP(pubSubHandler);
|
PREP(pubSubHandler);
|
||||||
PREP(processQueue);
|
PREP(processQueue);
|
||||||
|
PREP(publish);
|
||||||
PREP(saveDB);
|
PREP(saveDB);
|
||||||
PREP(scheduler);
|
PREP(scheduler);
|
||||||
PREP(set);
|
PREP(set);
|
||||||
PREP(setup);
|
PREP(setup);
|
||||||
|
PREP(subscribe);
|
||||||
PREP(test);
|
PREP(test);
|
49
addons/db/functions/fnc_publish.sqf
Normal file
49
addons/db/functions/fnc_publish.sqf
Normal file
@ -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
|
71
addons/db/functions/fnc_subscribe.sqf
Normal file
71
addons/db/functions/fnc_subscribe.sqf
Normal file
@ -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
|
Binary file not shown.
Binary file not shown.
@ -208,74 +208,74 @@ namespace ArmaDragonflyClient
|
|||||||
|
|
||||||
switch (func.ToLower())
|
switch (func.ToLower())
|
||||||
{
|
{
|
||||||
case "get":
|
case "get":
|
||||||
HandleGetOperation(_id, argsArr, argc);
|
HandleGetOperation(_id, argsArr, argc);
|
||||||
WriteOutput(output, $"[\"{_id}_get\",{argsArr[1]}]");
|
WriteOutput(output, $"[\"{_id}_get\",{argsArr[1]}]");
|
||||||
return 100;
|
return 100;
|
||||||
case "set":
|
case "set":
|
||||||
HandleSetOperation(argsArr);
|
HandleSetOperation(argsArr);
|
||||||
WriteOutput(output, "Async");
|
WriteOutput(output, "Async");
|
||||||
return 200;
|
return 200;
|
||||||
case "del":
|
case "del":
|
||||||
HandleDelOperation(argsArr);
|
HandleDelOperation(argsArr);
|
||||||
WriteOutput(output, "Async");
|
WriteOutput(output, "Async");
|
||||||
return 200;
|
return 200;
|
||||||
case "listadd":
|
case "listadd":
|
||||||
HandleListAddOperation(argsArr, argc);
|
HandleListAddOperation(argsArr, argc);
|
||||||
WriteOutput(output, "Async");
|
WriteOutput(output, "Async");
|
||||||
return 200;
|
return 200;
|
||||||
case "listidx":
|
case "listidx":
|
||||||
HandleListIdxOperation(_id, argsArr, argc);
|
HandleListIdxOperation(_id, argsArr, argc);
|
||||||
WriteOutput(output, $"[\"{_id}_listidx\",{argsArr[2]}]");
|
WriteOutput(output, $"[\"{_id}_listidx\",{argsArr[2]}]");
|
||||||
return 100;
|
return 100;
|
||||||
case "listlen":
|
case "listlen":
|
||||||
HandleListLenOperation(_id, argsArr);
|
HandleListLenOperation(_id, argsArr);
|
||||||
WriteOutput(output, $"[\"{_id}_listlen\"]");
|
WriteOutput(output, $"[\"{_id}_listlen\"]");
|
||||||
return 100;
|
return 100;
|
||||||
case "listrem":
|
case "listrem":
|
||||||
HandleListRemOperation(argsArr);
|
HandleListRemOperation(argsArr);
|
||||||
WriteOutput(output, "Async");
|
WriteOutput(output, "Async");
|
||||||
return 200;
|
return 200;
|
||||||
case "listrng":
|
case "listrng":
|
||||||
HandleListRngOperation(_id, argsArr, argc);
|
HandleListRngOperation(_id, argsArr, argc);
|
||||||
WriteOutput(output, $"[\"{_id}_listrng\",{argsArr[3]}]");
|
WriteOutput(output, $"[\"{_id}_listrng\",{argsArr[3]}]");
|
||||||
return 100;
|
return 100;
|
||||||
case "listset":
|
case "listset":
|
||||||
HandleListSetOperation(argsArr);
|
HandleListSetOperation(argsArr);
|
||||||
WriteOutput(output, "Async");
|
WriteOutput(output, "Async");
|
||||||
return 200;
|
return 200;
|
||||||
case "hset":
|
case "hset":
|
||||||
HandleHSetOperation(argsArr, argc);
|
HandleHSetOperation(argsArr, argc);
|
||||||
WriteOutput(output, "Async");
|
WriteOutput(output, "Async");
|
||||||
return 200;
|
return 200;
|
||||||
case "hsetid":
|
case "hsetid":
|
||||||
HandleHSetIdOperation(argsArr, argc);
|
HandleHSetIdOperation(argsArr, argc);
|
||||||
WriteOutput(output, "Async");
|
WriteOutput(output, "Async");
|
||||||
return 200;
|
return 200;
|
||||||
case "hget":
|
case "hget":
|
||||||
HandleHGetOperation(_id, argsArr, argc);
|
HandleHGetOperation(_id, argsArr, argc);
|
||||||
WriteOutput(output, $"[\"{_id}_hget\",{argsArr[1]}]");
|
WriteOutput(output, $"[\"{_id}_hget\",{argsArr[1]}]");
|
||||||
return 100;
|
return 100;
|
||||||
case "hgetid":
|
case "hgetid":
|
||||||
HandleHGetIdOperation(_id, argsArr, argc);
|
HandleHGetIdOperation(_id, argsArr, argc);
|
||||||
WriteOutput(output, $"[\"{_id}_hgetid\",{argsArr[2]}]");
|
WriteOutput(output, $"[\"{_id}_hgetid\",{argsArr[2]}]");
|
||||||
return 100;
|
return 100;
|
||||||
case "hgetall":
|
case "hgetall":
|
||||||
HandleHGetAllOperation(_id, argsArr, argc);
|
HandleHGetAllOperation(_id, argsArr, argc);
|
||||||
WriteOutput(output, $"[\"{_id}_hgetall\",{argsArr[0]}]");
|
WriteOutput(output, $"[\"{_id}_hgetall\",{argsArr[0]}]");
|
||||||
return 100;
|
return 100;
|
||||||
case "hgetallid":
|
case "hgetallid":
|
||||||
HandleHGetAllIdOperation(_id, argsArr, argc);
|
HandleHGetAllIdOperation(_id, argsArr, argc);
|
||||||
WriteOutput(output, $"[\"{_id}_hgetallid\",{argsArr[1]}]");
|
WriteOutput(output, $"[\"{_id}_hgetallid\",{argsArr[1]}]");
|
||||||
return 100;
|
return 100;
|
||||||
case "hdel":
|
case "hdel":
|
||||||
HandleHDelOperation(argsArr);
|
HandleHDelOperation(argsArr);
|
||||||
WriteOutput(output, "Async");
|
WriteOutput(output, "Async");
|
||||||
return 200;
|
return 200;
|
||||||
case "hdelid":
|
case "hdelid":
|
||||||
HandleHDelIdOperation(argsArr);
|
HandleHDelIdOperation(argsArr);
|
||||||
WriteOutput(output, "Async");
|
WriteOutput(output, "Async");
|
||||||
return 200;
|
return 200;
|
||||||
case "publish":
|
case "publish":
|
||||||
HandlePublishOperation(_id, argsArr);
|
HandlePublishOperation(_id, argsArr);
|
||||||
WriteOutput(output, $"[\"{_id}_publish\"]");
|
WriteOutput(output, $"[\"{_id}_publish\"]");
|
||||||
@ -292,12 +292,12 @@ namespace ArmaDragonflyClient
|
|||||||
HandleSetupOperation(argsArr, argc);
|
HandleSetupOperation(argsArr, argc);
|
||||||
WriteOutput(output, "Connection settings updated");
|
WriteOutput(output, "Connection settings updated");
|
||||||
return 100;
|
return 100;
|
||||||
case "version":
|
case "version":
|
||||||
WriteOutput(output, ADC_VERSION);
|
WriteOutput(output, ADC_VERSION);
|
||||||
return 100;
|
return 100;
|
||||||
default:
|
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");
|
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;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user