Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- term.clear()
- term.setCursorPos(1,1)
- --os.loadAPI("/sha")
- --os.loadAPI("/AES")
- for _, side in pairs(redstone.getSides()) do
- if peripheral.getType(side) == "modem" then
- rednet.open(side)
- end
- end
- if not rednet.isOpen() then
- print("No rednet modem found")
- return
- end
- local function generateKey()
- return math.floor(os.time()*os.getComputerID()/12)
- end
- print("Rednet open")
- rednet.host("ebay_server", "main_server")
- local running = true
- local quit = false
- local servers = {}
- local function contains(tbl, val)
- for i = 1, #tbl do
- if tbl[i] == val then
- return true, i
- end
- end
- end
- local function check(clientid)
- if #servers == 0 then
- rednet.send(clientid, "$no_servers")
- return false
- end
- return true
- end
- local function request(req)
- local rem = {}
- for i = 1, #servers do
- rednet.send(servers[i], req, "ebay_server")
- local id, mes = rednet.receive("ebay_server_"..servers[i], 3)
- if not id then
- print("Removing ".. servers[i] ..": Outdated server or offline")
- table.insert(rem, i)
- else
- return true, mes
- end
- end
- if #rem ~= 0 then
- for i = 1, #rem do
- table.remove(servers, rem[i])
- end
- end
- return false
- end
- local function good(mes)
- term.setTextColour(colours.green)
- print("["..textutils.formatTime(os.time()).."] [GOOD] "..mes)
- end
- local function info(mes)
- term.setTextColour(colours.white)
- print("["..textutils.formatTime(os.time()).."] [INFO] "..mes)
- end
- local function sev(mes)
- term.setTextColour(colours.red)
- print("["..textutils.formatTime(os.time()).."] [SEVR] "..mes)
- end
- local function split(str, sep)
- local t = {}
- local i = 1
- for str in string.gmatch(str, "([^"..sep.."]+)") do
- t[i] = str
- i = i + 1
- end
- return t
- end
- local function getUser(username, usrs)
- if #usrs == 0 then return nil end
- for i = 1, #usrs do
- if usrs[i].name == username then return users[i] end
- end
- return nil
- end
- local function beginsWith(str, bg)
- if #str < #bg then return false end
- if string.sub(str, 1, #bg) == bg then return true end
- return false
- end
- if not fs.exists("/disk/users") then
- local file = fs.open("/disk/users", "w")
- file.write("{}")
- file.close()
- end
- if not fs.exists("/disk/offers") then
- local file = fs.open("/disk/offers", "w")
- file.write("{}")
- file.close()
- end
- file = fs.open("/disk/users", "r")
- local users = loadstring("return ".. file.readAll())()
- file.close()
- file = fs.open("/disk/offers", "r")
- local offers = loadstring("return ".. file.readAll())()
- file.close()
- info(#users .. " users loaded")
- info(#offers .. " offers loaded")
- while running do
- local ev = { os.pullEvent() }
- if ev[1] == "key" then
- if ev[2] == keys.t and not quit then
- good("Press 'down' to quit")
- quit = true
- elseif ev[2] == keys.down and quit then
- good("Terminated")
- rednet.unhost("ebay_server", "main_server")
- for i = 1, #servers do
- rednet.send(servers[i], "$mainserver_shutdown", "ebay_server")
- end
- local offersF = fs.open("/disk/offers", "w")
- offersF.write(textutils.serialise(offers))
- offersF.close()
- local usersF = fs.open("/disk/users", "w")
- usersF.write(textutils.serialise(users))
- usersF.close()
- running = false
- else
- quit = false
- end
- end
- if ev[1] == "rednet_message" then
- if ev[4] == "ebay_server" then
- if ev[3] == "$boot_server_"..generateKey() then
- info("Registering server ".. ev[2])
- local cont, index = contains(servers, ev[2])
- if cont then table.remove(servers, index) end
- table.insert(servers, ev[2])
- elseif ev[3] == "$shutdown_server" then
- local cont, index = contains(servers, ev[2])
- if not cont then
- sev("Invalid shutdown post")
- else
- info("Removed ".. ev[2])
- table.remove(servers, index)
- end
- end
- elseif ev[4] == "ebay_client" then
- if ev[3] == "$get_status" then
- if #servers == 0 then
- rednet.send(ev[2], "$no_servers", "ebay_server")
- else
- rednet.send(ev[2], "$online", "ebay_server")
- end
- elseif ev[3] == "$get_offers" then
- if not fs.exists("/disk/offers") then
- sev("Database is gone!")
- else
- rednet.send(ev[2], textutils.serialise(offers), "ebay_server")
- good("Deliver offers to ".. ev[2] .. ": Success")
- end
- elseif string.sub(ev[3], 1, 9) == "$register" then
- info("Incoming register request")
- local rest = string.sub(ev[3], 10)
- local cred = split(rest, " ")
- if #cred ~= 2 then
- rednet.send(ev[2], "$err_bad_format")
- sev("Received invalid formatted register request from "..ev[2].." too many arguments: ".. #cred)
- else
- local usrname = cred[1]
- local pass = cred[2]
- --local pass = AES.decrypt("bananaserver", passenc)
- local user = getUser(usrname, users)
- if user then
- rednet.send(ev[2], "$err_username_used")
- info("Couldn't create user '".. usrname .."' because username was taken.")
- else
- local newuser = {
- name=usrname,
- password=sha.sha1(pass)
- }
- table.insert(users, newuser)
- rednet.send(ev[2], "$user_created")
- good("User '".. usrname .. "' created")
- end
- end
- elseif string.sub(ev[3],1,9) == "$addOffer" then
- info("Incoming add offer request")
- local rest = string.sub(ev[3], 10)
- local cred = split(rest, " ")
- if #cred ~= 3 or not tonumber(cred[1]) or not tonumber(cred[3]) then
- rednet.send(ev[2],"$err_bad_format")
- sev("Received invalid formatted add offer")
- print("'".. cred[1] .. "'")
- print("'".. cred[2] .. "'")
- print("'".. cred[3] .. "'")
- else
- local newOffer = {
- cost=tonumber(cred[1]),
- name=cred[2],
- stock=tonumber(cred[3])
- }
- table.insert(offers, newOffer)
- rednet.send(ev[2], "$offer_created")
- good("Offer created, creator ID: ".. ev[2])
- end
- end
- end
- end
- end
Add Comment
Please, Sign In to add comment