aboutsummaryrefslogtreecommitdiff
path: root/strichliste.lua
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-10-30 02:00:27 +0100
committermetamuffin <metamuffin@disroot.org>2024-10-30 02:00:27 +0100
commit6e0afc292b908005788e7580a1cae1ffc35268a8 (patch)
tree88519030576d2ea10cab4099ceb10c2d45dc180e /strichliste.lua
downloadabrechenbarkeit-6e0afc292b908005788e7580a1cae1ffc35268a8.tar
abrechenbarkeit-6e0afc292b908005788e7580a1cae1ffc35268a8.tar.bz2
abrechenbarkeit-6e0afc292b908005788e7580a1cae1ffc35268a8.tar.zst
a
Diffstat (limited to 'strichliste.lua')
-rwxr-xr-xstrichliste.lua109
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("<", "&lt;"):gsub("<", "&lt;")
+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