replace "Mark instance as NSFW" toggle with an instance-level mandatory CW
This commit is contained in:
parent
604f5a5c68
commit
d62be884b3
24 changed files with 44 additions and 127 deletions
|
|
@ -1,6 +1,18 @@
|
|||
# Upgrade Notes
|
||||
|
||||
## 2025.X.X
|
||||
## 2025.5.2
|
||||
|
||||
### Mark instance as NSFW
|
||||
|
||||
The "Mark instance as NSFW" has been removed in favor of the new "mandatory CW" / "force CW" system.
|
||||
Moderators can now apply any Content Warning of their choice to all notes from an instance by populating the "Force content warning" field on that instance's info page.
|
||||
The new Content Warning applies immediately, is retroactive, and does not federate or "infect" replies in a thread.
|
||||
|
||||
The upgrade will automatically a content warning of "NSFW" for instances that were formerly marked as NSFW, which displays as `[instance name] is flagged: "NSFW"` to users.
|
||||
The `notes` table is also cleaned up to remove any leftover "Instance is marked as NSFW" content warnings from posts.
|
||||
Staff can then remove or modify the new CW as usual.
|
||||
|
||||
## 2025.2.2
|
||||
|
||||
### Authorized Fetch
|
||||
|
||||
|
|
@ -13,6 +25,8 @@ Do not remove it before migration, or else the setting will reset to default (di
|
|||
|
||||
### Hellspawns
|
||||
|
||||
**Note: this workaround is no longer needed on Sharkey version 2025.5.2 and later, as "Mark instance as NSFW" has been completely rewritten.**
|
||||
|
||||
Sharkey versions before 2024.10 suffered from a bug in the "Mark instance as NSFW" feature.
|
||||
When a user from such an instance boosted a note, the boost would be converted to a hellspawn (pure renote with Content Warning).
|
||||
Hellspawns are buggy and do not properly federate, so it may be desirable to correct any that already exist in the database.
|
||||
|
|
|
|||
8
locales/index.d.ts
vendored
8
locales/index.d.ts
vendored
|
|
@ -10964,14 +10964,6 @@ export interface Locale extends ILocale {
|
|||
* Set content warning for instance
|
||||
*/
|
||||
"setMandatoryCWForInstance": string;
|
||||
/**
|
||||
* Set remote instance as NSFW
|
||||
*/
|
||||
"setRemoteInstanceNSFW": string;
|
||||
/**
|
||||
* Unset remote instance as NSFW
|
||||
*/
|
||||
"unsetRemoteInstanceNSFW": string;
|
||||
/**
|
||||
* Rejected reports from remote instance
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -0,0 +1,25 @@
|
|||
/*
|
||||
* SPDX-FileCopyrightText: hazelnoot and other Sharkey contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
export class ReplaceInstanceIsNSFW1751236746539 {
|
||||
name = 'ReplaceInstanceIsNSFW1751236746539'
|
||||
|
||||
async up(queryRunner) {
|
||||
// Data migration
|
||||
await queryRunner.query(`UPDATE "instance" SET "mandatoryCW" = 'NSFW' WHERE "isNSFW" = true`);
|
||||
await queryRunner.query(`UPDATE "note" SET "cw" = null WHERE "cw" = 'Instance is marked as NSFW'`);
|
||||
|
||||
// Schema migration
|
||||
await queryRunner.query(`ALTER TABLE "instance" DROP COLUMN "isNSFW"`);
|
||||
}
|
||||
|
||||
async down(queryRunner) {
|
||||
// Schema migration
|
||||
await queryRunner.query(`ALTER TABLE "instance" ADD "isNSFW" boolean NOT NULL DEFAULT false`);
|
||||
|
||||
// Data migration
|
||||
await queryRunner.query(`UPDATE "instance" SET "isNSFW" = true WHERE "mandatoryCW" ILIKE '%NSFW%'`);
|
||||
}
|
||||
}
|
||||
|
|
@ -414,14 +414,6 @@ export class NoteCreateService implements OnApplicationShutdown {
|
|||
}
|
||||
}
|
||||
|
||||
if (user.host && !data.cw) {
|
||||
await this.federatedInstanceService.fetchOrRegister(user.host).then(async i => {
|
||||
if (i.isNSFW && !this.isPureRenote(data)) {
|
||||
data.cw = 'Instance is marked as NSFW';
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (mentionedUsers.length > 0 && mentionedUsers.length > (await this.roleService.getUserPolicies(user.id)).mentionLimit) {
|
||||
throw new IdentifiableError('9f466dab-c856-48cd-9e65-ff90ff750580', 'Note contains too many mentions');
|
||||
}
|
||||
|
|
|
|||
|
|
@ -443,14 +443,6 @@ export class NoteEditService implements OnApplicationShutdown {
|
|||
}
|
||||
}
|
||||
|
||||
if (user.host && !data.cw) {
|
||||
await this.federatedInstanceService.fetchOrRegister(user.host).then(async i => {
|
||||
if (i.isNSFW && !this.noteCreateService.isPureRenote(data)) {
|
||||
data.cw = 'Instance is marked as NSFW';
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (mentionedUsers.length > 0 && mentionedUsers.length > (await this.roleService.getUserPolicies(user.id)).mentionLimit) {
|
||||
throw new IdentifiableError('9f466dab-c856-48cd-9e65-ff90ff750580', 'Note contains too many mentions');
|
||||
}
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ export class ApImageService {
|
|||
const shouldBeCached = this.meta.cacheRemoteFiles && (this.meta.cacheRemoteSensitiveFiles || !image.sensitive);
|
||||
|
||||
await this.federatedInstanceService.fetchOrRegister(actor.host).then(async i => {
|
||||
if (i.isNSFW) {
|
||||
if (i.isMediaSilenced) {
|
||||
image.sensitive = true;
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -63,7 +63,6 @@ export class InstanceEntityService {
|
|||
themeColor: instance.themeColor,
|
||||
infoUpdatedAt: instance.infoUpdatedAt ? instance.infoUpdatedAt.toISOString() : null,
|
||||
latestRequestReceivedAt: instance.latestRequestReceivedAt ? instance.latestRequestReceivedAt.toISOString() : null,
|
||||
isNSFW: instance.isNSFW,
|
||||
rejectReports: instance.rejectReports,
|
||||
rejectQuotes: instance.rejectQuotes,
|
||||
moderationNote: iAmModerator ? instance.moderationNote : null,
|
||||
|
|
|
|||
|
|
@ -205,11 +205,6 @@ export class MiInstance {
|
|||
})
|
||||
public infoUpdatedAt: Date | null;
|
||||
|
||||
@Column('boolean', {
|
||||
default: false,
|
||||
})
|
||||
public isNSFW: boolean;
|
||||
|
||||
@Column('boolean', {
|
||||
default: false,
|
||||
})
|
||||
|
|
|
|||
|
|
@ -116,11 +116,6 @@ export const packedFederationInstanceSchema = {
|
|||
optional: false, nullable: true,
|
||||
format: 'date-time',
|
||||
},
|
||||
isNSFW: {
|
||||
type: 'boolean',
|
||||
optional: false,
|
||||
nullable: false,
|
||||
},
|
||||
rejectReports: {
|
||||
type: 'boolean',
|
||||
optional: false,
|
||||
|
|
|
|||
|
|
@ -24,7 +24,6 @@ export const paramDef = {
|
|||
properties: {
|
||||
host: { type: 'string' },
|
||||
isSuspended: { type: 'boolean' },
|
||||
isNSFW: { type: 'boolean' },
|
||||
rejectReports: { type: 'boolean' },
|
||||
moderationNote: { type: 'string' },
|
||||
rejectQuotes: { type: 'boolean' },
|
||||
|
|
@ -58,7 +57,6 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
|||
|
||||
await this.federatedInstanceService.update(instance.id, {
|
||||
suspensionState,
|
||||
isNSFW: ps.isNSFW,
|
||||
rejectReports: ps.rejectReports,
|
||||
rejectQuotes: ps.rejectQuotes,
|
||||
moderationNote: ps.moderationNote,
|
||||
|
|
@ -78,14 +76,6 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
|||
}
|
||||
}
|
||||
|
||||
if (ps.isNSFW != null && instance.isNSFW !== ps.isNSFW) {
|
||||
const message = ps.rejectReports ? 'setRemoteInstanceNSFW' : 'unsetRemoteInstanceNSFW';
|
||||
this.moderationLogService.log(me, message, {
|
||||
id: instance.id,
|
||||
host: instance.host,
|
||||
});
|
||||
}
|
||||
|
||||
if (ps.rejectReports != null && instance.rejectReports !== ps.rejectReports) {
|
||||
const message = ps.rejectReports ? 'rejectRemoteInstanceReports' : 'acceptRemoteInstanceReports';
|
||||
this.moderationLogService.log(me, message, {
|
||||
|
|
|
|||
|
|
@ -108,8 +108,6 @@ export const moderationLogTypes = [
|
|||
'setMandatoryCW',
|
||||
'setMandatoryCWForNote',
|
||||
'setMandatoryCWForInstance',
|
||||
'setRemoteInstanceNSFW',
|
||||
'unsetRemoteInstanceNSFW',
|
||||
'suspendRemoteInstance',
|
||||
'unsuspendRemoteInstance',
|
||||
'rejectRemoteInstanceReports',
|
||||
|
|
@ -309,14 +307,6 @@ export type ModerationLogPayloads = {
|
|||
oldCW: string | null;
|
||||
host: string;
|
||||
};
|
||||
setRemoteInstanceNSFW: {
|
||||
id: string;
|
||||
host: string;
|
||||
};
|
||||
unsetRemoteInstanceNSFW: {
|
||||
id: string;
|
||||
host: string;
|
||||
};
|
||||
suspendRemoteInstance: {
|
||||
id: string;
|
||||
host: string;
|
||||
|
|
|
|||
|
|
@ -19,7 +19,6 @@ SPDX-License-Identifier: AGPL-3.0-only
|
|||
<option value="subscribing">{{ i18n.ts.subscribing }}</option>
|
||||
<option value="publishing">{{ i18n.ts.publishing }}</option>
|
||||
<option value="bubble">Bubble</option>
|
||||
<option value="nsfw">NSFW</option>
|
||||
<option v-if="$i" value="suspended">{{ i18n.ts.suspended }}</option>
|
||||
<option v-if="$i" value="silenced">{{ i18n.ts.silence }}</option>
|
||||
<option v-if="$i" value="blocked">{{ i18n.ts.blocked }}</option>
|
||||
|
|
@ -83,18 +82,16 @@ const pagination = {
|
|||
state.value === 'blocked' ? { blocked: true } :
|
||||
state.value === 'silenced' ? { silenced: true } :
|
||||
state.value === 'notResponding' ? { notResponding: true } :
|
||||
state.value === 'nsfw' ? { nsfw: true } :
|
||||
state.value === 'bubble' ? { bubble: true } :
|
||||
{}),
|
||||
})),
|
||||
} as Paging;
|
||||
} satisfies Paging;
|
||||
|
||||
function getStatus(instance) {
|
||||
if (instance.isSuspended) return 'Suspended';
|
||||
if (instance.isBlocked) return 'Blocked';
|
||||
if (instance.isSilenced) return 'Silenced';
|
||||
if (instance.isNotResponding) return 'Error';
|
||||
if (instance.isNSFW) return 'NSFW';
|
||||
return 'Alive';
|
||||
}
|
||||
</script>
|
||||
|
|
|
|||
|
|
@ -19,8 +19,6 @@ SPDX-License-Identifier: AGPL-3.0-only
|
|||
<option value="federating">{{ i18n.ts.federating }}</option>
|
||||
<option value="subscribing">{{ i18n.ts.subscribing }}</option>
|
||||
<option value="publishing">{{ i18n.ts.publishing }}</option>
|
||||
<!-- TODO translate -->
|
||||
<option value="nsfw">NSFW</option>
|
||||
<option value="suspended">{{ i18n.ts.suspended }}</option>
|
||||
<option value="blocked">{{ i18n.ts.blocked }}</option>
|
||||
<option value="silenced">{{ i18n.ts.silence }}</option>
|
||||
|
|
@ -85,7 +83,6 @@ const pagination = {
|
|||
state.value === 'blocked' ? { blocked: true } :
|
||||
state.value === 'silenced' ? { silenced: true } :
|
||||
state.value === 'notResponding' ? { notResponding: true } :
|
||||
state.value === 'nsfw' ? { nsfw: true } :
|
||||
{}),
|
||||
})),
|
||||
};
|
||||
|
|
@ -104,7 +101,6 @@ function getStatus(instance: Misskey.entities.FederationInstance) {
|
|||
if (instance.isBlocked) return 'Blocked';
|
||||
if (instance.isSilenced) return 'Silenced';
|
||||
if (instance.isNotResponding) return 'Error';
|
||||
if (instance.isNSFW) return 'NSFW';
|
||||
return 'Alive';
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -30,8 +30,6 @@ SPDX-License-Identifier: AGPL-3.0-only
|
|||
'setMandatoryCWForNote',
|
||||
'setMandatoryCWForInstance',
|
||||
'suspendRemoteInstance',
|
||||
'setRemoteInstanceNSFW',
|
||||
'unsetRemoteInstanceNSFW',
|
||||
'rejectRemoteInstanceReports',
|
||||
'acceptRemoteInstanceReports',
|
||||
'rejectQuotesUser',
|
||||
|
|
@ -69,7 +67,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
|||
'removeRelay',
|
||||
].includes(log.type)
|
||||
}"
|
||||
>{{ i18n.ts._moderationLogTypes[log.type] }}</b>
|
||||
>{{ i18n.ts._moderationLogTypes[log.type] ?? log.type }}</b>
|
||||
<span v-if="log.type === 'updateUserNote'">: @{{ log.info.userUsername }}{{ log.info.userHost ? '@' + log.info.userHost : '' }}</span>
|
||||
<span v-else-if="log.type === 'suspend'">: @{{ log.info.userUsername }}{{ log.info.userHost ? '@' + log.info.userHost : '' }}</span>
|
||||
<span v-else-if="log.type === 'approve'">: @{{ log.info.userUsername }}{{ log.info.userHost ? '@' + log.info.userHost : '' }}</span>
|
||||
|
|
@ -95,8 +93,6 @@ SPDX-License-Identifier: AGPL-3.0-only
|
|||
<span v-else-if="log.type === 'unmarkSensitiveDriveFile'">: @{{ log.info.fileUserUsername }}{{ log.info.fileUserHost ? '@' + log.info.fileUserHost : '' }}</span>
|
||||
<span v-else-if="log.type === 'suspendRemoteInstance'">: {{ log.info.host }}</span>
|
||||
<span v-else-if="log.type === 'unsuspendRemoteInstance'">: {{ log.info.host }}</span>
|
||||
<span v-else-if="log.type === 'setRemoteInstanceNSFW'">: {{ log.info.host }}</span>
|
||||
<span v-else-if="log.type === 'unsetRemoteInstanceNSFW'">: {{ log.info.host }}</span>
|
||||
<span v-else-if="log.type === 'rejectRemoteInstanceReports'">: {{ log.info.host }}</span>
|
||||
<span v-else-if="log.type === 'acceptRemoteInstanceReports'">: {{ log.info.host }}</span>
|
||||
<span v-else-if="log.type === 'createGlobalAnnouncement'">: {{ log.info.announcement.title }}</span>
|
||||
|
|
|
|||
|
|
@ -118,7 +118,6 @@ SPDX-License-Identifier: AGPL-3.0-only
|
|||
<MkInfo v-if="isBaseBlocked" warn>{{ i18n.ts.blockedByBase }}</MkInfo>
|
||||
<MkSwitch v-model="isBlocked" :disabled="!meta || !instance || isBaseBlocked" @update:modelValue="toggleBlock">{{ i18n.ts.blockThisInstance }}</MkSwitch>
|
||||
<MkSwitch v-model="rejectQuotes" :disabled="!instance" @update:modelValue="toggleRejectQuotes">{{ i18n.ts.rejectQuotesInstance }}</MkSwitch>
|
||||
<MkSwitch v-model="isNSFW" :disabled="!instance" @update:modelValue="toggleNSFW">{{ i18n.ts.markInstanceAsNSFW }}</MkSwitch>
|
||||
<MkSwitch v-model="rejectReports" :disabled="!instance" @update:modelValue="toggleRejectReports">{{ i18n.ts.rejectReports }}</MkSwitch>
|
||||
<MkInfo v-if="isBaseMediaSilenced" warn>{{ i18n.ts.mediaSilencedByBase }}</MkInfo>
|
||||
<MkSwitch v-model="isMediaSilenced" :disabled="!meta || !instance || isBaseMediaSilenced" @update:modelValue="toggleMediaSilenced">{{ i18n.ts.mediaSilenceThisInstance }}</MkSwitch>
|
||||
|
|
@ -259,7 +258,6 @@ const suspensionState = ref<'none' | 'manuallySuspended' | 'goneSuspended' | 'au
|
|||
const isSuspended = ref(false);
|
||||
const isBlocked = ref(false);
|
||||
const isSilenced = ref(false);
|
||||
const isNSFW = ref(false);
|
||||
const rejectQuotes = ref(false);
|
||||
const rejectReports = ref(false);
|
||||
const isMediaSilenced = ref(false);
|
||||
|
|
@ -320,13 +318,6 @@ const badges = computed(() => {
|
|||
style: 'warning',
|
||||
});
|
||||
}
|
||||
if (instance.value.isNSFW) {
|
||||
arr.push({
|
||||
key: 'nsfw',
|
||||
label: i18n.ts.nsfw,
|
||||
style: 'warning',
|
||||
});
|
||||
}
|
||||
if (instance.value.isBubbled) {
|
||||
arr.push({
|
||||
key: 'bubbled',
|
||||
|
|
@ -404,7 +395,6 @@ async function fetch(withHint = false): Promise<void> {
|
|||
isSuspended.value = suspensionState.value !== 'none';
|
||||
isBlocked.value = instance.value?.isBlocked ?? false;
|
||||
isSilenced.value = instance.value?.isSilenced ?? false;
|
||||
isNSFW.value = instance.value?.isNSFW ?? false;
|
||||
rejectReports.value = instance.value?.rejectReports ?? false;
|
||||
rejectQuotes.value = instance.value?.rejectQuotes ?? false;
|
||||
isMediaSilenced.value = instance.value?.isMediaSilenced ?? false;
|
||||
|
|
@ -470,18 +460,6 @@ async function toggleSuspended(): Promise<void> {
|
|||
});
|
||||
}
|
||||
|
||||
async function toggleNSFW(): Promise<void> {
|
||||
if (!iAmModerator) return;
|
||||
await os.promiseDialog(async () => {
|
||||
if (!instance.value) throw new Error('No instance?');
|
||||
await misskeyApi('admin/federation/update-instance', {
|
||||
host: instance.value.host,
|
||||
isNSFW: isNSFW.value,
|
||||
});
|
||||
await fetch();
|
||||
});
|
||||
}
|
||||
|
||||
async function toggleRejectReports(): Promise<void> {
|
||||
if (!iAmModerator) return;
|
||||
await os.promiseDialog(async () => {
|
||||
|
|
|
|||
|
|
@ -2964,12 +2964,6 @@ type ModerationLog = {
|
|||
} | {
|
||||
type: 'setMandatoryCWForInstance';
|
||||
info: ModerationLogPayloads['setMandatoryCWForInstance'];
|
||||
} | {
|
||||
type: 'setRemoteInstanceNSFW';
|
||||
info: ModerationLogPayloads['setRemoteInstanceNSFW'];
|
||||
} | {
|
||||
type: 'unsetRemoteInstanceNSFW';
|
||||
info: ModerationLogPayloads['unsetRemoteInstanceNSFW'];
|
||||
} | {
|
||||
type: 'resetPassword';
|
||||
info: ModerationLogPayloads['resetPassword'];
|
||||
|
|
@ -3111,7 +3105,7 @@ type ModerationLog = {
|
|||
});
|
||||
|
||||
// @public (undocumented)
|
||||
export const moderationLogTypes: readonly ["updateServerSettings", "suspend", "approve", "decline", "unsuspend", "updateUserNote", "addCustomEmoji", "updateCustomEmoji", "deleteCustomEmoji", "assignRole", "unassignRole", "createRole", "updateRole", "deleteRole", "clearQueue", "promoteQueue", "deleteDriveFile", "deleteNote", "createGlobalAnnouncement", "createUserAnnouncement", "updateGlobalAnnouncement", "updateUserAnnouncement", "deleteGlobalAnnouncement", "deleteUserAnnouncement", "resetPassword", "setMandatoryCW", "setMandatoryCWForNote", "setMandatoryCWForInstance", "setRemoteInstanceNSFW", "unsetRemoteInstanceNSFW", "suspendRemoteInstance", "unsuspendRemoteInstance", "rejectRemoteInstanceReports", "acceptRemoteInstanceReports", "updateRemoteInstanceNote", "markSensitiveDriveFile", "unmarkSensitiveDriveFile", "resolveAbuseReport", "forwardAbuseReport", "updateAbuseReportNote", "createInvitation", "createAd", "updateAd", "deleteAd", "createAvatarDecoration", "updateAvatarDecoration", "deleteAvatarDecoration", "unsetUserAvatar", "unsetUserBanner", "createSystemWebhook", "updateSystemWebhook", "deleteSystemWebhook", "createAbuseReportNotificationRecipient", "updateAbuseReportNotificationRecipient", "deleteAbuseReportNotificationRecipient", "deleteAccount", "deletePage", "deleteFlash", "deleteGalleryPost", "deleteChatRoom"];
|
||||
export const moderationLogTypes: readonly ["updateServerSettings", "suspend", "approve", "decline", "unsuspend", "updateUserNote", "addCustomEmoji", "updateCustomEmoji", "deleteCustomEmoji", "assignRole", "unassignRole", "createRole", "updateRole", "deleteRole", "clearQueue", "promoteQueue", "deleteDriveFile", "deleteNote", "createGlobalAnnouncement", "createUserAnnouncement", "updateGlobalAnnouncement", "updateUserAnnouncement", "deleteGlobalAnnouncement", "deleteUserAnnouncement", "resetPassword", "setMandatoryCW", "setMandatoryCWForNote", "setMandatoryCWForInstance", "suspendRemoteInstance", "unsuspendRemoteInstance", "rejectRemoteInstanceReports", "acceptRemoteInstanceReports", "updateRemoteInstanceNote", "markSensitiveDriveFile", "unmarkSensitiveDriveFile", "resolveAbuseReport", "forwardAbuseReport", "updateAbuseReportNote", "createInvitation", "createAd", "updateAd", "deleteAd", "createAvatarDecoration", "updateAvatarDecoration", "deleteAvatarDecoration", "unsetUserAvatar", "unsetUserBanner", "createSystemWebhook", "updateSystemWebhook", "deleteSystemWebhook", "createAbuseReportNotificationRecipient", "updateAbuseReportNotificationRecipient", "deleteAbuseReportNotificationRecipient", "deleteAccount", "deletePage", "deleteFlash", "deleteGalleryPost", "deleteChatRoom"];
|
||||
|
||||
// @public (undocumented)
|
||||
type MuteCreateRequest = operations['mute___create']['requestBody']['content']['application/json'];
|
||||
|
|
|
|||
|
|
@ -5346,7 +5346,6 @@ export type components = {
|
|||
infoUpdatedAt: string | null;
|
||||
/** Format: date-time */
|
||||
latestRequestReceivedAt: string | null;
|
||||
isNSFW: boolean;
|
||||
rejectReports: boolean;
|
||||
rejectQuotes: boolean;
|
||||
moderationNote?: string | null;
|
||||
|
|
@ -8909,7 +8908,6 @@ export type operations = {
|
|||
'application/json': {
|
||||
host: string;
|
||||
isSuspended?: boolean;
|
||||
isNSFW?: boolean;
|
||||
rejectReports?: boolean;
|
||||
moderationNote?: string;
|
||||
rejectQuotes?: boolean;
|
||||
|
|
|
|||
|
|
@ -152,8 +152,6 @@ export const moderationLogTypes = [
|
|||
'setMandatoryCW',
|
||||
'setMandatoryCWForNote',
|
||||
'setMandatoryCWForInstance',
|
||||
'setRemoteInstanceNSFW',
|
||||
'unsetRemoteInstanceNSFW',
|
||||
'suspendRemoteInstance',
|
||||
'unsuspendRemoteInstance',
|
||||
'rejectRemoteInstanceReports',
|
||||
|
|
@ -360,14 +358,6 @@ export type ModerationLogPayloads = {
|
|||
oldCW: string | null;
|
||||
host: string;
|
||||
};
|
||||
setRemoteInstanceNSFW: {
|
||||
id: string;
|
||||
host: string;
|
||||
};
|
||||
unsetRemoteInstanceNSFW: {
|
||||
id: string;
|
||||
host: string;
|
||||
};
|
||||
suspendRemoteInstance: {
|
||||
id: string;
|
||||
host: string;
|
||||
|
|
|
|||
|
|
@ -139,12 +139,6 @@ export type ModerationLog = {
|
|||
} | {
|
||||
type: 'setMandatoryCWForInstance';
|
||||
info: ModerationLogPayloads['setMandatoryCWForInstance'];
|
||||
} | {
|
||||
type: 'setRemoteInstanceNSFW';
|
||||
info: ModerationLogPayloads['setRemoteInstanceNSFW'];
|
||||
} | {
|
||||
type: 'unsetRemoteInstanceNSFW';
|
||||
info: ModerationLogPayloads['unsetRemoteInstanceNSFW'];
|
||||
} | {
|
||||
type: 'resetPassword';
|
||||
info: ModerationLogPayloads['resetPassword'];
|
||||
|
|
|
|||
|
|
@ -221,8 +221,6 @@ _moderationLogTypes:
|
|||
approve: "Genehmigt"
|
||||
decline: "Abgelehnt"
|
||||
setMandatoryCW: "Inhaltswarnung für Benutzer gesetzt"
|
||||
setRemoteInstanceNSFW: "Fremde Instanz als NSFW markiert"
|
||||
unsetRemoteInstanceNSFW: "NSFW-Markierung für fremde Instanz entfernt"
|
||||
rejectRemoteInstanceReports: "Meldungen von fremder Instanz abgelehnt"
|
||||
acceptRemoteInstanceReports: "Meldungen von fremder Instanz akzeptiert"
|
||||
rejectQuotesUser: "Zitate von Benutzer gesperrt/entfernt"
|
||||
|
|
|
|||
|
|
@ -348,8 +348,6 @@ _moderationLogTypes:
|
|||
setMandatoryCW: "Set content warning for user"
|
||||
setMandatoryCWForNote: "Set content warning for note"
|
||||
setMandatoryCWForInstance: "Set content warning for instance"
|
||||
setRemoteInstanceNSFW: "Set remote instance as NSFW"
|
||||
unsetRemoteInstanceNSFW: "Unset remote instance as NSFW"
|
||||
rejectRemoteInstanceReports: "Rejected reports from remote instance"
|
||||
acceptRemoteInstanceReports: "Accepted reports from remote instance"
|
||||
rejectQuotesUser: "Blocked/Stripped quote posts from user"
|
||||
|
|
|
|||
|
|
@ -277,8 +277,6 @@ _abuseReport:
|
|||
webhook: "指定したSystemWebhookに通知を送ります(通報を受けた時と通報を解決した時にそれぞれ発信)"
|
||||
_moderationLogTypes:
|
||||
approve: "承認済み"
|
||||
setRemoteInstanceNSFW: "Set remote instance as NSFW"
|
||||
unsetRemoteInstanceNSFW: "Set remote instance as NSFW"
|
||||
rejectRemoteInstanceReports: "Rejected reports from remote instance"
|
||||
acceptRemoteInstanceReports: "Accepted reports from remote instance"
|
||||
_mfm:
|
||||
|
|
|
|||
|
|
@ -46,8 +46,6 @@ _moderationLogTypes:
|
|||
approve: "ที่ได้รับการอนุมัติ"
|
||||
decline: "ปฏิเสธ"
|
||||
setMandatoryCW: "ตั้งค่าคำเตือนเนื้อหาสำหรับผู้ใช้"
|
||||
setRemoteInstanceNSFW: "ตั้งค่าเซิร์ฟเวอร์ระยะไกลเป็น NSFW"
|
||||
unsetRemoteInstanceNSFW: "ปิดการใช้งานการตั้งค่าเซิร์ฟเวอร์ระยะไกลเป็น NSFW"
|
||||
rejectRemoteInstanceReports: "รายงานถูกปฏิเสธจากเซิร์ฟเวอร์ระยะไกล"
|
||||
acceptRemoteInstanceReports: "รายงานได้รับการยอมรับจากเซิร์ฟเวอร์ระยะไกล"
|
||||
rejectQuotesUser: "โพสต์คำพูดของผู้ใช้ถูกบล็อค/ลบ"
|
||||
|
|
|
|||
|
|
@ -41,8 +41,6 @@ _moderationLogTypes:
|
|||
approve: "Đã chấp thuận"
|
||||
decline: "Từ chối"
|
||||
setMandatoryCW: "Đặt cảnh báo nội dung cho người dùng"
|
||||
setRemoteInstanceNSFW: "Đặt máy chủ từ xa thành NSFW"
|
||||
unsetRemoteInstanceNSFW: "Hủy cài đặt máy chủ từ xa thành NSFW"
|
||||
rejectRemoteInstanceReports: "Báo cáo bị từ chối từ máy chủ từ xa"
|
||||
acceptRemoteInstanceReports: "Đã chấp nhận báo cáo từ máy chủ từ xa"
|
||||
rejectQuotesUser: "Đã chặn/Xóa bài đăng trích dẫn của người dùng"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue