Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- VARIABLES --
- accountFile = "accounts.csv"
- modemSide = "right"
- logFile = "log.txt"
- -- IMPORTS --
- local inspect = require("/modules/inspect")
- -- UTILITY FUNCTIONS --
- function split (inputstr, sep)
- if sep == nil then sep = "%s" end
- local t={}
- for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
- table.insert(t, str) end
- return t
- end
- function writeLog(msg,log)
- time = split(os.date())
- time = time[2]..time[3].." "..time[4]
- local log = log or logFile
- log = fs.open(log,"a")
- logString = ("["..time.."] "..msg)
- log.writeLine(logString)
- print(logString)
- log.close()
- end
- function tableLength(T)
- local count = 0
- for _ in pairs(T) do count = count + 1 end
- return count
- end
- function tableCompare(a,b)
- return tableToCSV(a) == tableToCSV(b)
- end
- function tableToCSV(dict)
- local csvData = ""
- for _, a in ipairs(dict) do
- csvData = (csvData..(tostring(dict[a].name..","..dict[a].balance..","..dict[a].pass..","..dict[a].enabled..",nil\n")))
- end
- return csvData
- end
- -- ACCOUNT CLASS --
- Account = {name,balance,password,enabled}
- function Account:authenticate(input,src)
- input = tostring(input)
- assert(tostring(input),"Invalid password format")
- assert(#input == 4,"Password must be 4 characters long")
- if self.pass == input then
- writeLog("["..src.."] "..self.name..":authenticate(SUCCESS)src=")
- return true
- else
- writeLog("["..src.."] "..self.name..":authenticate(FAIL")
- return false
- end
- end
- function Account:isEnabled(src)
- if self.enabled == 1 then
- return true else return false end
- end
- function Account:getBalance(src)
- writeLog("["..src.."] "..self.name..":getBalance($"..self.balance..")")
- return self.balance
- end
- function Account:send (recipient,amount,src)
- assert(type(recipient) == type(self), "recipient is invalid for transaction")
- self.balance = self.balance - amount
- recipient.balance = recipient.balance + amount
- writeLog("["..src.."] "..self.name..":send("..recipient.name..", $"..amount..")")
- end
- -- ACCOUNT CREATION FUNCTION --
- function generateAccounts()
- -- parse account csv
- local accountList = {}
- for line in io.lines(accountFile) do
- local name,balance,pass,enabled = line:match("%s*(.-),%s*(.-),%s*(.-),%s*(.-),%s*(.-)")
- accountList[#accountList + 1] = {name=name,balance=balance,pass=pass,enabled=enabled}
- end
- writeLog("generateAccounts(success)")
- -- Instantiate objects into a dictionary
- local accountListLen=tableLength(accountList)
- local accountsDict = {}
- for i=1, accountListLen do
- local account = accountList[i]
- local accountObj = {name=account.name,balance=account.balance,pass=account.pass,enabled=account.enabled}
- setmetatable(accountObj, {__index=Account})
- table.insert(accountsDict,account.name)
- accountsDict[account.name] = accountObj
- end
- writeLog("instantiateAccounts(success)")
- return accountsDict
- end
- -- ACCOUNT FILE WRITEBACK --
- function databaseWriteback (accountsDict)
- oldAccountsDict = generateAccounts()
- tablesMatch = tableCompare(oldAccountsDict, accountsDict)
- if not tablesMatch then
- csvData = tableToCSV(accountsDict)
- file = fs.open(accountFile, "w")
- file.write(csvData)
- writeLog("databaseWriteback(sucess)")
- file.close()
- else
- writeLog("databaseWriteback(fail)")
- writeLog("Current account table matches old table, no changes made")
- end
- end
- -- Testing --
- ID=14
- port = "234265324534515762343289734906098437986128473623895734569823426324534512343289734906509843798612847362389573459823425676324534512343289734906098437986128473623895675734598"
- rednet.open(modemSide)
- while true do
- local id,msg,dist=rednet.receive(port)
- writeLog("["..id.."] ".."Inbound Command: "..msg)
- if msg == "auth" then
- clientID=id
- assert(loadfile("auth.lua"))(clientID)
- elseif msg == "send" then
- local a = generateAccounts()
- a["Phizx"]:send((a["PaullyBeenis"]), 5,id)
- databaseWriteback(a)
- send = ("sent $5 to PaullyBeenis")
- rednet.send(id, send, port)
- elseif msg == "balance" then
- local a = generateAccounts()
- send = ("Phizx's Balance: $"..a["Phizx"]:getBalance(id))
- rednet.send(id, send, port)
- else
- send = ("Invalid command, try again.")
- rednet.send(id, send, port)
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement