From 9dc4762fe0698c600901770336ac2b6b33f23361 Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Thu, 29 Jan 2026 13:50:37 +0900 Subject: [PATCH] wip --- locales/ja-JP.yml | 6 ++++ 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/settings.vue | 31 +++++++++++++++++++ packages/i18n/src/autogen/locale.ts | 18 +++++++++++ packages/misskey-js/etc/misskey-js.api.md | 2 +- packages/misskey-js/src/autogen/types.ts | 2 ++ 8 files changed, 73 insertions(+), 1 deletion(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 45d2efdf35..4f225378d5 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1778,6 +1778,12 @@ _serverSettings: entrancePageStyle: "エントランスページのスタイル" showTimelineForVisitor: "タイムラインを表示する" showActivitiesForVisitor: "アクティビティを表示する" + features: "機能" + + _spReactions: + enable: "スペシャルリアクションを有効にする" + description1: "通常のリアクションより目立つ「スペシャルリアクション」をノートに送れる機能です。" + description2: "有効にする場合、ロールポリシーで、毎月送ることのできる最大数を設定してください。" _userGeneratedContentsVisibilityForVisitor: all: "全て公開" diff --git a/packages/backend/src/models/Meta.ts b/packages/backend/src/models/Meta.ts index 620853450c..958de62c74 100644 --- a/packages/backend/src/models/Meta.ts +++ b/packages/backend/src/models/Meta.ts @@ -722,6 +722,11 @@ export class MiMeta { }) public showRoleBadgesOfRemoteUsers: boolean; + @Column('boolean', { + default: false, + }) + public enableSpReaction: 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 5beed3a7e8..f7a223ea5a 100644 --- a/packages/backend/src/server/api/endpoints/admin/meta.ts +++ b/packages/backend/src/server/api/endpoints/admin/meta.ts @@ -596,6 +596,10 @@ export const meta = { type: 'boolean', optional: false, nullable: false, }, + enableSpReaction: { + type: 'boolean', + optional: false, nullable: false, + }, }, }, } as const; @@ -752,6 +756,7 @@ export default class extends Endpoint { // eslint- remoteNotesCleaningExpiryDaysForEachNotes: instance.remoteNotesCleaningExpiryDaysForEachNotes, remoteNotesCleaningMaxProcessingDurationInMinutes: instance.remoteNotesCleaningMaxProcessingDurationInMinutes, showRoleBadgesOfRemoteUsers: instance.showRoleBadgesOfRemoteUsers, + enableSpReaction: instance.enableSpReaction, }; }); } 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 7a8dfc4555..3878832b26 100644 --- a/packages/backend/src/server/api/endpoints/admin/update-meta.ts +++ b/packages/backend/src/server/api/endpoints/admin/update-meta.ts @@ -218,6 +218,7 @@ export const paramDef = { remoteNotesCleaningExpiryDaysForEachNotes: { type: 'number' }, remoteNotesCleaningMaxProcessingDurationInMinutes: { type: 'number' }, showRoleBadgesOfRemoteUsers: { type: 'boolean' }, + enableSpReaction: { type: 'boolean' }, }, required: [], } as const; @@ -762,6 +763,10 @@ export default class extends Endpoint { // eslint- set.showRoleBadgesOfRemoteUsers = ps.showRoleBadgesOfRemoteUsers; } + if (ps.enableSpReaction !== undefined) { + set.enableSpReaction = ps.enableSpReaction; + } + const before = await this.metaService.fetch(true); await this.metaService.update(set); diff --git a/packages/frontend/src/pages/admin/settings.vue b/packages/frontend/src/pages/admin/settings.vue index 99d4455939..3d85059226 100644 --- a/packages/frontend/src/pages/admin/settings.vue +++ b/packages/frontend/src/pages/admin/settings.vue @@ -96,6 +96,28 @@ SPDX-License-Identifier: AGPL-3.0-only + + + + + + +
+ + + + + + +
+
+
+ @@ -426,6 +448,15 @@ const infoForm = useForm({ fetchInstance(true); }); +const featuresForm = useForm({ + enableSpReaction: meta.enableSpReaction, +}, async (state) => { + await os.apiWithDialog('admin/update-meta', { + enableSpReaction: state.enableSpReaction, + }); + fetchInstance(true); +}); + const pinnedUsersForm = useForm({ pinnedUsers: meta.pinnedUsers.join('\n'), }, async (state) => { diff --git a/packages/i18n/src/autogen/locale.ts b/packages/i18n/src/autogen/locale.ts index f814f3ecc2..d54f4f2f57 100644 --- a/packages/i18n/src/autogen/locale.ts +++ b/packages/i18n/src/autogen/locale.ts @@ -6972,6 +6972,24 @@ export interface Locale extends ILocale { * アクティビティを表示する */ "showActivitiesForVisitor": string; + /** + * 機能 + */ + "features": string; + "_spReactions": { + /** + * スペシャルリアクションを有効にする + */ + "enable": string; + /** + * 通常のリアクションより目立つ「スペシャルリアクション」をノートに送れる機能です。 + */ + "description1": string; + /** + * 有効にする場合、ロールポリシーで、毎月送ることのできる最大数を設定してください。 + */ + "description2": string; + }; "_userGeneratedContentsVisibilityForVisitor": { /** * 全て公開 diff --git a/packages/misskey-js/etc/misskey-js.api.md b/packages/misskey-js/etc/misskey-js.api.md index b84fdc7e31..5dbaf338eb 100644 --- a/packages/misskey-js/etc/misskey-js.api.md +++ b/packages/misskey-js/etc/misskey-js.api.md @@ -3466,7 +3466,7 @@ type RoleLite = components['schemas']['RoleLite']; type RolePolicies = components['schemas']['RolePolicies']; // @public (undocumented) -export const rolePolicies: readonly ["gtlAvailable", "ltlAvailable", "canPublicNote", "mentionLimit", "canInvite", "inviteLimit", "inviteLimitCycle", "inviteExpirationTime", "canManageCustomEmojis", "canManageAvatarDecorations", "canSearchNotes", "canSearchUsers", "canUseTranslator", "canHideAds", "driveCapacityMb", "maxFileSizeMb", "alwaysMarkNsfw", "canUpdateBioMedia", "pinLimit", "antennaLimit", "wordMuteLimit", "webhookLimit", "clipLimit", "noteEachClipsLimit", "userListLimit", "userEachUserListsLimit", "rateLimitFactor", "avatarDecorationLimit", "canImportAntennas", "canImportBlocking", "canImportFollowing", "canImportMuting", "canImportUserLists", "chatAvailability", "uploadableFileTypes", "noteDraftLimit", "scheduledNoteLimit", "watermarkAvailable"]; +export const rolePolicies: readonly ["gtlAvailable", "ltlAvailable", "canPublicNote", "mentionLimit", "canInvite", "inviteLimit", "inviteLimitCycle", "inviteExpirationTime", "canManageCustomEmojis", "canManageAvatarDecorations", "canSearchNotes", "canSearchUsers", "canUseTranslator", "canHideAds", "driveCapacityMb", "maxFileSizeMb", "alwaysMarkNsfw", "canUpdateBioMedia", "pinLimit", "antennaLimit", "wordMuteLimit", "webhookLimit", "clipLimit", "noteEachClipsLimit", "userListLimit", "userEachUserListsLimit", "rateLimitFactor", "avatarDecorationLimit", "canImportAntennas", "canImportBlocking", "canImportFollowing", "canImportMuting", "canImportUserLists", "chatAvailability", "uploadableFileTypes", "noteDraftLimit", "scheduledNoteLimit", "watermarkAvailable", "spReactionsMonthlyLimit"]; // @public (undocumented) type RolesListResponse = operations['roles___list']['responses']['200']['content']['application/json']; diff --git a/packages/misskey-js/src/autogen/types.ts b/packages/misskey-js/src/autogen/types.ts index 3aecc765d9..2a64801894 100644 --- a/packages/misskey-js/src/autogen/types.ts +++ b/packages/misskey-js/src/autogen/types.ts @@ -9520,6 +9520,7 @@ export interface operations { remoteNotesCleaningExpiryDaysForEachNotes: number; remoteNotesCleaningMaxProcessingDurationInMinutes: number; showRoleBadgesOfRemoteUsers: boolean; + enableSpReaction: boolean; }; }; }; @@ -12846,6 +12847,7 @@ export interface operations { remoteNotesCleaningExpiryDaysForEachNotes?: number; remoteNotesCleaningMaxProcessingDurationInMinutes?: number; showRoleBadgesOfRemoteUsers?: boolean; + enableSpReaction?: boolean; }; }; };