feat: media silence (#13842)
* feat: media silence * fix: lint * feat: deny creating custom emoji reaction and using custom emoji from media silenced hosts * chore: メディアサイレンスの説明にカスタム絵文字の話を追加 * Update locales/ja-JP.yml Co-authored-by: Sayamame-beans <61457993+Sayamame-beans@users.noreply.github.com> * chore: update index.d.ts * docs(changelog): update changelog --------- Co-authored-by: Sayamame-beans <61457993+Sayamame-beans@users.noreply.github.com>
This commit is contained in:
		@@ -47,6 +47,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 | 
			
		||||
						<MkButton v-if="suspensionState !== 'none'" :disabled="!instance" @click="resumeDelivery">{{ i18n.ts._delivery.resume }}</MkButton>
 | 
			
		||||
						<MkSwitch v-model="isBlocked" :disabled="!meta || !instance" @update:modelValue="toggleBlock">{{ i18n.ts.blockThisInstance }}</MkSwitch>
 | 
			
		||||
						<MkSwitch v-model="isSilenced" :disabled="!meta || !instance" @update:modelValue="toggleSilenced">{{ i18n.ts.silenceThisInstance }}</MkSwitch>
 | 
			
		||||
						<MkSwitch v-model="isMediaSilenced" :disabled="!meta || !instance" @update:modelValue="toggleMediaSilenced">{{ i18n.ts.mediaSilenceThisInstance }}</MkSwitch>
 | 
			
		||||
						<MkButton @click="refreshMetadata"><i class="ti ti-refresh"></i> Refresh metadata</MkButton>
 | 
			
		||||
						<MkTextarea v-model="moderationNote" manualSave>
 | 
			
		||||
							<template #label>{{ i18n.ts.moderationNote }}</template>
 | 
			
		||||
@@ -167,6 +168,7 @@ const instance = ref<Misskey.entities.FederationInstance | null>(null);
 | 
			
		||||
const suspensionState = ref<'none' | 'manuallySuspended' | 'goneSuspended' | 'autoSuspendedForNotResponding'>('none');
 | 
			
		||||
const isBlocked = ref(false);
 | 
			
		||||
const isSilenced = ref(false);
 | 
			
		||||
const isMediaSilenced = ref(false);
 | 
			
		||||
const faviconUrl = ref<string | null>(null);
 | 
			
		||||
const moderationNote = ref('');
 | 
			
		||||
 | 
			
		||||
@@ -195,8 +197,9 @@ async function fetch(): Promise<void> {
 | 
			
		||||
	suspensionState.value = instance.value?.suspensionState ?? 'none';
 | 
			
		||||
	isBlocked.value = instance.value?.isBlocked ?? false;
 | 
			
		||||
	isSilenced.value = instance.value?.isSilenced ?? false;
 | 
			
		||||
	isMediaSilenced.value = instance.value?.isMediaSilenced ?? false;
 | 
			
		||||
	faviconUrl.value = getProxiedImageUrlNullable(instance.value?.faviconUrl, 'preview') ?? getProxiedImageUrlNullable(instance.value?.iconUrl, 'preview');
 | 
			
		||||
	moderationNote.value = instance.value?.moderationNote;
 | 
			
		||||
	moderationNote.value = instance.value?.moderationNote ?? '';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function toggleBlock(): Promise<void> {
 | 
			
		||||
@@ -218,6 +221,16 @@ async function toggleSilenced(): Promise<void> {
 | 
			
		||||
	});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function toggleMediaSilenced(): Promise<void> {
 | 
			
		||||
	if (!meta.value) throw new Error('No meta?');
 | 
			
		||||
	if (!instance.value) throw new Error('No instance?');
 | 
			
		||||
	const { host } = instance.value;
 | 
			
		||||
	const mediaSilencedHosts = meta.value.mediaSilencedHosts ?? [];
 | 
			
		||||
	await misskeyApi('admin/update-meta', {
 | 
			
		||||
		mediaSilencedHosts: isMediaSilenced.value ? mediaSilencedHosts.concat([host]) : mediaSilencedHosts.filter(x => x !== host),
 | 
			
		||||
	});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function stopDelivery(): Promise<void> {
 | 
			
		||||
	if (!instance.value) throw new Error('No instance?');
 | 
			
		||||
	suspensionState.value = 'manuallySuspended';
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user