# HG changeset patch # User Kim Alvefur # Date 1457958972 -3600 # Node ID 73096d8d924c38ff0c95f0b2e7561e71c407c0e4 # Parent a435db77a5e5a804291049cd7b61516e764aa628 mod_track_muc_joins: Module to keep track of joined MUC rooms diff -r a435db77a5e5 -r 73096d8d924c mod_track_muc_joins/README.markdown --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_track_muc_joins/README.markdown Mon Mar 14 13:36:12 2016 +0100 @@ -0,0 +1,7 @@ +--- +summary: Keep track of joined chat rooms +... + +This module attempts to keep track of what MUC chat rooms users have +joined. It's not very useful on its own, but can be used by other +modules to influence decisions. diff -r a435db77a5e5 -r 73096d8d924c mod_track_muc_joins/mod_track_muc_joins.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_track_muc_joins/mod_track_muc_joins.lua Mon Mar 14 13:36:12 2016 +0100 @@ -0,0 +1,37 @@ + +module:hook("presence/full", function (event) + local stanza = event.stanza; + local session = sessions[stanza.attr.to]; + if not session then return end; + local log = session.log or module._log; + local muc_x = stanza:get_child("x", "http://jabber.org/protocol/muc#user"); + if not muc_x then return end -- Not MUC related + + local room = jid_bare(stanza.attr.from); + local joined = stanza.attr.type; + if joined == nil then + joined = true; + elseif joined == "unavailable" then + joined = nil; + else + -- Ignore errors and whatever + return; + end + + -- Check for status code 100, meaning it's their own reflected presence + for status in muc_x:childtags("status") do + log("debug", "Status code %d", status.attr.code); + if status.attr.code == "110" then + log("debug", "%s room %s", joined and "Joined" or "Left", room); + local rooms = session.rooms_joined; + if not rooms then + session.rooms_joined = { [room] = joined }; + else + rooms[room] = joined; + end + return; + end + end +end); + +-- TODO Check session.directed for outgoing presence?