NanoBob

NanoBank - client

Dec 24th, 2014
258
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 9.74 KB | None | 0 0
  1. --Nano banking OS
  2. local bankServerID=3
  3.  
  4. modem=rednet.open("back")
  5.  
  6. currentUser=nil
  7.  
  8. local desktopBackgroundColor=8
  9. local taskBarColor=256
  10. local menuButtonColor=2
  11. local menuColor=128
  12. local loginBackgroundColor=8
  13. local loginPanelColor=256
  14. local loginBarColor=128
  15. local loginButtonColor=128
  16.  
  17.  
  18. local screenX,screenY=term.getSize()
  19. if math.ceil(screenY/2)~=math.floor(screenY/2) then
  20.     screenY=screenY-1
  21. end
  22.  
  23. function relogin()
  24.     rednet.send(bankServerID,"disconnect "..currentUser)
  25.     repeat
  26.         id,returnedMessage=rednet.receive(1)
  27.     until id==bankServerID or id==nil
  28.     if id==nil then
  29.         loginErrorMessage("  Request timed out!  ",2)
  30.         return true
  31.     end
  32.     currentUser=nil
  33.     drawLogin()
  34.     loginEvents()
  35. end
  36. function kick()
  37.     rednet.send(bankServerID,"disconnect "..currentUser)
  38.     repeat
  39.         id,returnedMessage=rednet.receive(1)
  40.     until id==bankServerID or id==nil
  41.     if id==nil then
  42.         loginErrorMessage("  Request timed out!  ",2)
  43.         return true
  44.     end
  45.     currentUser=nil
  46.     loginEvents()
  47. end
  48.  
  49. mainMenuItems={
  50. ["Shut down"]={['c']=16384,['f']=os.shutdown},
  51. ["Reboot"]={['c']=32,['f']=os.reboot},
  52. ["Log off"]={['c']=2,['f']=relogin},
  53. }
  54.  
  55. function os.pullEvent()
  56.     local event, p1, p2, p3, p4, p5 = os.pullEventRaw()
  57.     if event == "terminate" and termDisabled then
  58.    
  59.     end
  60.     return event, p1, p2, p3, p4, p5
  61. end
  62.  
  63. defaultPrograms={
  64. ["updateOS"]="7BEqH0QS"
  65. }
  66.  
  67. for id,data in pairs(defaultPrograms) do
  68.     if fs.exists(id)==false then
  69.         shell.run("pastebin","get",data,id)
  70.     end
  71. end
  72.  
  73. function drawLogin()
  74.     termDisabled=true
  75.     userString=""
  76.     passString=""
  77.     term.setTextColor(2)
  78.     loginDrawn=true
  79.     term.setBackgroundColor(loginBackgroundColor)
  80.     term.clear()
  81.    
  82.     term.setCursorPos(screenX/2-10,screenY/2-5)
  83.     term.setBackgroundColor(loginBarColor)
  84.     term.write(" Login              ")
  85.     term.setBackgroundColor(loginPanelColor)
  86.     for i=1,7 do
  87.         term.setCursorPos(screenX/2-10,(screenY/2-5)+i)
  88.         term.write("                    ")
  89.     end
  90.     term.setBackgroundColor(1)
  91.     term.setCursorPos(screenX/2-2,(screenY/2-2))
  92.     term.write("        ")
  93.     term.setCursorPos(screenX/2-2,(screenY/2+0))
  94.     term.write("        ")
  95.     term.setBackgroundColor(loginPanelColor)
  96.     term.setCursorPos(screenX/2-7,(screenY/2-2))
  97.     term.write("User")
  98.     term.setCursorPos(screenX/2-7,(screenY/2+0))
  99.     term.write("Pass")
  100.     term.setCursorPos(screenX/2+4,screenY/2+2)
  101.     term.setBackgroundColor(loginButtonColor)
  102.     term.write("Login")
  103.     term.setBackgroundColor(1)
  104.     term.setTextColor(32768)
  105.     term.setCursorPos(screenX/2-2,(screenY/2-2))
  106.     term.setCursorBlink(true)
  107.    
  108. end
  109.  
  110. function loginEvents()
  111.     repeat
  112.         event,v1,v2,v3,v4,v5=os.pullEvent()
  113.         if event=="char" then
  114.             loginType(v1)
  115.         elseif event=="mouse_click" then
  116.            
  117.            
  118.             button=v1
  119.             x=v2
  120.             y=v3
  121.             if button==1 then
  122.                 if x>=screenX/2-3 and x< screenX/2+6 and y==math.floor(screenY/2-2) then
  123.                     term.setCursorPos(screenX/2-2+string.len(userString),(screenY/2-2))
  124.                 elseif x>=screenX/2-3 and x< screenX/2+6 and y==math.floor(screenY/2+0) then
  125.                     term.setCursorPos(screenX/2-2+string.len(passString),(screenY/2+0))
  126.                 elseif x>=screenX/2+4 and x<screenX/2+9 and y==math.floor(screenY/2+2) then
  127.                     serialiseLogin()
  128.                 end        
  129.             end
  130.         elseif event=="key" then
  131.             key=v1
  132.             if key==14 then
  133.                 loginBackspace()
  134.             elseif key==15 then
  135.                 loginTab()
  136.             elseif key==28 then
  137.                 serialiseLogin()
  138.             end
  139.         elseif event=="timer" then
  140.             if v1==kickTimer then
  141.                 drawLogin()
  142.                 loginErrorMessage("  Your login was timed out!  ",2)
  143.                 kick()
  144.             end
  145.         end
  146.     until currentUser~=nil
  147. end
  148.  
  149. function serialiseLogin()
  150.     loggedIn=attemptLogin(userString,passString)
  151.     if not loggedIn then
  152.         loginErrorMessage(" Inorrect Password!  ",1)
  153.     end
  154. end
  155.  
  156. function attemptLogin(user,pass)
  157.     rednet.send(bankServerID,"testAccount "..user)
  158.     repeat
  159.         id,returnedMessage=rednet.receive(1)
  160.     until id==bankServerID or id==nil
  161.     if returnedMessage=="Account does not exist" then
  162.         rednet.send(bankServerID,"createAccount "..user..","..pass)
  163.         repeat
  164.             id,returnedMessage=rednet.receive(1)
  165.         until id==bankServerID or id==nil
  166.         if returnedMessage=="true" then
  167.             passLength=string.len(pass)
  168.             if passLength<8 then
  169.                 for i=1,8-passLength do
  170.                     pass=pass.." "
  171.                 end
  172.             end
  173.             login(user)
  174.         elseif id==nil then
  175.             loginErrorMessage("  Request timed out!  ",2)
  176.         else
  177.             loginErrorMessage("  An error occured  ",1)
  178.             loginErrorMessage("  Error #"..returnedMessage.."  ",2)
  179.         end
  180.         return true
  181.     elseif returnedMessage=="true" then
  182.         rednet.send(bankServerID,"requestPassword "..user..","..pass)
  183.         repeat
  184.             id,returnedMessage=rednet.receive(1)
  185.         until id==bankServerID
  186.         if returnedMessage=="true" then
  187.             login(user)
  188.             return true
  189.         else
  190.             return false
  191.         end
  192.        
  193.     elseif returnedMessage~="Incorrect password" then
  194.         loginErrorMessage("  An error occured  ",1)
  195.         if returnedMessage~=nil then
  196.             loginErrorMessage("  Error #"..returnedMessage.."  ",2)
  197.         end
  198.         return true
  199.     elseif id==nil then
  200.         loginErrorMessage("  Request timed out!  ",2)
  201.         return true
  202.     end
  203. end
  204.  
  205. function loginErrorMessage(message,timeOut)
  206.     if message~=nil then
  207.         oldX,oldY=term.getCursorPos()
  208.         term.setCursorBlink(false)
  209.         term.setCursorPos(screenX/2-string.len(message)/2,screenY/2+5)
  210.         term.setTextColor(16384)
  211.         term.setBackgroundColor(32768)
  212.         term.write(message)
  213.         sleep(timeOut)
  214.         term.setBackgroundColor(8)
  215.         term.setCursorPos(screenX/2-string.len(message)/2,screenY/2+5)
  216.         for i=1,string.len(message) do
  217.             term.write(" ")
  218.         end
  219.         term.setCursorPos(oldX,oldY)
  220.         term.setTextColor(32768)
  221.         term.setCursorBlink(true)
  222.     end
  223. end
  224.  
  225. function login(user)
  226.     rednet.send(bankServerID,"connect "..user)
  227.     repeat
  228.         id,returnedMessage=rednet.receive(1)
  229.     until id==bankServerID or id==nil
  230.     if id==nil then
  231.         loginErrorMessage("  Request timed out!  ",2)
  232.         return true
  233.     elseif returnedMessage~="true" then
  234.         loginErrorMessage(returnedMessage,2)
  235.     end
  236.     kickTimer=os.startTimer(25)
  237.     currentUser=user
  238.     term.setCursorBlink(false)
  239.     loginDrawn=false
  240.     currentDirectory=""
  241.     drawDesktop()  
  242.     desktopEvents()
  243. end
  244.  
  245. function loginType(char)
  246.     x,y=term.getCursorPos()
  247.    
  248.     if y==math.floor(screenY/2+0) and string.len(passString)<8  then
  249.         writeChar="*"
  250.         passString=passString..char
  251.     elseif string.len(userString)<8 then
  252.         writeChar=char
  253.         userString=userString..char
  254.     end
  255.     term.setBackgroundColor(1)
  256.     term.write(writeChar)
  257. end
  258.  
  259. function loginTab()
  260.     x,y=term.getCursorPos()
  261.     if y==screenY/2 then
  262.         term.setCursorPos(screenX/2-2+string.len(userString),(screenY/2-2))
  263.     else
  264.         term.setCursorPos(screenX/2-2+string.len(passString),(screenY/2+0))
  265.     end
  266. end
  267.  
  268. function loginBackspace()
  269.     x,y=term.getCursorPos()
  270.    
  271.     x,y=term.getCursorPos()
  272.     if x>=screenX/2-2 then
  273.         if y==screenY/2  then
  274.             passString=string.sub(passString,0,string.len(passString)-1)
  275.         elseif y==screenY/2-2 then
  276.             userString=string.sub(userString,0,string.len(userString)-1)
  277.         end
  278.         term.setBackgroundColor(1)
  279.         x,y=term.getCursorPos()
  280.         term.setCursorPos(x-1,y)
  281.         term.write(" ")
  282.         term.setCursorPos(x-1,y)
  283.     end
  284. end
  285.  
  286. function drawDesktop()
  287.     if currentUser==nil then
  288.         loginEvents()
  289.     else
  290.        
  291.         term.setBackgroundColor(desktopBackgroundColor) --Taskbar on top of the screen
  292.         touchScreenTable={}
  293.         term.clear()
  294.         term.setCursorPos(1,1)
  295.         term.setBackgroundColor(taskBarColor)
  296.         for i=1,screenX do
  297.             term.setCursorPos(i,1)
  298.             term.write(" ")
  299.             --term.setCursorPos(i,2)
  300.             --term.write(" ")
  301.         end
  302.         term.setCursorPos(1,1)
  303.         term.setBackgroundColor(menuButtonColor)
  304.         term.setTextColor(32768)
  305.         term.write("   Menu   ")
  306.         touchScreenTable["menu"]={1,1,10,0,false,mainMenuFunction}
  307.         term.setBackgroundColor(taskBarColor)
  308.         term.setCursorPos(screenX-10,1)
  309.         term.setTextColor(32768)
  310.         term.write(currentUser)
  311.         term.setBackgroundColor(8)
  312.         term.setTextColor(1)
  313.         term.setCursorPos(1,2)
  314.     end    
  315. end
  316.  
  317. function backFile()
  318.     touchScreenTable={}
  319.     drawDesktop()
  320. end
  321.  
  322. function mainMenuFunction()
  323.     if mainmenuShown==nil then
  324.         mainmenuShown=false
  325.     end
  326.    
  327.     if mainmenuShown==true then
  328.         touchScreenTable={}
  329.         drawDesktop()
  330.     else
  331.         term.setTextColor(1)
  332.         term.setCursorPos(1,1)
  333.         term.setBackgroundColor(menuColor)
  334.         term.write("   Menu   ")
  335.         term.setBackgroundColor(menuColor)
  336.         for i=1,3 do
  337.             term.setCursorPos(1,i+1)
  338.             term.write("          ")
  339.         end
  340.         term.setBackgroundColor(menuColor)
  341.         i=2
  342.         for name,data in pairs(mainMenuItems) do
  343.             term.setCursorPos(1,i)
  344.             term.setTextColor(data['c'])
  345.             nameLength=string.len(name)
  346.             if nameLength<9 then
  347.                 for g=1,9-nameLength do
  348.                     name=name.." "
  349.                 end
  350.             end
  351.             term.write(name)
  352.             if data['f']==nil then
  353.                 touchScreenTable[name]={1,i,9,0,true}
  354.             else
  355.                 touchScreenTable[name]={1,i,9,0,false,data['f']}
  356.             end
  357.             i=i+1
  358.         end
  359.     end
  360.     mainmenuShown=not mainmenuShown
  361. end
  362.  
  363. function desktopEvents()
  364.     while true do
  365.         event,v1,v2,v3,v4,v5=os.pullEvent()
  366.         if event=="mouse_click" then
  367.             button=v1
  368.             x=v2
  369.             y=v3
  370.             for id,data in pairs(touchScreenTable) do
  371.                 if button==1 and x>=math.floor(data[1]) and x<=math.floor(data[3]) and y>=math.floor(data[2]) and y<=math.floor(data[2]+data[4])  then
  372.                     if data[5] then
  373.                         termDisabled=false
  374.                         shell.run(currentDirectory.."/"..id)
  375.                         drawDesktop()
  376.                         termDisabled=true
  377.                     elseif fs.isDir(currentDirectory.."/"..id) then
  378.                         currentDirectory="users/"..currentUser.."/"..id
  379.                         drawDesktop()
  380.                         termDisabled=true
  381.                     else
  382.                         termDisabled=false
  383.                         data[6](id)
  384.                         termDisabled=true
  385.                     end
  386.                        
  387.                 end
  388.             end
  389.         elseif event=="char" then
  390.            
  391.         elseif event=="key" then
  392.            
  393.         elseif event=="timer" then
  394.             if v1==kickTimer then
  395.                 drawLogin()
  396.                 loginErrorMessage("  Your login was timed out!  ",2)
  397.                 kick()
  398.             end
  399.         end
  400.     end
  401. end
  402.  
  403. function startOS()
  404.     drawLogin()
  405.     loginEvents()
  406. end
  407.  
  408. startOS()
Add Comment
Please, Sign In to add comment