enhance: リモートユーザーのロールバッジを表示するかどうかをサーバー管理者が設定できるように (#16661)

* enhance: リモートユーザーのロールバッジを表示するかどうかをサーバー管理者が設定できるように

* Update Changelog

* build misskey-js with types
This commit is contained in:
かっこかり 2025-10-16 22:45:37 +09:00 committed by GitHub
parent b6bf3cfcb7
commit 29892d2a01
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 60 additions and 2 deletions

View File

@ -1,6 +1,8 @@
## 2025.10.1
### General
- Enhance: リモートユーザーのロールバッジを表示できるように(オプトイン)
パフォーマンス上の問題からデフォルトで無効化されています。「コントロールパネル > パフォーマンス」から有効化できます。
- 依存関係の更新
### Client

4
locales/index.d.ts vendored
View File

@ -4706,6 +4706,10 @@ export interface Locale extends ILocale {
* Identicon生成を有効にする
*/
"enableIdenticonGeneration": string;
/**
*
*/
"showRoleBadgesOfRemoteUsers": string;
/**
*
*/

View File

@ -1172,6 +1172,7 @@ installed: "インストール済み"
branding: "ブランディング"
enableServerMachineStats: "サーバーのマシン情報を公開する"
enableIdenticonGeneration: "ユーザーごとのIdenticon生成を有効にする"
showRoleBadgesOfRemoteUsers: "リモートユーザーのロールバッジを表示する"
turnOffToImprovePerformance: "オフにするとパフォーマンスが向上します。"
createInviteCode: "招待コードを作成"
createWithOptions: "オプションを指定して作成"

View File

@ -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"`);
}
}

View File

@ -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) => ({

View File

@ -717,6 +717,11 @@ export class MiMeta {
})
public remoteNotesCleaningExpiryDaysForEachNotes: number;
@Column('boolean', {
default: false,
})
public showRoleBadgesOfRemoteUsers: boolean;
@Column('jsonb', {
default: { },
})

View File

@ -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<typeof meta, typeof paramDef> { // eslint-
enableRemoteNotesCleaning: instance.enableRemoteNotesCleaning,
remoteNotesCleaningExpiryDaysForEachNotes: instance.remoteNotesCleaningExpiryDaysForEachNotes,
remoteNotesCleaningMaxProcessingDurationInMinutes: instance.remoteNotesCleaningMaxProcessingDurationInMinutes,
showRoleBadgesOfRemoteUsers: instance.showRoleBadgesOfRemoteUsers,
};
});
}

View File

@ -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<typeof meta, typeof paramDef> { // 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);

View File

@ -53,6 +53,15 @@ SPDX-License-Identifier: AGPL-3.0-only
</div>
</SearchMarker>
<SearchMarker>
<div class="_panel" style="padding: 16px;">
<MkSwitch v-model="showRoleBadgesOfRemoteUsers" @change="onChange_showRoleBadgesOfRemoteUsers">
<template #label><SearchLabel>{{ i18n.ts.showRoleBadgesOfRemoteUsers }}</SearchLabel></template>
<template #caption>{{ i18n.ts.turnOffToImprovePerformance }}</template>
</MkSwitch>
</div>
</SearchMarker>
<SearchMarker>
<MkFolder :defaultOpen="true">
<template #icon><SearchIcon><i class="ti ti-bolt"></i></SearchIcon></template>
@ -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,

View File

@ -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;
};
};
};