diff options
Diffstat (limited to 'strichliste.lua')
-rwxr-xr-x | strichliste.lua | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/strichliste.lua b/strichliste.lua new file mode 100755 index 0000000..6ad7d5f --- /dev/null +++ b/strichliste.lua @@ -0,0 +1,109 @@ +#!/usr/bin/env luajit + +local path = os.getenv("PATH_INFO") +local method = os.getenv("REQUEST_METHOD") + +local function escape(s) + return s:gsub("<", "<"):gsub("<", "<") +end + +local function respond(status, title, body) + print(string.format("Status: %d", status)) + print("Content-Type: text/html") + print("") + print(string.format([[ + <html><head> + <title>%s</title> + <meta charset="utf-8" /> + </head><body> + ]], escape(title))) + body() + print("</body></html>") +end + +local function respond_error(message) + respond(400, "Error", function() + print(string.format("<p>Error: %s</p>", escape(message))) + end) +end + +local function form_data() + local data = {} + for pair in string.gmatch(io.read(), "([^&]+)") do + local key, value = string.match(pair, "([^=]+)=([^=]+)") + if key == nil or value == nil then + goto continue + end + data[key] = value + ::continue:: + end + return data +end + +local function read_log() + local log = io.open("log", "r") + if log == nil then + return function() return nil end + end + local lines = log:lines("l") + return function() + local l = lines() + local time, username, amount, comment = string.match(l, "(%d+),([%w_-]+),(-?%d+),([%w_-]*)") + return tonumber(time), username, tonumber(amount), comment + end +end + +if path == "/" then + print("Status: 200 OK") + print("Content-Type: text/plain") + print("") +elseif path ~= nil then + local username = path:sub(2) + if username:match("^[%w_-]+$") == nil then + return respond_error("username invalid") + end + + if method == "POST" then + local data = form_data() + local amount = tonumber(data.amount) + if amount == nil then + return respond_error("amount invalid") + end + local comment = data.comment or "" + if comment:match("^[%w_-]*$") == nil then + return respond_error("comment invalid") + end + local log = io.open("log", "a+") + if log == nil then + return respond_error("failed to open log") + end + local time = os.time() + log:write(string.format("%d,%s,%s,%s\n", time, username, amount, comment)) + log:flush() + log:close() + end + + respond(200, username, function() + print(string.format("<h1>%s</h1>", username)) + print([[ + <form action="" method="POST"> + <label for="amount">Amount: </label> + <input type="number" name="amount" id="amount" /><br/> + <label for="comment">Comment: </label> + <input type="text" name="comment" id="comment" /><br/> + <input type="submit" value="Update" /> + </form> + ]]) + for _, type in ipairs({ 1, -1 }) do + for _, amount in ipairs({ 50, 100, 150, 200, 500, 1000 }) do + print(string.format([[ + <form action="" method="POST"> + <input type="number" name="amount" id="amount" value="%d" hidden /> + <input type="text" name="comment" id="comment" value="" hidden /> + <input type="submit" value="%s%.02f€" /> + </form> + ]], amount * type, ({ [-1] = "-", [1] = "+" })[type], amount / 100)) + end + end + end) +end |