fix nullref in chatterbot and mapping issue in protectionservice

This commit is contained in:
Toastie 2025-03-14 16:02:05 +13:00
parent 8fa6b0c999
commit ba1f5afa01
Signed by: toastie_t0ast
GPG key ID: 0861BE54AD481DC7
2 changed files with 82 additions and 74 deletions
src/EllieBot/Modules
Administration/Protection
Games/ChatterBot

View file

@ -27,6 +27,7 @@ public class ProtectionService : IReadyExecutor, IEService
private readonly UserPunishService _punishService; private readonly UserPunishService _punishService;
private readonly INotifySubscriber _notifySub; private readonly INotifySubscriber _notifySub;
private readonly ShardData _shardData; private readonly ShardData _shardData;
private readonly Channel<PunishQueueItem> _punishUserQueue = private readonly Channel<PunishQueueItem> _punishUserQueue =
Channel.CreateUnbounded<PunishQueueItem>(new() Channel.CreateUnbounded<PunishQueueItem>(new()
{ {
@ -275,23 +276,25 @@ public class ProtectionService : IReadyExecutor, IEService
await using var uow = _db.GetDbContext(); await using var uow = _db.GetDbContext();
await uow.GetTable<AntiRaidSetting>() await uow.GetTable<AntiRaidSetting>()
.InsertOrUpdateAsync(() => new() .InsertOrUpdateAsync(() => new()
{ {
GuildId = guildId, GuildId = guildId,
Action = action, Action = action,
Seconds = seconds, Seconds = seconds,
UserThreshold = userThreshold, UserThreshold = userThreshold,
PunishDuration = minutesDuration PunishDuration = minutesDuration
}, _ => new() },
{ _ => new()
Action = action, {
Seconds = seconds, Action = action,
UserThreshold = userThreshold, Seconds = seconds,
PunishDuration = minutesDuration UserThreshold = userThreshold,
}, () => new() PunishDuration = minutesDuration
{ },
GuildId = guildId () => new()
}); {
GuildId = guildId
});
return stats; return stats;
@ -362,23 +365,25 @@ public class ProtectionService : IReadyExecutor, IEService
await using var uow = _db.GetDbContext(); await using var uow = _db.GetDbContext();
await uow.GetTable<AntiSpamSetting>() await uow.GetTable<AntiSpamSetting>()
.InsertOrUpdateAsync(() => new() .InsertOrUpdateAsync(() => new()
{ {
GuildId = guildId, GuildId = guildId,
Action = stats.AntiSpamSettings.Action, Action = stats.AntiSpamSettings.Action,
MessageThreshold = stats.AntiSpamSettings.MessageThreshold, MessageThreshold = stats.AntiSpamSettings.MessageThreshold,
MuteTime = stats.AntiSpamSettings.MuteTime, MuteTime = stats.AntiSpamSettings.MuteTime,
RoleId = stats.AntiSpamSettings.RoleId RoleId = stats.AntiSpamSettings.RoleId
}, (old) => new() },
{ (old) => new()
GuildId = guildId, {
Action = stats.AntiSpamSettings.Action, GuildId = guildId,
MessageThreshold = stats.AntiSpamSettings.MessageThreshold, Action = stats.AntiSpamSettings.Action,
MuteTime = stats.AntiSpamSettings.MuteTime, MessageThreshold = stats.AntiSpamSettings.MessageThreshold,
RoleId = stats.AntiSpamSettings.RoleId MuteTime = stats.AntiSpamSettings.MuteTime,
}, () => new() RoleId = stats.AntiSpamSettings.RoleId
{ },
GuildId = guildId () => new()
}); {
GuildId = guildId
});
return stats; return stats;
} }
@ -459,22 +464,24 @@ public class ProtectionService : IReadyExecutor, IEService
await uow.GetTable<AntiAltSetting>() await uow.GetTable<AntiAltSetting>()
.InsertOrUpdateAsync(() => new() .InsertOrUpdateAsync(() => new()
{ {
GuildId = guildId, GuildId = guildId,
Action = action, Action = action,
ActionDurationMinutes = actionDurationMinutes, ActionDurationMinutes = actionDurationMinutes,
MinAge = TimeSpan.FromMinutes(minAgeMinutes), MinAge = TimeSpan.FromMinutes(minAgeMinutes),
RoleId = roleId RoleId = roleId
}, _ => new() },
{ _ => new()
Action = action, {
ActionDurationMinutes = actionDurationMinutes, Action = action,
MinAge = TimeSpan.FromMinutes(minAgeMinutes), ActionDurationMinutes = actionDurationMinutes,
RoleId = roleId MinAge = TimeSpan.FromMinutes(minAgeMinutes),
}, () => new() RoleId = roleId
{ },
GuildId = guildId () => new()
}); {
GuildId = guildId
});
_antiAltGuilds[guildId] = new(new() _antiAltGuilds[guildId] = new(new()
{ {
@ -502,9 +509,9 @@ public class ProtectionService : IReadyExecutor, IEService
{ {
await using var uow = _db.GetDbContext(); await using var uow = _db.GetDbContext();
var configs = await uow.GetTable<AntiAltSetting>() var configs = await uow.Set<AntiAltSetting>()
.AsNoTracking() .AsNoTracking()
.Where(x => Queries.GuildOnShard(x.GuildId, _shardData.TotalShards, _shardData.ShardId)) .Where(x => x.GuildId / 4194304 % (ulong)_shardData.TotalShards == (ulong)_shardData.ShardId)
.ToListAsyncEF(); .ToListAsyncEF();
foreach (var config in configs) foreach (var config in configs)

View file

@ -13,7 +13,7 @@ namespace EllieBot.Modules.Games.Services;
public class ChatterBotService : IExecOnMessage, IReadyExecutor public class ChatterBotService : IExecOnMessage, IReadyExecutor
{ {
private ConcurrentDictionary<ulong, Lazy<IChatterBotSession>> _chatterBotGuilds; private ConcurrentDictionary<ulong, Lazy<IChatterBotSession>> _chatterBotGuilds = [];
public int Priority public int Priority
=> 1; => 1;
@ -165,8 +165,8 @@ public class ChatterBotService : IExecOnMessage, IReadyExecutor
(inTokens) + (result.TokensOut / 2 * 3)); (inTokens) + (result.TokensOut / 2 * 3));
await _sender.Response(channel) await _sender.Response(channel)
.Confirm(result.Text) .Confirm(result.Text)
.SendAsync(); .SendAsync();
} }
else else
{ {
@ -204,12 +204,12 @@ public class ChatterBotService : IExecOnMessage, IReadyExecutor
{ {
await using var uow = _db.GetDbContext(); await using var uow = _db.GetDbContext();
await uow.Set<GuildConfig>() await uow.Set<GuildConfig>()
.ToLinqToDBTable() .ToLinqToDBTable()
.Where(x => x.GuildId == guildId) .Where(x => x.GuildId == guildId)
.UpdateAsync((gc) => new GuildConfig() .UpdateAsync((gc) => new GuildConfig()
{ {
CleverbotEnabled = false CleverbotEnabled = false
}); });
await uow.SaveChangesAsync(); await uow.SaveChangesAsync();
return false; return false;
} }
@ -219,12 +219,12 @@ public class ChatterBotService : IExecOnMessage, IReadyExecutor
await using (var uow = _db.GetDbContext()) await using (var uow = _db.GetDbContext())
{ {
await uow.Set<GuildConfig>() await uow.Set<GuildConfig>()
.ToLinqToDBTable() .ToLinqToDBTable()
.Where(x => x.GuildId == guildId) .Where(x => x.GuildId == guildId)
.UpdateAsync((gc) => new GuildConfig() .UpdateAsync((gc) => new GuildConfig()
{ {
CleverbotEnabled = true CleverbotEnabled = true
}); });
await uow.SaveChangesAsync(); await uow.SaveChangesAsync();
} }
@ -235,12 +235,13 @@ public class ChatterBotService : IExecOnMessage, IReadyExecutor
public async Task OnReadyAsync() public async Task OnReadyAsync()
{ {
await using var uow = _db.GetDbContext(); await using var uow = _db.GetDbContext();
_chatterBotGuilds = uow.GuildConfigs _chatterBotGuilds = await uow.GuildConfigs
.AsNoTracking() .AsNoTracking()
.Where(gc => gc.CleverbotEnabled) .Where(gc => gc.CleverbotEnabled)
.AsEnumerable() .ToListAsyncLinqToDB()
.ToDictionary(gc => gc.GuildId, .Fmap(x => x
_ => new Lazy<IChatterBotSession>(() => CreateSession(), true)) .ToDictionary(gc => gc.GuildId,
.ToConcurrent(); _ => new Lazy<IChatterBotSession>(() => CreateSession(), true))
.ToConcurrent());
} }
} }