generated from nhcarrigan/template
feat: add community role grant and join prompt for players
- Grant Elysian Discord role to players on OAuth login (new and returning) - Add inGuild flag to Player schema, seeded from role grant response - Connect Discord Gateway WebSocket to keep inGuild in sync on join/leave - Return inGuild from load endpoint; expose in game context - Show join community modal once per session when inGuild is false
This commit is contained in:
@@ -16,6 +16,7 @@ import {
|
||||
} from "../services/discord.js";
|
||||
import { signToken } from "../services/jwt.js";
|
||||
import { logger } from "../services/logger.js";
|
||||
import { grantElysianRole } from "../services/webhook.js";
|
||||
import type { Player } from "@elysium/types";
|
||||
|
||||
const authRouter = new Hono();
|
||||
@@ -92,6 +93,12 @@ authRouter.get("/callback", async(context) => {
|
||||
},
|
||||
});
|
||||
|
||||
const inGuild = await grantElysianRole(player.discordId);
|
||||
await prisma.player.update({
|
||||
data: { inGuild },
|
||||
where: { discordId: player.discordId },
|
||||
});
|
||||
|
||||
const jwtToken = signToken(player.discordId);
|
||||
void logger.log("info", `New player registered: ${player.discordId}`);
|
||||
void logger.metric("user_registered", 1, { discordId: player.discordId });
|
||||
@@ -104,10 +111,12 @@ authRouter.get("/callback", async(context) => {
|
||||
);
|
||||
}
|
||||
|
||||
const inGuild = await grantElysianRole(discordUser.id);
|
||||
const updated = await prisma.player.update({
|
||||
data: {
|
||||
avatar: discordUser.avatar,
|
||||
discriminator: discordUser.discriminator,
|
||||
inGuild: inGuild,
|
||||
username: discordUser.username,
|
||||
},
|
||||
where: { discordId: discordUser.id },
|
||||
|
||||
@@ -760,6 +760,7 @@ gameRouter.get("/load", async(context) => {
|
||||
: computeHmac(JSON.stringify(freshState), secret);
|
||||
return context.json({
|
||||
currentSchemaVersion: currentSchemaVersion,
|
||||
inGuild: playerRecord.inGuild,
|
||||
loginBonus: null,
|
||||
loginStreak: playerRecord.loginStreak,
|
||||
offlineEssence: 0,
|
||||
@@ -898,8 +899,10 @@ gameRouter.get("/load", async(context) => {
|
||||
const signature = secret === undefined
|
||||
? undefined
|
||||
: computeHmac(JSON.stringify(state), secret);
|
||||
const inGuild = playerRecord?.inGuild ?? false;
|
||||
return context.json({
|
||||
currentSchemaVersion,
|
||||
inGuild,
|
||||
loginBonus,
|
||||
loginStreak,
|
||||
offlineEssence,
|
||||
|
||||
Reference in New Issue
Block a user