Open vietnguyen87 opened 2 months ago
@prefiks, @badlop Please help.!
So in other words you created room with create_room_with_opts
with subscribers and then when you sent message to a room using command (what exactly command?), that didn't get delivered to subscriber from create command, yes? I am just trying to see what i need to do to reproduce it.
yup, @prefiks i used two ways:
<message to='room3@conference.localhost' type='groupchat' id='e23ff0a35b4e9150' xml:lang='en'><body>testing </body></message>
It's working in my tests, you are aware that mucsub will not send regular groupchat message, but event with wrapped message like this:
<message to='prefiks@localhost' from='sub2@conference.localhost' id='1713861977424826' xmlns='jabber:client'>
<event xmlns='http://jabber.org/protocol/pubsub#event'>
<items node='urn:xmpp:mucsub:nodes:messages'>
<item id='1713861977424826'>
<message to='prefiks@localhost' from='sub2@conference.localhost/p2' type='groupchat' id='10483677060557293314' xmlns='jabber:client'><body>test</body>
</message>
</item>
</items>
</event>
</message>
hi @prefiks, i call Admin Api send-stanza https://docs.ejabberd.im/developer/ejabberd-api/admin-api/#send-stanza
<message to='7214252@localhost' from='room3@conference.localhost' id='1713865884466642' xmlns='jabber:client'><event xmlns='http://jabber.org/protocol/pubsub#event'><items node='urn:xmpp:mucsub:nodes:messages'><item id='1713865884466642'><message to='7214252@localhost' from='room3@conference.localhost/7238854' type='groupchat' id='1713865884466642' xmlns='jabber:client'><body>test</body></message></item></items></event></message>
but it did not work. I can't receive the message at SSE connection. Data has stored at db.
So that message that i showed in previous message was a result of calling
ejabberdctl send_message groupchat user@localhost sub2@conference.localhost "" test
and that resulted in sending that event to subscribers in a room.
I think your ejabberd sends event like this too, but your SSE server doesn't recognize it. Are you able to see all traffic that your code receive?
hi @prefiks, i can see the traffic come ejabberd server. I think SSE server doesn't recognize it because it's not auto join when a new group created. When i reconnect SSE and join all group that user subscribe then message receive.
ejabberdctl send_message groupchat 7238854@localhost room2@conference.localhost "" TestBody
Hi @prefiks,
Even if I reuse the xmpp client id in the call flow through the Chat APIs Server to join the room i created.
I also did not receive the message when I sent it.
send_message groupchat 7238854@localhost room4@conference.localhost "" TestBody
From admin website no any users join the room
So about send_message not sending message to a room, user that you use in 'from' must be room subscriber or muc admin, only those two classes can send message without joining room first.
hi @prefiks, Are these users who subscribe to the room?
When i created the room. all users are become subscriber.
Yes that list of room subscribers.
yeah, and i using 7238854@localhost 7238854 is a room subscriber to sending message to the room. But all other subscribers don't receive messages.
If i'm not join the room, i'm not receive the history message. I don't know if I did something wrong? Please help.
I don't know, do you have anything logged by server when you call that?
yes, when i call send_message
send_message groupchat 7238854@localhost room3@conference.localhost "" "TestBody no join group"
and log by server
log from ejabberd
So it seems that part is working.
ok @prefiks, let's me check again. But. i can't receive history message if i don't join group. in case user disconnected, the SSE connection lost. Currently, when user reconnect SSE, i join all group user subscribe.
Messages with event are stored in both user archive and offline storage (so they will be redelivered when user comes online). So those are two ways you can get older mesages.
in case user login on the other devices. I will get the messages history from api?
Hi @prefiks, I received data from ejabberd with type xmpp.PubsubEvent, parsing xml and received the message.
{
"Node": "urn:xmpp:mucsub:nodes:messages",
"Items": [
{
"ID": "1713956108027223",
"InnerXML": "PG1lc3NhZ2UgdG89JzcyMTQyNTJAbG9jYWxob3N0JyBmcm9tPSdyb29tMUBjb25mZXJlbmNlLmxvY2FsaG9zdC83MjM4ODU0JyB0eXBlPSdncm91cGNoYXQnIGlkPScxMjE4OTA1NjA4NjQ4ODIyMTgzMicgeG1sbnM9J2phYmJlcjpjbGllbnQnPjxhcmNoaXZlZCBieT0ncm9vbTFAY29uZmVyZW5jZS5sb2NhbGhvc3QnIGlkPScxNzEzOTU2MTA4MDI3MjIzJyB4bWxucz0ndXJuOnhtcHA6bWFtOnRtcCcvPjxzdGFuemEtaWQgYnk9J3Jvb20xQGNvbmZlcmVuY2UubG9jYWxob3N0JyBpZD0nMTcxMzk1NjEwODAyNzIyMycgeG1sbnM9J3Vybjp4bXBwOnNpZDowJy8+PGJvZHk+aGFoYWhhaGEgPzwvYm9keT48L21lc3NhZ2U+"
}
]
}
InnerXML after parse
<message to='7214252@localhost' from='room1@conference.localhost/7238854' type='groupchat' id='12189056086488221832' xmlns='jabber:client'><archived by='room1@conference.localhost' id='1713956108027223' xmlns='urn:xmpp:mam:tmp'/><stanza-id by='room1@conference.localhost' id='1713956108027223' xmlns='urn:xmpp:sid:0'/><body>hahahaha ?</body></message>
So what is the difference between muc and mucsub?
Please help me understand them clearly.!
Regular muc: you must be online, and explicitly join room to receive messages, when you go offline, you automatically leave room and messages stop arrive.
Mucsub: after subscribing room you will get event for every message until you unsubscribe from room. Messages will also arrive when you are offline, so with mod_offline enabled, they will be delivered to you after you reconnect.
Yeah, I understand clearly.! Thanks so much @prefiks. You save my day.! :D
Messages with event are stored in both user archive and offline storage (so they will be redelivered when user comes online). So those are two ways you can get older mesages.
Hi @prefiks, with MUCSUB when user online. If user don't join the room, will the message be automatically deliver? What is the best practice for returning history messages to users?
How to know if a subscriber is online in a room @prefiks ?
Environment
ejabberd version: 24.2.40 Using the ejabberd/ecs docker container
Configuration
Architecture
Description
I have Chat SSE Server uses ejabberd server, App/Web client connect to by SSE( Server send event). and Chat APIs Server uses ejabberd to call admin apis to send message, create groups...
I'm using https://github.com/xmppo/go-xmpp library for which I'm using MUC plugin to send join presence to specific chat room. That code is working and I'm able to receive all new messages in real time by call send message to ejabberd (admin apis) type "groupchat".
But i have an issue when client call Chat APIs Server ==> ejabberd (admin apis) to create group with all events :
after that user1 call Chat APIs Server ==> ejabberd (admin apis) to send message to room i just created. And this time user2 has already connected with Chat SSE Server can not received the message.
I did a look at the documentation and there is a mention which I think is related to that issue:
Do you have any ideas how to resolve that issue which I'm facing? How can users connected to Chat SSE Server still receive messages?