1
0
mirror of https://github.com/osmarks/random-stuff synced 2024-11-09 22:09:55 +00:00
random-stuff/computercraft/lms.lua
2024-06-11 15:18:13 +01:00

131 lines
3.2 KiB
Lua

local function update()
local h = http.get "https://raw.githubusercontent.com/osmarks/misc/master/computercraft/lms.lua"
local f = fs.open(shell.getRunningProgram(), "w")
f.write(h.readAll())
f.close()
h.close()
end
if ... == "update" then update() end
local m = peripheral.find "modem"
local s = peripheral.find "speaker"
local chan = 3636
print "Welcome to the Lightweight Messaging System (developed by GTech Potatronics)"
m.open(chan)
local username = settings.get "lms.username"
if username == nil then
write "Username: "
username = read()
end
local w, h = term.getSize()
local send_window = window.create(term.current(), 1, h, w, 1)
local message_window = window.create(term.current(), 1, 1, w, h - 1)
local function notification_sound()
if s then
for i = 4, 12, 4 do
s.playNote("flute", 3, i)
sleep(0.2)
end
end
end
local function exec_in_window(w, f)
local x, y = term.getCursorPos()
local last = term.redirect(w)
f()
term.redirect(last)
w.redraw()
term.setCursorPos(x, y)
end
local function print_message(txt)
exec_in_window(message_window, function()
print(txt)
end)
end
local function trim(s)
return s:match( "^%s*(.-)%s*$" )
end
local banned_text = {
"yeet",
"ecs dee",
"dab",
}
if debug and debug.getmetatable then
_G.getmetatable = debug.getmetatable
end
local function to_case_insensitive(text)
return text:gsub("[a-zA-Z]", function(char) return ("[%s%s]"):format(char:lower(), char:upper()) end)
end
local function filter(text)
local out = text
for _, b in pairs(banned_text) do
out = out:gsub(to_case_insensitive(b), "")
end
return out
end
local function strip_extraneous_spacing(text)
return text:gsub("%s+", " ")
end
local function collapse_e_sequences(text)
return text:gsub("ee+", "ee")
end
local function preproc(text)
return trim(filter(strip_extraneous_spacing(collapse_e_sequences(text:sub(1, 128)))))
end
local function add_message(msg, usr)
local msg, usr = preproc(msg), preproc(usr)
if msg == "" or usr == "" then return end
print_message(usr .. ": " .. msg)
end
local function send()
term.redirect(send_window)
term.setBackgroundColor(colors.white)
term.setTextColor(colors.black)
term.clear()
local hist = {}
while true do
local msg = read(nil, hist)
if msg == "!!exit" then return
elseif msg == "!!update" then update() print_message "Updated. Please restart the program."
else
table.insert(hist, msg)
if preproc(msg) == "" then
print_message "Your message is considered spam."
else
add_message(msg, username:sub(1, 16))
m.transmit(chan, chan, { message = msg, username = username })
end
end
end
end
local function recv()
while true do
local _, _, channel, _, message = os.pullEvent "modem_message"
if channel == chan and type(message) == "table" and message.message and message.username and type(message.message) == "string" and type(message.username) == "string" then
notification_sound()
add_message(message.message, message.username)
end
end
end
m.transmit(chan, chan, { username = username, message = "Connected." })
parallel.waitForAny(send, recv)