Skip to content

Commit

Permalink
feat: 사용자 메뉴에서 원격 서버를 관리할 수 있음 (#502)
Browse files Browse the repository at this point in the history
  - 서버 차단, 서버 사일런스, 서버 미디어 사일런스
  • Loading branch information
noridev committed Oct 1, 2024
1 parent fd3d281 commit 61bfadc
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 2 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG_CHERRYPICK.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ Misskey의 전체 변경 사항을 확인하려면, [CHANGELOG.md#2024xx](CHANGE
- Feat: 내용이 긴 노트의 간략화 여부를 선택할 수 있음 (kokonect-link/cherrypick#495)
- Feat: 답글로 작성된 노트를 간략화하여 표시할 수 있음 (kokonect-link/cherrypick#495)
- 리액션한 노트는 옵션 활성화 유무와 상관없이 항상 표시됩니다.
- Feat: 사용자 메뉴에서 원격 서버를 관리할 수 있음 (kokonect-link/cherrypick#502)
- 서버 차단, 서버 사일런스, 서버 미디어 사일런스
- Enhance: CherryPick 업데이트 페이지를 제어판 목록에 추가함
- Enhance: Webhook 추가 버튼을 헤더로 이동해 디자인 개선
- Enhance: 노트 번역 영역에서도 이모지를 눌러 이모지 메뉴를 열 수 있음
Expand Down
75 changes: 73 additions & 2 deletions packages/frontend/src/scripts/get-user-menu.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import { copyToClipboard } from '@/scripts/copy-to-clipboard.js';
import * as os from '@/os.js';
import { misskeyApi } from '@/scripts/misskey-api.js';
import { defaultStore, userActions } from '@/store.js';
import { $i, iAmModerator } from '@/account.js';
import { $i, iAmAdmin, iAmModerator } from '@/account.js';
import { notesSearchAvailable, canSearchNonLocalNotes } from '@/scripts/check-permissions.js';
import { IRouter } from '@/nirax.js';
import { antennasCache, rolesCache, userListsCache } from '@/cache.js';
Expand Down Expand Up @@ -49,6 +49,41 @@ export function getUserMenu(user: Misskey.entities.UserDetailed, router: IRouter
});
}

const meta = ref<Misskey.entities.AdminMetaResponse | null>(null);
const instance = ref<Misskey.entities.FederationInstance | null>(null);

async function toggleInstanceBlock(): Promise<void> {
if (!iAmAdmin) return;
if (!meta.value) throw new Error('No meta?');
if (!instance.value) throw new Error('No instance?');
const { instanceHost } = instance.value;
await misskeyApi('admin/update-meta', {
blockedHosts: isBlocked.value ? meta.value.blockedHosts.concat([instanceHost]) : meta.value.blockedHosts.filter(x => x !== instanceHost),
});
}

async function toggleInstanceSilenced(): Promise<void> {
if (!iAmAdmin) return;
if (!meta.value) throw new Error('No meta?');
if (!instance.value) throw new Error('No instance?');
const { instanceHost } = instance.value;
const silencedHosts = meta.value.silencedHosts ?? [];
await misskeyApi('admin/update-meta', {
silencedHosts: isSilenced.value ? silencedHosts.concat([instanceHost]) : silencedHosts.filter(x => x !== instanceHost),
});
}

async function toggleInstanceMediaSilenced(): Promise<void> {
if (!iAmAdmin) return;
if (!meta.value) throw new Error('No meta?');
if (!instance.value) throw new Error('No instance?');
const { instanceHost } = instance.value;
const mediaSilencedHosts = meta.value.mediaSilencedHosts ?? [];
await misskeyApi('admin/update-meta', {
mediaSilencedHosts: isMediaSilenced.value ? mediaSilencedHosts.concat([instanceHost]) : mediaSilencedHosts.filter(x => x !== instanceHost),
});
}

async function toggleMute() {
if (user.isMuted) {
os.apiWithDialog('mute/delete', {
Expand Down Expand Up @@ -425,7 +460,43 @@ export function getUserMenu(user: Misskey.entities.UserDetailed, router: IRouter
});
//}

menuItems.push({ type: 'divider' }, {
menuItems.push({ type: 'divider' });

const isInstanceBlocked = ref(instance.value?.isBlocked ?? false);
const isInstanceSilenced = ref(instance.value?.isSilenced ?? false);
const isInstanceMediaSilenced = ref(instance.value?.isMediaSilenced ?? false);

if (iAmAdmin && (meta.value || instance.value)) {
menuItems.push({
type: 'parent',
icon: 'ti ti-server-cog',
text: i18n.ts.instances,
children: async () => {
const federationChildMenu = [] as MenuItem[];

federationChildMenu.push({
type: 'switch',
text: i18n.ts.blockThisInstance,
ref: isInstanceBlocked,
action: toggleInstanceBlock,
}, {
type: 'switch',
text: i18n.ts.silenceThisInstance,
ref: isInstanceSilenced,
action: toggleInstanceSilenced,
}, {
type: 'switch',
text: i18n.ts.mediaSilenceThisInstance,
ref: isInstanceMediaSilenced,
action: toggleInstanceMediaSilenced,
});

return federationChildMenu;
},
});
}

menuItems.push({
icon: user.isMuted ? 'ti ti-eye' : 'ti ti-eye-off',
text: user.isMuted ? i18n.ts.unmute : i18n.ts.mute,
action: toggleMute,
Expand Down

0 comments on commit 61bfadc

Please sign in to comment.