Advertisement
Jonas_spielt

TerminalSoftware

Jan 7th, 2018
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 14.23 KB | None | 0 0
  1. if not fs.exists("crypt") then
  2.     shell.run("pastebin get STRXsMfE crypt")
  3. end
  4. os.loadAPI("crypt")
  5. tArgs = {...}
  6. local h = fs.open("terminal.config", "r")
  7. config = textutils.unserialize(h.readAll())
  8. h.close()
  9. local xsize, ysize = term.getSize()
  10. if term.isColor() then
  11.     green = colors.green
  12.     blue = colors.blue
  13.     red = colors.red
  14. else
  15.     green = colors.gray
  16.     blue = colors.lightGray
  17.     red = colors.black
  18. end
  19. local mon = peripheral.find("monitor")
  20. mon.setTextScale(0.5)
  21. nfc = false
  22. for k,v in pairs(peripheral.getNames()) do
  23.     if peripheral.getType(v) == "modem" and peripheral.call(v, "isWireless") == true then
  24.         nfc = true
  25.     end
  26. end
  27. local modem = peripheral.find("modem")
  28.  
  29. function randomNumber()
  30.     return tonumber(tostring({}):sub(8),16)
  31. end
  32.  
  33. function getBasestation()
  34.     local messg = {}
  35.     messg["Protocol"] = "LTE"
  36.     messg["Sender"] = os.getComputerID()..".bankomat.ctOS"
  37.     messg["Receipient"] = "BROADCAST"
  38.     messg["Request"] = "broadcast_station_ping"
  39.     messg["LTE"] = {}
  40.     messg["LTE"]["SI"] = "STATIC_TERMINAL"
  41.     if not modem.isOpen(1800) then
  42.         modem.open(1800)
  43.     end
  44.     local t = os.startTimer(2)
  45.     local returns = nil
  46.     local function a()
  47.         modem.transmit(1800, 1800, messg)
  48.         sleep(1)
  49.     end
  50.     local function b()
  51.         while true do
  52.             local sEvent, sModem, nChannel, nReplyChannel, tMessage = os.pullEvent()
  53.             if sEvent == "modem_message" and type(tMessage) == "table" and tMessage["Receipient"] == os.getComputerID()..".bankomat.ctOS" and tMessage["Request"] == "broadcast_station_pingres" then
  54.                 os.cancelTimer(t)
  55.                 returns = tMessage["Sender"]
  56.                 return
  57.             elseif sEvent == "timer" and sModem == t then
  58.                 term.redirect(mon)
  59.                 term.setBackgroundColor(colors.red)
  60.                 term.clear()
  61.                 term.setTextColor(colors.white)
  62.                 term.setCursorPos(5,5)
  63.                 term.write("Ausser")
  64.                 term.setCursorPos(5,6)
  65.                 term.write("Betrieb")
  66.                 sleep(5)
  67.                 os.reboot()
  68.                 return
  69.             end
  70.         end
  71.     end
  72.     parallel.waitForAny(a,b)
  73.     return returns
  74. end
  75. function networkRegistration()
  76.     local basestation = getBasestation()
  77.     local packet = {}
  78.     packet["Sender"] = os.getComputerID()..".bankomat.ctOS"
  79.     packet["Receipient"] = basestation
  80.     packet["Protocol"] = "LTE"
  81.     packet["LTE"] = {}
  82.     packet["LTE"]["Request"] = "LTE_CLIENT_REGISTER"
  83.     packet["LTE"]["SI"] = "STATIC_TERMINAL"
  84.     packet["LTE"]["Static"] = true
  85.     packet["Data"] = crypt.encrypt("LTE_INTERN_HELLO", "STATIC_TERMINAL")
  86.     modem.transmit(1800, 1800, packet)
  87.     local timer = os.startTimer(5)
  88.     while true do
  89.         local event, p1, p2, p3, p4 = os.pullEvent()
  90.         if event == "modem_message" and type(p4) == "table" and p4["Receipient"] == os.getComputerID()..".bankomat.ctOS" and p4["Sender"] == basestation and p4["LTE"]["Request"] == "LTE_CLIENT_WELCOME" then
  91.             break
  92.         elseif event == "timer" and p1 == timer then
  93.             term.redirect(mon)
  94.             term.setBackgroundColor(colors.red)
  95.             term.clear()
  96.             term.setTextColor(colors.white)
  97.             term.setCursorPos(5,5)
  98.             term.write("Ausser")
  99.             term.setCursorPos(5,6)
  100.             term.write("Betrieb")
  101.             sleep(5)
  102.             os.reboot()
  103.             break
  104.         end
  105.     end
  106. end
  107.  
  108. function drawInterface( ... )
  109.     term.setBackgroundColor(colors.white)
  110.     term.clear()
  111.     paintutils.drawLine(1,1,xsize,1,blue)
  112.     term.setBackgroundColor(blue)
  113.     term.setTextColor(colors.white)
  114.     term.setCursorPos(2,1)
  115.     term.write("OBK")
  116.     if nfc then
  117.         term.setCursorPos(xsize-5,1)
  118.         term.write(")))")
  119.     end
  120.     term.setCursorPos(xsize/2-10,ysize/2-4)
  121.     term.setTextColor(colors.black)
  122.     term.setBackgroundColor(colors.white)
  123.     term.write("Bitte Aktion waehlen")
  124.     term.setBackgroundColor(colors.lightGray)
  125.     term.setTextColor(colors.white)
  126.     term.setCursorPos(xsize/2-9,ysize/2)
  127.     term.write("Zahlung")
  128.     term.setCursorPos(xsize/2-1,ysize/2)
  129.     term.write("Gutschrift")
  130.     local typ = ""
  131.     while true do
  132.         local event, button, x, y = os.pullEvent("mouse_click")
  133.         if x >= math.floor(xsize/2-9) and x <= math.floor(xsize/2-3) and y == math.floor(ysize/2) then
  134.             typ = "zahlung"
  135.             break
  136.         elseif x >= math.floor(xsize/2-1) and x <= math.floor(xsize/2+8) and y == math.floor(ysize/2) then
  137.             typ = "gutschrift"
  138.             break
  139.         end
  140.     end
  141.     paintutils.drawFilledBox(1,2,xsize,ysize,colors.white)
  142.     term.setCursorPos(xsize/2-11,ysize/2-4)
  143.     term.setTextColor(colors.black)
  144.     term.setBackgroundColor(colors.white)
  145.     term.write("Zahlungsbetrag waehlen")
  146.     term.setCursorPos(xsize/2-4,ysize/2)
  147.     term.write("EUR ")
  148.     term.setTextColor(blue)
  149.     local betrag = read()
  150.     paintutils.drawFilledBox(1,2,xsize,ysize,colors.white)
  151.     term.setCursorPos(xsize/2-12,ysize/2-4)
  152.     term.setTextColor(colors.black)
  153.     term.setBackgroundColor(colors.white)
  154.     term.write("Verwendungszweck angeben")
  155.     term.setCursorPos(xsize/2-6,ysize/2)
  156.     term.setTextColor(blue)
  157.     local text = read()
  158.     paintutils.drawFilledBox(1,2,xsize,ysize,colors.white)
  159.     term.setCursorPos(xsize/2-9,ysize/2)
  160.     term.write("Zahlungsvorgang...")
  161.     if typ == "zahlung" then
  162.         startTransaktion(tonumber(betrag),text)
  163.     elseif typ == "gutschrift" then
  164.         startGutschrift(tonumber(betrag), text)
  165.     end
  166. end
  167.  
  168. diskdrive = nil
  169. function waitForCard()
  170.     modem.open(50)
  171.     while true do
  172.         local event, modemSide, channel, rchannel, message, dist = os.pullEvent()
  173.         if event == "modem_message" and channel == 50 and message["Request"] == "Bankomat.NFC.Pay" and dist < 4 then
  174.             return message["Data"]
  175.         elseif event == "disk" then
  176.             diskdrive = modemSide
  177.             if disk.hasData(modemSide) and fs.exists("disk/.bankomat") then
  178.                 local h = fs.open("disk/.bankomat", "r")
  179.                 local x = h.readAll()
  180.                 h.close()
  181.                 return x
  182.             else
  183.                 disk.eject(modemSide)
  184.             end
  185.         end
  186.     end
  187. end
  188.  
  189. function startTransaktion(betrag, text)
  190.     mon.setBackgroundColor(colors.white)
  191.     mon.clear()
  192.     local prev = term.redirect(mon)
  193.     local x,y = term.getSize()
  194.     paintutils.drawLine(1,1,xsize,1,colors.blue)
  195.     term.setTextColor(colors.white)
  196.     term.setCursorPos(1,1)
  197.     term.write("OBK")
  198.     term.setCursorPos(x-3,1)
  199.     if nfc then
  200.         term.write(")))")
  201.     end
  202.     local str = betrag.." EUR"
  203.     term.setCursorPos(math.ceil(x/2-math.ceil(string.len(str)/2)),3)
  204.     term.setBackgroundColor(colors.white)
  205.     term.setTextColor(colors.blue)
  206.     term.write(betrag)
  207.     term.setTextColor(colors.black)
  208.     term.write(" EUR")
  209.     term.setCursorPos(math.ceil(x/2-5),y-3)
  210.     term.write("Bitte Karte")
  211.     term.setCursorPos(math.ceil(x/2-6),y-2)
  212.     term.write("eingeben oder")
  213.     term.setCursorPos(math.ceil(x/2-5),y-1)
  214.     term.write("NFC starten")
  215.     local card = waitForCard()
  216.     paintutils.drawFilledBox(1,2,x,y,colors.white)
  217.     term.setCursorPos(1,y/2)
  218.     term.write("Autorisierung...")
  219.     modem.open(config["Anschluss"])
  220.     local msg = {}
  221.     msg["Protocol"] = "Bankomat"
  222.     msg["Sender"] = os.getComputerID()..".network.ctOS"
  223.     msg["Receipient"] = "server.bankomat.ctOS"
  224.     msg["Request"] = "User.newTransaktion"
  225.     local tablex = {}
  226.     tablex[1] = card
  227.     tablex[2] = config["Kontonummer"]
  228.     tablex[3] = text
  229.     tablex[4] = betrag
  230.     msg["Data"] = tablex
  231.     msg["nMessageID"] = randomNumber()
  232.     msg["ResponseID"] = msg["nMessageID"] + 1
  233.     if config["Anschluss"] == 1800 then
  234.         networkRegistration()
  235.         msg["Data"] = crypt.encrypt(msg["Data"], "STATIC_TERMINAL")
  236.         msg["LTE"] = {}
  237.         msg["LTE"]["SI"] = "STATIC_TERMINAL"
  238.     end
  239.     modem.transmit(config["Anschluss"], config["Anschluss"], msg)
  240.     while true do
  241.         local event, modemSide, channel, rchannel, mseg = os.pullEvent("modem_message")
  242.         if mseg["Request"] == "User.newTransaktion.Response" and mseg["Sender"] == "server.bankomat.ctOS" and mseg["nMessageID"] == msg["ResponseID"] then
  243.             if config["Anschluss"] == 1800 then
  244.                     mseg["Data"] = crypt.decrypt(mseg["Data"], "STATIC_TERMINAL")
  245.                 end
  246.             if mseg["Data"] == true then
  247.                 paintutils.drawFilledBox(1,2,x,y,colors.white)
  248.                 term.setCursorPos(1,y/2)
  249.                 term.write("Zahlung erfolgt")
  250.                 term.redirect(prev)
  251.                 paintutils.drawFilledBox(1,2,xsize,ysize,colors.white)
  252.                 term.setCursorPos(xsize/2-7,ysize/2)
  253.                 term.write("Zahlung erfolgt")
  254.                 if type(diskdrive) ~= "nil" then
  255.                     disk.eject(diskdrive)
  256.                 end
  257.                 local printer = peripheral.find("printer")
  258.                 if printer ~= nil then
  259.                     if printer.newPage() then
  260.                         local xp, yp = printer.getPageSize()
  261.                         printer.setCursorPos(1,1)
  262.                         printer.write(string.rep("-",xp))
  263.                         printer.setCursorPos(xp/2-6,2)
  264.                         printer.write("Zahlungsbeleg")
  265.                         printer.setCursorPos(1,3)
  266.                         printer.write(string.rep("-",xp))
  267.                         printer.setCursorPos(2,5)
  268.                         printer.write("TerminalID: #"..os.getComputerID())
  269.                         printer.setCursorPos(2,7)
  270.                         printer.write("Zeitstempel: "..os.day().." "..textutils.formatTime(os.time(),true))
  271.                         printer.setCursorPos(2,9)
  272.                         printer.write("Empfaenger: "..config["Kontonummer"])
  273.                         printer.setCursorPos(2,11)
  274.                         printer.write("Sender: "..card)
  275.                         printer.setCursorPos(2,13)
  276.                         printer.write("Verwendungszweck:")
  277.                         printer.setCursorPos(2,14)
  278.                         printer.write(text)
  279.                         local str = "EUR "..betrag
  280.                         printer.setCursorPos(xp/2-(string.len(str)/2),16)
  281.                         printer.write(str)
  282.                         printer.setPageTitle("Zahlungsbeleg")
  283.                         printer.endPage()
  284.                     end
  285.                 end
  286.                 return true
  287.             else
  288.                 if type(diskdrive) ~= "nil" then
  289.                     disk.eject(diskdrive)
  290.                 end
  291.                 paintutils.drawFilledBox(1,2,x,y,colors.white)
  292.                 term.setCursorPos(1,y/2)
  293.                 term.write("Zahlungsfehler")
  294.                 term.redirect(prev)
  295.                 paintutils.drawFilledBox(1,2,xsize,ysize,colors.white)
  296.                 term.setCursorPos(xsize/2-7,ysize/2)
  297.                 term.write("Zahlungsfehler")
  298.                 return false
  299.             end
  300.             break
  301.         end
  302.     end
  303.     sleep(5)
  304.     term.setBackgroundColor(colors.black)
  305.     term.clear()
  306.     term.setCursorPos(1,1)
  307.     return
  308. end
  309.  
  310. function startGutschrift(betrag, text)
  311.     mon.setBackgroundColor(colors.white)
  312.     mon.clear()
  313.     local prev = term.redirect(mon)
  314.     local x,y = term.getSize()
  315.     paintutils.drawLine(1,1,xsize,1,colors.blue)
  316.     term.setTextColor(colors.white)
  317.     term.setCursorPos(1,1)
  318.     term.write("OBK")
  319.     term.setCursorPos(x-3,1)
  320.     if nfc then
  321.         term.write(")))")
  322.     end
  323.     local str = "+"..betrag.." EUR"
  324.     term.setCursorPos(math.ceil(x/2-math.ceil(string.len(str)/2)),3)
  325.     term.setBackgroundColor(colors.white)
  326.     term.setTextColor(colors.blue)
  327.     term.write("+"..betrag)
  328.     term.setTextColor(colors.black)
  329.     term.write(" EUR")
  330.     term.setCursorPos(math.ceil(x/2-5),y-3)
  331.     term.write("Bitte Karte")
  332.     term.setCursorPos(math.ceil(x/2-6),y-2)
  333.     term.write("eingeben oder")
  334.     term.setCursorPos(math.ceil(x/2-5),y-1)
  335.     term.write("NFC starten")
  336.     local card = waitForCard()
  337.     paintutils.drawFilledBox(1,2,x,y,colors.white)
  338.     term.setCursorPos(1,x/2)
  339.     term.write("Autorisierung...")
  340.     local modem = peripheral.find("modem")
  341.     modem.open(config["Anschluss"])
  342.     local msg = {}
  343.     msg["Protocol"] = "Bankomat"
  344.     msg["Sender"] = os.getComputerID()..".network.ctOS"
  345.     msg["Receipient"] = "server.bankomat.ctOS"
  346.     msg["Request"] = "User.newTransaktion"
  347.     local tablex = {}
  348.     tablex[1] = config["Kontonummer"]
  349.     tablex[2] = card
  350.     tablex[3] = text
  351.     tablex[4] = betrag
  352.     msg["Data"] = tablex
  353.     msg["nMessageID"] = randomNumber()
  354.     msg["ResponseID"] = msg["nMessageID"] + 1
  355.     if config["Anschluss"] == 1800 then
  356.         networkRegistration()
  357.         msg["Data"] = crypt.encrypt(msg["Data"], "STATIC_TERMINAL")
  358.         msg["LTE"] = {}
  359.         msg["LTE"]["SI"] = "STATIC_TERMINAL"
  360.     end
  361.     modem.transmit(config["Anschluss"], config["Anschluss"], msg)
  362.     while true do
  363.         local event, modemSide, channel, rchannel, mseg = os.pullEvent("modem_message")
  364.         if mseg["Request"] == "User.newTransaktion.Response" and mseg["Sender"] == "server.bankomat.ctOS" and mseg["nMessageID"] == msg["ResponseID"] then
  365.             if config["Anschluss"] == 1800 then
  366.                     mseg["Data"] = crypt.decrypt(mseg["Data"], "STATIC_TERMINAL")
  367.                 end
  368.             if mseg["Data"] == true then
  369.                 paintutils.drawFilledBox(1,2,x,y,colors.white)
  370.                 term.setCursorPos(3,y/2)
  371.                 term.write("Gutschrift")
  372.                 term.setCursorPos(4,y/2+1)
  373.                 term.write("erfolgt")
  374.                 term.redirect(prev)
  375.                 paintutils.drawFilledBox(1,2,xsize,ysize,colors.white)
  376.                 term.setCursorPos(xsize/2-9,ysize/2)
  377.                 term.write("Gutschrift erfolgt")
  378.                 if type(diskdrive) ~= "nil" then
  379.                     disk.eject(diskdrive)
  380.                 end
  381.                 local printer = peripheral.find("printer")
  382.                 if printer ~= nil then
  383.                     if printer.newPage() then
  384.                         local xp, yp = printer.getPageSize()
  385.                         printer.setCursorPos(1,1)
  386.                         printer.write(string.rep("-",xp))
  387.                         printer.setCursorPos(xp/2-6,2)
  388.                         printer.write("Zahlungsbeleg")
  389.                         printer.setCursorPos(1,3)
  390.                         printer.write(string.rep("-",xp))
  391.                         printer.setCursorPos(2,5)
  392.                         printer.write("TerminalID: #"..os.getComputerID())
  393.                         printer.setCursorPos(2,7)
  394.                         printer.write("Zeitstempel: "..os.day().." "..textutils.formatTime(os.time(),true))
  395.                         printer.setCursorPos(2,9)
  396.                         printer.write("Empfaenger: "..card)
  397.                         printer.setCursorPos(2,11)
  398.                         printer.write("Sender: "..config["Kontonummer"])
  399.                         printer.setCursorPos(2,13)
  400.                         printer.write("Verwendungszweck:")
  401.                         printer.setCursorPos(2,14)
  402.                         printer.write(text)
  403.                         local str = "EUR "..betrag
  404.                         printer.setCursorPos(xp/2-(string.len(str)/2),16)
  405.                         printer.write(str)
  406.                         printer.setPageTitle("Zahlungsbeleg")
  407.                         printer.endPage()
  408.                     end
  409.                 end
  410.                 return true
  411.             else
  412.                 if type(diskdrive) ~= "nil" then
  413.                     disk.eject(diskdrive)
  414.                 end
  415.                 paintutils.drawFilledBox(1,2,x,y,colors.white)
  416.                 term.setCursorPos(2,y/2)
  417.                 term.write("Zahlungsfehler")
  418.                 term.redirect(prev)
  419.                 paintutils.drawFilledBox(1,2,xsize,ysize,colors.white)
  420.                 term.setCursorPos(xsize/2-7,ysize/2)
  421.                 term.write("Zahlungsfehler")
  422.                 return false
  423.             end
  424.             break
  425.         end
  426.     end
  427.     sleep(5)
  428.     term.setBackgroundColor(colors.black)
  429.     term.clear()
  430.     term.setCursorPos(1,1)
  431.     return
  432. end
  433.  
  434. if type(tArgs) == "table" and type(tArgs[1]) ~= "nil" then
  435.     term.setBackgroundColor(colors.white)
  436.     term.clear()
  437.     paintutils.drawLine(1,1,xsize,1,blue)
  438.     term.setBackgroundColor(blue)
  439.     term.setTextColor(colors.white)
  440.     term.setCursorPos(2,1)
  441.     term.write("OBK")
  442.     if nfc then
  443.         term.setCursorPos(xsize-5,1)
  444.         term.write(")))")
  445.     end
  446.     paintutils.drawFilledBox(1,2,xsize,ysize,colors.white)
  447.     term.setCursorPos(xsize/2-9,ysize/2)
  448.     term.setTextColor(blue)
  449.     term.write("Zahlungsvorgang...")
  450.     if tonumber(tArgs[1]) > 0 then
  451.         return startTransaktion(tonumber(tArgs[1]), tArgs[2])
  452.     else
  453.         return startGutschrift(math.abs(tonumber(tArgs[1])), tArgs[2])
  454.     end
  455. else
  456.     if shell then
  457.         drawInterface()
  458.     end
  459. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement