mirror of
https://gitlab.com/Kwoth/nadekobot.git
synced 2025-09-10 17:28:27 -04:00
Merge branch 'v4' of https://gitlab.com/Kwoth/nadekobot into v4
This commit is contained in:
@@ -46,9 +46,7 @@ public sealed class CommandOrExprTypeReader : NadekoTypeReader<CommandOrExprInfo
|
|||||||
|
|
||||||
public override async ValueTask<TypeReaderResult<CommandOrExprInfo>> ReadAsync(ICommandContext ctx, string input)
|
public override async ValueTask<TypeReaderResult<CommandOrExprInfo>> ReadAsync(ICommandContext ctx, string input)
|
||||||
{
|
{
|
||||||
input = input.ToUpperInvariant();
|
if (_exprs.ExpressionExists(ctx.Guild?.Id, input))
|
||||||
|
|
||||||
if (_exprs.ExpressionExists(ctx.Guild?.Id, input) || _exprs.ExpressionExists(null, input))
|
|
||||||
return TypeReaderResult.FromSuccess(new CommandOrExprInfo(input, CommandOrExprInfo.Type.Custom));
|
return TypeReaderResult.FromSuccess(new CommandOrExprInfo(input, CommandOrExprInfo.Type.Custom));
|
||||||
|
|
||||||
var cmd = await new CommandTypeReader(_commandHandler, _cmds).ReadAsync(ctx, input);
|
var cmd = await new CommandTypeReader(_commandHandler, _cmds).ReadAsync(ctx, input);
|
||||||
|
@@ -12,10 +12,4 @@ public static class NadekoExpressionExtensions
|
|||||||
|
|
||||||
public static IEnumerable<NadekoExpression> ForId(this DbSet<NadekoExpression> exprs, ulong id)
|
public static IEnumerable<NadekoExpression> ForId(this DbSet<NadekoExpression> exprs, ulong id)
|
||||||
=> exprs.AsNoTracking().AsQueryable().Where(x => x.GuildId == id).ToList();
|
=> exprs.AsNoTracking().AsQueryable().Where(x => x.GuildId == id).ToList();
|
||||||
|
|
||||||
public static NadekoExpression GetByGuildIdAndInput(
|
|
||||||
this DbSet<NadekoExpression> exprs,
|
|
||||||
ulong? guildId,
|
|
||||||
string input)
|
|
||||||
=> exprs.FirstOrDefault(x => x.GuildId == guildId && x.Trigger.ToUpper() == input);
|
|
||||||
}
|
}
|
@@ -34,14 +34,14 @@ public sealed class NadekoExpressionsService : IExecOnMessage, IReadyExecutor
|
|||||||
";
|
";
|
||||||
|
|
||||||
private static readonly ISerializer _exportSerializer = new SerializerBuilder()
|
private static readonly ISerializer _exportSerializer = new SerializerBuilder()
|
||||||
.WithEventEmitter(args
|
.WithEventEmitter(args
|
||||||
=> new MultilineScalarFlowStyleEmitter(args))
|
=> new MultilineScalarFlowStyleEmitter(args))
|
||||||
.WithNamingConvention(CamelCaseNamingConvention.Instance)
|
.WithNamingConvention(CamelCaseNamingConvention.Instance)
|
||||||
.WithIndentedSequences()
|
.WithIndentedSequences()
|
||||||
.ConfigureDefaultValuesHandling(DefaultValuesHandling
|
.ConfigureDefaultValuesHandling(DefaultValuesHandling
|
||||||
.OmitDefaults)
|
.OmitDefaults)
|
||||||
.DisableAliases()
|
.DisableAliases()
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
public int Priority
|
public int Priority
|
||||||
=> 0;
|
=> 0;
|
||||||
@@ -57,8 +57,8 @@ public sealed class NadekoExpressionsService : IExecOnMessage, IReadyExecutor
|
|||||||
// 1. expressions are almost never added (compared to how many times they are being looped through)
|
// 1. expressions are almost never added (compared to how many times they are being looped through)
|
||||||
// 2. only need write locks for this as we'll rebuild+replace the array on every edit
|
// 2. only need write locks for this as we'll rebuild+replace the array on every edit
|
||||||
// 3. there's never many of them (at most a thousand, usually < 100)
|
// 3. there's never many of them (at most a thousand, usually < 100)
|
||||||
private NadekoExpression[] globalExpressions;
|
private NadekoExpression[] globalExpressions = Array.Empty<NadekoExpression>();
|
||||||
private ConcurrentDictionary<ulong, NadekoExpression[]> newguildExpressions;
|
private ConcurrentDictionary<ulong, NadekoExpression[]> newguildExpressions = new();
|
||||||
|
|
||||||
private readonly DbService _db;
|
private readonly DbService _db;
|
||||||
private readonly DiscordSocketClient _client;
|
private readonly DiscordSocketClient _client;
|
||||||
@@ -112,20 +112,20 @@ public sealed class NadekoExpressionsService : IExecOnMessage, IReadyExecutor
|
|||||||
{
|
{
|
||||||
await using var uow = _db.GetDbContext();
|
await using var uow = _db.GetDbContext();
|
||||||
var guildItems = await uow.Expressions.AsNoTracking()
|
var guildItems = await uow.Expressions.AsNoTracking()
|
||||||
.Where(x => allGuildIds.Contains(x.GuildId.Value))
|
.Where(x => allGuildIds.Contains(x.GuildId.Value))
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
|
|
||||||
newguildExpressions = guildItems.GroupBy(k => k.GuildId!.Value)
|
newguildExpressions = guildItems.GroupBy(k => k.GuildId!.Value)
|
||||||
.ToDictionary(g => g.Key,
|
.ToDictionary(g => g.Key,
|
||||||
g => g.Select(x =>
|
g => g.Select(x =>
|
||||||
{
|
{
|
||||||
x.Trigger = x.Trigger.Replace(MENTION_PH, _bot.Mention);
|
x.Trigger = x.Trigger.Replace(MENTION_PH, _bot.Mention);
|
||||||
return x;
|
return x;
|
||||||
})
|
})
|
||||||
.ToArray())
|
.ToArray())
|
||||||
.ToConcurrent();
|
.ToConcurrent();
|
||||||
|
|
||||||
_disabledGlobalExpressionGuilds = new (await uow.GuildConfigs
|
_disabledGlobalExpressionGuilds = new(await uow.GuildConfigs
|
||||||
.Where(x => x.DisableGlobalExpressions)
|
.Where(x => x.DisableGlobalExpressions)
|
||||||
.Select(x => x.GuildId)
|
.Select(x => x.GuildId)
|
||||||
.ToListAsyncLinqToDB());
|
.ToListAsyncLinqToDB());
|
||||||
@@ -133,14 +133,14 @@ public sealed class NadekoExpressionsService : IExecOnMessage, IReadyExecutor
|
|||||||
lock (_gexprWriteLock)
|
lock (_gexprWriteLock)
|
||||||
{
|
{
|
||||||
var globalItems = uow.Expressions.AsNoTracking()
|
var globalItems = uow.Expressions.AsNoTracking()
|
||||||
.Where(x => x.GuildId == null || x.GuildId == 0)
|
.Where(x => x.GuildId == null || x.GuildId == 0)
|
||||||
.AsEnumerable()
|
.AsEnumerable()
|
||||||
.Select(x =>
|
.Select(x =>
|
||||||
{
|
{
|
||||||
x.Trigger = x.Trigger.Replace(MENTION_PH, _bot.Mention);
|
x.Trigger = x.Trigger.Replace(MENTION_PH, _bot.Mention);
|
||||||
return x;
|
return x;
|
||||||
})
|
})
|
||||||
.ToArray();
|
.ToArray();
|
||||||
|
|
||||||
globalExpressions = globalItems;
|
globalExpressions = globalItems;
|
||||||
}
|
}
|
||||||
@@ -167,7 +167,7 @@ public sealed class NadekoExpressionsService : IExecOnMessage, IReadyExecutor
|
|||||||
|
|
||||||
if (_disabledGlobalExpressionGuilds.Contains(channel.Guild.Id))
|
if (_disabledGlobalExpressionGuilds.Contains(channel.Guild.Id))
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
var localGrs = globalExpressions;
|
var localGrs = globalExpressions;
|
||||||
|
|
||||||
return MatchExpressions(content, localGrs);
|
return MatchExpressions(content, localGrs);
|
||||||
@@ -466,7 +466,7 @@ public sealed class NadekoExpressionsService : IExecOnMessage, IReadyExecutor
|
|||||||
await using (var uow = _db.GetDbContext())
|
await using (var uow = _db.GetDbContext())
|
||||||
{
|
{
|
||||||
expr = uow.Expressions.GetById(id);
|
expr = uow.Expressions.GetById(id);
|
||||||
|
|
||||||
if (expr is null || expr.GuildId != guildId)
|
if (expr is null || expr.GuildId != guildId)
|
||||||
return (false, false);
|
return (false, false);
|
||||||
if (field == ExprField.AutoDelete)
|
if (field == ExprField.AutoDelete)
|
||||||
@@ -509,9 +509,25 @@ public sealed class NadekoExpressionsService : IExecOnMessage, IReadyExecutor
|
|||||||
|
|
||||||
public bool ExpressionExists(ulong? guildId, string input)
|
public bool ExpressionExists(ulong? guildId, string input)
|
||||||
{
|
{
|
||||||
using var uow = _db.GetDbContext();
|
input = input.ToLowerInvariant();
|
||||||
var expr = uow.Expressions.GetByGuildIdAndInput(guildId, input);
|
|
||||||
return expr is not null;
|
var gexprs = globalExpressions;
|
||||||
|
foreach (var t in gexprs)
|
||||||
|
{
|
||||||
|
if (t.Trigger == input)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (guildId is ulong gid && newguildExpressions.TryGetValue(gid, out var guildExprs))
|
||||||
|
{
|
||||||
|
foreach (var t in guildExprs)
|
||||||
|
{
|
||||||
|
if (t.Trigger == input)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string ExportExpressions(ulong? guildId)
|
public string ExportExpressions(ulong? guildId)
|
||||||
@@ -542,17 +558,17 @@ public sealed class NadekoExpressionsService : IExecOnMessage, IReadyExecutor
|
|||||||
{
|
{
|
||||||
var trigger = entry.Key;
|
var trigger = entry.Key;
|
||||||
await uow.Expressions.AddRangeAsync(entry.Value.Where(expr => !string.IsNullOrWhiteSpace(expr.Res))
|
await uow.Expressions.AddRangeAsync(entry.Value.Where(expr => !string.IsNullOrWhiteSpace(expr.Res))
|
||||||
.Select(expr => new NadekoExpression
|
.Select(expr => new NadekoExpression
|
||||||
{
|
{
|
||||||
GuildId = guildId,
|
GuildId = guildId,
|
||||||
Response = expr.Res,
|
Response = expr.Res,
|
||||||
Reactions = expr.React?.Join("@@@"),
|
Reactions = expr.React?.Join("@@@"),
|
||||||
Trigger = trigger,
|
Trigger = trigger,
|
||||||
AllowTarget = expr.At,
|
AllowTarget = expr.At,
|
||||||
ContainsAnywhere = expr.Ca,
|
ContainsAnywhere = expr.Ca,
|
||||||
DmResponse = expr.Dm,
|
DmResponse = expr.Dm,
|
||||||
AutoDeleteTrigger = expr.Ad
|
AutoDeleteTrigger = expr.Ad
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
await uow.SaveChangesAsync();
|
await uow.SaveChangesAsync();
|
||||||
@@ -725,12 +741,12 @@ public sealed class NadekoExpressionsService : IExecOnMessage, IReadyExecutor
|
|||||||
var gc = ctx.GuildConfigsForId(guildId, set => set);
|
var gc = ctx.GuildConfigsForId(guildId, set => set);
|
||||||
var toReturn = gc.DisableGlobalExpressions = !gc.DisableGlobalExpressions;
|
var toReturn = gc.DisableGlobalExpressions = !gc.DisableGlobalExpressions;
|
||||||
await ctx.SaveChangesAsync();
|
await ctx.SaveChangesAsync();
|
||||||
|
|
||||||
if (toReturn)
|
if (toReturn)
|
||||||
_disabledGlobalExpressionGuilds.Add(guildId);
|
_disabledGlobalExpressionGuilds.Add(guildId);
|
||||||
else
|
else
|
||||||
_disabledGlobalExpressionGuilds.TryRemove(guildId);
|
_disabledGlobalExpressionGuilds.TryRemove(guildId);
|
||||||
|
|
||||||
return toReturn;
|
return toReturn;
|
||||||
}
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user