add permission scanner, info panels, image QR scan, invite tracker, ticket templates
Five new features: - /permissions scan: audits admin/ban roles, dangerous bot permissions, public channels, empty/duplicate/useless roles, too-many-admins warning. - /panel create: fixed info panels (rules/support/bewerbung/partner/ rollen/events/faq) with buttons wired into the existing ticket/ register/partner flows, FAQ panels get a question dropdown. - Image moderation: QR-code detection in message attachments via jimp+jsqr (pure JS, no native build deps) with a small scam-pattern check; opt-in toggle in dashboard settings since decoding costs per-message. - Invite tracker extension: now resolves the inviter (not just the code), tracks suspicious joins per invite, and the dashboard growth page gets an invite breakdown + recent-joins table. - Ticket categories: /ticketconfig lets each ticket topic get its own ping role and a modal question template shown before the channel is created; topics without config behave exactly as before. Also fixes two rough edges found along the way: the welcome embed had no way to attach an image despite the backend already supporting it (added URL/file-upload fields + live preview), and Reaction Roles required typing raw role IDs into a textarea (replaced with a proper role picker). Incidentally repairs node_modules/.bin symlinks that were committed as literal broken shell-script text instead of real symlinks. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -12,13 +12,13 @@ const event: EventHandler = {
|
||||
return;
|
||||
}
|
||||
|
||||
context.altAccounts.check(member).then(({ score, reasons }) => {
|
||||
if (context.altAccounts.isSuspicious(score)) context.logging.logSuspiciousJoin(member, reasons);
|
||||
}).catch(() => undefined);
|
||||
|
||||
context.growth.resolveUsedInvite(member.guild).then((inviteCode) => {
|
||||
context.growth.recordJoin(member.guild.id, member.id, inviteCode);
|
||||
}).catch(() => undefined);
|
||||
Promise.all([context.altAccounts.check(member), context.growth.resolveUsedInvite(member.guild)])
|
||||
.then(([{ score, reasons }, invite]) => {
|
||||
const suspicious = context.altAccounts.isSuspicious(score);
|
||||
if (suspicious) context.logging.logSuspiciousJoin(member, reasons);
|
||||
context.growth.recordJoin(member.guild.id, member.id, invite, suspicious);
|
||||
})
|
||||
.catch(() => undefined);
|
||||
|
||||
const guildConfig = settingsStore.get(member.guild.id);
|
||||
const welcomeCfg = guildConfig?.welcomeConfig || guildConfig?.automodConfig?.welcomeConfig;
|
||||
|
||||
Reference in New Issue
Block a user