Guest User

server

a guest
Jan 18th, 2016
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.37 KB | None | 0 0
  1. term.clear()
  2. term.setCursorPos(1,1)
  3.  
  4. --os.loadAPI("/sha")
  5. --os.loadAPI("/AES")
  6.  
  7. for _, side in pairs(redstone.getSides()) do
  8.   if peripheral.getType(side) == "modem" then
  9.     rednet.open(side)
  10.   end
  11. end
  12.  
  13. if not rednet.isOpen() then
  14.   print("No rednet modem found")
  15.   return
  16. end
  17.  
  18. local function generateKey()
  19.   return math.floor(os.time()*os.getComputerID()/12)
  20. end
  21.  
  22. print("Rednet open")
  23.  
  24. rednet.host("ebay_server", "main_server")
  25.  
  26. local running = true
  27. local quit = false
  28.  
  29. local servers = {}
  30.  
  31. local function contains(tbl, val)
  32.   for i = 1, #tbl do
  33.     if tbl[i] == val then
  34.       return true, i
  35.     end
  36.   end
  37. end
  38.  
  39. local function check(clientid)
  40.   if #servers == 0 then
  41.     rednet.send(clientid, "$no_servers")
  42.     return false
  43.   end
  44.   return true
  45. end
  46.  
  47. local function request(req)
  48.   local rem = {}
  49.   for i = 1, #servers do
  50.     rednet.send(servers[i], req, "ebay_server")
  51.     local id, mes = rednet.receive("ebay_server_"..servers[i], 3)
  52.     if not id then
  53.       print("Removing ".. servers[i] ..": Outdated server or offline")
  54.       table.insert(rem, i)
  55.     else
  56.       return true, mes
  57.     end
  58.   end
  59.   if #rem ~= 0 then
  60.     for i = 1, #rem do
  61.       table.remove(servers, rem[i])
  62.     end
  63.   end
  64.   return false
  65. end
  66.  
  67. local function good(mes)
  68.   term.setTextColour(colours.green)
  69.   print("["..textutils.formatTime(os.time()).."] [GOOD] "..mes)
  70. end
  71.  
  72. local function info(mes)
  73.   term.setTextColour(colours.white)
  74.   print("["..textutils.formatTime(os.time()).."] [INFO] "..mes)
  75. end
  76.  
  77. local function sev(mes)
  78.   term.setTextColour(colours.red)
  79.   print("["..textutils.formatTime(os.time()).."] [SEVR] "..mes)
  80. end
  81.  
  82. local function split(str, sep)
  83.   local t = {}
  84.   local i = 1
  85.   for str in string.gmatch(str, "([^"..sep.."]+)") do
  86.     t[i] = str
  87.     i = i + 1
  88.   end
  89.   return t
  90. end
  91.  
  92. local function getUser(username, usrs)
  93.   if #usrs == 0 then return nil end
  94.   for i = 1, #usrs do
  95.     if usrs[i].name == username then return users[i] end
  96.   end
  97.   return nil
  98. end
  99.  
  100. local function beginsWith(str, bg)
  101.   if #str < #bg then return false end
  102.   if string.sub(str, 1, #bg) == bg then return true end
  103.   return false
  104. end
  105.  
  106. if not fs.exists("/disk/users") then
  107.   local file = fs.open("/disk/users", "w")
  108.   file.write("{}")
  109.   file.close()
  110. end
  111.  
  112. if not fs.exists("/disk/offers") then
  113.   local file = fs.open("/disk/offers", "w")
  114.   file.write("{}")
  115.   file.close()  
  116. end
  117.  
  118. file = fs.open("/disk/users", "r")
  119. local users = loadstring("return ".. file.readAll())()
  120. file.close()
  121.  
  122. file = fs.open("/disk/offers", "r")
  123. local offers = loadstring("return ".. file.readAll())()
  124. file.close()
  125.  
  126. info(#users .. " users loaded")
  127. info(#offers .. " offers loaded")
  128.  
  129. while running do
  130.  
  131.   local ev = { os.pullEvent() }
  132.  
  133.   if ev[1] == "key" then
  134.     if ev[2] == keys.t and not quit then
  135.       good("Press 'down' to quit")
  136.       quit = true
  137.     elseif ev[2] == keys.down and quit then
  138.       good("Terminated")
  139.       rednet.unhost("ebay_server", "main_server")
  140.       for i = 1, #servers do
  141.         rednet.send(servers[i], "$mainserver_shutdown", "ebay_server")
  142.       end
  143.      
  144.       local offersF = fs.open("/disk/offers", "w")
  145.       offersF.write(textutils.serialise(offers))
  146.       offersF.close()
  147.      
  148.       local usersF = fs.open("/disk/users", "w")
  149.       usersF.write(textutils.serialise(users))
  150.       usersF.close()
  151.      
  152.       running = false
  153.     else
  154.       quit = false
  155.     end
  156.   end
  157.  
  158.   if ev[1] == "rednet_message" then
  159.     if ev[4] == "ebay_server" then
  160.       if ev[3] == "$boot_server_"..generateKey() then
  161.         info("Registering server ".. ev[2])
  162.         local cont, index = contains(servers, ev[2])
  163.         if cont then table.remove(servers, index) end
  164.         table.insert(servers, ev[2])
  165.       elseif ev[3] == "$shutdown_server" then
  166.         local cont, index = contains(servers, ev[2])
  167.         if not cont then
  168.           sev("Invalid shutdown post")
  169.         else
  170.           info("Removed ".. ev[2])
  171.           table.remove(servers, index)
  172.         end
  173.       end
  174.     elseif ev[4] == "ebay_client" then
  175.       if ev[3] == "$get_status" then
  176.         if #servers == 0 then
  177.           rednet.send(ev[2], "$no_servers", "ebay_server")
  178.         else
  179.           rednet.send(ev[2], "$online", "ebay_server")
  180.         end
  181.       elseif ev[3] == "$get_offers" then
  182.         if not fs.exists("/disk/offers") then
  183.           sev("Database is gone!")
  184.         else
  185.           rednet.send(ev[2], textutils.serialise(offers), "ebay_server")
  186.           good("Deliver offers to ".. ev[2] .. ": Success")
  187.         end
  188.       elseif string.sub(ev[3], 1, 9) == "$register" then
  189.         info("Incoming register request")
  190.         local rest = string.sub(ev[3], 10)
  191.         local cred = split(rest, " ")
  192.        
  193.         if #cred ~= 2 then
  194.           rednet.send(ev[2], "$err_bad_format")
  195.           sev("Received invalid formatted register request from "..ev[2].." too many arguments: ".. #cred)
  196.         else
  197.           local usrname = cred[1]
  198.           local pass = cred[2]
  199.           --local pass = AES.decrypt("bananaserver", passenc)
  200.          
  201.           local user = getUser(usrname, users)
  202.           if user then
  203.             rednet.send(ev[2], "$err_username_used")
  204.             info("Couldn't create user '".. usrname .."' because username was taken.")
  205.           else
  206.             local newuser = {
  207.               name=usrname,
  208.               password=sha.sha1(pass)
  209.             }
  210.             table.insert(users, newuser)
  211.             rednet.send(ev[2], "$user_created")
  212.             good("User '".. usrname .. "' created")
  213.           end
  214.         end
  215.       elseif string.sub(ev[3],1,9) == "$addOffer" then
  216.         info("Incoming add offer request")
  217.         local rest = string.sub(ev[3], 10)
  218.         local cred = split(rest, " ")
  219.         if #cred ~= 3 or not tonumber(cred[1]) or not tonumber(cred[3]) then
  220.           rednet.send(ev[2],"$err_bad_format")
  221.           sev("Received invalid formatted add offer")
  222.           print("'".. cred[1] .. "'")
  223.           print("'".. cred[2] .. "'")
  224.           print("'".. cred[3] .. "'")
  225.         else
  226.           local newOffer = {
  227.              cost=tonumber(cred[1]),
  228.              name=cred[2],
  229.              stock=tonumber(cred[3])
  230.           }
  231.           table.insert(offers, newOffer)
  232.           rednet.send(ev[2], "$offer_created")
  233.           good("Offer created, creator ID: ".. ev[2])
  234.         end
  235.       end
  236.     end
  237.   end
  238. end
Add Comment
Please, Sign In to add comment