+ Discord role drop
+
+ Give everyone holding a Discord role the same number of tokens, whether or not they are
+ online — a player who is signed out finds the gift box waiting. Only players who have
+ claimed benefits on this site are counted, and their roles are refreshed once a day, so a
+ role given or taken since then isn't seen yet. Up to {MAX_TOKEN_DROP.toLocaleString()}{' '}
+ tokens each.
+
+
+
+ )
+}
+
/**
* Change the account's username — the name used to sign in, here and in the game.
*
diff --git a/apps/www/src/staff.ts b/apps/www/src/staff.ts
index e9850c0..c34cbe6 100644
--- a/apps/www/src/staff.ts
+++ b/apps/www/src/staff.ts
@@ -10,6 +10,7 @@ import {
movePlayerToDorm,
writeAuditLog,
} from '@repo/domain'
+import { PlatformType } from '@repo/domain/src/enums'
import { intVar, logger } from '@repo/hono-helpers'
import { validateAndGetAccountId, validateAndGetRoles } from '@repo/jwt'
@@ -31,6 +32,9 @@ import {
searchReports,
} from '../../api/src/reports-db'
import { getWarningsAgainst } from '../../api/src/warnings-db'
+// The platform links, owned by `auth`: a Discord link carries the roles its member held at
+// their claim or the last daily sweep (discord-roles.ts), which is what the role drop reads.
+import { getLinksForPlatform } from '../../auth/src/platform-db'
// Balances, owned by `econ`. A staff token gift is the same credit econ's own faucets make.
import {
ALL_PLATFORMS,
@@ -955,6 +959,79 @@ export async function giftOnlineTokensHandler(c: Context