мы хотим создать простой серверный компонент для ejabberd , который получает все сообщения, отправленные в MU C комнаты (у нас много комнат, и все время создаются новые ) и после обработки некоторых из этих сообщений выполняет некоторые операции.
Мы не хотим, чтобы наш серверный компонент действовал как бот, поэтому мы не хотим, чтобы он отвечал на сообщения или тому подобное, мы просто хотим, чтобы он получал копии всех сообщений для обработки некоторых из них.
Чтобы сделать это, мы следовали учебному пособию, доступному здесь: https://sleekxmpp.readthedocs.io/en/latest/getting_started/component.html
Проблема в том, что компонент, кажется, получает только некоторые сообщения (примерно 1 из 5).
Кроме того, мы наблюдаем странное поведение: доставка сообщения кажется «исключительной», что означает, что сообщение доставляется либо клиентам, подключенным к комнате, либо компоненту сервера, что странно, если честно. Другими словами, 1 сообщение из 5 доставляется на серверный компонент, а остальные 4 доставляются клиентам как обычно.
Вот наш код компонента (мы пробовали с обоими sleekxmpp и slixmpp, но у нас всегда одинаковое поведение):
import sys
import logging
#import sleekxmpp
#from sleekxmpp.componentxmpp import ComponentXMPP
import slixmpp
from slixmpp.componentxmpp import ComponentXMPP
if sys.version_info < (3, 0):
from sleekxmpp.util.misc_ops import setdefaultencoding
setdefaultencoding('utf8')
else:
raw_input = input
class NotificationsComponent(ComponentXMPP):
def __init__(self):
ComponentXMPP.__init__(self, "muc.ourservice.it", "secret", "jabber.ourservice.it", 5233)
# add handler
self.add_event_handler("message", self.message)
#self.add_event_handler("groupchat_message", self.message)
def message(self, msg):
if msg['type'] == 'groupchat':
print('Received group chat message')
print(msg)
#msg.reply('Well received').send()
else:
print('Received another message')
if __name__ == '__main__':
logging.basicConfig(level=logging.DEBUG,format='%(levelname)-8s %(message)s')
xmpp = NotificationsComponent()
xmpp.register_plugin('xep_0030') # Service Discovery
#xmpp.register_plugin('xep_0004') # Data Forms
#xmpp.register_plugin('xep_0060') # PubSub
xmpp.register_plugin('xep_0199') # XMPP Ping
#xmpp.register_plugin('xep_0045') # MUC
# Connect to the XMPP server and start processing XMPP stanzas.
xmpp.connect()
xmpp.process()
и вот фрагмент нашей конфигурации ejabberd 18.03:
listen:
-
port: 5222
ip: "::"
module: ejabberd_c2s
starttls: true
certfile: 'CERTFILE'
protocol_options: 'TLSOPTS'
## dhfile: 'DHFILE'
## ciphers: 'CIPHERS'
##
## To enforce TLS encryption for client connections,
## use this instead of the "starttls" option:
##
starttls_required: true
##
## Stream compression
##
zlib: true
##
max_stanza_size: 65536
shaper: none
access: c2s
-
port: 5280
ip: "::"
module: ejabberd_http
request_handlers:
"/admin": ejabberd_web_admin
"/bosh": mod_bosh
#request_handlers:
# "/ws": ejabberd_http_ws
# "/bosh": mod_bosh
# "/api": mod_http_api
## "/pub/archive": mod_http_fileserver
web_admin: true
http_bind: true
## register: true
captcha: false
certfile: 'CERTFILE'
tls: true
-
port: 5233
ip: "::"
module: ejabberd_service
access: all
privilege_access:
message: "outgoing"
password: "secret"
shaper: none
мы также пытались поиграть с доступом, privilege_access и такие вещи, но не повезло.
У вас есть идеи, что может вызвать это странное поведение? Есть ли какой-нибудь конкретный плагин или модуль, который должен быть включен?
Конечно, мы включили журналы отладки как в sleekxmpp, так и в ejabberd, но мы не видим никаких ошибок, просто сообщения отсутствуют.
Мы также сделали еще один тест. Даже используя официальный пример "echo component", доступный в репозитории slixmpp, мы сталкиваемся с той же проблемой. Похоже, что на нашем сервере есть какая-то проблема, возможно, в части маршрутизации сообщений, мы не знаем.
Спасибо