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:
Jacob Schmidt 2025-03-20 19:54:58 -05:00
parent 3f01040e16
commit 38639b50c7
6 changed files with 196 additions and 74 deletions

View File

@ -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);

View 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

View 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

View File

@ -296,7 +296,7 @@ namespace ArmaDragonflyClient
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");
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;
}
}