fix: handle Discord connections over gRPC

Signed-off-by: Sienna "suprstarrd" M. <business@suprstarrd.com>
This commit is contained in:
suprstarrd 2026-08-02 16:25:03 -04:00
parent 1595159755
commit 93d7e3ade5
No known key found for this signature in database
GPG Key ID: 5CDFB12F6C2A3E39
3 changed files with 321 additions and 452 deletions

715
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -45,7 +45,7 @@
"mii-js": "github:PretendoNetwork/mii-js#v1.0.4",
"mongoose": "^6.4.0",
"morgan": "^1.10.0",
"nice-grpc": "^2.1.13",
"nice-grpc": "^2.1.16",
"nodemailer": "^6.7.5",
"stripe": "^9.9.0"
},

View File

@ -5,6 +5,8 @@ const got = require('got');
const { marked } = require('marked');
const { REST: DiscordRest } = require('@discordjs/rest');
const { Routes: DiscordRoutes } = require('discord-api-types/v10');
const { createChannel, createClient, Metadata } = require('nice-grpc');
const { ApiServiceDefinition } = require('@pretendonetwork/grpc/api/v2/api_service');
const merge = require('lodash.merge');
const config = require('./config');
const logger = require('./logger');
@ -12,6 +14,9 @@ const baseLocale = require(`${__dirname}/../locales/en_US.json`);
const discordRest = new DiscordRest({ version: '10' }).setToken(config.discord.bot_token);
const gRPCApiChannel = createChannel(`${config.grpc.api.host}:${config.grpc.api.port}`);
const gRPCApiClient = createClient(ApiServiceDefinition, gRPCApiChannel);
function fullUrl(request) {
return `${request.protocol}://${request.hostname}${request.originalUrl}`;
}
@ -180,38 +185,41 @@ async function getUserAccountData(request, response, fromRetry = false) {
}
async function updateDiscordConnection(discordUser, request, response, fromRetry = false) {
const apiResponse = await apiPostRequest('/v1/connections/add/discord', {
Authorization: `${request.cookies.token_type} ${request.cookies.access_token}`
}, {
data: {
try {
return await gRPCApiClient.setDiscordConnectionData({
id: discordUser.id
}, {
metadata: Metadata({
'X-API-Key': config.grpc.api.api_key,
'X-Token': request.headers['access_token']
})
});
} catch {
if (fromRetry === true) {
throw new Error('Bad');
}
});
if (apiResponse.statusCode !== 200 && fromRetry === true) {
// TODO: Error message
throw new Error('Bad');
}
if (apiResponse.statusCode !== 200) {
await refreshLogin(request, response);
await updateDiscordConnection(discordUser, request, response, true);
return await updateDiscordConnection(discordUser, request, response, true);
}
}
async function removeDiscordConnection(request, response, fromRetry = false) {
const apiResponse = await apiDeleteRequest('/v1/connections/remove/discord', {
Authorization: `${request.cookies.token_type} ${request.cookies.access_token}`
});
if (apiResponse.statusCode !== 200 && fromRetry === true) {
// TODO: Error message
throw new Error('Bad');
}
if (apiResponse.statusCode !== 200) {
try {
return await gRPCApiClient.setDiscordConnectionData({
id: discordUser.id
}, {
metadata: Metadata({
'X-API-Key': config.grpc.api.api_key,
'X-Token': request.headers['access_token']
})
});
} catch {
if (fromRetry === true) {
throw new Error('Bad');
}
await refreshLogin(request, response);
await removeDiscordConnection(request, response, true);
return await removeDiscordConnection(request, response, true);
}
}