Mercurial Hosting > disearch
changeset 13:af2b95854072
add server records
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 30 Oct 2023 21:32:42 -0600 |
parents | 3e2cb946d511 |
children | 80105b716a62 |
files | src/add_server.js.luan src/choose_server.html.luan src/delete_server.js.luan src/lib/Db.luan src/lib/Server.luan src/lib/Shared.luan src/lib/Utils.luan src/servers.html.luan |
diffstat | 8 files changed, 177 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/src/add_server.js.luan Mon Oct 30 14:59:45 2023 -0600 +++ b/src/add_server.js.luan Mon Oct 30 21:32:42 2023 -0600 @@ -6,6 +6,11 @@ local Http = require "luan:http/Http.luan" local Shared = require "site:/lib/Shared.luan" local js_error = Shared.js_error or error() +local Server = require "site:/lib/Server.luan" +local Utils = require "site:/lib/Utils.luan" +local get_user = Utils.get_user or error() +local Db = require "site:/lib/Db.luan" +local run_in_transaction = Db.run_in_transaction or error() local Logging = require "luan:logging/Logging.luan" local logger = Logging.logger "add_server.js" @@ -25,6 +30,16 @@ js_error( "invite", [[Invalid Discord invite URL]] ) return end + run_in_transaction( function() + local server = Server.new{ + owner_discord_id = get_user() or error() + discord_id = id + name = name + icon = icon + invite = invite + } + server.save() + end ) %> location = '/servers.html'; <%
--- a/src/choose_server.html.luan Mon Oct 30 14:59:45 2023 -0600 +++ b/src/choose_server.html.luan Mon Oct 30 21:32:42 2023 -0600 @@ -15,6 +15,9 @@ local header = Shared.header or error() local footer = Shared.footer or error() local Config = require "site:/lib/Config.luan" +local Utils = require "site:/lib/Utils.luan" +local list_to_set = Utils.list_to_set or error() +local Server = require "site:/lib/Server.luan" local Logging = require "luan:logging/Logging.luan" local logger = Logging.logger "choose_server.html" @@ -61,9 +64,15 @@ -- logger.info(result) result = json_parse(result) -- logger.info(stringify(result)) + + local set = list_to_set{} + for _, server in ipairs(Server.get_user_servers()) do + set[server.discord_id] = true + end + local servers = {} for _, server in ipairs(result) do - if server.owner then + if server.owner and not set[server.id] then servers[#servers+1] = server end end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/delete_server.js.luan Mon Oct 30 21:32:42 2023 -0600 @@ -0,0 +1,19 @@ +local Luan = require "luan:Luan.luan" +local error = Luan.error +local Io = require "luan:Io.luan" +local Http = require "luan:http/Http.luan" +local Server = require "site:/lib/Server.luan" +local Utils = require "site:/lib/Utils.luan" +local get_user = Utils.get_user or error() + + +return function() + local server_id = Http.request.parameters.server or error() + local server = Server.get_by_id(server_id) + server.owner_discord_id == get_user() or error() + server.delete() + Io.stdout = Http.response.text_writer() +%> + location.reload(); +<% +end
--- a/src/lib/Db.luan Mon Oct 30 14:59:45 2023 -0600 +++ b/src/lib/Db.luan Mon Oct 30 21:32:42 2023 -0600 @@ -18,6 +18,8 @@ name = "lucene" } ) +Db.indexed_fields.server_owner_discord_id = Lucene.type.string + function Db.not_in_transaction() logger.error(new_error("not in transaction")) end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/lib/Server.luan Mon Oct 30 21:32:42 2023 -0600 @@ -0,0 +1,84 @@ +local Luan = require "luan:Luan.luan" +local error = Luan.error +local ipairs = Luan.ipairs or error() +local Db = require "site:/lib/Db.luan" +local Utils = require "site:/lib/Utils.luan" +local get_user = Utils.get_user or error() + + +local Server = {} + +local function from_doc(doc) + doc.type == "server" or error "wrong type" + return Server.new { + id = doc.id + owner_discord_id = doc.server_owner_discord_id + discord_id = doc.discord_id + name = doc.name + icon = doc.icon + invite = doc.invite + } +end + +local function to_doc(server) + return { + type = "server" + id = server.id + server_owner_discord_id = server.owner_discord_id or error() + discord_id = server.discord_id or error() + name = server.name or error() + icon = server.icon or error() + invite = server.invite or error() + } +end + +function Server.new(server) + + function server.save() + local doc = to_doc(server) + Db.save(doc) + server.id = doc.id + end + + function server.reload() + return Server.get_by_id(server.id) or error(server.id) + end + + function server.delete() + Db.run_in_transaction( function() + Db.delete("id:"..server.id) + end ) + end + + function server.write_img_html() + %><img icon src="https://cdn.discordapp.com/icons/<%=server.discord_id%>/<%=server.icon%>.png"><% + end + + function server.invite_url() + return "https://discord.gg/"..server.invite + end + + return server +end + +function Server.get_by_id(id) + local doc = Db.get_document("id:"..id) + return doc and from_doc(doc) +end + +local function search(query,sort,rows) + rows = rows or 1000000 + local docs = Db.search(query,1,rows,{sort=sort}) + local servers = {} + for _, doc in ipairs(docs) do + local server = from_doc(doc) + servers[#servers+1] = server + end + return servers +end + +function Server.get_user_servers() + return search( "server_owner_discord_id:"..get_user() ) +end + +return Server
--- a/src/lib/Shared.luan Mon Oct 30 14:59:45 2023 -0600 +++ b/src/lib/Shared.luan Mon Oct 30 21:32:42 2023 -0600 @@ -4,17 +4,14 @@ local Parsers = require "luan:Parsers.luan" local json_string = Parsers.json_string or error() local Http = require "luan:http/Http.luan" +local Utils = require "site:/lib/Utils.luan" +local get_user = Utils.get_user or error() local Shared = {} local started = Time.now() -local function get_user() - return Http.request.cookies.user -end -Shared.get_user = get_user - function Shared.head() %> <meta name="viewport" content="width=device-width, initial-scale=1">
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/lib/Utils.luan Mon Oct 30 21:32:42 2023 -0600 @@ -0,0 +1,28 @@ +local Luan = require "luan:Luan.luan" +local error = Luan.error +local ipairs = Luan.ipairs or error() +local set_metatable = Luan.set_metatable or error() +local Http = require "luan:http/Http.luan" + + +local Utils = {} + +function Utils.get_user() + return Http.request.cookies.user +end + +local set_mt = {} +function set_mt.__index(table,key) + return false +end + +function Utils.list_to_set(list) + local set = {} + for _, v in ipairs(list) do + set[v] = true + end + set_metatable(set,set_mt) + return set +end + +return Utils
--- a/src/servers.html.luan Mon Oct 30 14:59:45 2023 -0600 +++ b/src/servers.html.luan Mon Oct 30 21:32:42 2023 -0600 @@ -1,14 +1,19 @@ local Luan = require "luan:Luan.luan" local error = Luan.error +local ipairs = Luan.ipairs or error() +local Html = require "luan:Html.luan" +local html_encode = Html.encode or error() local Io = require "luan:Io.luan" local Http = require "luan:http/Http.luan" local Shared = require "site:/lib/Shared.luan" local head = Shared.head or error() local header = Shared.header or error() local footer = Shared.footer or error() +local Server = require "site:/lib/Server.luan" return function() + local servers = Server.get_user_servers() Io.stdout = Http.response.text_writer() %> <!doctype html> @@ -21,7 +26,18 @@ <% header() %> <h1>Your servers</h1> - +<% + for _, server in ipairs(servers) do +%> + <p> + <%=html_encode(server.name)%> + <% server.write_img_html() %> + <a href="<%=server.invite_url()%>">invite</a> + <a href="javascript:ajax('/delete_server.js?server=<%=server.id%>')">delete</a> + </p> +<% + end +%> <p><a href="choose_server.html">add server</a></p> <% footer() %>