generated from nhcarrigan/template
feat: grant Elysian role on auth and prompt non-members to join (#134)
## Summary - Grants the Elysian Discord role to players on login/registration and persists an `inGuild` flag on the Player record - Connects to the Discord Gateway via WebSocket to keep `inGuild` in sync as players join or leave the server - Shows a dismissible "Join our community" modal to players who are not yet in the guild - Hardens `inGuild` exposure through the load endpoint and game context - Moves all non-secret Discord IDs (guild, role, client, redirect URI) out of env vars and into hardcoded constants; removes them from `prod.env` ## Test plan - [ ] Lint, build, and test pipeline passes (100% coverage maintained) - [ ] New player auth grants Elysian role and sets `inGuild: true` - [ ] Existing player auth re-attempts role grant and updates `inGuild` - [ ] Join community modal appears for players not in the guild - [ ] Modal does not reappear within the same browser session after dismissal - [ ] Gateway correctly sets `inGuild: true/false` on member add/remove events ✨ This issue was created with help from Hikari~ 🌸 Reviewed-on: #134 Co-authored-by: Hikari <hikari@nhcarrigan.com> Co-committed-by: Hikari <hikari@nhcarrigan.com>
This commit was merged in pull request #134.
This commit is contained in:
@@ -243,6 +243,11 @@ interface GameContextValue {
|
||||
isLoading: boolean;
|
||||
error: string | null;
|
||||
|
||||
/**
|
||||
* Whether the player is currently a member of the NHCarrigan Discord server.
|
||||
*/
|
||||
inGuild: boolean;
|
||||
|
||||
/**
|
||||
* Click the crystal to earn gold.
|
||||
*/
|
||||
@@ -694,6 +699,7 @@ export const GameProvider = ({
|
||||
const [ schemaOutdated, setSchemaOutdated ] = useState(false);
|
||||
const [ saveSchemaVersion, setSaveSchemaVersion ] = useState(0);
|
||||
const [ currentSchemaVersion, setCurrentSchemaVersion ] = useState(0);
|
||||
const [ inGuild, setInGuild ] = useState(false);
|
||||
const [ unlockedCodexEntryIds, setUnlockedCodexEntryIds ] = useState<
|
||||
Array<string>
|
||||
>([]);
|
||||
@@ -731,6 +737,7 @@ export const GameProvider = ({
|
||||
setSchemaOutdated(data.schemaOutdated);
|
||||
setSaveSchemaVersion(data.state.schemaVersion ?? 0);
|
||||
setCurrentSchemaVersion(data.currentSchemaVersion);
|
||||
setInGuild(data.inGuild);
|
||||
|
||||
// Fetch number format preference from profile (fire-and-forget, non-blocking)
|
||||
void fetch(`/api/profile/${data.state.player.discordId}`).
|
||||
@@ -2303,6 +2310,7 @@ export const GameProvider = ({
|
||||
forceUnlocks,
|
||||
formatNumber,
|
||||
handleClick,
|
||||
inGuild,
|
||||
isLoading,
|
||||
isSyncing,
|
||||
lastSavedAt,
|
||||
@@ -2374,6 +2382,7 @@ export const GameProvider = ({
|
||||
error,
|
||||
flushBossLoreToasts,
|
||||
forceSync,
|
||||
inGuild,
|
||||
forceUnlocks,
|
||||
handleClick,
|
||||
isLoading,
|
||||
|
||||
Reference in New Issue
Block a user