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 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); 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;