Files
FrozenFriendsYume/packages/backend/built/misc/check-word-mute.js
T
2026-07-26 18:25:37 +09:00

37 lines
1.5 KiB
JavaScript

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