I have joined multiple groups on my whatsapp which generate hundreds of messages daily. Some of them might concern me, while others might not. So I wanted to find out is there a way (using some api, scripting or whatever) to listen to every incoming group message and on finding specific keywords in those messages perform certain operation (such as sending me a notification).
Open to ideas. Thanks in advance.
Related
Socket.io offers first-class support to address specific recipients by using rooms
I'm creating a webapp where the server passes notifications to the user via Socket.io. It is a marketplace. Users may favourite/buy/sell articles and will therefore be notified from the server when something changes.
Now I've got to make the choices whether a user joins a room for every article he is interested upon login or whether I emit a message for every user individually when something changes.
What is more efficient? Is there a best practice? Am I taking on this problem from the wrong perspective?
Rooms are only a construct on the server for keeping track of lists of sockets. When you broadcast to a room, all the socket.io code does is loop through the list of sockets and send a message individually to each one.
So, in either of your cases, a message is being sent individually to each socket - same for both. Use rooms if the mechanism for keeping track of groups of sockets and being able to easily send a message to each one is useful and works for your purpose.
If you have some reason to want to use your own data structures for keeping track of lists of sockets, then that's fine too and it won't cost any more to loop through it and send a message to each one as long as you have an efficient scheme for finding which sockets you want to send the message to.
What are the best practices for sending system message/s to group/ user, while using XMPP protocol? All the users at at the group should receive the message.
How can I achieve it?
Possible solutions that might be useful:
The announce - I have encountered with the announce and more
specifically this module.
Publish-Subscribe http://www.xmpp.org/extensions/xep-0060.html
There is always the
option of creating an admin user that will send messages.
Thanks in advance.
The best approach depends on your constrain and especially if you control the client. For example, if you use a client you did not develop, it may not render the pubsub messages fine.
The second thing to consider if how are the group defined. Are users registering for alerts ? In that case in seems to match the pubsub case. Otherwise, if groups are not too large, you may use an admin user to send to the list of user you want. You can even send a single message to multiple users using XEP-0033: Extended Stanza Addressing (Sometimes called "multicast").
mod_announce can only target all users or all online users, so it does not seem to match your need in terms of "groups".
I explained most of the option in a talk (video and slides): https://blog.process-one.net/implementing-state-of-the-art-one-to-many-chat-services-with-ejabberd-ejabberd-workshop-1/
It is broader as it not only cover broadcast but also groupchat, but it should help clarifying your choice.
From the spec —
7.14 Exiting a Room
In order to exit a multi-user chat room, an occupant sends a presence
stanza of type "unavailable" to the <room#service/nick> it is
currently using in the room.
Example 80. Occupant Exits a Room
<presence
from='hag66#shakespeare.lit/pda'
to='coven#chat.shakespeare.lit/thirdwitch'
type='unavailable'/>
This implies that as soon as the user disconnects from the XMPP server, he is removed from the group on the server side. The issue is simple — I don't want this behavior; I want a behavior that is similar to what Whatsapp does, i.e. even if the user goes offline, he is still part of the MUC room (which is configured to be persistent on the server side) and will receive messages from other occupants.
Given the spec and the documentation for XEP-0045 and XMPPFramework for iOS, I have no idea how to accomplish this or if it's possible to accomplish this in the traditional ejabberd server.
XEP-45 was designed more then 10 years ago. Back then, the designers had something like IRC channels in mind. Everything of XEP-45 is designed based on the assumption that a user enters and leaves a room when he/she starts/terminates its client.
WhatsApp Groupchats are different: A user joins a groupchat is is able to view the (complete) history of that chat. Even if the users client is offline/unavailable, he is still considered part of the groupchat.
The XMPP community currently works on a new XEP that provides such functionality. It is called XEP-0369: Mediated Information eXchange. It is the spiritual successor of XEP-0045, providing the features one would expect from modern groupchats.
You could emulate something quite like this by using server-side history of the MUC (Message Archive Management, XEP-0313), so that when a client logs in they're able to request the history of the MUC while they weren't in it.
If you also want to be able to show the offline pseudo-occupants of a room, the easiest way to do this is probably to map a pubsub node per room to store the list of these pseudo-occupants that clients could read to supplement the usual occupancy list.
There are probably other solutions here, but those that come immediately to mind for me involve changing the behaviour of the server in non-standard ways, such as allowing normal occupants to query a membership list, which normally only admins can do.
The Whatsapp model is much simpler than you imagine - they just maintain user session online even if user disconnects, and re-sends messages when he "reattach" session. XEP-0198 introduce similar concept to traditional XMPP sessions. You only need to configure longer inactivity period (typically XEP-0198 assume 300 seconds, but whatsapp-like messengers holds session 24+ hours)
Yes you can make your group persistent by setting its configurations this way:
NSString *var = [field attributeStringValueForName:#"var"];
if ([var isEqualToString:#"muc#roomconfig_persistentroom"])
{
[field removeChildAtIndex:0];
[field addChild:[NSXMLElement elementWithName:#"value" stringValue:#"1"]];
}
Using OpenFire 3.71, I have a couple of different conference services, each has a couple of chat rooms in it.
Now I want to broadcast messages to all the MUC ROOMS within one of the services and not as "private messages" to the individual users in those rooms/services. (It should more or less look like as if I entered every single room, sent a message, and left...)
Is that possible in some way? Is there a plugin already? Or is at least possible to write such an plugin? I'm not really sure how the MUC's work...If somebody knows a good source for that, that would be nice to read too...
Thanks,
Jens
I figured out a workaround, in case anybody needs something similar:
I implemented the clients now in the way that they will automatically join a default (per service) muc in addition to the room they join manually. In this default room, only the "owner" can send messages and once the client receives a message in this chat it is displayed within the room that s/he is "actually" in...
As usual for "workarounds" it's surely not the best solution, but it works for my purpose...
If you know of a better solution please let me know.
Anyone know if there is a way to query the last n messages in a muc in xmpp (specifically ejabberd) without joining the room.
Thanks.
No, not without modifications to the server software.
If you do actually join, you can specify the amount of history you want with the <history/> element, see Managing Discussion History in XEP 45.
Messages are kept in each chat room process memory.
You will have to modify the code to expose access to that data structure programmatically.