From 810052c605feb5044a080adfe99ba2fa69b7b351 Mon Sep 17 00:00:00 2001 From: cherry-xw <649207438@qq.com> Date: Thu, 15 Oct 2026 15:31:19 +0800 Subject: [PATCH] fix(onebot): preserve profile regions in user and member responses (#2107) --- packages/napcat-core/helper/profile-region.ts | 24 +++++++++++++++++++ .../action/go-cqhttp/GetStrangerInfo.ts | 2 ++ packages/napcat-onebot/helper/data.ts | 5 ++-- region-offline.test.mjs | 8 +++++++ 4 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 packages/napcat-core/helper/profile-region.ts create mode 100644 region-offline.test.mjs diff --git a/packages/napcat-core/helper/profile-region.ts b/packages/napcat-core/helper/profile-region.ts new file mode 100644 index 00000000..97d37017 --- /dev/null +++ b/packages/napcat-core/helper/profile-region.ts @@ -0,0 +1,24 @@ +/** Self-reported profile region only; never infer a location from other fields. */ +export interface ProfileRegion { + country?: string; + province?: string; + city?: string; +} + +function text (value: unknown): string { + return typeof value === 'string' ? value.trim() : ''; +} + +/** Keep one source together: mixing old/new components can invent a region. */ +export function selectProfileRegion (fresh?: ProfileRegion, fallback?: ProfileRegion): Required { + for (const source of [fresh, fallback]) { + const region = { country: text(source?.country), province: text(source?.province), city: text(source?.city) }; + if (Object.values(region).some(Boolean)) return region; + } + return { country: '', province: '', city: '' }; +} + +export function profileRegionArea (source?: ProfileRegion): string { + const region = selectProfileRegion(source); + return [...new Set(Object.values(region).filter(Boolean))].join(' '); +} diff --git a/packages/napcat-onebot/action/go-cqhttp/GetStrangerInfo.ts b/packages/napcat-onebot/action/go-cqhttp/GetStrangerInfo.ts index 7610917e..c07340af 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetStrangerInfo.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetStrangerInfo.ts @@ -1,3 +1,4 @@ +import { selectProfileRegion } from '@/napcat-core/helper/profile-region'; import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { OB11UserSex } from '@/napcat-onebot/index'; import { OB11Construct } from '@/napcat-onebot/helper/data'; @@ -56,6 +57,7 @@ export default class GoCQHTTPGetStrangerInfo extends OneBotAction