Show users' joins/parts in chat view
New API messages were added to distinguish between a user leaving of their own volition and being kicked/banned. Messages are now shown in the chat view when a user leaves or or kicked/banned, etc.
This commit is contained in:
parent
fde681bbf4
commit
77d914312c
|
@ -228,23 +228,29 @@ enum im_what_code {
|
||||||
//! Kick user
|
//! Kick user
|
||||||
IM_ROOM_KICK_PARTICIPANT = 171,
|
IM_ROOM_KICK_PARTICIPANT = 171,
|
||||||
|
|
||||||
|
//! A user was kicked
|
||||||
|
IM_ROOM_PARTICIPANT_KICKED = 172,
|
||||||
|
|
||||||
//! Ban user
|
//! Ban user
|
||||||
IM_ROOM_BAN_PARTICIPANT = 172,
|
IM_ROOM_BAN_PARTICIPANT = 173,
|
||||||
|
|
||||||
|
//! A user was banned
|
||||||
|
IM_ROOM_PARTICIPANT_BANNED = 174,
|
||||||
|
|
||||||
//! Unban user
|
//! Unban user
|
||||||
IM_ROOM_UNBAN_PARTICIPANT = 173,
|
IM_ROOM_UNBAN_PARTICIPANT = 175,
|
||||||
|
|
||||||
//! Mute user
|
//! Mute user
|
||||||
IM_ROOM_MUTE_PARTICIPANT = 174,
|
IM_ROOM_MUTE_PARTICIPANT = 176,
|
||||||
|
|
||||||
//! Unmute user
|
//! Unmute user
|
||||||
IM_ROOM_UNMUTE_PARTICIPANT = 175,
|
IM_ROOM_UNMUTE_PARTICIPANT = 177,
|
||||||
|
|
||||||
//! Deafen
|
//! Deafen
|
||||||
IM_ROOM_DEAFEN_PARTICIPANT = 176,
|
IM_ROOM_DEAFEN_PARTICIPANT = 178,
|
||||||
|
|
||||||
//! Allow to read messages
|
//! Allow to read messages
|
||||||
IM_ROOM_UNDEAFEN_PARTICIPANT = 177,
|
IM_ROOM_UNDEAFEN_PARTICIPANT = 179,
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -70,6 +70,31 @@ Conversation::ImMessage(BMessage* msg)
|
||||||
fMessenger.SendMessage(msg);
|
fMessenger.SendMessage(msg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case IM_ROOM_PARTICIPANT_JOINED:
|
||||||
|
{
|
||||||
|
BString user_id;
|
||||||
|
if (msg->FindString("user_id", &user_id) != B_OK)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (UserById(user_id) == NULL) {
|
||||||
|
_EnsureUser(msg);
|
||||||
|
GetView()->MessageReceived(msg);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IM_ROOM_PARTICIPANT_LEFT:
|
||||||
|
case IM_ROOM_PARTICIPANT_KICKED:
|
||||||
|
case IM_ROOM_PARTICIPANT_BANNED:
|
||||||
|
{
|
||||||
|
BString user_id = msg->FindString("user_id");
|
||||||
|
User* user;
|
||||||
|
if (user_id.IsEmpty() == true || (user = UserById(user_id)) == NULL)
|
||||||
|
break;
|
||||||
|
|
||||||
|
GetView()->MessageReceived(msg);
|
||||||
|
RemoveUser(user);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case IM_LOGS_RECEIVED:
|
case IM_LOGS_RECEIVED:
|
||||||
default:
|
default:
|
||||||
GetView()->MessageReceived(msg);
|
GetView()->MessageReceived(msg);
|
||||||
|
@ -347,16 +372,19 @@ User*
|
||||||
Conversation::_EnsureUser(BMessage* msg)
|
Conversation::_EnsureUser(BMessage* msg)
|
||||||
{
|
{
|
||||||
BString id = msg->FindString("user_id");
|
BString id = msg->FindString("user_id");
|
||||||
|
BString name = msg->FindString("user_name");
|
||||||
if (id.IsEmpty() == true) return NULL;
|
if (id.IsEmpty() == true) return NULL;
|
||||||
|
|
||||||
User* user = UserById(id);
|
User* user = UserById(id);
|
||||||
User* serverUser = _GetServer()->UserById(id);
|
User* serverUser = _GetServer()->UserById(id);
|
||||||
|
|
||||||
|
// Not here, but found in server
|
||||||
if (user == NULL && serverUser != NULL) {
|
if (user == NULL && serverUser != NULL) {
|
||||||
fUsers.AddItem(id, serverUser);
|
fUsers.AddItem(id, serverUser);
|
||||||
user = serverUser;
|
user = serverUser;
|
||||||
GetView()->UpdateUserList(fUsers);
|
GetView()->UpdateUserList(fUsers);
|
||||||
}
|
}
|
||||||
|
// Not anywhere; create user
|
||||||
else if (user == NULL) {
|
else if (user == NULL) {
|
||||||
user = new User(id, _GetServer()->Looper());
|
user = new User(id, _GetServer()->Looper());
|
||||||
user->SetProtocolLooper(fLooper);
|
user->SetProtocolLooper(fLooper);
|
||||||
|
@ -364,6 +392,9 @@ Conversation::_EnsureUser(BMessage* msg)
|
||||||
_GetServer()->AddUser(user);
|
_GetServer()->AddUser(user);
|
||||||
fUsers.AddItem(id, user);
|
fUsers.AddItem(id, user);
|
||||||
GetView()->UpdateUserList(fUsers);
|
GetView()->UpdateUserList(fUsers);
|
||||||
|
|
||||||
|
if (name.IsEmpty() == false)
|
||||||
|
user->SetNotifyName(name);
|
||||||
}
|
}
|
||||||
user->RegisterObserver(this);
|
user->RegisterObserver(this);
|
||||||
return user;
|
return user;
|
||||||
|
|
|
@ -186,10 +186,8 @@ Server::ImMessage(BMessage* msg)
|
||||||
contact->SetNotifyName(name);
|
contact->SetNotifyName(name);
|
||||||
|
|
||||||
BString status;
|
BString status;
|
||||||
if (msg->FindString("message", &status) == B_OK) {
|
if (msg->FindString("message", &status) == B_OK)
|
||||||
contact->SetNotifyPersonalStatus(status);
|
contact->SetNotifyPersonalStatus(status);
|
||||||
// contact->GetChatWindow()->UpdatePersonalMessage();
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case IM_EXTENDED_CONTACT_INFO:
|
case IM_EXTENDED_CONTACT_INFO:
|
||||||
|
@ -276,14 +274,15 @@ Server::ImMessage(BMessage* msg)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case IM_ROOM_PARTICIPANT_JOINED:
|
||||||
case IM_ROOM_PARTICIPANT_LEFT:
|
case IM_ROOM_PARTICIPANT_LEFT:
|
||||||
|
case IM_ROOM_PARTICIPANT_BANNED:
|
||||||
|
case IM_ROOM_PARTICIPANT_KICKED:
|
||||||
{
|
{
|
||||||
Conversation* chat = _EnsureConversation(msg);
|
Conversation* chat = _EnsureConversation(msg);
|
||||||
User* user = _EnsureUser(msg);
|
if (chat == NULL)
|
||||||
|
|
||||||
if (user == NULL || chat == NULL)
|
|
||||||
break;
|
break;
|
||||||
chat->RemoveUser(user);
|
chat->ImMessage(msg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case IM_ROOM_ROLECHANGE:
|
case IM_ROOM_ROLECHANGE:
|
||||||
|
|
|
@ -149,6 +149,30 @@ ConversationView::ImMessage(BMessage* msg)
|
||||||
_AppendOrEnqueueMessage(msg);
|
_AppendOrEnqueueMessage(msg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case IM_ROOM_PARTICIPANT_JOINED:
|
||||||
|
{
|
||||||
|
_UserMessage("%user% has joined the room.\n",
|
||||||
|
"%user% has joined the room (%body%).\n", msg);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IM_ROOM_PARTICIPANT_LEFT:
|
||||||
|
{
|
||||||
|
_UserMessage("%user% has left the room.\n",
|
||||||
|
"%user% has left the room (%body%).\n", msg);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IM_ROOM_PARTICIPANT_KICKED:
|
||||||
|
{
|
||||||
|
_UserMessage("%user% was kicked.\n",
|
||||||
|
"%user% was kicked (%body%).\n", msg);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IM_ROOM_PARTICIPANT_BANNED:
|
||||||
|
{
|
||||||
|
_UserMessage("%user% has been banned.\n",
|
||||||
|
"%user% has been banned (%body%).\n", msg);
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -276,9 +300,9 @@ void
|
||||||
ConversationView::_AppendMessage(BMessage* msg)
|
ConversationView::_AppendMessage(BMessage* msg)
|
||||||
{
|
{
|
||||||
BStringList users, bodies;
|
BStringList users, bodies;
|
||||||
if (msg->FindStrings("body", &bodies) != B_OK
|
if (msg->FindStrings("body", &bodies) != B_OK)
|
||||||
|| msg->FindStrings("user_id", &users) != B_OK)
|
|
||||||
return;
|
return;
|
||||||
|
msg->FindStrings("user_id", &users);
|
||||||
|
|
||||||
for (int i = bodies.CountStrings(); i >= 0; i--) {
|
for (int i = bodies.CountStrings(); i >= 0; i--) {
|
||||||
User* sender = fConversation->UserById(users.StringAt(i));
|
User* sender = fConversation->UserById(users.StringAt(i));
|
||||||
|
@ -298,3 +322,31 @@ ConversationView::_AppendMessage(BMessage* msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
ConversationView::_UserMessage(const char* format, const char* bodyFormat,
|
||||||
|
BMessage* msg)
|
||||||
|
{
|
||||||
|
BString user_id;
|
||||||
|
BString user_name = msg->FindString("user_name");
|
||||||
|
BString body = msg->FindString("body");
|
||||||
|
|
||||||
|
if (msg->FindString("user_id", &user_id) != B_OK)
|
||||||
|
return;
|
||||||
|
if (user_name.IsEmpty() == true)
|
||||||
|
user_name = user_id;
|
||||||
|
|
||||||
|
BString newBody("** ");
|
||||||
|
if (body.IsEmpty() == true)
|
||||||
|
newBody << format;
|
||||||
|
else {
|
||||||
|
newBody << bodyFormat;
|
||||||
|
newBody.ReplaceAll("%body%", body.String());
|
||||||
|
}
|
||||||
|
newBody.ReplaceAll("%user%", user_name.String());
|
||||||
|
|
||||||
|
BMessage newMsg;
|
||||||
|
newMsg.AddString("body", newBody);
|
||||||
|
_AppendOrEnqueueMessage(&newMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -50,6 +50,9 @@ private:
|
||||||
bool _AppendOrEnqueueMessage(BMessage* msg);
|
bool _AppendOrEnqueueMessage(BMessage* msg);
|
||||||
void _AppendMessage(BMessage* msg);
|
void _AppendMessage(BMessage* msg);
|
||||||
|
|
||||||
|
void _UserMessage(const char* format, const char* bodyFormat,
|
||||||
|
BMessage* msg);
|
||||||
|
|
||||||
Conversation* fConversation;
|
Conversation* fConversation;
|
||||||
int32 fMessageCount;
|
int32 fMessageCount;
|
||||||
BObjectList<BMessage> fMessageQueue;
|
BObjectList<BMessage> fMessageQueue;
|
||||||
|
|
|
@ -140,7 +140,7 @@ JabberHandler::Process(BMessage* msg)
|
||||||
if (!invite_id)
|
if (!invite_id)
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
|
|
||||||
_ChatCreated(invite_id);
|
_ChatCreatedMsg(invite_id);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -705,7 +705,7 @@ JabberHandler::_MessageSent(const char* id, const char* subject,
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
JabberHandler::_ChatCreated(const char* id)
|
JabberHandler::_ChatCreatedMsg(const char* id)
|
||||||
{
|
{
|
||||||
BMessage msg(IM_MESSAGE);
|
BMessage msg(IM_MESSAGE);
|
||||||
msg.AddInt32("im_what", IM_CHAT_CREATED);
|
msg.AddInt32("im_what", IM_CHAT_CREATED);
|
||||||
|
@ -715,6 +715,70 @@ JabberHandler::_ChatCreated(const char* id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
JabberHandler::_RoleChangedMsg(BString chat_id, BString user_id,
|
||||||
|
gloox::MUCRoomRole role, gloox::MUCRoomAffiliation aff)
|
||||||
|
{
|
||||||
|
BMessage roleMsg(IM_MESSAGE);
|
||||||
|
roleMsg.AddInt32("im_what", IM_ROOM_ROLECHANGE);
|
||||||
|
roleMsg.AddString("user_id", user_id);
|
||||||
|
roleMsg.AddString("chat_id", chat_id);
|
||||||
|
roleMsg.AddString("role_title", _RoleTitle(role, aff));
|
||||||
|
roleMsg.AddInt32("role_perms", _RolePerms(role, aff));
|
||||||
|
roleMsg.AddInt32("role_priority", _RolePriority(role, aff));
|
||||||
|
_SendMessage(&roleMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
JabberHandler::_UserLeftMsg(BString chat_id, gloox::MUCRoomParticipant participant)
|
||||||
|
{
|
||||||
|
BString user_id;
|
||||||
|
const char* nick = participant.nick->resource().c_str();
|
||||||
|
bool isSelf = _MUCUserId(chat_id, nick, &user_id);
|
||||||
|
|
||||||
|
if (user_id.IsEmpty() == true)
|
||||||
|
return;
|
||||||
|
|
||||||
|
int32 im_what = IM_ROOM_PARTICIPANT_LEFT;
|
||||||
|
int flags = participant.flags;
|
||||||
|
|
||||||
|
if (flags & gloox::UserBanned)
|
||||||
|
im_what = IM_ROOM_PARTICIPANT_BANNED;
|
||||||
|
else if (flags & gloox::UserKicked)
|
||||||
|
im_what = IM_ROOM_PARTICIPANT_KICKED;
|
||||||
|
|
||||||
|
BMessage leftMsg(IM_MESSAGE);
|
||||||
|
leftMsg.AddInt32("im_what", im_what);
|
||||||
|
leftMsg.AddString("chat_id", chat_id);
|
||||||
|
leftMsg.AddString("user_id", user_id);
|
||||||
|
leftMsg.AddString("user_name", nick);
|
||||||
|
if (participant.reason.empty() == false)
|
||||||
|
leftMsg.AddString("body", participant.reason.c_str());
|
||||||
|
_SendMessage(&leftMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
JabberHandler::_StatusSetMsg(const char* user_id, gloox::Presence::PresenceType type,
|
||||||
|
const char* message, const char* resource)
|
||||||
|
{
|
||||||
|
BMessage msg(IM_MESSAGE);
|
||||||
|
msg.AddInt32("im_what", IM_STATUS_SET);
|
||||||
|
msg.AddString("user_id", user_id);
|
||||||
|
msg.AddInt32("status", _GlooxStatusToCaya(type));
|
||||||
|
|
||||||
|
if (BString(resource).IsEmpty() == false)
|
||||||
|
msg.AddString("resource", resource);
|
||||||
|
if (BString(message).IsEmpty() == false)
|
||||||
|
msg.AddString("message", message);
|
||||||
|
|
||||||
|
msg.PrintToStream();
|
||||||
|
|
||||||
|
_SendMessage(&msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
JabberHandler::_SetupAvatarCache()
|
JabberHandler::_SetupAvatarCache()
|
||||||
{
|
{
|
||||||
|
@ -1251,49 +1315,26 @@ JabberHandler::handleMUCParticipantPresence(gloox::MUCRoom *room,
|
||||||
joinedMsg.AddInt32("im_what", im_what);
|
joinedMsg.AddInt32("im_what", im_what);
|
||||||
joinedMsg.AddString("chat_id", chat_id);
|
joinedMsg.AddString("chat_id", chat_id);
|
||||||
_SendMessage(&joinedMsg);
|
_SendMessage(&joinedMsg);
|
||||||
_RoleChanged(chat_id, user_id, role, aff);
|
_RoleChangedMsg(chat_id, user_id, role, aff);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
BMessage statusMsg(IM_MESSAGE);
|
_StatusSetMsg(user_id.String(), presence.presence(), presence.status().c_str(), "");
|
||||||
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 unavailable (disconnected/left chat)
|
||||||
if (presence.presence() == 5) {
|
if (presence.presence() == 5) {
|
||||||
BMessage leftMsg(IM_MESSAGE);
|
_UserLeftMsg(chat_id, participant);
|
||||||
leftMsg.AddInt32("im_what", IM_ROOM_PARTICIPANT_LEFT);
|
|
||||||
leftMsg.AddString("user_id", user_id);
|
|
||||||
leftMsg.AddString("chat_id", chat_id);
|
|
||||||
_SendMessage(&leftMsg);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
BMessage joinMsg(IM_MESSAGE);
|
BMessage joinMsg(IM_MESSAGE);
|
||||||
joinMsg.AddInt32("im_what", IM_ROOM_PARTICIPANTS);
|
joinMsg.AddInt32("im_what", IM_ROOM_PARTICIPANT_JOINED);
|
||||||
joinMsg.AddString("user_id", user_id);
|
joinMsg.AddString("user_id", user_id);
|
||||||
joinMsg.AddString("user_name", nick);
|
joinMsg.AddString("user_name", nick);
|
||||||
joinMsg.AddString("chat_id", chat_id);
|
joinMsg.AddString("chat_id", chat_id);
|
||||||
_SendMessage(&joinMsg);
|
_SendMessage(&joinMsg);
|
||||||
|
|
||||||
_RoleChanged(chat_id, user_id, role, aff);
|
_RoleChangedMsg(chat_id, user_id, role, aff);
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
JabberHandler::_RoleChanged(BString chat_id, BString user_id,
|
|
||||||
gloox::MUCRoomRole role, gloox::MUCRoomAffiliation aff)
|
|
||||||
{
|
|
||||||
BMessage roleMsg(IM_MESSAGE);
|
|
||||||
roleMsg.AddInt32("im_what", IM_ROOM_ROLECHANGE);
|
|
||||||
roleMsg.AddString("user_id", user_id);
|
|
||||||
roleMsg.AddString("chat_id", chat_id);
|
|
||||||
roleMsg.AddString("role_title", _RoleTitle(role, aff));
|
|
||||||
roleMsg.AddInt32("role_perms", _RolePerms(role, aff));
|
|
||||||
roleMsg.AddInt32("role_priority", _RolePriority(role, aff));
|
|
||||||
_SendMessage(&roleMsg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1482,13 +1523,8 @@ JabberHandler::handleRosterPresence(const gloox::RosterItem& item,
|
||||||
gloox::Presence::PresenceType type,
|
gloox::Presence::PresenceType type,
|
||||||
const std::string& presenceMsg)
|
const std::string& presenceMsg)
|
||||||
{
|
{
|
||||||
BMessage msg(IM_MESSAGE);
|
_StatusSetMsg(item.jidJID().full().c_str(), type, presenceMsg.c_str(),
|
||||||
msg.AddInt32("im_what", IM_STATUS_SET);
|
resource.c_str());
|
||||||
msg.AddString("user_id", item.jidJID().full().c_str());
|
|
||||||
msg.AddInt32("status", _GlooxStatusToCaya(type));
|
|
||||||
msg.AddString("resource", resource.c_str());
|
|
||||||
msg.AddString("message", presenceMsg.c_str());
|
|
||||||
_SendMessage(&msg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -117,9 +117,12 @@ private:
|
||||||
void _MessageSent(const char* id, const char* subject,
|
void _MessageSent(const char* id, const char* subject,
|
||||||
const char* body);
|
const char* body);
|
||||||
|
|
||||||
void _ChatCreated(const char* id);
|
void _ChatCreatedMsg(const char* id);
|
||||||
void _RoleChanged(BString chat_id, BString user_id,
|
void _RoleChangedMsg(BString chat_id, BString user_id,
|
||||||
gloox::MUCRoomRole role, gloox::MUCRoomAffiliation aff);
|
gloox::MUCRoomRole role, gloox::MUCRoomAffiliation aff);
|
||||||
|
void _UserLeftMsg(BString chat_id, gloox::MUCRoomParticipant participant);
|
||||||
|
void _StatusSetMsg(const char* user_id, gloox::Presence::PresenceType type,
|
||||||
|
const char* message, const char* resource);
|
||||||
|
|
||||||
void _Notify(notification_type type, const char* title, const char* message);
|
void _Notify(notification_type type, const char* title, const char* message);
|
||||||
void _NotifyProgress(const char* title, const char* message, float progress);
|
void _NotifyProgress(const char* title, const char* message, float progress);
|
||||||
|
|
Ŝarĝante…
Reference in New Issue