--- /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.
--- /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?