diff options
-rwxr-xr-x | strichliste.lua | 88 |
1 files changed, 67 insertions, 21 deletions
diff --git a/strichliste.lua b/strichliste.lua index 959cc87..f7bef9c 100755 --- a/strichliste.lua +++ b/strichliste.lua @@ -28,6 +28,12 @@ local function respond_error(message) end) end +local function redirect(path) + print("Status: 307") + print(string.format("Location: %s", path)) + print() +end + local function form_data() local data = {} for pair in string.gmatch(io.read(), "([^&]+)") do @@ -62,27 +68,10 @@ local function balances() return users end -if path == "/" then - if query == "?log" then - return respond(200, "Log", function() - print("<table>") - print("<tr><th>Time</th><th>Username</th><th>Amount</th><th>Comment</th></tr>") - for time, username, amount, comment in read_log() do - print(string.format("<tr><td>%d</td><td>%s</td><td>%.02f€</td><td>%s</td></tr>", time, escape(username), - amount / 100, escape(comment))) - end - print("</table>") - end) +local function r_user() + if path == nil then + return respond_error("no path") end - return respond(200, "Users", function() - print("<ul>") - for username, balance in balances() do - print(string.format("<li><a href=\"/%s\">%s</a>: %.02f€</li>", escape(username), escape(username), - balance / 100)) - end - print("</ul>") - end) -elseif path ~= nil then local username = path:sub(2) if username:match("^[%w_-]+$") == nil then return respond_error("username invalid") @@ -108,8 +97,10 @@ elseif path ~= nil then log:close() end - respond(200, username, function() + return respond(200, username, function() print(string.format("<h1>%s</h1>", username)) + local balance = balances()[username] or 0 + print(string.format("Current balance: %.02f", balance / 100)) print([[ <form action="" method="POST"> <label for="amount">Amount: </label> @@ -132,3 +123,58 @@ elseif path ~= nil then end end) end + +local function r_log() + return respond(200, "Log", function() + print("<table>") + print("<tr><th>Time</th><th>Username</th><th>Amount</th><th>Comment</th></tr>") + for time, username, amount, comment in read_log() do + print(string.format("<tr><td>%d</td><td>%s</td><td>%.02f€</td><td>%s</td></tr>", time, escape(username), + amount / 100, escape(comment))) + end + print("</table>") + end) +end + +local function r_index() + return respond(200, "Users", function() + print([[ + <form action="/" method="GET"> + <label for="username">Username: </label> + <input type="text" name="create_user" id="username" /><br/> + <input type="submit" value="Create" /> + </form> + ]]) + print("<ul>") + for username, balance in pairs(balances()) do + print(string.format("<li><a href=\"/%s\">%s</a>: %.02f€</li>", escape(username), escape(username), + balance / 100)) + end + print("</ul>") + end) +end + +local function r_create_user() + if query == nil then + return respond_error("no query") + end + local username = query:match("^\\?create_user=([%w_-]+)$") + if username == nil then + return respond_error("invalid username") + end + return redirect(string.format("/%s", username)) +end + +if path == "/" then + if query == "?log" then + return r_log() + elseif query ~= nil and query:match("^\\?create_user=") then + return r_create_user() + else + return r_index() + end +else + r_user() +end + +return respond_error("unknown route") |