From 876a182e7b2abc5ec33446278c8078e94cedb357 Mon Sep 17 00:00:00 2001 From: Jemma Poffinbarger Date: Sun, 19 Apr 2026 13:39:32 -0500 Subject: [PATCH] feat(grpc): implement getPNIDs --- src/services/grpc/account/v2/get-pnids.ts | 120 ++++++++++++++++++ .../grpc/account/v2/implementation.ts | 4 +- 2 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 src/services/grpc/account/v2/get-pnids.ts diff --git a/src/services/grpc/account/v2/get-pnids.ts b/src/services/grpc/account/v2/get-pnids.ts new file mode 100644 index 0000000..1bcd863 --- /dev/null +++ b/src/services/grpc/account/v2/get-pnids.ts @@ -0,0 +1,120 @@ +// import { Status, ServerError } from 'nice-grpc'; +import { getPNIDByPID } from '@/database'; +import { PNID_PERMISSION_FLAGS } from '@/types/common/permission-flags'; +import { config } from '@/config-manager'; +import { Device } from '@/models/device'; +import type { GetPNIDsRequest, GetPNIDsResponse } from '@pretendonetwork/grpc/account/v2/get_pnids_rpc'; + +export async function getPNIDs(request: GetPNIDsRequest): Promise { + const response: GetPNIDsResponse = { userData: [] }; + for (const pid of request.pid) { + const pnid = await getPNIDByPID(pid); + if (!pnid) { + response.userData[pid] = { + deleted: true, + pid: pid, + username: 'Unknown', + accessLevel: -1, + serverAccessLevel: 'prod', + mii: { + name: 'Unknown', + data: '', + url: '' + }, + creationDate: '', + birthdate: '', + gender: '', + country: '', + language: '', + emailAddress: '', + tierName: '', + permissions: { + bannedAllPermanently: false, + bannedAllTemporarily: false, + betaAccess: false, + accessAdminPanel: false, + createServerConfigs: false, + modifyServerConfigs: false, + deployServer: false, + modifyPnids: false, + modifyNexAccounts: false, + modifyConsoles: false, + banPnids: false, + banNexAccounts: false, + banConsoles: false, + moderateMiiverse: false, + createApiKeys: false, + createBossTasks: false, + updateBossTasks: false, + deleteBossTasks: false, + uploadBossFiles: false, + updateBossFiles: false, + deleteBossFiles: false, + updatePnidPermissions: false + }, + linkedDevices: [] + }; + continue; + } + + const devices = (await Device.find({ + linked_pids: pnid.pid + })).map((device) => { + return { + model: device.get('model'), // ".model" gives the Mongoose model... + serial: device.serial, + linkedPids: device.linked_pids, + accessLevel: device.access_level, + serverAccessLevel: device.server_access_level, + deviceId: device.device_id + }; + }); + + response.userData[pid] = { + deleted: pnid.deleted || pnid.marked_for_deletion, + pid: pnid.pid, + username: pnid.username, + accessLevel: pnid.access_level, + serverAccessLevel: pnid.server_access_level, + mii: { + name: pnid.mii.name, + data: pnid.mii.data, + url: `${config.cdn.base_url}/mii/${pnid.pid}/standard.tga` + }, + creationDate: pnid.creation_date, + birthdate: pnid.birthdate, + gender: pnid.gender, + country: pnid.country, + language: pnid.language, + emailAddress: pnid.email.address, + tierName: pnid.connections.stripe.tier_name, + permissions: { + bannedAllPermanently: pnid.hasPermission(PNID_PERMISSION_FLAGS.BANNED_ALL_PERMANENTLY), + bannedAllTemporarily: pnid.hasPermission(PNID_PERMISSION_FLAGS.BANNED_ALL_TEMPORARILY), + betaAccess: pnid.hasPermission(PNID_PERMISSION_FLAGS.BETA_ACCESS), + accessAdminPanel: pnid.hasPermission(PNID_PERMISSION_FLAGS.ACCESS_ADMIN_PANEL), + createServerConfigs: pnid.hasPermission(PNID_PERMISSION_FLAGS.CREATE_SERVER_CONFIGS), + modifyServerConfigs: pnid.hasPermission(PNID_PERMISSION_FLAGS.MODIFY_SERVER_CONFIGS), + deployServer: pnid.hasPermission(PNID_PERMISSION_FLAGS.DEPLOY_SERVER), + modifyPnids: pnid.hasPermission(PNID_PERMISSION_FLAGS.MODIFY_PNIDS), + modifyNexAccounts: pnid.hasPermission(PNID_PERMISSION_FLAGS.MODIFY_NEX_ACCOUNTS), + modifyConsoles: pnid.hasPermission(PNID_PERMISSION_FLAGS.MODIFY_CONSOLES), + banPnids: pnid.hasPermission(PNID_PERMISSION_FLAGS.BAN_PNIDS), + banNexAccounts: pnid.hasPermission(PNID_PERMISSION_FLAGS.BAN_NEX_ACCOUNTS), + banConsoles: pnid.hasPermission(PNID_PERMISSION_FLAGS.BAN_CONSOLES), + moderateMiiverse: pnid.hasPermission(PNID_PERMISSION_FLAGS.MODERATE_MIIVERSE), + createApiKeys: pnid.hasPermission(PNID_PERMISSION_FLAGS.CREATE_API_KEYS), + createBossTasks: pnid.hasPermission(PNID_PERMISSION_FLAGS.CREATE_BOSS_TASKS), + updateBossTasks: pnid.hasPermission(PNID_PERMISSION_FLAGS.UPDATE_BOSS_TASKS), + deleteBossTasks: pnid.hasPermission(PNID_PERMISSION_FLAGS.DELETE_BOSS_TASKS), + uploadBossFiles: pnid.hasPermission(PNID_PERMISSION_FLAGS.UPLOAD_BOSS_FILES), + updateBossFiles: pnid.hasPermission(PNID_PERMISSION_FLAGS.UPDATE_BOSS_FILES), + deleteBossFiles: pnid.hasPermission(PNID_PERMISSION_FLAGS.DELETE_BOSS_FILES), + updatePnidPermissions: pnid.hasPermission(PNID_PERMISSION_FLAGS.UPDATE_PNID_PERMISSIONS) + }, + linkedDevices: devices + }; + } + + return response; +} diff --git a/src/services/grpc/account/v2/implementation.ts b/src/services/grpc/account/v2/implementation.ts index 9528225..40e5853 100644 --- a/src/services/grpc/account/v2/implementation.ts +++ b/src/services/grpc/account/v2/implementation.ts @@ -34,6 +34,7 @@ import { updateBan } from '@/services/grpc/account/v2/update-ban'; import { pardonBan } from '@/services/grpc/account/v2/pardon-ban'; import { listBanComments } from '@/services/grpc/account/v2/list-ban-comments'; import { createBanComment } from '@/services/grpc/account/v2/create-ban-comment'; +import { getPNIDs } from '@/services/grpc/account/v2/get-pnids'; import type { AccountServiceImplementation } from '@pretendonetwork/grpc/account/v2/account_service'; export const accountServiceImplementationV2: AccountServiceImplementation = { @@ -72,5 +73,6 @@ export const accountServiceImplementationV2: AccountServiceImplementation = { updateBan, pardonBan, listBanComments, - createBanComment + createBanComment, + getPNIDs };