92 lines
2.7 KiB
JavaScript
92 lines
2.7 KiB
JavaScript
export const muteFilterHits = (muteFilters, status) => {
|
|
const statusText = status.text.toLowerCase()
|
|
const statusSummary = status.summary.toLowerCase()
|
|
const replyToUser = status.in_reply_to_screen_name?.toLowerCase()
|
|
const poster = status.user.screen_name?.toLowerCase()
|
|
const mentions = (status.attentions || []).map((att) =>
|
|
att.screen_name.toLowerCase(),
|
|
)
|
|
|
|
return muteFilters
|
|
.toSorted((a, b) => b.order - a.order)
|
|
.map((filter) => {
|
|
const {
|
|
hide,
|
|
expires,
|
|
name,
|
|
value,
|
|
type,
|
|
enabled,
|
|
caseSensitive = false,
|
|
} = filter
|
|
if (!enabled) return false
|
|
if (value === '') return false
|
|
if (expires !== null && expires < Date.now()) return false
|
|
switch (type) {
|
|
case 'word': {
|
|
let match = false
|
|
if (caseSensitive) {
|
|
match = statusText.includes(value) || statusSummary.includes(value)
|
|
} else {
|
|
const lowercaseValue = value.toLowerCase()
|
|
match =
|
|
statusText.toLowerCase().includes(lowercaseValue) ||
|
|
statusSummary.toLowerCase().includes(lowercaseValue)
|
|
}
|
|
|
|
if (match) {
|
|
return { hide, name }
|
|
}
|
|
break
|
|
}
|
|
case 'regexp': {
|
|
try {
|
|
const re = new RegExp(value, caseSensitive ? '' : 'i')
|
|
if (re.test(statusText) || re.test(statusSummary)) {
|
|
return { hide, name }
|
|
}
|
|
return false
|
|
} catch {
|
|
return false
|
|
}
|
|
}
|
|
case 'user': {
|
|
let match = false
|
|
if (caseSensitive) {
|
|
match =
|
|
poster.includes(value) ||
|
|
replyToUser.includes(value) ||
|
|
mentions.some((mention) => mention.includes(value))
|
|
} else {
|
|
const lowercaseValue = value.toLowerCase()
|
|
match =
|
|
poster.toLowerCase().includes(lowercaseValue) ||
|
|
replyToUser.toLowerCase().includes(lowercaseValue) ||
|
|
mentions.some((mention) =>
|
|
mention.toLowerCase().includes(lowercaseValue),
|
|
)
|
|
}
|
|
if (match) {
|
|
return { hide, name }
|
|
}
|
|
break
|
|
}
|
|
case 'user_regexp': {
|
|
try {
|
|
const re = new RegExp(value, caseSensitive ? '' : 'i')
|
|
if (
|
|
re.test(poster) ||
|
|
re.test(replyToUser) ||
|
|
mentions.some((mention) => re.test(mention))
|
|
) {
|
|
return { hide, name }
|
|
}
|
|
return false
|
|
} catch {
|
|
return false
|
|
}
|
|
}
|
|
}
|
|
})
|
|
.filter(Boolean)
|
|
}
|