# HG changeset patch # User Kim Alvefur # Date 1529770114 -7200 # Node ID 774845606d73278778ab6022535d14f4b6818e80 # Parent 11087a72990b188cc09f57687e6afee9c9426795 mod_muc_badge: Generates a SVG badge with the number of occupants in rooms diff -r 11087a72990b -r 774845606d73 mod_muc_badge/README.markdown --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_muc_badge/README.markdown Sat Jun 23 18:08:34 2018 +0200 @@ -0,0 +1,25 @@ +--- +depends: +- 'mod\_http' +- 'mod\_muc' +provides: +- http +title: 'mod\_muc\_badge' +--- + +# Introduction + +This module generates a badge, similar the one + + +# Configuration + + Option Type Default + ------------------ -------- -------------------------- + `badge_label` string `"Chatroom"` + `badge_count` string `"%d online"` + `badge_template` string A SVG image (see source) + +The template must be valid XML. If it contains `{label}` then this is +replaced by `badge_label`, similarly, `{count}` is substituted by +`badge_count` with `%d` changed to the number of occupants. diff -r 11087a72990b -r 774845606d73 mod_muc_badge/mod_muc_badge.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_muc_badge/mod_muc_badge.lua Sat Jun 23 18:08:34 2018 +0200 @@ -0,0 +1,89 @@ +-- 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 label = module:get_option_string("badge_label", "Chatroom"); +local number = module:get_option_string("badge_count", "%d online"); + +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 response = event.response; + response.headers.content_type = "image/svg+xml"; + local svg = [[]] .. + tostring(template.apply({ + label = label; + number = string.format(number, count); + })); + return svg; + end; + } +});