dragonfly/extension/src/DragonflyDB.cs

242 lines
10 KiB
C#

#pragma warning disable IDE0130 // Namespace does not match folder structure
namespace ArmaDragonflyClient
#pragma warning restore IDE0130 // Namespace does not match folder structure
{
internal class DragonflyDB
{
private readonly static DragonflyClient _client = new(Main.ADC_HOST, Main.ADC_PORT, Main.ADC_PASSWORD);
private static CancellationTokenSource _listenerCts;
public static async Task<string> DragonflyRaw(string key, string keyValue, string function = null)
{
await _client.ConnectAsync();
await _client.SendCommandAsync($"SET {key} {keyValue}");
string response = await _client.SendCommandAsync($"GET {key}");
if (!string.IsNullOrEmpty(function))
Main.Log($"ArmaDragonflyClient '{function}', '{response}'", "debug");
return response;
}
public static async Task DragonflyGetAsync(string key, string function, string uniqueID, string entity = null, string call = "false", int bufferSize = Main.ADC_BUFFERSIZE)
{
if (string.IsNullOrEmpty(key) || string.IsNullOrEmpty(function))
{
Main.Log($"ArmaDragonflyClient 'key' or 'function' cannot be empty", "debug");
}
await _client.ConnectAsync();
string data = await _client.SendCommandAsync($"GET {key}");
Utils.CheckByteCount(uniqueID, data, function, entity, Convert.ToBoolean(call), bufferSize);
}
public static async Task DragonflySetAsync(string key, string keyValue)
{
await _client.ConnectAsync();
await _client.SendCommandAsync($"SET {key} {keyValue}");
}
public static async Task DragonflyDeleteAsync(string key)
{
await _client.ConnectAsync();
await _client.SendCommandAsync($"DEL {key}");
}
public static async Task DragonflyListAddAsync(string key, string keyValue)
{
await _client.ConnectAsync();
await _client.SendCommandAsync($"RPUSH {key} {Utils.Base64Encode(keyValue)}");
}
public static async Task DragonflyListIndexAsync(string key, string keyIndex, string function, string uniqueID, string entity = null, string call = "false", int bufferSize = Main.ADC_BUFFERSIZE)
{
if (string.IsNullOrEmpty(key) || string.IsNullOrEmpty(keyIndex) || string.IsNullOrEmpty(function))
{
Main.Log($"ArmaDragonflyClient 'key', 'keyIndex' or 'function' cannot be empty", "debug");
}
await _client.ConnectAsync();
string data = await _client.SendCommandAsync($"LINDEX {key} {keyIndex}", true);
string decodedData = Utils.Base64Decode(data);
Utils.CheckByteCount(uniqueID, decodedData, function, entity, Convert.ToBoolean(call), bufferSize);
}
public static async Task DragonflyListLengthAsync(string key, string function, string uniqueID, string entity = null, string call = "false", int bufferSize = Main.ADC_BUFFERSIZE)
{
if (string.IsNullOrEmpty(key) || string.IsNullOrEmpty(function))
{
Main.Log($"ArmaDragonflyClient 'key' or 'function' cannot be empty", "debug");
}
await _client.ConnectAsync();
string data = await _client.SendCommandAsync($"LLEN {key}");
Utils.CheckByteCount(uniqueID, data, function, entity, Convert.ToBoolean(call), bufferSize);
}
public static async Task DragonflyListRangeAsync(string key, string keyStart, string keyStop, string function, string uniqueID, string entity = null, string call = "false", int bufferSize = Main.ADC_BUFFERSIZE)
{
if (string.IsNullOrEmpty(key) || string.IsNullOrEmpty(keyStart) || string.IsNullOrEmpty(keyStop) || string.IsNullOrEmpty(function))
{
Main.Log($"ArmaDragonflyClient 'key', 'keyStart', 'keyStop' or 'function' cannot be empty", "debug");
}
await _client.ConnectAsync();
string data = await _client.SendCommandAsync($"LRANGE {key} {keyStart} {keyStop}", true);
Utils.CheckByteCount(uniqueID, data, function, entity, Convert.ToBoolean(call), bufferSize);
}
public static async Task DragonflyListRemoveAsync(string key, string keyIndex)
{
await _client.ConnectAsync();
await _client.SendCommandAsync($"LSET {key} {keyIndex} DRAGONFLYREMOVE");
await _client.SendCommandAsync($"LREM {key} 0 DRAGONFLYREMOVE");
}
public static async Task DragonflyListSetAsync(string key, string keyIndex, string keyValue)
{
await _client.ConnectAsync();
await _client.SendCommandAsync($"LSET {key} {keyIndex} {Utils.Base64Encode(keyValue)}");
}
public static async Task DragonflyHashSetAsync(string key, string keyField, string keyValue)
{
await _client.ConnectAsync();
await _client.SendCommandAsync($"HSET {key} {keyField} {keyValue}");
}
public static async Task DragonflyHashGetAsync(string key, string keyField, string function, string uniqueID, string entity = null, string call = "false", int bufferSize = Main.ADC_BUFFERSIZE)
{
if (string.IsNullOrEmpty(key) || string.IsNullOrEmpty(keyField) || string.IsNullOrEmpty(function))
{
Main.Log($"ArmaDragonflyClient 'key', 'keyField' or 'function' cannot be empty", "debug");
}
await _client.ConnectAsync();
string data = await _client.SendCommandAsync($"HGET {key} {keyField}");
Utils.CheckByteCount(uniqueID, data, function, entity, Convert.ToBoolean(call), bufferSize);
}
public static async Task DragonflyHashGetAllAsync(string key, string function, string uniqueID, string entity = null, string call = "false", int bufferSize = Main.ADC_BUFFERSIZE)
{
if (string.IsNullOrEmpty(key) || string.IsNullOrEmpty(function))
{
Main.Log($"ArmaDragonflyClient 'key' or 'function' cannot be empty", "debug");
}
await _client.ConnectAsync();
string data = await _client.SendCommandAsync($"HGETALL {key}");
Utils.CheckByteCount(uniqueID, data, function, entity, Convert.ToBoolean(call), bufferSize);
}
public static async Task DragonflyHashDeleteAsync(string key, string keyField)
{
await _client.ConnectAsync();
await _client.SendCommandAsync($"HDEL {key} {keyField}");
}
public static async Task DragonflyFetchAsync(string key, string keyType, string function, string entity = null, string call = "false", int bufferSize = Main.ADC_BUFFERSIZE)
{
if (string.IsNullOrEmpty(key) || string.IsNullOrEmpty(keyType) || string.IsNullOrEmpty(function))
{
Main.Log($"ArmaDragonflyClient 'key', 'keyField' or 'function' cannot be empty", "debug");
}
await _client.ConnectAsync();
string data = await _client.SendCommandAsync($"GET {key}");
string uniqueId = Utils.GetUniqueId().ToString();
Utils.CheckByteCount(uniqueId, data, function, entity, Convert.ToBoolean(call), bufferSize);
}
public static async Task DragonflySaveDBAsync()
{
await _client.ConnectAsync();
string response = await _client.SendCommandAsync("SAVE");
Main.Log($"ArmaDragonflyClient 'SAVE', Response: '{response}'", "debug");
}
public static async Task DragonflyPublishAsync(string channel, string message, string uniqueID)
{
await _client.ConnectAsync();
await _client.SendCommandAsync($"PUBLISH {channel} {message}");
Main.Log($"ArmaDragonflyClient 'PUBLISH', Channel: '{channel}', Message: '{message}'", "debug");
}
public static async Task DragonflySubscribeAsync(string channel, string eventType, string eventName, string uniqueID, string target = null, int bufferSize = Main.ADC_BUFFERSIZE)
{
await _client.ConnectAsync();
try
{
await _client.SendCommandAsync($"SUBSCRIBE {channel}");
Main.Log($"ArmaDragonflyClient 'SUBSCRIBE', Channel: '{channel}'", "debug");
_listenerCts = new CancellationTokenSource();
await Task.Run(async () =>
{
await StartMessageListener(message => {
Utils.CheckByteCountPubSub(uniqueID, message, eventType, eventName, target, bufferSize);
});
});
}
catch (Exception ex)
{
Main.Log($"ArmaDragonflyClient 'SUBSCRIBE', Exception: '{ex.Message}'", "error");
throw;
}
}
private static async Task StartMessageListener(Action<string> messageHandler)
{
try
{
while (!_listenerCts.Token.IsCancellationRequested)
{
string response = await _client.ReceiveMessageAsync();
if (!string.IsNullOrEmpty(response))
{
var messageParts = response.Split(',');
if (messageParts.Length >= 3)
{
string messageType = messageParts[0];
string channel = messageParts[1];
string message = messageParts[2];
Main.Log($"ArmaDragonflyClient 'SUBSCRIBE', Channel: '{channel}', Message: '{message}'", "debug");
messageHandler(message);
}
}
await Task.Delay(10);
}
}
catch (Exception ex)
{
Main.Log($"ArmaDragonflyClient 'SUBSCRIBE', Exception: '{ex.Message}'", "error");
throw;
}
}
public static void StopMessageListener()
{
_listenerCts.Cancel();
_listenerCts.Dispose();
_listenerCts = null;
}
}
}