having .crca enabled with %target% will replace target with everything that comes after the trigger wherever it is in the triggering message
This commit is contained in:
parent
10fdd36e87
commit
464118f792
@ -58,11 +58,23 @@ namespace NadekoBot.Modules.CustomReactions.Extensions
|
|||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async Task<string> ResolveResponseStringAsync(this string str, IUserMessage ctx, DiscordSocketClient client, string resolvedTrigger)
|
private static async Task<string> ResolveResponseStringAsync(this string str, IUserMessage ctx, DiscordSocketClient client, string resolvedTrigger, bool containsAnywhere)
|
||||||
{
|
{
|
||||||
|
var substringIndex = resolvedTrigger.Length;
|
||||||
|
if (containsAnywhere)
|
||||||
|
{
|
||||||
|
var pos = ctx.Content.GetWordPosition(resolvedTrigger);
|
||||||
|
if (pos == WordPosition.Start)
|
||||||
|
substringIndex += 1;
|
||||||
|
else if (pos == WordPosition.End)
|
||||||
|
substringIndex = ctx.Content.Length;
|
||||||
|
else if (pos == WordPosition.Middle)
|
||||||
|
substringIndex += ctx.Content.IndexOf(resolvedTrigger);
|
||||||
|
}
|
||||||
|
|
||||||
var rep = new ReplacementBuilder()
|
var rep = new ReplacementBuilder()
|
||||||
.WithDefault(ctx.Author, ctx.Channel, (ctx.Channel as ITextChannel)?.Guild, client)
|
.WithDefault(ctx.Author, ctx.Channel, (ctx.Channel as ITextChannel)?.Guild, client)
|
||||||
.WithOverride("%target%", () => ctx.Content.Substring(resolvedTrigger.Length).Trim())
|
.WithOverride("%target%", () => ctx.Content.Substring(substringIndex))
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
str = rep.Replace(str);
|
str = rep.Replace(str);
|
||||||
@ -77,8 +89,8 @@ namespace NadekoBot.Modules.CustomReactions.Extensions
|
|||||||
public static string TriggerWithContext(this CustomReaction cr, IUserMessage ctx, DiscordSocketClient client)
|
public static string TriggerWithContext(this CustomReaction cr, IUserMessage ctx, DiscordSocketClient client)
|
||||||
=> cr.Trigger.ResolveTriggerString(ctx, client);
|
=> cr.Trigger.ResolveTriggerString(ctx, client);
|
||||||
|
|
||||||
public static Task<string > ResponseWithContextAsync(this CustomReaction cr, IUserMessage ctx, DiscordSocketClient client)
|
public static Task<string > ResponseWithContextAsync(this CustomReaction cr, IUserMessage ctx, DiscordSocketClient client, bool containsAnywhere)
|
||||||
=> cr.Response.ResolveResponseStringAsync(ctx, client, cr.Trigger.ResolveTriggerString(ctx, client));
|
=> cr.Response.ResolveResponseStringAsync(ctx, client, cr.Trigger.ResolveTriggerString(ctx, client), containsAnywhere);
|
||||||
|
|
||||||
public static async Task<IUserMessage> Send(this CustomReaction cr, IUserMessage ctx, DiscordSocketClient client, CustomReactionsService crs)
|
public static async Task<IUserMessage> Send(this CustomReaction cr, IUserMessage ctx, DiscordSocketClient client, CustomReactionsService crs)
|
||||||
{
|
{
|
||||||
@ -88,16 +100,49 @@ namespace NadekoBot.Modules.CustomReactions.Extensions
|
|||||||
|
|
||||||
if (CREmbed.TryParse(cr.Response, out CREmbed crembed))
|
if (CREmbed.TryParse(cr.Response, out CREmbed crembed))
|
||||||
{
|
{
|
||||||
|
var trigger = cr.Trigger.ResolveTriggerString(ctx, client);
|
||||||
|
var substringIndex = trigger.Length;
|
||||||
|
if (cr.ContainsAnywhere)
|
||||||
|
{
|
||||||
|
var pos = ctx.Content.GetWordPosition(trigger);
|
||||||
|
if (pos == WordPosition.Start)
|
||||||
|
substringIndex += 1;
|
||||||
|
else if (pos == WordPosition.End)
|
||||||
|
substringIndex = ctx.Content.Length;
|
||||||
|
else if (pos == WordPosition.Middle)
|
||||||
|
substringIndex += ctx.Content.IndexOf(trigger);
|
||||||
|
}
|
||||||
|
|
||||||
var rep = new ReplacementBuilder()
|
var rep = new ReplacementBuilder()
|
||||||
.WithDefault(ctx.Author, ctx.Channel, (ctx.Channel as ITextChannel)?.Guild, client)
|
.WithDefault(ctx.Author, ctx.Channel, (ctx.Channel as ITextChannel)?.Guild, client)
|
||||||
.WithOverride("%target%", () => ctx.Content.Substring(cr.Trigger.ResolveTriggerString(ctx, client).Length).Trim())
|
.WithOverride("%target%", () => ctx.Content.Substring(substringIndex).Trim())
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
rep.Replace(crembed);
|
rep.Replace(crembed);
|
||||||
|
|
||||||
return await channel.EmbedAsync(crembed.ToEmbed(), crembed.PlainText?.SanitizeMentions() ?? "");
|
return await channel.EmbedAsync(crembed.ToEmbed(), crembed.PlainText?.SanitizeMentions() ?? "");
|
||||||
}
|
}
|
||||||
return await channel.SendMessageAsync((await cr.ResponseWithContextAsync(ctx, client)).SanitizeMentions());
|
return await channel.SendMessageAsync((await cr.ResponseWithContextAsync(ctx, client, cr.ContainsAnywhere)).SanitizeMentions());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static WordPosition GetWordPosition(this string str, string word)
|
||||||
|
{
|
||||||
|
if (str.StartsWith(word + " "))
|
||||||
|
return WordPosition.Start;
|
||||||
|
else if (str.EndsWith(" " + word))
|
||||||
|
return WordPosition.End;
|
||||||
|
else if (str.Contains(" " + word + " "))
|
||||||
|
return WordPosition.Middle;
|
||||||
|
else
|
||||||
|
return WordPosition.None;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum WordPosition
|
||||||
|
{
|
||||||
|
None,
|
||||||
|
Start,
|
||||||
|
Middle,
|
||||||
|
End,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -70,9 +70,7 @@ namespace NadekoBot.Modules.CustomReactions.Services
|
|||||||
var hasTarget = cr.Response.ToLowerInvariant().Contains("%target%");
|
var hasTarget = cr.Response.ToLowerInvariant().Contains("%target%");
|
||||||
var trigger = cr.TriggerWithContext(umsg, _client).Trim().ToLowerInvariant();
|
var trigger = cr.TriggerWithContext(umsg, _client).Trim().ToLowerInvariant();
|
||||||
return ((cr.ContainsAnywhere &&
|
return ((cr.ContainsAnywhere &&
|
||||||
(content.StartsWith(trigger + " ")
|
(content.GetWordPosition(trigger) != WordPosition.None))
|
||||||
|| content.EndsWith(" " + trigger)
|
|
||||||
|| content.Contains(" " + trigger + " ")))
|
|
||||||
|| (hasTarget && content.StartsWith(trigger + " "))
|
|| (hasTarget && content.StartsWith(trigger + " "))
|
||||||
|| (_bc.BotConfig.CustomReactionsStartWith && content.StartsWith(trigger + " "))
|
|| (_bc.BotConfig.CustomReactionsStartWith && content.StartsWith(trigger + " "))
|
||||||
|| content == trigger);
|
|| content == trigger);
|
||||||
|
Loading…
Reference in New Issue
Block a user