Send MUC participants on join, and send participants' status

This commit is contained in:
Jaidyn Ann 2021-06-02 16:58:29 -05:00
parent ad1c7b5782
commit b66ea722b0
2 changed files with 78 additions and 3 deletions

View File

@ -11,6 +11,7 @@
#include <File.h> #include <File.h>
#include <FindDirectory.h> #include <FindDirectory.h>
#include <List.h> #include <List.h>
#include <StringList.h>
#include <CayaProtocolMessages.h> #include <CayaProtocolMessages.h>
@ -137,12 +138,13 @@ JabberHandler::Process(BMessage* msg)
case IM_JOIN_ROOM: { case IM_JOIN_ROOM: {
BString chat_id = msg->FindString("chat_id"); BString chat_id = msg->FindString("chat_id");
BString join_id = chat_id; BString join_id = chat_id;
join_id << "/" << fUsername; join_id << "/" << fNick;
gloox::MUCRoom* room = gloox::MUCRoom* room =
new gloox::MUCRoom(fClient, gloox::JID(join_id.String()), new gloox::MUCRoom(fClient, gloox::JID(join_id.String()),
this, this); this, this);
room->join(); room->join();
room->getRoomItems();
fRooms.AddItem(chat_id, room); fRooms.AddItem(chat_id, room);
break; break;
@ -213,6 +215,7 @@ JabberHandler::UpdateSettings(BMessage* msg)
// Store settings // Store settings
fUsername = username; fUsername = username;
fNick = username;
fPassword = password; fPassword = password;
fServer = server; fServer = server;
fResource = resource; fResource = resource;
@ -1075,6 +1078,43 @@ JabberHandler::handleMUCParticipantPresence(gloox::MUCRoom *room,
const gloox::MUCRoomParticipant participant, const gloox::MUCRoomParticipant participant,
const gloox::Presence &presence) const gloox::Presence &presence)
{ {
BString chat_id(room->name().c_str());
chat_id << "@" << room->service().c_str();
BString nick = participant.nick->resource().c_str();
BString user_id(chat_id);
user_id << "/" << nick;
if (nick == fNick) {
BMessage joinedMsg(IM_MESSAGE);
joinedMsg.AddInt32("im_what", IM_ROOM_JOINED);
joinedMsg.AddString("chat_id", chat_id);
_SendMessage(&joinedMsg);
return;
}
BMessage statusMsg(IM_MESSAGE);
statusMsg.AddInt32("im_what", IM_STATUS_SET);
statusMsg.AddString("user_id", user_id);
statusMsg.AddInt32("status", _GlooxStatusToCaya(presence.presence()));
_SendMessage(&statusMsg);
// If unavailable (disconnected/left chat)
if (presence.presence() == 5) {
BMessage leftMsg(IM_MESSAGE);
leftMsg.AddInt32("im_what", IM_ROOM_PARTICIPANT_LEFT);
leftMsg.AddString("user_id", user_id);
leftMsg.AddString("chat_id", chat_id);
_SendMessage(&leftMsg);
return;
}
BMessage joinMsg(IM_MESSAGE);
joinMsg.AddInt32("im_what", IM_ROOM_PARTICIPANTS);
joinMsg.AddString("user_id", user_id);
joinMsg.AddString("user_name", nick);
joinMsg.AddString("chat_id", chat_id);
_SendMessage(&joinMsg);
} }
@ -1086,14 +1126,21 @@ JabberHandler::handleMUCMessage(gloox::MUCRoom *room, const gloox::Message &m,
if (m.body() == "") if (m.body() == "")
return; return;
int32 im_what = IM_MESSAGE_RECEIVED;
if (m.when() != 0)
im_what = IM_LOGS_RECEIVED;
BString chat_id(room->name().c_str()); BString chat_id(room->name().c_str());
chat_id << "@" << room->service().c_str(); chat_id << "@" << room->service().c_str();
BString user_id(chat_id);
user_id << "/" << m.from().resource().c_str();
// Notify that a chat message was received // Notify that a chat message was received
BMessage msg(IM_MESSAGE); BMessage msg(IM_MESSAGE);
msg.AddString("user_id", m.from().resource().c_str()); msg.AddInt32("im_what", im_what);
msg.AddString("user_id", user_id);
msg.AddString("chat_id", chat_id); msg.AddString("chat_id", chat_id);
msg.AddInt32("im_what", IM_MESSAGE_RECEIVED);
if (m.subject() != "") if (m.subject() != "")
msg.AddString("subject", m.subject().c_str()); msg.AddString("subject", m.subject().c_str());
msg.AddString("body", m.body().c_str()); msg.AddString("body", m.body().c_str());
@ -1141,6 +1188,33 @@ JabberHandler::handleMUCInfo(gloox::MUCRoom *room, int features,
void void
JabberHandler::handleMUCItems(gloox::MUCRoom *room, const gloox::Disco::ItemList &items) JabberHandler::handleMUCItems(gloox::MUCRoom *room, const gloox::Disco::ItemList &items)
{ {
BStringList nicks;
BStringList ids;
BString chat_id(room->name().c_str());
chat_id << "@" << room->service().c_str();
for (auto item: items) {
BString nick = item->jid().resource().c_str();
nicks.Add(nick);
// Unless it's the user, derive ID from room resource
if (fNick != nick) {
BString user_id(chat_id);
user_id << "/" << nick;
ids.Add(user_id);
}
else
ids.Add(BString(fJid.bare().c_str()));
}
BMessage msg(IM_MESSAGE);
msg.AddStrings("user_id", ids);
msg.AddStrings("user_name", nicks);
msg.AddString("chat_id", chat_id);
msg.AddInt32("im_what", IM_ROOM_PARTICIPANTS);
_SendMessage(&msg);
} }

View File

@ -84,6 +84,7 @@ public:
protected: protected:
BString fUsername; BString fUsername;
BString fNick;
BString fPassword; BString fPassword;
BString fServer; BString fServer;
BString fResource; BString fResource;