Mercurial > prosody-modules
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)
