import RE2 from "re2"; function checkWordMute(note, mutedWords) { if (note == null) return false; let text = `${note.cw ?? ""} ${note.text ?? ""}`; if (note.files != null) text += ` ${note.files.map((f)=>f.comment ?? "").join(" ")}`; text = text.trim().toLowerCase(); if (text === "") return false; for (const mutePattern of mutedWords){ if (Array.isArray(mutePattern)) { // Clean up const keywords = mutePattern.filter((keyword)=>keyword !== ""); if (keywords.length > 0 && keywords.every((keyword)=>text.includes(keyword.toLowerCase()))) return true; } else { // represents RegExp const regexp = mutePattern.match(/^\/(.+)\/(.*)$/); // This should never happen due to input sanitisation. if (!regexp) { console.warn(`Found invalid regex in word mutes: ${mutePattern}`); continue; } try { if (new RE2(regexp[1], regexp[2]).test(text)) return true; } catch (err) { // This should never happen due to input sanitisation. } } } return false; } export async function getWordHardMute(note, me, mutedWords) { // 自分自身 if (me && note.userId === me.id) return false; if (mutedWords.length <= 0) return false; if (note.isFiltered) return true; return checkWordMute(note, mutedWords) || checkWordMute(note.reply, mutedWords) || checkWordMute(note.renote, mutedWords); }