changeset 6310:92e2dcf039d9

mod_drop_chatstates: New module to drop chatstates for specific domains
author Chaz Kettleson <chaz@pyr3x.com>
date Sat, 02 Aug 2025 10:51:20 -0400
parents f4eba826a308
children 2525f247084c
files mod_drop_chatstates/README.md mod_drop_chatstates/mod_drop_chatstates.lua
diffstat 2 files changed, 51 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_drop_chatstates/README.md	Sat Aug 02 10:51:20 2025 -0400
@@ -0,0 +1,38 @@
+---
+labels:
+- 'Stage-Alpha'
+- 'Type-Web'
+summary: Drop chatstates for specific domains.
+rockspec:
+  build:
+    modules:
+      mod_drop_chatstates: mod_drop_chatstates.lua
+...
+
+Introduction
+============
+
+This is a Prosody module to drop chatstates for specific domains.
+
+Clients that request chatstates to virtual JIDs (i.e. those created by
+modules like mod\_voipms to send/receive SMS/MMS on domains like
+'sms.example.com') will, by design, receive errors indicating the
+service is unavailable. While most clients will silently ignore this,
+clients like profanity will not. This module allows us to drop responses
+for chatstates on selected domains if we know they will never respond.
+
+Configuration
+=============
+
+| option                    | type   | default | description
+|---------------------------|--------|---------|-------------------------------|
+| drop\_chatstates\_domains | table  | {}      | Domains to drop chatstates for
+
+Sample module configuration:
+
+```
+modules_enabled = {
+    "drop_chatstates";
+}
+drop_chatstates_domains = { "sms.example.com" }
+```
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_drop_chatstates/mod_drop_chatstates.lua	Sat Aug 02 10:51:20 2025 -0400
@@ -0,0 +1,13 @@
+local jid = require "util.jid"
+local st = require "util.stanza"
+
+local CHATSTATES_NS = "http://jabber.org/protocol/chatstates"
+local domains = module:get_option_set("drop_chatstates_domains", {})
+
+local function handle_pre_message(event)
+    local to_host = jid.host(stanza.attr.to)
+    if not to_host or not domains:contains(to_host) then return end
+    if event.stanza:get_child(nil, CHATSTATES_NS) then return true end
+end
+
+module:hook("pre-message/bare", handle_pre_message)