Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- M1cr0S Messaging Client 1.7
- os.loadAPI("/m1")
- local selected, messages, user, menu, input, name, settings = 1, {}, "", 0, "", "", {}
- local origx, origy = term.getSize()
- m1.set(false, 1, 1)
- function redraw()
- term.clear()
- local x = 1
- while x <= origx do
- m1.printex(1, "-", x, "noclr")
- m1.printex(origy, "-", x, "noclr")
- x = x+1
- end
- m1.printex(1, "ME-Mail", "center", "noclr")
- end
- function msgmgr(action, p1, p2) --P1 = Menu start point OR user to send message to. --p1 = Message to send
- local lines = 0
- if action == "menu" then
- redraw()
- m1.printex(origy, "Enter=Open Insert=New End=Exit Home=Refresh", "center", "noclr")
- m1.printex(2, "No. |", 1, "noclr")
- m1.printex(2, "From", 7, "noclr")
- if messages == nil then print "No connection to server" elseif messages[1] == -1 then m1.printex(3, "No Messages") else
- local line = 3 --Changing this changes starting line of list printer
- for i,data in ipairs(messages) do if (#messages > origy-3 and i >= p1) or (#messages <= origy-3) then
- local part1 = " "..tostring(i).." "
- if selected == i then part1 = "["..tostring(i).."]" end --Puts brackets on selected message
- m1.printex(line, part1, 1, "noclr")
- m1.printex(line, "|", 5, "noclr")
- m1.printex(line, data[1], 7, "noclr")
- line = line+1
- if line > origy-1 then break end
- end end
- end
- elseif action == "open" then
- redraw()
- m1.printex(2, "From: "..messages[selected][1], "center")
- m1.printex(4, messages[selected][2], "left")
- m1.printex(origy, "Enter = Back Delete = Delete Msg Insert = Reply", "center", "noclr")
- elseif action == "delete" then
- m1.tablesend({[1] = user, [2] = "msgdel", [3] = selected}, settings[2])
- id, messages = m1.tablereceive(settings[2], 5)
- redraw()
- m1.printex(2, "Message Deleted", "center")
- m1.wait(2)
- elseif action == "new2" then
- redraw()
- m1.printex(origy, "Enter = Start Writing/Cancel", "center", "noclr")
- m1.printex(2, "To:")
- name = read()
- if name == "" then return 0 end
- m1.tablesend({[1] = "usrchk", [2] = name}, settings[2])
- local srv, exists = rednet.receive(2)
- if srv == settings[2] and exists == "false" then
- m1.printex(4, "User Doesn't Exist.")
- m1.wait(2)
- return 0
- end
- elseif action == "new" then
- redraw()
- m1.printex(2, "To: "..name, "center")
- m1.printex(origy, "Insert = Send | End = Cancel", "center", "noclr")
- if input ~= "" then input = input:sub(1, input:len()-1) end
- if input:len() <= (origy-3)*origx then
- local length = input:len()
- if p1 == 14 then
- if input:find("\n", length-2, length) ~= nil then
- input = input:sub(1, length-1)
- else
- input = input:sub(1, length-1)
- end
- elseif p1 == 28 and lines < origy-4 then input = input.." \n"
- elseif p1 == 57 then input = input.." "
- elseif p1 == 210 and input:len() >= 2 then
- m1.tablesend({[1] = user, [2] = "msgadd", [3] = input, [4] = name}, settings[2])
- redraw()
- m1.printex(2, "Message Sent", "center")
- input, name, menu = "", "", 0
- m1.wait(2)
- return 0
- elseif p1 ~= 210 and p1 ~= 28 and p1 ~= nil then input = input..p1 end
- input = input.."_"
- m1.printex(3, input, "left")
- lines = 0
- for count in input:gmatch("[\n]+") do lines = lines+1 end
- end
- end
- end
- function memail()
- redraw()
- local top = 1
- m1.tablesend({[1] = user, [2] = "msgget"}, settings[2])
- id, messages = m1.tablereceive(settings[2], 5)
- msgmgr("menu", top)
- if messages[1] == -1 then
- menu = -1
- end
- repeat
- event, p1 = os.pullEvent()
- if event == "key" and p1 == 1 then
- return 0
- elseif event == "key" and menu == 0 and p1 == 208 and selected < #messages then
- selected = selected+1
- if selected >= origy-3 then top = top+1 end
- msgmgr("menu", top)
- elseif event == "key" and menu == 0 and p1 == 200 and selected > 1 then
- selected = selected-1
- if selected == origy-3 then top = 1 elseif selected > origy-3 then top = top-1 end
- msgmgr("menu", top)
- elseif event == "key" and (menu == 0 or menu == -1) and p1 == 199 then
- menu, top, selected = 0, 1, 1
- m1.tablesend({[1] = user, [2] = "msgget"}, settings[2])
- id, messages = m1.tablereceive(settings[2], 5)
- msgmgr("menu", top)
- --Open Message
- elseif event == "key" and p1 == 28 and menu == 0 then
- menu = 1
- msgmgr("open")
- elseif event == "key" and p1 == 207 and (menu == 0 or menu == -1) then
- os.shutdown()
- --Opened Message Actions
- elseif event == "key" and p1 == 28 and menu == 1 then
- menu = 0
- m1.tablesend({[1] = user, [2] = "msgget"}, settings[2])
- id, messages = m1.tablereceive(settings[2], 5)
- msgmgr("menu", top)
- elseif event == "key" and p1 == 211 and menu == 1 then
- msgmgr("delete")
- menu, top, selected = 0, 1, 1
- m1.tablesend({[1] = user, [2] = "msgget"}, settings[2])
- id, messages = m1.tablereceive(settings[2], 5)
- msgmgr("menu", top)
- elseif event == "key" and p1 == 210 and menu == 1 then
- name = messages[selected][1]
- input = ""
- msgmgr("new", "RE: "..name.."\n\n")
- menu, top, selected = 2, 1, 1
- elseif event == "key" and p1 == 210 and (menu == 0 or menu == -1) then
- local cancel = msgmgr("new2", nil)
- if cancel == 0 then msgmgr("menu", top) else
- msgmgr("new", nil)
- menu, top, selected, input = 2, 1, 1, ""
- end
- elseif event == "key" and p1 == 210 and menu == 2 and input:len() >= 2 then
- msgmgr("new", p1)
- menu, top, selected, input = 0, 1, 1, ""
- msgmgr("menu", top)
- elseif event == "key" and p1 == 207 and menu == 2 then
- menu, top, selected, input = 2, 1, 1, ""
- msgmgr("menu", top)
- elseif event == "key" and (p1 == 14 or p1 == 28 or p1 == 57) and menu == 2 then
- msgmgr("new", p1)
- elseif event == "char" and p1 ~= " " and p1 ~= nil and menu == 2 then
- msgmgr("new", p1)
- end
- until false
- end
- function getpwd()
- local function pwdchk(check)
- m1.tablesend(check, settings[2])
- local id, request;
- repeat id, request = rednet.receive(3) until id == settings[2] or id == nil
- if id == nil or request == nil then return("No Connection")
- elseif m1.deserialize(request) ~= nil and type(settings[3]) == "number" and m1.deserialize(request)[1] == "true" and m1.deserialize(request)[2] < settings[3] then return("disallowed")
- else return(request) end
- request, input, id = nil
- end
- local function reset(reason)
- if reason == "timer" then
- timer, timer2 = nil, nil
- os.shutdown()
- elseif reason ~= nil then
- m1.printex(6, reason)
- stage, pwd, user = 1, {}, ""
- m1.wait(3)
- redraw()
- return 1
- else return 1 end
- end
- local stage, pwd = 1, {}
- user = ""
- redraw()
- m1.printex(2, "Enter Name:")
- local timer1 = os.startTimer(60)
- local timer2 = os.startTimer(9)
- if m1.getperipheral("drive") and disk.isPresent(m1.getperipheral("drive")) and fs.exists("/disk/login") then
- local drvtbl = m1.tableload("/disk/login")
- user = drvtbl[2]
- stage = pwdchk(drvtbl)
- disk.eject(m1.getperipheral("drive"))
- if m1.deserialize(stage) ~= nil and m1.deserialize(stage)[1] == "true" then
- m1.printex(6, "Password Correct")
- pwd, timer, timer2 = {}, nil, nil
- m1.wait(1)
- return 0
- else reset(stage) end
- end
- repeat
- event, p1 = os.pullEvent()
- if event == "timer" and p1 == timer2 then
- rednet.send(settings[2], "ping")
- local resid, pong = rednet.receive(2)
- if resid == settings[2] and pong == "pong" then timer2, timer2 = nil, os.startTimer(9) else
- return(2)
- end
- timer2 = os.startTimer(9)
- elseif event == "timer" and p1 == timer1 then --Turn Off Computer/Restart Timer
- reset("timer")
- else
- timer = os.startTimer(60)
- end
- if event == "disk" and disk.isPresent(m1.getperipheral("drive")) and fs.exists("/disk/login") then
- timer = nil
- local drvtbl = m1.tableload("/disk/login")
- user = drvtbl[2]
- stage = pwdchk(drvtbl)
- disk.eject(m1.getperipheral("drive"))
- if m1.deserialize(stage) ~= nil and m1.deserialize(stage)[1] == "true" then
- m1.printex(6, "Password Correct")
- pwd, timer, timer2 = {}, nil, nil
- m1.wait(1)
- return 0
- else reset(stage) end
- elseif event == "key" and p1 == 1 then reset()
- elseif stage == 1 then --Get user user
- if event == "char" and p1 ~= nil then user = user..p1
- elseif event == "key" and p1 == 14 then user = user:sub(1, user:len()-1)
- elseif event == "key" and p1 == 28 then
- stage = 2
- m1.printex(4, "Enter Password:")
- end
- m1.printex(3, user)
- elseif stage == 2 then
- if event == "key" and p1 == 14 then table.remove(pwd)
- elseif event == "key" and p1 == 28 then
- stage = pwdchk({[1] = "pwdchk", [2] = user, [3] = pwd})
- if m1.deserialize(stage) ~= nil and m1.deserialize(stage)[1] == "true" then
- m1.printex(6, "Password Correct")
- pwd, timer, timer2 = {}, nil, nil
- m1.wait(1)
- return 0
- else return(reset(stage)) end
- elseif event == "key" and p1 ~= 1 then table.insert(pwd, p1) end
- m1.printex(5)
- for i, data in ipairs(pwd) do m1.printex(5, "*", i, "noclr") end
- end
- until false
- end
- function firstrun()
- settings = {}
- print("Getting Server ID...")
- settings[1] = m1.getperipheral("modem")
- rednet.open(settings[1])
- repeat
- rednet.broadcast("srvidreq")
- settings[2], res = rednet.receive(3)
- until settings[2] ~= nil
- rednet.close(settings[1])
- print("Min Rank required/Allowed user?")
- settings[3] = read()
- if tonumber(settings[3]) ~= nil then settings[3] = tonumber(settings[3]) end
- m1.tablesave("/settings", settings)
- print("Done!")
- term.clear()
- end
- function startup()
- if fs.exists("/settings") == false then firstrun() end
- settings = m1.tableload("/settings")
- settings[1] = m1.getperipheral("modem")
- rednet.open(settings[1])
- local function connectionlock()
- redraw()
- m1.printex(origy/2+1, "No Connection to Server", "center")
- local reconnect = 1
- repeat
- rednet.send(settings[2], "ping")
- local id, response = rednet.receive(5)
- if response == "pong" and id == settings[2] then break end
- until reconnect == 0
- end
- repeat
- local pwdres, msgres = -1, -1
- repeat
- pwdres = -1
- pwdres = getpwd()
- if pwdres == 2 then
- connectionlock()
- pwdres = -1
- end
- until pwdres == 0
- repeat
- msgres = -1
- msgres = memail()
- until msgres == 0
- until false
- end
- startup()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement