View difference between Paste ID: 2qZ9qEVd and 52S1pDyN
SHOW: | | - or go back to the newest paste.
1
-- VARIABLES --
2
accountFile = "accounts.csv"
3
modemSide = "right"
4
logFile = "log.txt"
5
6
-- IMPORTS --
7-
local inspect = require("/modules/inspect")
7+
--local inspect = require("/modules/inspect")
8
9
10
-- UTILITY FUNCTIONS --
11
function split (inputstr, sep)
12
    if sep == nil then sep = "%s" end
13
    local t={}
14
    for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
15
        table.insert(t, str) end
16
    return t
17
end
18
19
function writeLog(msg,log)
20
    time = split(os.date())
21
    time = time[2]..time[3].." "..time[4]
22
    local log = log or logFile
23
    log = fs.open(log,"a")
24
    logString = ("["..time.."] "..msg)
25
    log.writeLine(logString)
26
    print(logString)
27
    log.close()
28
end
29
30
function tableLength(T)
31
    local count = 0
32
    for _ in pairs(T) do count = count + 1 end
33
    return count
34
end
35
36
function tableCompare(a,b)
37
    return tableToCSV(a) == tableToCSV(b)
38
end
39
40
function tableToCSV(dict) 
41
    local csvData = ""
42
    for _, a in ipairs(dict) do
43
        csvData = (csvData..(tostring(dict[a].name..","..dict[a].balance..","..dict[a].pass..","..dict[a].enabled..",nil\n")))
44
    end 
45
    return csvData
46
end
47
48
49
-- ACCOUNT CLASS --
50
Account = {name,balance,password,enabled}
51
52
function Account:authenticate(input,src)
53
    input = tostring(input)
54
    assert(tostring(input),"Invalid password format")
55
    assert(#input == 4,"Password must be 4 characters long")
56
    if self.pass == input then
57
        writeLog("["..src.."] "..self.name..":authenticate(SUCCESS)src=") 
58
        return true 
59
    else 
60
        writeLog("["..src.."] "..self.name..":authenticate(FAIL")
61
        return false 
62
    end
63
end
64
65
function Account:isEnabled(src)
66
    if self.enabled == 1 then
67
        return true else return false end
68
end
69
70
function Account:getBalance(src)
71
    writeLog("["..src.."] "..self.name..":getBalance($"..self.balance..")")
72
    return self.balance
73
end
74
75
function Account:send (recipient,amount,src)
76
    assert(type(recipient) == type(self), "recipient is invalid for transaction")
77
    self.balance = self.balance - amount
78
    recipient.balance = recipient.balance + amount
79
    writeLog("["..src.."] "..self.name..":send("..recipient.name..", $"..amount..")")
80
end    
81
82
83
-- ACCOUNT CREATION FUNCTION --
84
function generateAccounts()
85
86
    -- parse account csv
87
    local accountList = {}
88
    for line in io.lines(accountFile) do
89
       local name,balance,pass,enabled = line:match("%s*(.-),%s*(.-),%s*(.-),%s*(.-),%s*(.-)")
90
       accountList[#accountList + 1] = {name=name,balance=balance,pass=pass,enabled=enabled}
91
    end
92
    writeLog("generateAccounts(success)")
93
94
    -- Instantiate objects into a dictionary
95
    local accountListLen=tableLength(accountList)
96
    local accountsDict = {}
97
    for i=1, accountListLen do
98
        local account = accountList[i]
99
        local accountObj = {name=account.name,balance=account.balance,pass=account.pass,enabled=account.enabled}
100
        setmetatable(accountObj, {__index=Account})
101
        table.insert(accountsDict,account.name)
102
        accountsDict[account.name] = accountObj
103
    end   
104
    writeLog("instantiateAccounts(success)")
105
    return accountsDict
106
end
107
108
109
-- ACCOUNT FILE WRITEBACK --
110
function databaseWriteback (accountsDict)
111
    oldAccountsDict = generateAccounts()
112
    tablesMatch = tableCompare(oldAccountsDict, accountsDict)
113
    if not tablesMatch then
114
        csvData = tableToCSV(accountsDict)
115
        file = fs.open(accountFile, "w")
116
        file.write(csvData)
117
        writeLog("databaseWriteback(sucess)")
118
        file.close()
119
    else 
120
        writeLog("databaseWriteback(fail)")
121
        writeLog("Current account table matches old table, no changes made")
122
    end
123
end
124
125
126
127
128
-- Testing --
129
ID=14
130
port = "234265324534515762343289734906098437986128473623895734569823426324534512343289734906509843798612847362389573459823425676324534512343289734906098437986128473623895675734598"
131
rednet.open(modemSide)
132
133
while true do
134
    local id,msg,dist=rednet.receive(port)
135
    writeLog("["..id.."] ".."Inbound Command: "..msg)
136
    if msg == "auth" then
137
        clientID=id
138
        assert(loadfile("auth.lua"))(clientID)
139
    elseif msg == "send" then
140
       local a = generateAccounts()
141
       a["Phizx"]:send((a["PaullyBeenis"]), 5,id)
142
       databaseWriteback(a)
143
       send = ("sent $5 to PaullyBeenis")
144
       rednet.send(id, send, port)
145
    elseif msg == "balance" then
146
        local a = generateAccounts()
147
        send = ("Phizx's Balance: $"..a["Phizx"]:getBalance(id))
148
        rednet.send(id, send, port)
149
    else
150
        send = ("Invalid command, try again.")
151
        rednet.send(id, send, port)
152
    end
153
        
154
end
155
156