From 29892d2a01d902166b762dbfe2d2487169a8d048 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=8B=E3=81=A3=E3=81=93=E3=81=8B=E3=82=8A?= <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Thu, 16 Oct 2025 22:45:37 +0900 Subject: [PATCH] =?UTF-8?q?enhance:=20=E3=83=AA=E3=83=A2=E3=83=BC=E3=83=88?= =?UTF-8?q?=E3=83=A6=E3=83=BC=E3=82=B6=E3=83=BC=E3=81=AE=E3=83=AD=E3=83=BC?= =?UTF-8?q?=E3=83=AB=E3=83=90=E3=83=83=E3=82=B8=E3=82=92=E8=A1=A8=E7=A4=BA?= =?UTF-8?q?=E3=81=99=E3=82=8B=E3=81=8B=E3=81=A9=E3=81=86=E3=81=8B=E3=82=92?= =?UTF-8?q?=E3=82=B5=E3=83=BC=E3=83=90=E3=83=BC=E7=AE=A1=E7=90=86=E8=80=85?= =?UTF-8?q?=E3=81=8C=E8=A8=AD=E5=AE=9A=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=20(#16661)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * enhance: リモートユーザーのロールバッジを表示するかどうかをサーバー管理者が設定できるように * Update Changelog * build misskey-js with types --- CHANGELOG.md | 2 ++ locales/index.d.ts | 4 ++++ locales/ja-JP.yml | 1 + .../1760607435831-RoleBadgesRemoteUsers.js | 16 ++++++++++++++++ .../src/core/entities/UserEntityService.ts | 4 ++-- packages/backend/src/models/Meta.ts | 5 +++++ .../src/server/api/endpoints/admin/meta.ts | 5 +++++ .../server/api/endpoints/admin/update-meta.ts | 5 +++++ .../frontend/src/pages/admin/performance.vue | 18 ++++++++++++++++++ packages/misskey-js/src/autogen/types.ts | 2 ++ 10 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 packages/backend/migration/1760607435831-RoleBadgesRemoteUsers.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 26acc75c7e..7d20ef5c6c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ ## 2025.10.1 ### General +- Enhance: リモートユーザーのロールバッジを表示できるように(オプトイン) + パフォーマンス上の問題からデフォルトで無効化されています。「コントロールパネル > パフォーマンス」から有効化できます。 - 依存関係の更新 ### Client diff --git a/locales/index.d.ts b/locales/index.d.ts index b54763a8a2..7391e197c4 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -4706,6 +4706,10 @@ export interface Locale extends ILocale { * ユーザーごとのIdenticon生成を有効にする */ "enableIdenticonGeneration": string; + /** + * リモートユーザーのロールバッジを表示する + */ + "showRoleBadgesOfRemoteUsers": string; /** * オフにするとパフォーマンスが向上します。 */ diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 3c9f0a5853..9ee3224441 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1172,6 +1172,7 @@ installed: "インストール済み" branding: "ブランディング" enableServerMachineStats: "サーバーのマシン情報を公開する" enableIdenticonGeneration: "ユーザーごとのIdenticon生成を有効にする" +showRoleBadgesOfRemoteUsers: "リモートユーザーのロールバッジを表示する" turnOffToImprovePerformance: "オフにするとパフォーマンスが向上します。" createInviteCode: "招待コードを作成" createWithOptions: "オプションを指定して作成" diff --git a/packages/backend/migration/1760607435831-RoleBadgesRemoteUsers.js b/packages/backend/migration/1760607435831-RoleBadgesRemoteUsers.js new file mode 100644 index 0000000000..483d35a91b --- /dev/null +++ b/packages/backend/migration/1760607435831-RoleBadgesRemoteUsers.js @@ -0,0 +1,16 @@ +/* + * SPDX-FileCopyrightText: syuilo and misskey-project + * SPDX-License-Identifier: AGPL-3.0-only + */ + +export class RoleBadgesRemoteUsers1760607435831 { + name = 'RoleBadgesRemoteUsers1760607435831' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "meta" ADD "showRoleBadgesOfRemoteUsers" boolean NOT NULL DEFAULT false`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "showRoleBadgesOfRemoteUsers"`); + } +} diff --git a/packages/backend/src/core/entities/UserEntityService.ts b/packages/backend/src/core/entities/UserEntityService.ts index 47021359e1..ac5b855096 100644 --- a/packages/backend/src/core/entities/UserEntityService.ts +++ b/packages/backend/src/core/entities/UserEntityService.ts @@ -512,8 +512,8 @@ export class UserEntityService implements OnModuleInit { } : undefined) : undefined, emojis: this.customEmojiService.populateEmojis(user.emojis, user.host), onlineStatus: this.getOnlineStatus(user), - // パフォーマンス上の理由でローカルユーザーのみ - badgeRoles: user.host == null ? this.roleService.getUserBadgeRoles(user.id).then((rs) => rs + // パフォーマンス上の理由で、明示的に設定しない場合はローカルユーザーのみ取得 + badgeRoles: (this.meta.showRoleBadgesOfRemoteUsers || user.host == null) ? this.roleService.getUserBadgeRoles(user.id).then((rs) => rs .filter((r) => r.isPublic || iAmModerator) .sort((a, b) => b.displayOrder - a.displayOrder) .map((r) => ({ diff --git a/packages/backend/src/models/Meta.ts b/packages/backend/src/models/Meta.ts index f8021a7a84..205c9eeb89 100644 --- a/packages/backend/src/models/Meta.ts +++ b/packages/backend/src/models/Meta.ts @@ -717,6 +717,11 @@ export class MiMeta { }) public remoteNotesCleaningExpiryDaysForEachNotes: number; + @Column('boolean', { + default: false, + }) + public showRoleBadgesOfRemoteUsers: boolean; + @Column('jsonb', { default: { }, }) diff --git a/packages/backend/src/server/api/endpoints/admin/meta.ts b/packages/backend/src/server/api/endpoints/admin/meta.ts index 21099c0a8c..2c7f793584 100644 --- a/packages/backend/src/server/api/endpoints/admin/meta.ts +++ b/packages/backend/src/server/api/endpoints/admin/meta.ts @@ -593,6 +593,10 @@ export const meta = { type: 'number', optional: false, nullable: false, }, + showRoleBadgesOfRemoteUsers: { + type: 'boolean', + optional: false, nullable: false, + }, }, }, } as const; @@ -748,6 +752,7 @@ export default class extends Endpoint { // eslint- enableRemoteNotesCleaning: instance.enableRemoteNotesCleaning, remoteNotesCleaningExpiryDaysForEachNotes: instance.remoteNotesCleaningExpiryDaysForEachNotes, remoteNotesCleaningMaxProcessingDurationInMinutes: instance.remoteNotesCleaningMaxProcessingDurationInMinutes, + showRoleBadgesOfRemoteUsers: instance.showRoleBadgesOfRemoteUsers, }; }); } diff --git a/packages/backend/src/server/api/endpoints/admin/update-meta.ts b/packages/backend/src/server/api/endpoints/admin/update-meta.ts index a1a2a99d6e..b3c2cecc67 100644 --- a/packages/backend/src/server/api/endpoints/admin/update-meta.ts +++ b/packages/backend/src/server/api/endpoints/admin/update-meta.ts @@ -209,6 +209,7 @@ export const paramDef = { enableRemoteNotesCleaning: { type: 'boolean' }, remoteNotesCleaningExpiryDaysForEachNotes: { type: 'number' }, remoteNotesCleaningMaxProcessingDurationInMinutes: { type: 'number' }, + showRoleBadgesOfRemoteUsers: { type: 'boolean' }, }, required: [], } as const; @@ -743,6 +744,10 @@ export default class extends Endpoint { // eslint- set.remoteNotesCleaningMaxProcessingDurationInMinutes = ps.remoteNotesCleaningMaxProcessingDurationInMinutes; } + if (ps.showRoleBadgesOfRemoteUsers !== undefined) { + set.showRoleBadgesOfRemoteUsers = ps.showRoleBadgesOfRemoteUsers; + } + const before = await this.metaService.fetch(true); await this.metaService.update(set); diff --git a/packages/frontend/src/pages/admin/performance.vue b/packages/frontend/src/pages/admin/performance.vue index e3021778e7..c5f3c2d4f0 100644 --- a/packages/frontend/src/pages/admin/performance.vue +++ b/packages/frontend/src/pages/admin/performance.vue @@ -53,6 +53,15 @@ SPDX-License-Identifier: AGPL-3.0-only + +
+ + + + +
+
+ @@ -188,6 +197,7 @@ const enableIdenticonGeneration = ref(meta.enableIdenticonGeneration); const enableChartsForRemoteUser = ref(meta.enableChartsForRemoteUser); const enableStatsForFederatedInstances = ref(meta.enableStatsForFederatedInstances); const enableChartsForFederatedInstances = ref(meta.enableChartsForFederatedInstances); +const showRoleBadgesOfRemoteUsers = ref(meta.showRoleBadgesOfRemoteUsers); function onChange_enableServerMachineStats(value: boolean) { os.apiWithDialog('admin/update-meta', { @@ -229,6 +239,14 @@ function onChange_enableChartsForFederatedInstances(value: boolean) { }); } +function onChange_showRoleBadgesOfRemoteUsers(value: boolean) { + os.apiWithDialog('admin/update-meta', { + showRoleBadgesOfRemoteUsers: value, + }).then(() => { + fetchInstance(true); + }); +} + const fttForm = useForm({ enableFanoutTimeline: meta.enableFanoutTimeline, enableFanoutTimelineDbFallback: meta.enableFanoutTimelineDbFallback, diff --git a/packages/misskey-js/src/autogen/types.ts b/packages/misskey-js/src/autogen/types.ts index 7edd43bf9b..3e95651071 100644 --- a/packages/misskey-js/src/autogen/types.ts +++ b/packages/misskey-js/src/autogen/types.ts @@ -9460,6 +9460,7 @@ export interface operations { enableRemoteNotesCleaning: boolean; remoteNotesCleaningExpiryDaysForEachNotes: number; remoteNotesCleaningMaxProcessingDurationInMinutes: number; + showRoleBadgesOfRemoteUsers: boolean; }; }; }; @@ -12780,6 +12781,7 @@ export interface operations { enableRemoteNotesCleaning?: boolean; remoteNotesCleaningExpiryDaysForEachNotes?: number; remoteNotesCleaningMaxProcessingDurationInMinutes?: number; + showRoleBadgesOfRemoteUsers?: boolean; }; }; };