Advertisement
m1cr0man

MEMail 1.7

Jul 9th, 2012
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 10.19 KB | None | 0 0
  1. -- M1cr0S Messaging Client 1.7
  2.  
  3. os.loadAPI("/m1")
  4. local selected, messages, user, menu, input, name, settings = 1, {}, "", 0, "", "", {}
  5. local origx, origy = term.getSize()
  6. m1.set(false, 1, 1)
  7.  
  8. function redraw()
  9.     term.clear()
  10.     local x = 1
  11.     while x <= origx do
  12.         m1.printex(1, "-", x, "noclr")
  13.         m1.printex(origy, "-", x, "noclr")
  14.         x = x+1
  15.     end
  16.     m1.printex(1, "ME-Mail", "center", "noclr")
  17. end
  18.  
  19. function msgmgr(action, p1, p2) --P1 = Menu start point OR user to send message to. --p1 = Message to send
  20.     local lines = 0
  21.     if action == "menu" then
  22.         redraw()
  23.         m1.printex(origy, "Enter=Open Insert=New End=Exit Home=Refresh", "center", "noclr")
  24.         m1.printex(2, "No. |", 1, "noclr")
  25.         m1.printex(2, "From", 7, "noclr")
  26.         if messages == nil then print "No connection to server" elseif messages[1] == -1 then m1.printex(3, "No Messages") else
  27.             local line = 3 --Changing this changes starting line of list printer
  28.             for i,data in ipairs(messages) do if (#messages > origy-3 and i >= p1) or (#messages <= origy-3) then
  29.                 local part1 = " "..tostring(i).." "
  30.                 if selected == i then part1 = "["..tostring(i).."]" end --Puts brackets on selected message
  31.                 m1.printex(line, part1, 1, "noclr")
  32.                 m1.printex(line, "|", 5, "noclr")
  33.                 m1.printex(line, data[1], 7, "noclr")
  34.                 line = line+1
  35.                 if line > origy-1 then break end
  36.             end end
  37.         end
  38.     elseif action == "open" then
  39.         redraw()
  40.         m1.printex(2, "From: "..messages[selected][1], "center")
  41.         m1.printex(4, messages[selected][2], "left")
  42.         m1.printex(origy, "Enter = Back  Delete = Delete Msg  Insert = Reply", "center", "noclr")
  43.     elseif action == "delete" then
  44.         m1.tablesend({[1] = user, [2] = "msgdel", [3] = selected}, settings[2])
  45.         id, messages = m1.tablereceive(settings[2], 5)
  46.         redraw()
  47.         m1.printex(2, "Message Deleted", "center")
  48.         m1.wait(2)
  49.     elseif action == "new2" then
  50.         redraw()
  51.         m1.printex(origy, "Enter = Start Writing/Cancel", "center", "noclr")
  52.         m1.printex(2, "To:")
  53.         name = read()
  54.         if name == "" then return 0 end
  55.         m1.tablesend({[1] = "usrchk", [2] = name}, settings[2])
  56.         local srv, exists = rednet.receive(2)
  57.         if srv == settings[2] and exists == "false" then
  58.             m1.printex(4, "User Doesn't Exist.")
  59.             m1.wait(2)
  60.             return 0
  61.         end
  62.     elseif action == "new" then
  63.         redraw()
  64.         m1.printex(2, "To: "..name, "center")
  65.         m1.printex(origy, "Insert = Send | End = Cancel", "center", "noclr")
  66.         if input ~= "" then input = input:sub(1, input:len()-1) end
  67.         if input:len() <= (origy-3)*origx then
  68.             local length = input:len()
  69.             if p1 == 14 then
  70.                 if input:find("\n", length-2, length) ~= nil then
  71.                     input = input:sub(1, length-1)
  72.                 else
  73.                     input = input:sub(1, length-1)
  74.                 end
  75.             elseif p1 == 28 and lines < origy-4 then input = input.." \n"
  76.             elseif p1 == 57 then input = input.." "
  77.             elseif p1 == 210 and input:len() >= 2 then
  78.                 m1.tablesend({[1] = user, [2] = "msgadd", [3] = input, [4] = name}, settings[2])
  79.                 redraw()
  80.                 m1.printex(2, "Message Sent", "center")
  81.                 input, name, menu = "", "", 0
  82.                 m1.wait(2)
  83.                 return 0
  84.             elseif p1 ~= 210 and p1 ~= 28 and p1 ~= nil then input = input..p1 end
  85.         input = input.."_"
  86.         m1.printex(3, input, "left")
  87.         lines = 0
  88.         for count in input:gmatch("[\n]+") do lines = lines+1 end
  89.         end
  90.     end
  91. end
  92.  
  93. function memail()
  94.     redraw()
  95.     local top = 1
  96.     m1.tablesend({[1] = user, [2] = "msgget"}, settings[2])
  97.     id, messages = m1.tablereceive(settings[2], 5)
  98.     msgmgr("menu", top)
  99.     if messages[1] == -1 then
  100.         menu = -1
  101.     end
  102.     repeat
  103.         event, p1 = os.pullEvent()
  104.         if event == "key" and p1 == 1 then
  105.             return 0
  106.         elseif event == "key" and menu == 0 and p1 == 208 and selected < #messages then
  107.             selected = selected+1
  108.             if selected >= origy-3 then top = top+1 end
  109.             msgmgr("menu", top)
  110.         elseif event == "key" and menu == 0 and p1 == 200 and selected > 1 then
  111.             selected = selected-1
  112.             if selected == origy-3 then top = 1 elseif selected > origy-3 then top = top-1 end
  113.             msgmgr("menu", top)
  114.         elseif event == "key" and (menu == 0 or menu == -1) and p1 == 199 then
  115.             menu, top, selected = 0, 1, 1
  116.             m1.tablesend({[1] = user, [2] = "msgget"}, settings[2])
  117.             id, messages = m1.tablereceive(settings[2], 5)
  118.             msgmgr("menu", top)
  119.         --Open Message
  120.         elseif event == "key" and p1 == 28 and menu == 0 then
  121.             menu = 1
  122.             msgmgr("open")
  123.         elseif event == "key" and p1 == 207 and (menu == 0 or menu == -1) then
  124.             os.shutdown()
  125.         --Opened Message Actions
  126.         elseif event == "key" and p1 == 28 and menu == 1 then
  127.             menu = 0
  128.             m1.tablesend({[1] = user, [2] = "msgget"}, settings[2])
  129.             id, messages = m1.tablereceive(settings[2], 5)
  130.             msgmgr("menu", top)
  131.         elseif event == "key" and p1 == 211 and menu == 1 then
  132.             msgmgr("delete")
  133.             menu, top, selected = 0, 1, 1
  134.             m1.tablesend({[1] = user, [2] = "msgget"}, settings[2])
  135.             id, messages = m1.tablereceive(settings[2], 5)
  136.             msgmgr("menu", top)
  137.         elseif event == "key" and p1 == 210 and menu == 1 then
  138.             name = messages[selected][1]
  139.             input = ""
  140.             msgmgr("new", "RE: "..name.."\n\n")
  141.             menu, top, selected = 2, 1, 1
  142.         elseif event == "key" and p1 == 210 and (menu == 0 or menu == -1) then
  143.             local cancel = msgmgr("new2", nil)
  144.             if cancel == 0 then msgmgr("menu", top) else
  145.                 msgmgr("new", nil)
  146.                 menu, top, selected, input = 2, 1, 1, ""
  147.             end
  148.         elseif event == "key" and p1 == 210 and menu == 2 and input:len() >= 2 then
  149.             msgmgr("new", p1)
  150.             menu, top, selected, input = 0, 1, 1, ""
  151.             msgmgr("menu", top)
  152.         elseif event == "key" and p1 == 207 and menu == 2 then
  153.             menu, top, selected, input = 2, 1, 1, ""
  154.             msgmgr("menu", top)
  155.         elseif event == "key" and (p1 == 14 or p1 == 28 or p1 == 57) and menu == 2 then
  156.             msgmgr("new", p1)
  157.         elseif event == "char" and p1 ~= " " and p1 ~= nil and menu == 2 then
  158.             msgmgr("new", p1)
  159.         end
  160.     until false
  161. end
  162.  
  163. function getpwd()
  164.     local function pwdchk(check)
  165.         m1.tablesend(check, settings[2])
  166.         local id, request;
  167.         repeat id, request = rednet.receive(3) until id == settings[2] or id == nil
  168.         if id == nil or request == nil then return("No Connection")
  169.         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")
  170.         else return(request) end
  171.         request, input, id = nil
  172.     end
  173.    
  174.     local function reset(reason)
  175.         if reason == "timer" then
  176.             timer, timer2 = nil, nil
  177.             os.shutdown()
  178.         elseif reason ~= nil then
  179.             m1.printex(6, reason)
  180.             stage, pwd, user = 1, {}, ""
  181.             m1.wait(3)
  182.             redraw()
  183.             return 1
  184.         else return 1 end
  185.     end
  186.    
  187.     local stage, pwd = 1, {}
  188.     user = ""
  189.     redraw()
  190.     m1.printex(2, "Enter Name:")
  191.     local timer1 = os.startTimer(60)
  192.     local timer2 = os.startTimer(9)
  193.     if m1.getperipheral("drive") and disk.isPresent(m1.getperipheral("drive")) and fs.exists("/disk/login") then
  194.         local drvtbl = m1.tableload("/disk/login")
  195.         user = drvtbl[2]
  196.         stage = pwdchk(drvtbl)
  197.         disk.eject(m1.getperipheral("drive"))
  198.         if m1.deserialize(stage) ~= nil and m1.deserialize(stage)[1] == "true" then
  199.             m1.printex(6, "Password Correct")
  200.             pwd, timer, timer2 = {}, nil, nil
  201.             m1.wait(1)
  202.             return 0
  203.         else reset(stage) end
  204.     end
  205.     repeat
  206.         event, p1 = os.pullEvent()
  207.         if event == "timer" and p1 == timer2 then
  208.             rednet.send(settings[2], "ping")
  209.             local resid, pong = rednet.receive(2)
  210.             if resid == settings[2] and pong == "pong" then timer2, timer2 = nil, os.startTimer(9) else
  211.                 return(2)
  212.             end
  213.             timer2 = os.startTimer(9)
  214.         elseif event == "timer" and p1 == timer1 then --Turn Off Computer/Restart Timer
  215.             reset("timer")
  216.         else
  217.             timer = os.startTimer(60)
  218.         end
  219.         if event == "disk" and disk.isPresent(m1.getperipheral("drive")) and fs.exists("/disk/login") then
  220.             timer = nil
  221.             local drvtbl = m1.tableload("/disk/login")
  222.             user = drvtbl[2]
  223.             stage = pwdchk(drvtbl)
  224.             disk.eject(m1.getperipheral("drive"))
  225.             if m1.deserialize(stage) ~= nil and m1.deserialize(stage)[1] == "true" then
  226.                 m1.printex(6, "Password Correct")
  227.                 pwd, timer, timer2 = {}, nil, nil
  228.                 m1.wait(1)
  229.                 return 0
  230.             else reset(stage) end
  231.         elseif event == "key" and p1 == 1 then reset()
  232.         elseif stage == 1 then --Get user user
  233.             if event == "char" and p1 ~= nil then user = user..p1
  234.             elseif event == "key" and p1 == 14 then user = user:sub(1, user:len()-1)
  235.             elseif event == "key" and p1 == 28 then
  236.                 stage = 2
  237.                 m1.printex(4, "Enter Password:")
  238.             end
  239.             m1.printex(3, user)
  240.         elseif stage == 2 then
  241.             if event == "key" and p1 == 14 then table.remove(pwd)
  242.             elseif event == "key" and p1 == 28 then
  243.                 stage = pwdchk({[1] = "pwdchk", [2] = user, [3] = pwd})
  244.                 if m1.deserialize(stage) ~= nil and m1.deserialize(stage)[1] == "true" then
  245.                     m1.printex(6, "Password Correct")
  246.                     pwd, timer, timer2 = {}, nil, nil
  247.                     m1.wait(1)
  248.                     return 0
  249.                 else return(reset(stage)) end
  250.             elseif event == "key" and p1 ~= 1 then table.insert(pwd, p1) end
  251.             m1.printex(5)
  252.             for i, data in ipairs(pwd) do m1.printex(5, "*", i, "noclr") end
  253.         end
  254.        
  255.     until false
  256. end
  257.  
  258. function firstrun()
  259.     settings = {}
  260.     print("Getting Server ID...")
  261.     settings[1] = m1.getperipheral("modem")
  262.     rednet.open(settings[1])
  263.     repeat
  264.         rednet.broadcast("srvidreq")
  265.         settings[2], res = rednet.receive(3)
  266.     until settings[2] ~= nil
  267.     rednet.close(settings[1])
  268.     print("Min Rank required/Allowed user?")
  269.     settings[3] = read()
  270.     if tonumber(settings[3]) ~= nil then settings[3] = tonumber(settings[3]) end
  271.     m1.tablesave("/settings", settings)
  272.     print("Done!")
  273.     term.clear()
  274. end
  275.  
  276. function startup()
  277.     if fs.exists("/settings") == false then firstrun() end
  278.     settings = m1.tableload("/settings")
  279.     settings[1] = m1.getperipheral("modem")
  280.     rednet.open(settings[1])
  281.     local function connectionlock()
  282.         redraw()
  283.         m1.printex(origy/2+1, "No Connection to Server", "center")
  284.         local reconnect = 1
  285.         repeat
  286.             rednet.send(settings[2], "ping")
  287.             local id, response = rednet.receive(5)
  288.             if response == "pong" and id == settings[2] then break end
  289.         until reconnect == 0
  290.     end
  291.     repeat
  292.         local pwdres, msgres = -1, -1
  293.         repeat
  294.             pwdres = -1
  295.             pwdres = getpwd()
  296.             if pwdres == 2 then
  297.                 connectionlock()
  298.                 pwdres = -1
  299.             end
  300.         until pwdres == 0
  301.         repeat
  302.             msgres = -1
  303.             msgres = memail()
  304.         until msgres == 0
  305.     until false
  306. end
  307.  
  308. startup()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement