Fixed some NRT warnings in pub/sub mechanism

This commit is contained in:
Kwoth
2021-12-29 06:59:41 +01:00
parent 82000c97a4
commit 6eee161b6b
5 changed files with 44 additions and 34 deletions

View File

@@ -2,12 +2,13 @@ namespace NadekoBot.Common;
public class EventPubSub : IPubSub
{
private readonly Dictionary<string, Dictionary<Delegate, List<Func<object?, ValueTask>>>> _actions = new();
private readonly Dictionary<string, Dictionary<Delegate, List<Func<object, ValueTask>>>> _actions = new();
private readonly object _locker = new();
public Task Sub<TData>(in TypedKey<TData> key, Func<TData?, ValueTask> action)
public Task Sub<TData>(in TypedKey<TData> key, Func<TData, ValueTask> action)
where TData: notnull
{
Func<object?, ValueTask> localAction = obj => action((TData?)obj);
Func<object, ValueTask> localAction = obj => action((TData)obj);
lock (_locker)
{
if (!_actions.TryGetValue(key.Key, out var keyActions))
@@ -29,6 +30,7 @@ public class EventPubSub : IPubSub
}
public Task Pub<TData>(in TypedKey<TData> key, TData data)
where TData: notnull
{
lock (_locker)
{

View File

@@ -2,6 +2,8 @@ namespace NadekoBot.Common;
public interface IPubSub
{
public Task Pub<TData>(in TypedKey<TData> key, TData data);
public Task Sub<TData>(in TypedKey<TData> key, Func<TData?, ValueTask> action);
public Task Pub<TData>(in TypedKey<TData> key, TData data)
where TData: notnull;
public Task Sub<TData>(in TypedKey<TData> key, Func<TData, ValueTask> action)
where TData: notnull;
}

View File

@@ -16,13 +16,15 @@ public sealed class RedisPubSub : IPubSub
}
public Task Pub<TData>(in TypedKey<TData> key, TData data)
where TData : notnull
{
var serialized = _serializer.Serialize(data);
return _multi.GetSubscriber()
.PublishAsync($"{_creds.RedisKey()}:{key.Key}", serialized, CommandFlags.FireAndForget);
}
public Task Sub<TData>(in TypedKey<TData> key, Func<TData?, ValueTask> action)
public Task Sub<TData>(in TypedKey<TData> key, Func<TData, ValueTask> action)
where TData : notnull
{
var eventName = key.Key;
@@ -31,7 +33,11 @@ public sealed class RedisPubSub : IPubSub
try
{
var dataObj = _serializer.Deserialize<TData>(data);
await action(dataObj);
if(dataObj is not null)
await action(dataObj);
else
Log.Warning("Publishing event {EventName} with a null value. This is not allowed",
eventName);
}
catch (Exception ex)
{