Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- fs = require("filesystem")
- component = require("component")
- jenisis = require("jenisis")
- modem = component.getPrimary("modem")
- textutils = require("serialization")
- event = require("event")
- term = require("term")
- function broadcast(packet)
- packet_ = textutils.serialize(packet)
- modem.broadcast(1024, packet_)
- end
- function receive()
- event_ = {event.pull("modem_message")}
- return textutils.unserialize(event_[6])
- end
- function check(accName)
- if fs.exists("/acc/"..accName) then
- print("Checked for "..accName..", found")
- return true
- else
- print("Checked for "..accName..", not found")
- return false
- end
- end
- function pullInfo(accName)
- if not check(accName) then
- return false
- end
- file = io.open("/acc/"..accName)
- acctable = textutils.unserialize(file:read("*a"))
- file:close()
- print("Pulled info for "..accName)
- return acctable
- end
- function writeInfo(acctable)
- if not check(acctable.accountName) then
- return false
- end
- file = io.open("/acc/"..acctable.accountName, "w")
- file:write(textutils.serialize(acctable))
- file:close()
- print("Wrote info for "..acctable.accountName)
- return true
- end
- function flag(accountname)
- if not check(accountname) then
- return false
- end
- accTable = pullInfo(accountname)
- if accTable.isFlagged then
- accTable.isFlagged = false
- else
- accTable.isFlagged = true
- end
- writeInfo(accTable)
- print("Modified flag state for "..accountname..", now "..tostring(accTable.isFlagged))
- return true
- end
- function recordTrans(flagee, addendum)
- if not fs.exists("/history/"..flagee) then
- mode = "w"
- else
- mode = "a"
- end
- file = io.open("/history/"..flagee, mode)
- file:write(flagee..addendum)
- file:close()
- print("Recorded transaction")
- return true
- end
- function transfer(accSendName, accTakeName, amount)
- if not check(accSendName.accountName) or not check(accTakeName) then
- print("Rejected transfer for nonexistent account")
- return false
- end
- accSend = pullInfo(accSendName.accountName)
- accTake = pullInfo(accTakeName)
- govAcc = pullInfo("government")
- if accSend.balance < amount then
- print("Transfer rejected for too low balance")
- return false
- elseif amount < 0 then
- print("Transfer rejected for negative transaction")
- return false
- elseif accSend.accountKey ~= accSendName.accountKey then
- print("Transfer rejected for failed authentications")
- return false
- end
- if accSend.isFlagged then
- recordTrans(accSend.accountName, " ("..amount..") -> "..accTake.accountName)
- elseif accTake.isFlagged then
- recordTrans(accTake.accountName, " ("..amount..") <- "..accSend.accountName)
- end
- if not accTake.isFront then
- accSend.balance = accSend.balance - amount
- accTake.balance = accTake.balance + (amount * 0.95)
- govAcc.balance = govAcc.balance + (amount * 0.05)
- writeInfo(accSend)
- writeInfo(accTake)
- writeInfo(govAcc)
- print("Did succesful transfer")
- return true
- else
- owners = accTake.owners
- for k, v in pairs(owners) do
- transfer(accSend, k, (amount * v))
- end
- return true
- end
- end
- function newAccount(accTable)
- for k, v in pairs(accTable) do
- if v == nil or v == "" then
- return false
- end
- end
- if check(accTable.accountName) then
- print("Failed creation for "..accTable.accountName..", already exists")
- return false
- else
- file = io.open("/acc/"..accTable.accountName, "w")
- file:write(textutils.serialize(accTable))
- file:close()
- print("Made new account titled "..accTable.accountName)
- return true
- end
- end
- function getMoney(accTable)
- if not check(accTable.accountName) then
- return false
- end
- account = pullInfo(accTable.accountName)
- if account.accountKey ~= accTable.accountKey then
- return false
- else
- print("Pulled account balance for "..accTable.accountName)
- return account.balance
- end
- end
- function doFront(accTable)
- if not check(accTable.accountName) then
- return false
- end
- acc = pullInfo(accTable.accountName)
- if acc.accountKey ~= accTable.accountKey then
- return false
- else
- acc.owners = accTable.owners
- end
- total = 0
- for k, v in pairs(acc.owners) do
- if not check(k) then
- return false
- end
- total = total + v
- end
- if total ~= 1 then
- print("Failed to set up front for "..acc.accountName..", not equal to 1")
- return false
- else
- acc.isFront = true
- writeInfo(acc)
- print("Set up front for "..acc.accountName)
- return true
- end
- end
- function getInfo(acctable)
- if not check(acctable.accountName) then
- return false
- end
- newacc = pullInfo(acctable.accountName)
- if acctable.accountKey == newacc.accountKey then
- print("Grabbed info for "..acctable.accountName)
- return newacc
- else
- print("Attempted info grab for "..acctable.accountName..", authentication failed.")
- return false
- end
- end
- function doOrder(account, amount, adminpass)
- if not check(account) then
- return false
- end
- if adminpass ~= "th1s1smy@dm1np@ssw0rd" then
- return false
- end
- accTable = pullInfo(account)
- accTable.balance = accTable.balance + amount
- writeInfo(accTable)
- print("Did order to "..account)
- return true
- end
- function auth(accTable)
- if not check(accTable.accountName) then
- return false
- end
- acctable = pullInfo(accTable.accountName)
- if acctable.accountKey == accTable.accountKey then
- print("Verified authentication for "..acctable.accountName)
- return true
- else
- print("Failed authentication for "..accTable.accountName)
- return false
- end
- end
- term.clear()
- print("Starting banking server. STOP LOOKING AT ME >:[")
- while true do
- message = receive()
- print("Message received: ")
- for k, v in ipairs(message) do
- print(k, v)
- if type(v) == "table" then
- for j, c in pairs(v) do
- print(j, c)
- end
- end
- end
- if type(message) == "table" then
- if message.type == "newaccount" then
- result = newAccount(message.account)
- broadcast(result)
- elseif message.type == "getfunds" then
- temp = pullInfo(message.target)
- broadcast(temp.balance)
- elseif message.type == "doorder" then
- result = doOrder(message.target, message.amount, message.masterpass)
- broadcast(result)
- elseif message.type == "transfer" then
- result = transfer(message.account, message.target, message.amount)
- broadcast(result)
- elseif message.type == "getinfo" then
- result = getInfo(message.account)
- broadcast(result)
- elseif message.type == "dofront" then
- result = doFront(message.account)
- broadcast(result)
- elseif message.type == "flag" then
- result = flag(message.target)
- broadcast(result)
- elseif message.type == "auth" then
- result = auth(message.account)
- broadcast(result)
- else
- broadcast("error")
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement