/* * Copyright (C) 2026 Fluxer Contributors * * This file is part of Fluxer. * * Fluxer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fluxer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with Fluxer. If not, see . */ /** @jsxRuntime automatic */ /** @jsxImportSource hono/jsx */ import {AdminACLs} from '@fluxer/constants/src/AdminACLs'; import {DeletionReasons as CoreDeletionReasons} from '@fluxer/constants/src/Core'; import {GuildFeatures, GuildOperations} from '@fluxer/constants/src/GuildConstants'; import {SuspiciousActivityFlags, UserFlags} from '@fluxer/constants/src/UserConstants'; export interface PatchableUserFlag { name: string; value: bigint; } export const FLAG_STAFF: PatchableUserFlag = {name: 'STAFF', value: UserFlags.STAFF}; export const FLAG_STAFF_HIDDEN: PatchableUserFlag = {name: 'STAFF_HIDDEN', value: UserFlags.STAFF_HIDDEN}; export const FLAG_CTP_MEMBER: PatchableUserFlag = {name: 'CTP_MEMBER', value: UserFlags.CTP_MEMBER}; export const FLAG_PARTNER: PatchableUserFlag = {name: 'PARTNER', value: UserFlags.PARTNER}; export const FLAG_BUG_HUNTER: PatchableUserFlag = {name: 'BUG_HUNTER', value: UserFlags.BUG_HUNTER}; export const FLAG_HIGH_GLOBAL_RATE_LIMIT: PatchableUserFlag = { name: 'HIGH_GLOBAL_RATE_LIMIT', value: UserFlags.HIGH_GLOBAL_RATE_LIMIT, }; export const FLAG_PREMIUM_PURCHASE_DISABLED: PatchableUserFlag = { name: 'PREMIUM_PURCHASE_DISABLED', value: UserFlags.PREMIUM_PURCHASE_DISABLED, }; export const FLAG_PREMIUM_ENABLED_OVERRIDE: PatchableUserFlag = { name: 'PREMIUM_ENABLED_OVERRIDE', value: UserFlags.PREMIUM_ENABLED_OVERRIDE, }; export const FLAG_RATE_LIMIT_BYPASS: PatchableUserFlag = { name: 'RATE_LIMIT_BYPASS', value: UserFlags.RATE_LIMIT_BYPASS, }; export const FLAG_REPORT_BANNED: PatchableUserFlag = {name: 'REPORT_BANNED', value: UserFlags.REPORT_BANNED}; export const FLAG_VERIFIED_NOT_UNDERAGE: PatchableUserFlag = { name: 'VERIFIED_NOT_UNDERAGE', value: UserFlags.VERIFIED_NOT_UNDERAGE, }; export const FLAG_USED_MOBILE_CLIENT: PatchableUserFlag = { name: 'USED_MOBILE_CLIENT', value: UserFlags.USED_MOBILE_CLIENT, }; export const FLAG_APP_STORE_REVIEWER: PatchableUserFlag = { name: 'APP_STORE_REVIEWER', value: UserFlags.APP_STORE_REVIEWER, }; export const FLAG_DM_HISTORY_BACKFILLED: PatchableUserFlag = { name: 'DM_HISTORY_BACKFILLED', value: UserFlags.DM_HISTORY_BACKFILLED, }; export const SELF_HOSTED_PATCHABLE_FLAGS: Array = [ FLAG_STAFF, FLAG_STAFF_HIDDEN, FLAG_HIGH_GLOBAL_RATE_LIMIT, FLAG_RATE_LIMIT_BYPASS, FLAG_REPORT_BANNED, FLAG_VERIFIED_NOT_UNDERAGE, ]; export const PATCHABLE_FLAGS: Array = [ FLAG_STAFF, FLAG_STAFF_HIDDEN, FLAG_CTP_MEMBER, FLAG_PARTNER, FLAG_BUG_HUNTER, FLAG_HIGH_GLOBAL_RATE_LIMIT, FLAG_PREMIUM_PURCHASE_DISABLED, FLAG_PREMIUM_ENABLED_OVERRIDE, FLAG_RATE_LIMIT_BYPASS, FLAG_REPORT_BANNED, FLAG_VERIFIED_NOT_UNDERAGE, FLAG_USED_MOBILE_CLIENT, FLAG_APP_STORE_REVIEWER, FLAG_DM_HISTORY_BACKFILLED, ]; export interface Flag { name: string; value: number; } export const SUSPICIOUS_FLAG_REQUIRE_VERIFIED_EMAIL: Flag = { name: 'REQUIRE_VERIFIED_EMAIL', value: SuspiciousActivityFlags.REQUIRE_VERIFIED_EMAIL, }; export const SUSPICIOUS_FLAG_REQUIRE_REVERIFIED_EMAIL: Flag = { name: 'REQUIRE_REVERIFIED_EMAIL', value: SuspiciousActivityFlags.REQUIRE_REVERIFIED_EMAIL, }; export const SUSPICIOUS_FLAG_REQUIRE_VERIFIED_PHONE: Flag = { name: 'REQUIRE_VERIFIED_PHONE', value: SuspiciousActivityFlags.REQUIRE_VERIFIED_PHONE, }; export const SUSPICIOUS_FLAG_REQUIRE_REVERIFIED_PHONE: Flag = { name: 'REQUIRE_REVERIFIED_PHONE', value: SuspiciousActivityFlags.REQUIRE_REVERIFIED_PHONE, }; export const SUSPICIOUS_FLAG_REQUIRE_VERIFIED_EMAIL_OR_VERIFIED_PHONE: Flag = { name: 'REQUIRE_VERIFIED_EMAIL_OR_VERIFIED_PHONE', value: SuspiciousActivityFlags.REQUIRE_VERIFIED_EMAIL_OR_VERIFIED_PHONE, }; export const SUSPICIOUS_FLAG_REQUIRE_REVERIFIED_EMAIL_OR_VERIFIED_PHONE: Flag = { name: 'REQUIRE_REVERIFIED_EMAIL_OR_VERIFIED_PHONE', value: SuspiciousActivityFlags.REQUIRE_REVERIFIED_EMAIL_OR_VERIFIED_PHONE, }; export const SUSPICIOUS_FLAG_REQUIRE_VERIFIED_EMAIL_OR_REVERIFIED_PHONE: Flag = { name: 'REQUIRE_VERIFIED_EMAIL_OR_REVERIFIED_PHONE', value: SuspiciousActivityFlags.REQUIRE_VERIFIED_EMAIL_OR_REVERIFIED_PHONE, }; export const SUSPICIOUS_FLAG_REQUIRE_REVERIFIED_EMAIL_OR_REVERIFIED_PHONE: Flag = { name: 'REQUIRE_REVERIFIED_EMAIL_OR_REVERIFIED_PHONE', value: SuspiciousActivityFlags.REQUIRE_REVERIFIED_EMAIL_OR_REVERIFIED_PHONE, }; export const SUSPICIOUS_ACTIVITY_FLAGS: Array = [ SUSPICIOUS_FLAG_REQUIRE_VERIFIED_EMAIL, SUSPICIOUS_FLAG_REQUIRE_REVERIFIED_EMAIL, SUSPICIOUS_FLAG_REQUIRE_VERIFIED_PHONE, SUSPICIOUS_FLAG_REQUIRE_REVERIFIED_PHONE, SUSPICIOUS_FLAG_REQUIRE_VERIFIED_EMAIL_OR_VERIFIED_PHONE, SUSPICIOUS_FLAG_REQUIRE_REVERIFIED_EMAIL_OR_VERIFIED_PHONE, SUSPICIOUS_FLAG_REQUIRE_VERIFIED_EMAIL_OR_REVERIFIED_PHONE, SUSPICIOUS_FLAG_REQUIRE_REVERIFIED_EMAIL_OR_REVERIFIED_PHONE, ]; export const DELETION_REASONS: Array<{id: number; label: string}> = [ {id: CoreDeletionReasons.USER_REQUESTED, label: 'User requested'}, {id: CoreDeletionReasons.OTHER, label: 'Other'}, {id: CoreDeletionReasons.SPAM, label: 'Spam'}, {id: CoreDeletionReasons.CHEATING_OR_EXPLOITATION, label: 'Cheating or exploitation'}, {id: CoreDeletionReasons.COORDINATED_RAIDING, label: 'Coordinated raiding or manipulation'}, {id: CoreDeletionReasons.AUTOMATION_OR_SELFBOT, label: 'Automation or self-bot usage'}, {id: CoreDeletionReasons.NONCONSENSUAL_SEXUAL_CONTENT, label: 'Nonconsensual sexual content'}, {id: CoreDeletionReasons.SCAM_OR_SOCIAL_ENGINEERING, label: 'Scam or social engineering'}, {id: CoreDeletionReasons.CHILD_SEXUAL_CONTENT, label: 'Child sexual content'}, {id: CoreDeletionReasons.PRIVACY_VIOLATION_OR_DOXXING, label: 'Privacy violation or doxxing'}, {id: CoreDeletionReasons.HARASSMENT_OR_BULLYING, label: 'Harassment or bullying'}, {id: CoreDeletionReasons.PAYMENT_FRAUD, label: 'Payment fraud'}, {id: CoreDeletionReasons.CHILD_SAFETY_VIOLATION, label: 'Child safety violation'}, {id: CoreDeletionReasons.BILLING_DISPUTE_OR_ABUSE, label: 'Billing dispute or abuse'}, {id: CoreDeletionReasons.UNSOLICITED_EXPLICIT_CONTENT, label: 'Unsolicited explicit content'}, {id: CoreDeletionReasons.GRAPHIC_VIOLENCE, label: 'Graphic violence'}, {id: CoreDeletionReasons.BAN_EVASION, label: 'Ban evasion'}, {id: CoreDeletionReasons.TOKEN_OR_CREDENTIAL_SCAM, label: 'Token or credential scam'}, {id: CoreDeletionReasons.INACTIVITY, label: 'Inactivity'}, {id: CoreDeletionReasons.HATE_SPEECH_OR_EXTREMIST_CONTENT, label: 'Hate speech or extremist content'}, {id: CoreDeletionReasons.MALICIOUS_LINKS_OR_MALWARE, label: 'Malicious links or malware distribution'}, {id: CoreDeletionReasons.IMPERSONATION_OR_FAKE_IDENTITY, label: 'Impersonation or fake identity'}, ]; export const TEMP_BAN_DURATIONS: Array<{hours: number; label: string}> = [ {hours: 1, label: '1 hour'}, {hours: 12, label: '12 hours'}, {hours: 24, label: '1 day'}, {hours: 72, label: '3 days'}, {hours: 120, label: '5 days'}, {hours: 168, label: '1 week'}, {hours: 336, label: '2 weeks'}, {hours: 720, label: '30 days'}, {hours: 0, label: 'Permanent'}, ]; export const ALL_ACLS = Object.values(AdminACLs); export const GUILD_FEATURES = Object.values(GuildFeatures) as ReadonlyArray; const HOSTED_ONLY_GUILD_FEATURES: ReadonlyArray = [ GuildFeatures.VISIONARY, GuildFeatures.VIP_VOICE, GuildFeatures.OPERATOR, ]; export const SELF_HOSTED_GUILD_FEATURES: ReadonlyArray = GUILD_FEATURES.filter( (f) => !HOSTED_ONLY_GUILD_FEATURES.includes(f), ); export const DISABLED_OP_PUSH_NOTIFICATIONS: Flag = { name: 'PUSH_NOTIFICATIONS', value: GuildOperations.PUSH_NOTIFICATIONS, }; export const DISABLED_OP_EVERYONE_MENTIONS: Flag = { name: 'EVERYONE_MENTIONS', value: GuildOperations.EVERYONE_MENTIONS, }; export const DISABLED_OP_TYPING_EVENTS: Flag = {name: 'TYPING_EVENTS', value: GuildOperations.TYPING_EVENTS}; export const DISABLED_OP_INSTANT_INVITES: Flag = {name: 'INSTANT_INVITES', value: GuildOperations.INSTANT_INVITES}; export const DISABLED_OP_SEND_MESSAGE: Flag = {name: 'SEND_MESSAGE', value: GuildOperations.SEND_MESSAGE}; export const DISABLED_OP_REACTIONS: Flag = {name: 'REACTIONS', value: GuildOperations.REACTIONS}; export const DISABLED_OP_MEMBER_LIST_UPDATES: Flag = { name: 'MEMBER_LIST_UPDATES', value: GuildOperations.MEMBER_LIST_UPDATES, }; export const DISABLED_OPERATIONS: Array = [ DISABLED_OP_PUSH_NOTIFICATIONS, DISABLED_OP_EVERYONE_MENTIONS, DISABLED_OP_TYPING_EVENTS, DISABLED_OP_INSTANT_INVITES, DISABLED_OP_SEND_MESSAGE, DISABLED_OP_REACTIONS, DISABLED_OP_MEMBER_LIST_UPDATES, ];