From 03f01b6ffc8216457b62faa535765fc94983d331 Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Sun, 6 Aug 2023 19:48:58 +0900 Subject: [PATCH 1/3] feat(backend): add option to exclude sensitive channel --- packages/backend/src/server/api/endpoints/users/notes.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/backend/src/server/api/endpoints/users/notes.ts b/packages/backend/src/server/api/endpoints/users/notes.ts index f42f84e6a7..29df89390a 100644 --- a/packages/backend/src/server/api/endpoints/users/notes.ts +++ b/packages/backend/src/server/api/endpoints/users/notes.ts @@ -48,6 +48,7 @@ export const paramDef = { type: 'string', } }, excludeNsfw: { type: 'boolean', default: false }, + includeSensitiveChannel: { type: 'boolean', default: true }, }, required: ['userId'], } as const; @@ -79,6 +80,14 @@ export default class extends Endpoint { .leftJoinAndSelect('reply.user', 'replyUser') .leftJoinAndSelect('renote.user', 'renoteUser'); + if (!ps.includeSensitiveChannel) { + query.leftJoinAndSelect('note.channel', 'channel') + .andWhere(new Brackets((qb) => { + qb.where('channel.isSensitive IS NULL') + .orWhere('channel.isSensitive = FALSE'); + })); + } + this.queryService.generateVisibilityQuery(query, me); if (me) { this.queryService.generateMutedUserQuery(query, me, user); From 62b75bb61badf6307437843a0e20b423005f4e2d Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Sun, 6 Aug 2023 19:52:15 +0900 Subject: [PATCH 2/3] feat(frontend): hide or collapse note of sensitive channel --- packages/frontend/src/components/MkNote.vue | 3 ++- packages/frontend/src/components/MkNotes.vue | 3 ++- packages/frontend/src/pages/user/home.vue | 3 ++- packages/frontend/src/pages/user/index.timeline.vue | 4 +++- packages/frontend/src/scripts/collapsed.ts | 5 +++-- 5 files changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/frontend/src/components/MkNote.vue b/packages/frontend/src/components/MkNote.vue index 1c4d2b4c4c..3479bba79e 100644 --- a/packages/frontend/src/components/MkNote.vue +++ b/packages/frontend/src/components/MkNote.vue @@ -175,6 +175,7 @@ import { notePage } from '@/filters/note'; const props = defineProps<{ note: misskey.entities.Note; pinned?: boolean; + collapseSensitiveChannel?: boolean; }>(); const inChannel = inject('inChannel', null); @@ -210,7 +211,7 @@ let appearNote = $computed(() => isRenote ? note.renote as misskey.entities.Note const isMyRenote = $i && ($i.id === note.userId); const showContent = ref(false); const urls = appearNote.text ? extractUrlFromMfm(mfm.parse(appearNote.text)) : null; -const isLong = shouldCollapsed(appearNote); +const isLong = shouldCollapsed(appearNote, props.collapseSensitiveChannel ?? false); const collapsed = ref(appearNote.cw == null && isLong); const isDeleted = ref(false); const muted = ref(checkWordMute(appearNote, $i, defaultStore.state.mutedWords)); diff --git a/packages/frontend/src/components/MkNotes.vue b/packages/frontend/src/components/MkNotes.vue index b49c8fa8b7..788abbdf38 100644 --- a/packages/frontend/src/components/MkNotes.vue +++ b/packages/frontend/src/components/MkNotes.vue @@ -19,7 +19,7 @@ :ad="true" :class="$style.notes" > - + @@ -37,6 +37,7 @@ import { infoImageUrl } from '@/instance'; const props = defineProps<{ pagination: Paging; noGap?: boolean; + collapseSensitiveChannel?: boolean; }>(); const pagingComponent = shallowRef>(); diff --git a/packages/frontend/src/pages/user/home.vue b/packages/frontend/src/pages/user/home.vue index b0d42463a0..9dc2d8ccc3 100644 --- a/packages/frontend/src/pages/user/home.vue +++ b/packages/frontend/src/pages/user/home.vue @@ -125,7 +125,7 @@ - +
@@ -194,6 +194,7 @@ const pagination = { limit: 10, params: computed(() => ({ userId: props.user.id, + includeSensitiveChannel: $i != null, })), }; diff --git a/packages/frontend/src/pages/user/index.timeline.vue b/packages/frontend/src/pages/user/index.timeline.vue index 91c580ce96..3c2c30a277 100644 --- a/packages/frontend/src/pages/user/index.timeline.vue +++ b/packages/frontend/src/pages/user/index.timeline.vue @@ -8,7 +8,7 @@ - + @@ -19,6 +19,7 @@ import * as misskey from 'misskey-js'; import MkNotes from '@/components/MkNotes.vue'; import MkTab from '@/components/MkTab.vue'; import { i18n } from '@/i18n'; +import { $i } from '@/account'; const props = defineProps<{ user: misskey.entities.UserDetailed; @@ -33,6 +34,7 @@ const pagination = { userId: props.user.id, includeReplies: include.value === 'replies' || include.value === 'files', withFiles: include.value === 'files', + includeSensitiveChannel: $i != null, })), }; diff --git a/packages/frontend/src/scripts/collapsed.ts b/packages/frontend/src/scripts/collapsed.ts index 1bf56f233b..59601aa3be 100644 --- a/packages/frontend/src/scripts/collapsed.ts +++ b/packages/frontend/src/scripts/collapsed.ts @@ -2,7 +2,7 @@ import * as mfm from 'mfm-js'; import * as misskey from 'misskey-js'; import { extractUrlFromMfm } from './extract-url-from-mfm'; -export function shouldCollapsed(note: misskey.entities.Note): boolean { +export function shouldCollapsed(note: misskey.entities.Note, collapseSensitiveChannel = false): boolean { const urls = note.text ? extractUrlFromMfm(mfm.parse(note.text)) : null; const collapsed = note.cw == null && note.text != null && ( (note.text.includes('$[x2')) || @@ -12,7 +12,8 @@ export function shouldCollapsed(note: misskey.entities.Note): boolean { (note.text.split('\n').length > 9) || (note.text.length > 500) || (note.files.length >= 5) || - (!!urls && urls.length >= 4) + (!!urls && urls.length >= 4) || + collapseSensitiveChannel ? note.channel?.isSensitive : false ); return collapsed; From c56622aed951bb8ec00aec68770ddd371c1e6965 Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Sun, 6 Aug 2023 19:55:44 +0900 Subject: [PATCH 3/3] =?UTF-8?q?docs(changelog):=20add=20=E3=82=BB=E3=83=B3?= =?UTF-8?q?=E3=82=B7=E3=83=86=E3=82=A3=E3=83=96=E3=83=81=E3=83=A3=E3=83=B3?= =?UTF-8?q?=E3=83=8D=E3=83=AB=E3=81=AENote=E3=81=8C=E3=83=A6=E3=83=BC?= =?UTF-8?q?=E3=82=B6=E3=83=9A=E3=83=BC=E3=82=B8=E3=81=8B=E3=82=89=E9=9D=9E?= =?UTF-8?q?=E8=A1=A8=E7=A4=BA=E3=81=BE=E3=81=9F=E3=81=AF=E3=81=9F=E3=81=9F?= =?UTF-8?q?=E3=81=BE=E3=82=8C=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=AA?= =?UTF-8?q?=E3=82=8A=E3=81=BE=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 04ace07a16..6399ced6ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ ### Client - センシティブチャンネルのNoteのReNoteはデフォルトでHome TLに流れるようになりました +- センシティブチャンネルのNoteがユーザページから非表示またはたたまれるようになりました - Enhance: Renote自体を通報できるように ### Server