Advertisement
m1cr0man

M1cr0S Door Lock 1.6

Jun 27th, 2012
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.77 KB | None | 0 0
  1. --M1cr0S Door Locker 1.6
  2.  
  3. os.loadAPI("/m1")
  4. m1.set(true, 1, 1)
  5. local settings, menu, input, name, result = {}, 0, {}, "", {}
  6. local x, y = term.getSize()
  7.  
  8. function firstrun()
  9.     print "Getting server ID"
  10.     settings[1] = m1.getperipheral("modem")
  11.     rednet.open(settings[1])
  12.     repeat
  13.         rednet.broadcast("srvidreq")
  14.         settings[2], request = rednet.receive(3)
  15.     until type(settings[2]) == "number"
  16.     rednet.close(settings[1])
  17.     print "Valid User/Required Rank(and above)"
  18.     settings[3] = read()
  19.     if tonumber(settings[3]) ~= nil then settings[3] = tonumber(settings[3]) end
  20.     print "Side to send redstone signal/ID of door control"
  21.     settings[4] = read()
  22.     if tonumber(settings[4]) ~= nil then
  23.         settings[4] = tonumber(settings[4])
  24.     else
  25.         print "How long to send signal for"
  26.         settings[5] = tonumber(read())
  27.         print "Door closed redstone state (on/off)"
  28.         if read() == "on" then settings[6] = true else settings[6] = false end
  29.     end
  30.     m1.tablesave("/settings", settings)
  31.     print("Done")
  32.     m1.wait(2)
  33.     os.reboot()
  34. end
  35.  
  36. function redraw()
  37.     term.clear()
  38.     local x, y = term.getSize()
  39.     local origx = x
  40.     while x > 0 do
  41.     m1.printex(1, "-", x, "noclr")
  42.     m1.printex(y, "-", x, "noclr")
  43.     x = x-1
  44.     end
  45.     while y > 0 do
  46.     m1.printex(y, "|", 1, "noclr")
  47.     m1.printex(y, "|", origx, "noclr")
  48.     y = y-1
  49.     end
  50.     m1.printex(1, "Password Protected Door", "center", "noclr")
  51.     m1.printex(3, "Input Username:", 2, "noclr")
  52. end
  53.  
  54. function pwdchk(event, line)
  55.     if event == "disk" then input = m1.tableload("disk/login") else input = {[1] = "pwdchk", [2] = name, [3] = input} end
  56.     if type(settings[3]) == "string" and input[2] ~= settings[3] then return({"disallowed"}) end
  57.     m1.tablesend(input, settings[2])
  58.     local id, request = m1.tablereceive(settings[2], 3)
  59.     if request == nil then return({"No Connection"})
  60.     elseif type(settings[3]) == "number" and request[1] == "true" and request[2] < settings[3] then return({"disallowed"})
  61.     else return(request) end
  62.     request, name = {}, ""
  63. end
  64.  
  65. function getinput(key)
  66.     local line = 4
  67.     if menu == 1 then line = 6 end
  68.     if key == 14 then table.remove(input)
  69.     elseif key ~= 1 and key ~= 28 and key ~= nil and key ~= " " then table.insert(input, key)
  70.     elseif key == 28 and menu == 0 then
  71.         name = ""
  72.         for i,data in ipairs(input) do name = name..data end
  73.         input = {}
  74.         return(name)
  75.     end
  76.     m1.printex(line, "|")
  77.     m1.printex(line, "|", x, "noclr")
  78.     for i,data in ipairs(input) do
  79.         if menu == 1 then data = "*" end
  80.         m1.printex(line, data, i+1, "noclr")
  81.     end
  82. end
  83.    
  84. function startup()
  85.     if fs.exists("/settings") == false then firstrun() end
  86.     settings = m1.tableload("/settings")
  87.     settings[1] = m1.getperipheral("modem")
  88.     redraw()
  89.     rednet.open(settings[1])
  90.     repeat
  91.         if type(settings[4]) == "string" and settings[6] == true then redstone.setOutput(settings[4], settings[6]) elseif type(settings[4]) == "string" then redstone.setOutput(settings[4], false) end
  92.         local event, p1, p2 = os.pullEvent()
  93.         if event == "rednet_message" then
  94.             local request = m1.deserialize(p2)
  95.             if request ~= nil and request[2] ~= nil and request[3] ~= nil and ((type(settings[3]) == "string" and request[2] == settings[3]) or (type(settings[3]) == "number" and request[3] >= settings[3])) then
  96.                 if settings[6] == true then redstone.setOutput(settings[4], false) else redstone.setOutput(settings[4], true) end
  97.                 m1.printex(7, "Remotely Opened", 2, "noclr")
  98.                 m1.wait(settings[5])
  99.             else
  100.                 m1.printex(7, "Access Denied", 2, "noclr")
  101.                 m1.wait(2)
  102.             end
  103.             menu, input, name, result, requset = 0, {}, "", {}, {}
  104.             redraw()
  105.         elseif (event == "disk") or (event == "key" and p1 == 28 and menu == 1) then --End events, which check password
  106.             result = pwdchk(event, 7)
  107.             if event == "disk" then disk.eject(m1.getperipheral("drive")) end
  108.             if result[1] == "true" then
  109.                 m1.printex(7, "Password Correct", 2, "noclr")
  110.                 if type(settings[4]) == "number" then
  111.                     m1.tablesend({[1] = "remopn", [2] = settings[4], [3] = input[2]}, settings[2])
  112.                 elseif type(settings[4]) == "string" and settings[6] == true then
  113.                     redstone.setOutput(settings[4], false)
  114.                 elseif type(settings[4]) == "string" then
  115.                     redstone.setOutput(settings[4], true)
  116.                 end
  117.                 m1.wait(settings[5] or 3)
  118.             elseif result[1] == "disallowed" then
  119.                 m1.printex(7, "Access Denied", 2, "noclr")
  120.                 m1.wait(2)
  121.             else
  122.                 m1.printex(7, result[1], 2, "noclr")
  123.                 m1.wait(2)
  124.             end
  125.             menu, input, name, result = 0, {}, "", {}
  126.             redraw()
  127.         elseif event == "key" and p1 == 28 and menu == 0 then
  128.             name = getinput(p1)
  129.             menu = 1
  130.             m1.printex(5, "Enter Password:", 2, "noclr")
  131.         elseif event == "key" and p1 == 14 then getinput(p1)
  132.         elseif event == "char" and menu == 0 then getinput(p1)
  133.         elseif event == "key" and menu == 1 then getinput(p1) end
  134.     until false
  135.     rednet.close(settings[1])
  136. end
  137. startup()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement