Mercurial Hosting > linkmystyle
view src/lib/Icon.luan @ 0:8f4df159f06b
start public repo
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Fri, 11 Jul 2025 20:57:49 -0600 |
parents | |
children |
line wrap: on
line source
local Luan = require "luan:Luan.luan" local error = Luan.error local ipairs = Luan.ipairs or error() local Number = require "luan:Number.luan" local long = Number.long or error() local float = Number.float or error() local Db = require "site:/lib/Db.luan" local Icon = {} local icon_names = { applemusic = { title = "Apple Music" placeholder = "https://music.apple.com/" } cashapp = { title = "Cashapp" placeholder = "https://cash.app/$username" } discord = { title = "Discord" placeholder = "https://discord.com/invite/yourchannel" } email = { title = "Email" placeholder = "you@email.com" type = "email" } facebook = { title = "Facebook" placeholder = "https://facebook.com/facebookpageurl" } instagram = { title = "Instagram" placeholder = "https://www.instagram.com/username" } patreon = { title = "Patreon" placeholder = "https://patreon.com/" } pinterest = { title = "Pinterest" placeholder = "https://www.pinterest.com/username/" } paypal = { title = "PayPal" placeholder = "https://www.paypal.me/username" } reddit = { title = "Reddit" placeholder = "https://www.reddit.com/" } snapchat = { title = "Snapchat" placeholder = "https://www.snapchat.com/add/username" } soundcloud = { title = "SoundCloud" placeholder = "https://soundcloud.com/username" } spotify = { title = "Spotify" placeholder = "https://open.spotify.com/artist/artistname" } threads = { title = "Threads" placeholder = "https://www.threads.net/@username" } tiktok = { title = "TikTok" placeholder = "https://www.tiktok.com/@username" } twitch = { title = "Twitch" placeholder = "https://twitch.tv/" } twitter = { title = "Twitter" placeholder = "https://twitter.com/username" } youtube = { title = "YouTube" placeholder = "https://youtube.com/channel/youtubechannelurl" } } Icon.icon_names = icon_names local function from_doc(doc) doc.type == "icon" or error "wrong type" return Icon.new { id = doc.id name = doc.icon_name url = doc.url user_id = doc.icon_user_id order = doc.icon_order } end Icon.from_doc = from_doc local function to_doc(icon) return { type = "icon" id = icon.id icon_name = icon.name or error() url = icon.url or error() icon_user_id = long(icon.user_id) icon_order = float(icon.order) } end function Icon.new(icon) function icon.save() local doc = to_doc(icon) Db.save(doc) icon.id = doc.id end function icon.title_attr() return [[title="]]..icon_names[icon.name].title..[["]] end function icon.move_after(prev) local icons = Icon.get_user_icons(icon.user_id) if prev == nil then icon.order = icons[1].order - 1 else icon.owner_id==prev.owner_id or error() for i, x in ipairs(icons) do if prev.id == x.id then if i == #icons then icon.order = prev.order + 1 else local next = icons[i+1] icon.order = (prev.order + next.order) / 2 end return end end error() end end return icon end function Icon.get_by_id(id) local doc = Db.get_document("id:"..id) return doc and from_doc(doc) end local function from_docs(docs) local icons = {} for _, doc in ipairs(docs) do local icon = from_doc(doc) icons[#icons+1] = icon end return icons end function Icon.get_user_icons(user_id) local docs = Db.search("icon_user_id:"..user_id,1,1000,{sort="icon_order"}) return from_docs(docs) end return Icon