v1.3.2
Added
-
Sign-in on beta and staging is now restricted to Bug Hunters (instance
owners bypass it, so they can't lock themselves out of their own
environment). Rejected cleanly at the OAuth login step
(checkBugHunterOnly, same pattern as the existingcheckBanScope),
plus a matching global check inapi/uapi.gofor defense in depth on
any session issued before this. Reads the sameusers.bug_hunters
columnSpecRoleSyncalready keeps in sync with the Bug Hunter Discord
role no new sync mechanism, no new schema. -
Real account bans: a new
BanUser/UnbanUserRPC action (new
ban_userspermission) setsusers.banned, distinct from
AppBanUser/AppUnbanUser's much narrowerapp_bannedflag. Nothing
previously set the column at all despiteapi/uapi.goalready rejecting
every authenticated request from a banned user except sessions scoped
ban_exempta full account ban was completely unreachable through any
staff action. -
VoteBanAdd/VoteBanRemovenow supportServer,Team, andPackin
addition toBot(all four carry an identicalvote_bannedcolumn).
ForceRemovenow supportsServerandPackin addition toBot
thekick/protected-bots behaviour stays bot-only, since neither has a
"leave the guild" equivalent. This is the reports-can't-act-on-non-bot-
content gap: reports against a server or pack had no staff action to
take beyond bots. -
A generic badge system: a staff-managed catalog (
badges) plus a
flexible assignment table (entity_badges), so a new purely-decorative
badge is a catalog row and an assignment from now on, not a new column,
backend flag, and frontend branch every time. NewAssignBadge/
UnassignBadgeRPC action (newassign_badgespermission, works on
User/Bot/Server/Team) reaches every entity type through the same
Actions menu as every other staff action, and a new
GET /{target_type}/{target_id}/badgespublic route reads them back.
Deliberately separate from the functional badges already on
users/bots/servers (premium, certified, developer,bug_huntersthe
last one specifically because it's synced from a Discord role by
SpecRoleSync, not manually assigned, so it stays exactly as-is)
newmanage_badgespermission gates the catalog itself. -
Bots can now document their own commands and post changelog/announcement
entries, gated by the sameedit_botsentity permission (owner or team)
that already gates editing a bot's settings no new permission needed.
PUT /bots/{id}/commandsreplaces the whole command list (same
full-replace convention asextra_links);POST/DELETE /bots/{id}/changelogsappend and remove individual entries (same
convention as reviews). Both are public to read.- A new
Healthroute group,GET /health/*— one endpoint per subsystem
(database, API, bot/server/pack listings, blog, search, Discord auth,
tickets, staff panel, plus Infernoplex's and Arcadia's separate Discord
gateway connections), each returning a bare 200/503 with no body to
parse. Built for the new external status page (omni-status) to point one
uptime monitor at each endpoint — mirrors what Omniplex's own
/about/statuspage already self-probes client-side, done server-side
instead so an outside monitor doesn't need API-client internals.
- A new
-
Servers now go through the same staff review pipeline bots already do:
PUT /serverspreviously defaulted straight totype = 'approved', so
every server went live immediately with zero review, unlike bots
(typedefault flipped topendingviaexp/serverreview.sql, existing
rows untouched).Claim/Unclaim/Approve/Deny/Unverifynow support
ServeralongsideBot(shares the existingreview_botspermission,
same precedent asVoteBanAdd/ForceRemovealready covering multiple
target types under one permission), and a newServerQueuepanel op
mirrorsBotQueue. No server equivalent of the bot-approval Discord
role auto-grant exists, soApprovestops at the state transition and
mod-log post for servers. -
Some
Bot Reviews/Users & Votesstaff permissions (transfer_bots,
force_remove_bots,manage_premium,manage_votes,ban_voters)
reclassified under a newContent Managementcategory — these act on
listed entities (transferring, deleting, granting perks, resetting
votes, vote-banning), not on the review queue or on user accounts, so
they read oddly grouped with either. -
GET /servers/@emojis/flatandGET /servers/@stickers/flat— unnest
every opted-in server's emojis/stickers into one flat, item-level-paginated
list (60/page) instead ofGET /servers/@emojis's one-page-per-server
shape, for a cross-server browse page that doesn't grow one section per
server as more servers opt in.
Fixed
- Animated emojis were synced with a permanently-static CDN URL despite
animated: truebeing stored correctly —disgo'sEmoji.URL()
always defaults to PNG regardless of the emoji's animated flag (unlike
Sticker.URL(), which already inferred the right format from
FormatType).serversync.gonow explicitly requests GIF format when
Animatedis true. - Server
total_members/online_memberswere only ever set once, at
/setuptime, and never refreshed — there's no periodic member-count
sync, and the bot deliberately doesn't hold the privileged Server
Members intent (seeTeamCleanup's doc comment), so the gateway's
cached guild object never gets live count updates either. The existing
30-minute server-sync task (renamedsyncAvatars→syncServerMeta)
now also REST-pollsGetGuild(id, true)per server and updates both
counts, the same way/setuporiginally got them.