random-stuff/computercraft/potatos-chat-monitor.lua

73 lines
3.2 KiB
Lua

if not process.info "chatd" and _G.switchcraft then
process.spawn(chatbox.run, "chatd")
end
local server = settings.get "server"
if _G.switchcraft then server = "switchcraft" end
local chatbox = _G.chatbox or peripheral.find "chat_box"
local data = persistence "pcm"
if not data.blasphemy_counts then data.blasphemy_counts = {} end
local potatOS_supporters = {
gollark = true,
["6_4"] = true
}
local clause_separators = {".", ",", '"', "'", "`", "and", "!", "?", ":", ";", "-"}
local negative_words_list = "abysmal awful appalling atrocious bad boring belligerent banal broken callous crazy cruel corrosive corrupt criminal contradictory confused damaging dismal dreadful deprived deplorable dishonest disease detrimental dishonorable dreary evil enrage fail foul faulty filthy frightful fight gross ghastly grim guilty grotesque grimace haggard harmful horrendous hostile hate horrible hideous icky immature infernal insane inane insidious insipid inelegant junk lousy malicious malware messy monstrous menacing missing nasty negative nonsense naughty odious offensive oppressive objectionable petty poor poisonous questionable reject reptilian rotten repugnant repulsive ruthless scary shocking sad sickening stupid spiteful stormy smelly suspicious shoddy sinister substandard severe stuck threatening terrifying tense ugly unwanted unsatisfactory unwieldy unsightly unwelcome unfair unhealthy unpleasant untoward vile villainous vindictive vicious wicked worthless insecure bug virus sucks dodecahedr worse" .. " sh" .. "it " .. "cr" .. "ap"
local negative_words = negative_words_list / " "
local ignore_if_present_words = "greenhouse not garden these support bounty debug antivirus n't" / " "
function _G.is_blasphemous(message)
local clauses = {message:lower()}
for _, sep in pairs(clause_separators) do
local out = {}
for _, x in pairs(clauses) do
for _, y in pairs(string.split(x, sep)) do
table.insert(out, y)
end
end
clauses = out
end
for _, clause in pairs(clauses) do
for _, word in pairs(negative_words) do
if clause:match(word) and clause:match "potatos" then
for _, iword in pairs(ignore_if_present_words) do
if clause:match(iword) then return false, iword, clause end
end
return true, word, clause
end
end
end
return false
end
while true do
local ev, user, message, mdata = os.pullEvent()
if ev == "chat" or ev == "chat_discord" then
local blasphemous, word, clause = is_blasphemous(message)
if blasphemous then
if mdata then
mdata.renderedText = nil
end
data.blasphemy_counts[user] = (data.blasphemy_counts[user] or 0) + 1
data.save()
print("BLASPHEMY from", user, "-", message, word, clause)
potatOS.report_incident(("blasphemy from %s"):format(user), {"blasphemy"}, {
disable_host_data = true,
ID = os.getComputerID(),
extra_meta = {
message_data = mdata,
user = user,
message = message,
server = server,
blasphemy_count = data.blasphemy_counts[user]
}
})
end
elseif ev == "command" and message == "blasphemy_count" then
print(user, "requested count")
chatbox.tell(user, ("Blasphemy count: %d"):format(data.blasphemy_counts[user] or 0), "PCM")
end
end