From 21ab8e75ee19a4f70f5a91d8613e1b1c873cc251 Mon Sep 17 00:00:00 2001 From: Johann150 Date: Tue, 30 May 2023 17:53:50 +0200 Subject: [PATCH 01/10] activitypub: improve JSON-LD context Added @type values for most definitions, and made name and value only scoped to the PropertyValue type. (Blame Volpeon) --- .../src/remote/activitypub/renderer/index.ts | 53 ++++++++++++++----- 1 file changed, 41 insertions(+), 12 deletions(-) diff --git a/packages/backend/src/remote/activitypub/renderer/index.ts b/packages/backend/src/remote/activitypub/renderer/index.ts index b66f766a2..5c6679181 100644 --- a/packages/backend/src/remote/activitypub/renderer/index.ts +++ b/packages/backend/src/remote/activitypub/renderer/index.ts @@ -17,27 +17,56 @@ export const renderActivity = (x: any): IActivity | null => { 'https://www.w3.org/ns/activitystreams', 'https://w3id.org/security/v1', { + xsd: 'http://www.w3.org/2001/XMLSchema#', // as non-standards - manuallyApprovesFollowers: 'as:manuallyApprovesFollowers', - sensitive: 'as:sensitive', + manuallyApprovesFollowers: { + '@id': 'as:manuallyApprovesFollowers', + '@type': 'xsd:boolean', + }, + sensitive: { + '@id': 'as:sensitive', + '@type': 'xsd:boolean', + }, Hashtag: 'as:Hashtag', // Mastodon toot: 'http://joinmastodon.org/ns#', Emoji: 'toot:Emoji', - featured: 'toot:featured', - discoverable: 'toot:discoverable', + featured: { + '@id': 'toot:featured', + '@type': '@id', + }, + discoverable: { + '@id': 'toot:discoverable', + '@type': 'xsd:boolean', + }, // Fedibird - fedibird: 'http://fedibird.com/ns#', - quoteUri: 'fedibird:quoteUri', + quoteUri: { + '@id': 'http://fedibird.com/ns#quoteUri', + '@type': '@id', + }, // schema - schema: 'http://schema.org#', - PropertyValue: 'schema:PropertyValue', - value: 'schema:value', + schema: 'http://schema.org/', + PropertyValue: { + '@id': 'schema:PropertyValue', + '@context': { + 'value': 'schema:value', + 'name': 'schema:name', + }, + }, // Misskey misskey: 'https://misskey-hub.net/ns#', - '_misskey_quote': 'misskey:_misskey_quote', - '_misskey_talk': 'misskey:_misskey_talk', - 'isCat': 'misskey:isCat', + '_misskey_quote': { + '@id': 'misskey:_misskey_quote', + '@type': '@id', + }, + '_misskey_talk': { + '@id': 'misskey:_misskey_talk', + '@type': 'xsd:boolean', + }, + 'isCat': { + '@id': 'misskey:isCat', + '@type': 'xsd:boolean', + }, // vcard vcard: 'http://www.w3.org/2006/vcard/ns#', }, From f00b3cc378546b1e32613378ae47220a4e9690b2 Mon Sep 17 00:00:00 2001 From: Johann150 Date: Tue, 30 May 2023 19:53:17 +0200 Subject: [PATCH 02/10] add missing import for emoji parsing --- packages/backend/src/remote/activitypub/models/tag.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/backend/src/remote/activitypub/models/tag.ts b/packages/backend/src/remote/activitypub/models/tag.ts index 00322bfd2..5d81be83b 100644 --- a/packages/backend/src/remote/activitypub/models/tag.ts +++ b/packages/backend/src/remote/activitypub/models/tag.ts @@ -4,6 +4,7 @@ import { toPuny } from '@/misc/convert-host.js'; import { Emojis } from '@/models/index.js'; import { Emoji } from '@/models/entities/emoji.js'; import { apLogger } from '@/remote/activitypub/logger.js'; +import { genId } from '@/misc/gen-id.js'; export function extractApHashtags(tags: IObject | IObject[] | null | undefined): string[] { if (tags == null) return []; From bed82861758c23868f0494b3b48e7a27609bcdab Mon Sep 17 00:00:00 2001 From: Johann150 Date: Tue, 30 May 2023 20:25:55 +0200 Subject: [PATCH 03/10] fix missing variable in processContent --- packages/backend/src/remote/activitypub/models/note.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/remote/activitypub/models/note.ts b/packages/backend/src/remote/activitypub/models/note.ts index 70123bb4d..c7e7362cb 100644 --- a/packages/backend/src/remote/activitypub/models/note.ts +++ b/packages/backend/src/remote/activitypub/models/note.ts @@ -62,7 +62,7 @@ export function validateNote(object: IObject): Error | null { /** * Function to process the content of a note, reusable in createNote and updateNote. */ -async function processContent(note: IPost, quoteUri: string | null): +async function processContent(actor: IRemoteUser, note: IPost, quoteUri: string | null): Promise<{ cw: string | null, files: DriveFile[], @@ -258,7 +258,7 @@ export async function createNote(value: string | IObject, resolver: Resolver, si const poll = await extractPollFromQuestion(note, resolver).catch(() => undefined); - const processedContent = await processContent(note, quote?.uri); + const processedContent = await processContent(actor, note, quote?.uri); if (isTalk) { for (const recipient of visibleUsers) { From 7c9e118ff1138592b4af99cffa70102887ad589f Mon Sep 17 00:00:00 2001 From: Johann150 Date: Tue, 30 May 2023 20:40:25 +0200 Subject: [PATCH 04/10] refactor checkExpired to use Promise.all --- .../queue/processors/system/check-expired.ts | 79 +++++++++---------- 1 file changed, 38 insertions(+), 41 deletions(-) diff --git a/packages/backend/src/queue/processors/system/check-expired.ts b/packages/backend/src/queue/processors/system/check-expired.ts index 71bd498e9..98adcf355 100644 --- a/packages/backend/src/queue/processors/system/check-expired.ts +++ b/packages/backend/src/queue/processors/system/check-expired.ts @@ -10,52 +10,49 @@ const logger = queueLogger.createSubLogger('check-expired'); export async function checkExpired(job: Bull.Job>, done: any): Promise { logger.info('Checking expired data...'); - const expiredMutings = await Mutings.createQueryBuilder('muting') - .where('muting.expiresAt IS NOT NULL') - .andWhere('muting.expiresAt < :now', { now: new Date() }) - .innerJoinAndSelect('muting.mutee', 'mutee') - .getMany(); - - if (expiredMutings.length > 0) { - await Mutings.delete({ - id: In(expiredMutings.map(m => m.id)), - }); - - for (const m of expiredMutings) { - publishUserEvent(m.muterId, 'unmute', m.mutee!); - } - } - const OlderThan = (millis: number) => { return LessThan(new Date(new Date().getTime() - millis)); }; - await Signins.delete({ - createdAt: OlderThan(2 * MONTH), - }); + await Promise.all([ + Mutings.createQueryBuilder('muting') + .where('muting.expiresAt IS NOT NULL') + .andWhere('muting.expiresAt < :now', { now: new Date() }) + .innerJoinAndSelect('muting.mutee', 'mutee') + .getMany() + .then(async (expiredMutings) => { + if (expiredMutings.length > 0) { + await Mutings.delete({ + id: In(expiredMutings.map(m => m.id)), + }); - await AttestationChallenges.delete({ - createdAt: OlderThan(5 * MINUTE), - }); - - await PasswordResetRequests.delete({ - // this timing should be the same as in @/server/api/endpoints/reset-password.ts - createdAt: OlderThan(30 * MINUTE), - }); - - await AuthSessions.delete({ - createdAt: OlderThan(15 * MINUTE), - }); - - await Notifications.delete({ - isRead: true, - createdAt: OlderThan(3 * MONTH), - }); - - await Users.delete({ - // delete users where the deletion status reference count has come down to zero - isDeleted: 0, - }); + for (const m of expiredMutings) { + publishUserEvent(m.muterId, 'unmute', m.mutee!); + } + } + }), + Signins.delete({ + createdAt: OlderThan(2 * MONTH), + }), + AttestationChallenges.delete({ + createdAt: OlderThan(5 * MINUTE), + }), + PasswordResetRequests.delete({ + // this timing should be the same as in @/server/api/endpoints/reset-password.ts + createdAt: OlderThan(30 * MINUTE), + }), + AuthSessions.delete({ + createdAt: OlderThan(15 * MINUTE), + }), + Notifications.delete({ + isRead: true, + createdAt: OlderThan(3 * MONTH), + }), + Users.delete({ + // delete users where the deletion status reference count has come down to zero + isDeleted: 0, + }), + ]); logger.succ('Deleted expired data.'); From 7272bde464032baaf450263b32733b0f0251aa5d Mon Sep 17 00:00:00 2001 From: Johann150 Date: Tue, 30 May 2023 20:58:18 +0200 Subject: [PATCH 05/10] fix more variable issues in processContent --- packages/backend/src/remote/activitypub/models/note.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/backend/src/remote/activitypub/models/note.ts b/packages/backend/src/remote/activitypub/models/note.ts index c7e7362cb..687582d20 100644 --- a/packages/backend/src/remote/activitypub/models/note.ts +++ b/packages/backend/src/remote/activitypub/models/note.ts @@ -62,7 +62,7 @@ export function validateNote(object: IObject): Error | null { /** * Function to process the content of a note, reusable in createNote and updateNote. */ -async function processContent(actor: IRemoteUser, note: IPost, quoteUri: string | null): +async function processContent(actor: IRemoteUser, note: IPost, quoteUri: string | null, resolver: Resolver): Promise<{ cw: string | null, files: DriveFile[], @@ -78,10 +78,10 @@ async function processContent(actor: IRemoteUser, note: IPost, quoteUri: string const limit = promiseLimit(2); const attachments = toArray(note.attachment); - const files = note.attachment + const files = attachments // If the note is marked as sensitive, the images should be marked sensitive too. .map(attach => attach.sensitive |= note.sensitive) - ? (await Promise.all(note.attachment.map(x => limit(() => resolveImage(actor, x, resolver)) as Promise))) + ? (await Promise.all(attachments.map(x => limit(() => resolveImage(actor, x, resolver)) as Promise))) .filter(image => image != null) : []; @@ -258,7 +258,7 @@ export async function createNote(value: string | IObject, resolver: Resolver, si const poll = await extractPollFromQuestion(note, resolver).catch(() => undefined); - const processedContent = await processContent(actor, note, quote?.uri); + const processedContent = await processContent(actor, note, quote?.uri, resolver); if (isTalk) { for (const recipient of visibleUsers) { From 64c4973ecaad1a55f0caaafc5a724542ee631494 Mon Sep 17 00:00:00 2001 From: Johann150 Date: Tue, 30 May 2023 21:14:42 +0200 Subject: [PATCH 06/10] fixup: removing default exports This is a fixup for commit 410c519953d662e51806d4111bc71914511bc3d5. --- packages/backend/test/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend/test/utils.ts b/packages/backend/test/utils.ts index 59a62452c..64a3b8b8b 100644 --- a/packages/backend/test/utils.ts +++ b/packages/backend/test/utils.ts @@ -10,7 +10,7 @@ import * as foundkey from 'foundkey-js'; import fetch from 'node-fetch'; import FormData from 'form-data'; import { DataSource } from 'typeorm'; -import loadConfig from '../src/config/load.js'; +import { loadConfig } from '../src/config/load.js'; import { entities } from '../src/db/postgre.js'; import got from 'got'; From 0addcddd6c7396679e6d791131bd5cb7de591bcd Mon Sep 17 00:00:00 2001 From: Johann150 Date: Wed, 31 May 2023 11:39:50 +0200 Subject: [PATCH 07/10] server: respect log level environment variable --- packages/backend/src/services/logger.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/backend/src/services/logger.ts b/packages/backend/src/services/logger.ts index 67fb8407c..966e2b2a7 100644 --- a/packages/backend/src/services/logger.ts +++ b/packages/backend/src/services/logger.ts @@ -31,13 +31,13 @@ export default class Logger { * @param color Log message color * @param store Whether to store messages */ - constructor(domain: string, color?: KEYWORD, store = true, minLevel: Level = LOG_LEVELS.info) { + constructor(domain: string, color?: KEYWORD, store = true, minLevel?: Level) { this.domain = { name: domain, color, }; this.store = store; - this.minLevel = minLevel; + this.minLevel = minLevel ?? envOption.logLevel; } /** @@ -47,7 +47,7 @@ export default class Logger { * @param store Whether to store messages * @returns A Logger instance whose parent logger is this instance. */ - public createSubLogger(domain: string, color?: KEYWORD, store = true, minLevel: Level = LOG_LEVELS.info): Logger { + public createSubLogger(domain: string, color?: KEYWORD, store = true, minLevel?: Level): Logger { const logger = new Logger(domain, color, store, minLevel); logger.parentLogger = this; return logger; From 94cd10365d469f7670c656b094fa829273822b9a Mon Sep 17 00:00:00 2001 From: Johann150 Date: Wed, 31 May 2023 12:31:57 +0200 Subject: [PATCH 08/10] Revert "try to fix tests" This reverts commit c53486a47c2f0e48b2a5e2ca7b4f1d5f18396411. --- packages/backend/test/api.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend/test/api.ts b/packages/backend/test/api.ts index 222c8d4d4..ae46ae92d 100644 --- a/packages/backend/test/api.ts +++ b/packages/backend/test/api.ts @@ -10,7 +10,7 @@ describe('API', () => { let bob: any; let carol: any; - before(async function() { + before(async () => { this.timeout(0); p = await startServer(); alice = await signup({ username: 'alice' }); From af003fc0fef40e1c2506e9816f02a0d8cca1cbf8 Mon Sep 17 00:00:00 2001 From: Johann150 Date: Wed, 31 May 2023 12:42:13 +0200 Subject: [PATCH 09/10] try to fix test timeout (again) --- packages/backend/test/api-visibility.ts | 5 +++-- packages/backend/test/api.ts | 5 +++-- packages/backend/test/block.ts | 6 +++--- packages/backend/test/fetch-resource.ts | 5 +++-- packages/backend/test/ff-visibility.ts | 6 +++--- packages/backend/test/mute.ts | 6 +++--- packages/backend/test/note.ts | 6 +++--- packages/backend/test/services/blocking.ts | 6 +++--- packages/backend/test/streaming.ts | 16 ++++++++-------- packages/backend/test/thread-mute.ts | 6 +++--- packages/backend/test/user-notes.ts | 6 +++--- 11 files changed, 38 insertions(+), 35 deletions(-) diff --git a/packages/backend/test/api-visibility.ts b/packages/backend/test/api-visibility.ts index 6f1d51a67..18da1d0c9 100644 --- a/packages/backend/test/api-visibility.ts +++ b/packages/backend/test/api-visibility.ts @@ -4,11 +4,12 @@ import * as assert from 'assert'; import * as childProcess from 'child_process'; import { async, signup, request, post, startServer, shutdownServer } from './utils.js'; -describe('API visibility', () => { +describe('API visibility', function() { + this.timeout(20*60*1000); + let p: childProcess.ChildProcess; before(async () => { - this.timeout(0); p = await startServer(); }); diff --git a/packages/backend/test/api.ts b/packages/backend/test/api.ts index ae46ae92d..8bcef2ea2 100644 --- a/packages/backend/test/api.ts +++ b/packages/backend/test/api.ts @@ -4,14 +4,15 @@ import * as assert from 'assert'; import * as childProcess from 'child_process'; import { async, signup, request, post, react, uploadFile, startServer, shutdownServer } from './utils.js'; -describe('API', () => { +describe('API', function() { + this.timeout(20*60*1000); + let p: childProcess.ChildProcess; let alice: any; let bob: any; let carol: any; before(async () => { - this.timeout(0); p = await startServer(); alice = await signup({ username: 'alice' }); bob = await signup({ username: 'bob' }); diff --git a/packages/backend/test/block.ts b/packages/backend/test/block.ts index ec5d54ca0..b01096e80 100644 --- a/packages/backend/test/block.ts +++ b/packages/backend/test/block.ts @@ -4,7 +4,9 @@ import * as assert from 'assert'; import * as childProcess from 'child_process'; import { async, signup, request, post, startServer, shutdownServer } from './utils.js'; -describe('Block', () => { +describe('Block', function() { + this.timeout(20*60*1000); + let p: childProcess.ChildProcess; // alice blocks bob @@ -13,8 +15,6 @@ describe('Block', () => { let carol: any; before(async () => { - this.timeout(0); - p = await startServer(); alice = await signup({ username: 'alice' }); bob = await signup({ username: 'bob' }); diff --git a/packages/backend/test/fetch-resource.ts b/packages/backend/test/fetch-resource.ts index 2bdd7a7e2..ba1bf54a9 100644 --- a/packages/backend/test/fetch-resource.ts +++ b/packages/backend/test/fetch-resource.ts @@ -16,14 +16,15 @@ const AP = 'application/activity+json; charset=utf-8'; const JSON = 'application/json; charset=utf-8'; const HTML = 'text/html; charset=utf-8'; -describe('Fetch resource', () => { +describe('Fetch resource', function() { + this.timeout(20*60*1000); + let p: childProcess.ChildProcess; let alice: any; let alicesPost: any; before(async () => { - this.timeout(0); p = await startServer(); alice = await signup({ username: 'alice' }); alicesPost = await post(alice, { diff --git a/packages/backend/test/ff-visibility.ts b/packages/backend/test/ff-visibility.ts index 59b94e135..d71464a39 100644 --- a/packages/backend/test/ff-visibility.ts +++ b/packages/backend/test/ff-visibility.ts @@ -4,7 +4,9 @@ import * as assert from 'assert'; import * as childProcess from 'child_process'; import { async, signup, request, post, react, connectStream, startServer, shutdownServer, simpleGet } from './utils.js'; -describe('FF visibility', () => { +describe('FF visibility', function() { + this.timeout(20*60*1000); + let p: childProcess.ChildProcess; let alice: any; @@ -12,8 +14,6 @@ describe('FF visibility', () => { let follower: any; before(async () => { - this.timeout(0); - p = await startServer(); alice = await signup({ username: 'alice' }); bob = await signup({ username: 'bob' }); diff --git a/packages/backend/test/mute.ts b/packages/backend/test/mute.ts index 602623f4b..178018eea 100644 --- a/packages/backend/test/mute.ts +++ b/packages/backend/test/mute.ts @@ -4,7 +4,9 @@ import * as assert from 'assert'; import * as childProcess from 'child_process'; import { async, signup, request, post, react, startServer, shutdownServer, waitFire } from './utils.js'; -describe('Mute', () => { +describe('Mute', function() { + this.timeout(20*60*1000); + let p: childProcess.ChildProcess; // alice mutes carol @@ -13,8 +15,6 @@ describe('Mute', () => { let carol: any; before(async () => { - this.timeout(0); - p = await startServer(); alice = await signup({ username: 'alice' }); bob = await signup({ username: 'bob' }); diff --git a/packages/backend/test/note.ts b/packages/backend/test/note.ts index 1f7cf8f03..0f10f5ff9 100644 --- a/packages/backend/test/note.ts +++ b/packages/backend/test/note.ts @@ -5,7 +5,9 @@ import * as childProcess from 'child_process'; import { Note } from '../src/models/entities/note.js'; import { async, signup, request, post, uploadUrl, startServer, shutdownServer, initTestDb, api } from './utils.js'; -describe('Note', () => { +describe('Note', function() { + this.timeout(20*60*1000); + let p: childProcess.ChildProcess; let Notes: any; @@ -13,8 +15,6 @@ describe('Note', () => { let bob: any; before(async () => { - this.timeout(0); - p = await startServer(); const connection = await initTestDb(true); Notes = connection.getRepository(Note); diff --git a/packages/backend/test/services/blocking.ts b/packages/backend/test/services/blocking.ts index 2f72972f2..122e8126e 100644 --- a/packages/backend/test/services/blocking.ts +++ b/packages/backend/test/services/blocking.ts @@ -5,7 +5,9 @@ import * as childProcess from 'child_process'; import * as sinon from 'sinon'; import { async, signup, startServer, shutdownServer, initTestDb } from '../utils.js'; -describe('Creating a block activity', () => { +describe('Creating a block activity', function() { + this.timeout(20*60*1000); + let p: childProcess.ChildProcess; // alice blocks bob @@ -14,8 +16,6 @@ describe('Creating a block activity', () => { let carol: any; before(async () => { - this.timeout(0); - await initTestDb(); p = await startServer(); alice = await signup({ username: 'alice' }); diff --git a/packages/backend/test/streaming.ts b/packages/backend/test/streaming.ts index dd0e814d4..ad326703d 100644 --- a/packages/backend/test/streaming.ts +++ b/packages/backend/test/streaming.ts @@ -24,7 +24,9 @@ describe('Streaming', () => { }); }; - describe('Streaming', () => { + describe('Streaming', function() { + this.timeout(20*60*1000); + // Local users let ayano: any; let kyoko: any; @@ -38,8 +40,6 @@ describe('Streaming', () => { let list: any; before(async () => { - this.timeout(0); - p = await startServer(); const connection = await initTestDb(true); Followings = connection.getRepository(Following); @@ -410,7 +410,7 @@ describe('Streaming', () => { let fooCount = 0; let barCount = 0; let fooBarCount = 0; - + const ws = await connectStream(chitose, 'hashtag', ({ type, body }) => { if (type == 'note') { if (body.text === '#foo') fooCount++; @@ -422,19 +422,19 @@ describe('Streaming', () => { ['foo', 'bar'], ], }); - + post(chitose, { text: '#foo', }); - + post(chitose, { text: '#bar', }); - + post(chitose, { text: '#foo #bar', }); - + setTimeout(() => { assert.strictEqual(fooCount, 0); assert.strictEqual(barCount, 0); diff --git a/packages/backend/test/thread-mute.ts b/packages/backend/test/thread-mute.ts index d1338fd3b..d4ca80af6 100644 --- a/packages/backend/test/thread-mute.ts +++ b/packages/backend/test/thread-mute.ts @@ -4,7 +4,9 @@ import * as assert from 'assert'; import * as childProcess from 'child_process'; import { async, signup, request, post, react, connectStream, startServer, shutdownServer } from './utils.js'; -describe('Note thread mute', () => { +describe('Note thread mute', function() { + this.timeout(20*60*1000); + let p: childProcess.ChildProcess; let alice: any; @@ -12,8 +14,6 @@ describe('Note thread mute', () => { let carol: any; before(async () => { - this.timeout(0); - p = await startServer(); alice = await signup({ username: 'alice' }); bob = await signup({ username: 'bob' }); diff --git a/packages/backend/test/user-notes.ts b/packages/backend/test/user-notes.ts index 31a66dbd2..9d11d2304 100644 --- a/packages/backend/test/user-notes.ts +++ b/packages/backend/test/user-notes.ts @@ -4,7 +4,9 @@ import * as assert from 'assert'; import * as childProcess from 'child_process'; import { async, signup, request, post, uploadUrl, startServer, shutdownServer } from './utils.js'; -describe('users/notes', () => { +describe('users/notes', function() { + this.timeout(20*60*1000); + let p: childProcess.ChildProcess; let alice: any; @@ -13,8 +15,6 @@ describe('users/notes', () => { let jpgPngNote: any; before(async () => { - this.timeout(0); - p = await startServer(); alice = await signup({ username: 'alice' }); const jpg = await uploadUrl(alice, 'https://raw.githubusercontent.com/misskey-dev/misskey/develop/packages/backend/test/resources/Lenna.jpg'); From a0f0bac1cafbbdcb6f0042a3a9788c745d48e22b Mon Sep 17 00:00:00 2001 From: Johann150 Date: Wed, 31 May 2023 12:58:50 +0200 Subject: [PATCH 10/10] make mutes case insensitive closes https://akkoma.dev/FoundKeyGang/FoundKey/issues/392 Changelog: Changed --- packages/backend/src/misc/check-word-mute.ts | 3 ++- packages/client/src/scripts/check-word-mute.ts | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/misc/check-word-mute.ts b/packages/backend/src/misc/check-word-mute.ts index c49e95ace..614713d33 100644 --- a/packages/backend/src/misc/check-word-mute.ts +++ b/packages/backend/src/misc/check-word-mute.ts @@ -20,10 +20,11 @@ export async function checkWordMute(note: NoteLike, me: UserLike | null | undefi const text = ((note.cw ?? '') + '\n' + (note.text ?? '')).trim(); if (text === '') return false; + const textLower = text.toLowerCase(); const matched = mutedWords.some(filter => { if (Array.isArray(filter)) { - return filter.every(keyword => text.includes(keyword)); + return filter.every(keyword => textLower.includes(keyword.toLowerCase())); } else { // represents RegExp const regexp = filter.match(/^\/(.+)\/(.*)$/); diff --git a/packages/client/src/scripts/check-word-mute.ts b/packages/client/src/scripts/check-word-mute.ts index 35d40a6e0..bbe86162d 100644 --- a/packages/client/src/scripts/check-word-mute.ts +++ b/packages/client/src/scripts/check-word-mute.ts @@ -6,6 +6,7 @@ export function checkWordMute(note: Record, me: Record const text = ((note.cw ?? '') + '\n' + (note.text ?? '')).trim(); if (text === '') return false; + const textLower = text.toLowerCase(); const matched = mutedWords.some(filter => { if (Array.isArray(filter)) { @@ -13,7 +14,7 @@ export function checkWordMute(note: Record, me: Record const filteredFilter = filter.filter(keyword => keyword !== ''); if (filteredFilter.length === 0) return false; - return filteredFilter.every(keyword => text.includes(keyword)); + return filteredFilter.every(keyword => textLower.includes(keyword.toLowerCase())); } else { // represents RegExp const regexp = filter.match(/^\/(.+)\/(.*)$/);