mirror of
https://codeberg.org/metamuffin/abrechenbarkeit.git
synced 2024-12-28 07:54:35 +00:00
a
This commit is contained in:
commit
6e0afc292b
3 changed files with 112 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
/log
|
2
gnix.yaml
Normal file
2
gnix.yaml
Normal file
|
@ -0,0 +1,2 @@
|
|||
http: { bind: "0.0.0.0:8080" }
|
||||
handler: !cgi { bin: ./strichliste.lua }
|
109
strichliste.lua
Executable file
109
strichliste.lua
Executable file
|
@ -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
|
Loading…
Reference in a new issue