feat(webhooks): add basic commands
This commit is contained in:
parent
c1f05eecf8
commit
a81ffc3399
@ -16,6 +16,12 @@ namespace PluralKit.Bot
|
|||||||
throw new PKError("This command can not be run in a DM.");
|
throw new PKError("This command can not be run in a DM.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Context CheckDMContext(this Context ctx)
|
||||||
|
{
|
||||||
|
if (ctx.Channel.GuildId == null) return ctx;
|
||||||
|
throw new PKError("This command must be run in a DM.");
|
||||||
|
}
|
||||||
|
|
||||||
public static Context CheckSystemPrivacy(this Context ctx, PKSystem target, PrivacyLevel level)
|
public static Context CheckSystemPrivacy(this Context ctx, PKSystem target, PrivacyLevel level)
|
||||||
{
|
{
|
||||||
if (level.CanAccess(ctx.LookupContextFor(target))) return ctx;
|
if (level.CanAccess(ctx.LookupContextFor(target))) return ctx;
|
||||||
|
@ -11,12 +11,12 @@ namespace PluralKit.Bot
|
|||||||
{
|
{
|
||||||
public class Api
|
public class Api
|
||||||
{
|
{
|
||||||
private readonly IDatabase _db;
|
|
||||||
private readonly ModelRepository _repo;
|
private readonly ModelRepository _repo;
|
||||||
public Api(IDatabase db, ModelRepository repo)
|
private readonly DispatchService _dispatch;
|
||||||
|
public Api(ModelRepository repo, DispatchService dispatch)
|
||||||
{
|
{
|
||||||
_db = db;
|
|
||||||
_repo = repo;
|
_repo = repo;
|
||||||
|
_dispatch = dispatch;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task GetToken(Context ctx)
|
public async Task GetToken(Context ctx)
|
||||||
@ -91,5 +91,54 @@ namespace PluralKit.Bot
|
|||||||
await ctx.Reply($"{Emojis.Error} Could not send token in DMs. Are your DMs closed?");
|
await ctx.Reply($"{Emojis.Error} Could not send token in DMs. Are your DMs closed?");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task SystemWebhook(Context ctx)
|
||||||
|
{
|
||||||
|
ctx.CheckDMContext();
|
||||||
|
|
||||||
|
if (!ctx.HasNext(false))
|
||||||
|
{
|
||||||
|
if (ctx.System.WebhookUrl == null)
|
||||||
|
await ctx.Reply("Your system does not have a webhook URL set. Set one with `pk;system webhook <url>`!");
|
||||||
|
else
|
||||||
|
await ctx.Reply($"Your system's webhook URL is <{ctx.System.WebhookUrl}>.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (await ctx.MatchClear("your system's webhook URL"))
|
||||||
|
{
|
||||||
|
await _repo.UpdateSystem(ctx.System.Id, new()
|
||||||
|
{
|
||||||
|
WebhookUrl = null,
|
||||||
|
Token = null,
|
||||||
|
});
|
||||||
|
|
||||||
|
await ctx.Reply($"{Emojis.Success} System webhook URL removed.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var newUrl = ctx.RemainderOrNull();
|
||||||
|
if (!await DispatchExt.ValidateUri(newUrl))
|
||||||
|
{
|
||||||
|
await ctx.Reply($"New URL '{newUrl}' is invalid. Are you sure this is a valid, publicly accessible URL?");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var newToken = StringUtils.GenerateToken();
|
||||||
|
|
||||||
|
await _repo.UpdateSystem(ctx.System.Id, new()
|
||||||
|
{
|
||||||
|
WebhookUrl = newUrl,
|
||||||
|
Token = newToken,
|
||||||
|
});
|
||||||
|
|
||||||
|
await ctx.Reply($"{Emojis.Success} Successfully the new webhook URL for your system."
|
||||||
|
+ $"\n\n{Emojis.Warn} The following token is used to authenticate requests from PluralKit to you."
|
||||||
|
+ " If it leaks, you should clear and re-set the webhook URL to get a new token."
|
||||||
|
+ "\ntodo: add link to docs or something"
|
||||||
|
);
|
||||||
|
|
||||||
|
await ctx.Reply(newToken);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -286,6 +286,8 @@ namespace PluralKit.Bot
|
|||||||
await ctx.Execute<SystemEdit>(SystemAvatar, m => m.Avatar(ctx));
|
await ctx.Execute<SystemEdit>(SystemAvatar, m => m.Avatar(ctx));
|
||||||
else if (ctx.Match("delete", "remove", "destroy", "erase", "yeet"))
|
else if (ctx.Match("delete", "remove", "destroy", "erase", "yeet"))
|
||||||
await ctx.Execute<SystemEdit>(SystemDelete, m => m.Delete(ctx));
|
await ctx.Execute<SystemEdit>(SystemDelete, m => m.Delete(ctx));
|
||||||
|
else if (ctx.Match("webhook", "hook"))
|
||||||
|
await ctx.Execute<Api>(null, m => m.SystemWebhook(ctx));
|
||||||
else if (ctx.Match("timezone", "tz"))
|
else if (ctx.Match("timezone", "tz"))
|
||||||
await ctx.Execute<SystemEdit>(SystemTimezone, m => m.SystemTimezone(ctx));
|
await ctx.Execute<SystemEdit>(SystemTimezone, m => m.SystemTimezone(ctx));
|
||||||
else if (ctx.Match("proxy"))
|
else if (ctx.Match("proxy"))
|
||||||
|
@ -20,6 +20,8 @@ namespace PluralKit.Core
|
|||||||
public Partial<string?> BannerImage { get; set; }
|
public Partial<string?> BannerImage { get; set; }
|
||||||
public Partial<string?> Color { get; set; }
|
public Partial<string?> Color { get; set; }
|
||||||
public Partial<string?> Token { get; set; }
|
public Partial<string?> Token { get; set; }
|
||||||
|
public Partial<string?> WebhookUrl { get; set; }
|
||||||
|
public Partial<string?> WebhookToken { get; set; }
|
||||||
public Partial<string> UiTz { get; set; }
|
public Partial<string> UiTz { get; set; }
|
||||||
public Partial<PrivacyLevel> DescriptionPrivacy { get; set; }
|
public Partial<PrivacyLevel> DescriptionPrivacy { get; set; }
|
||||||
public Partial<PrivacyLevel> MemberListPrivacy { get; set; }
|
public Partial<PrivacyLevel> MemberListPrivacy { get; set; }
|
||||||
@ -40,6 +42,8 @@ namespace PluralKit.Core
|
|||||||
.With("banner_image", BannerImage)
|
.With("banner_image", BannerImage)
|
||||||
.With("color", Color)
|
.With("color", Color)
|
||||||
.With("token", Token)
|
.With("token", Token)
|
||||||
|
.With("webhook_url", WebhookUrl)
|
||||||
|
.With("webhook_token", WebhookToken)
|
||||||
.With("ui_tz", UiTz)
|
.With("ui_tz", UiTz)
|
||||||
.With("description_privacy", DescriptionPrivacy)
|
.With("description_privacy", DescriptionPrivacy)
|
||||||
.With("member_list_privacy", MemberListPrivacy)
|
.With("member_list_privacy", MemberListPrivacy)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user