-- MIT License -- -- Copyright (c) 2018 Kim Alvefur -- -- Permission is hereby granted, free of charge, to any person obtaining a copy -- of this software and associated documentation files (the "Software"), to deal -- in the Software without restriction, including without limitation the rights -- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -- copies of the Software, and to permit persons to whom the Software is -- furnished to do so, subject to the following conditions: -- -- The above copyright notice and this permission notice shall be included in -- all copies or substantial portions of the Software. -- -- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. module:depends"http"; local jid_prep = require "util.jid".prep; -- Support both old and new MUC code local mod_muc = module:depends"muc"; local rooms = rawget(mod_muc, "rooms"); local get_room_from_jid = rawget(mod_muc, "get_room_from_jid") or function (jid) return rooms[jid]; end -- I believe the origins of this template to be in the public domain as per -- https://github.com/badges/shields/blob/master/LICENSE.md local template = module:get_option_string("badge_template", [[ {label} {label} {number} {number} ]]); template = assert(require "util.template"(template)); local number = module:get_option_string("badge_count", "%d online"); local charwidth = 7; module:provides("http", { route = { ["GET /*"] = function (event, path) local jid = jid_prep(path); if not jid then return end local room = get_room_from_jid(jid); if not room then return end if (room.get_hidden or room.is_hidden)(room) then return end local count = 0; for _ in pairs(room._occupants) do count = count + 1; end local badge_label = (" %s "):format(room:get_name()); local badge_count = (" %s "):format(string.format(number, count)); local response = event.response; response.headers.content_type = "image/svg+xml"; local svg = [[]] .. tostring(template.apply({ label = badge_label; number = badge_count; width = ("%d"):format( (#badge_label + #badge_count) * charwidth ); labelwidth = ("%d"):format( #badge_label * charwidth ); countwidth = ("%d"):format( #badge_count * charwidth ); })); return svg; end; } });