Basis for custom userlist pop-up menu items
This commit is contained in:
parent
83e98bd5a8
commit
66b8150eeb
|
@ -50,4 +50,7 @@ const uint32 CAYA_DISABLE_ACCOUNT = 'CYda';
|
||||||
//! Request a "help" message
|
//! Request a "help" message
|
||||||
const uint32 CAYA_REQUEST_HELP = 'CYhm';
|
const uint32 CAYA_REQUEST_HELP = 'CYhm';
|
||||||
|
|
||||||
|
//! Display a "user info" window
|
||||||
|
const uint32 CAYA_USER_INFO = 'CYuw';
|
||||||
|
|
||||||
#endif // _CAYA_MESSAGES_H
|
#endif // _CAYA_MESSAGES_H
|
||||||
|
|
|
@ -0,0 +1,149 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2021, Jaidyn Levesque <jadedctrl@teknik.io>
|
||||||
|
* All rights reserved. Distributed under the terms of the MIT license.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "DefaultItems.h"
|
||||||
|
|
||||||
|
#include <InterfaceDefs.h>
|
||||||
|
|
||||||
|
#include "CayaMessages.h"
|
||||||
|
#include "CayaProtocolMessages.h"
|
||||||
|
#include "Role.h"
|
||||||
|
|
||||||
|
|
||||||
|
CommandMap
|
||||||
|
DefaultCommands()
|
||||||
|
{
|
||||||
|
List<int32> roomUser;
|
||||||
|
roomUser.AddItem(CMD_ROOM_PARTICIPANT);
|
||||||
|
List<int32> kickBody;
|
||||||
|
kickBody.AddItem(CMD_ROOM_PARTICIPANT);
|
||||||
|
kickBody.AddItem(CMD_BODY_STRING);
|
||||||
|
List<int32> knownUser;
|
||||||
|
knownUser.AddItem(CMD_KNOWN_USER);
|
||||||
|
List<int32> anyUser;
|
||||||
|
anyUser.AddItem(CMD_ANY_USER);
|
||||||
|
|
||||||
|
CommandMap commands;
|
||||||
|
|
||||||
|
BMessage kickMsg(IM_MESSAGE);
|
||||||
|
kickMsg.AddInt32("im_what", IM_ROOM_KICK_PARTICIPANT);
|
||||||
|
ChatCommand* kick = new ChatCommand("kick", kickMsg, true, kickBody);
|
||||||
|
kick->SetDesc("Force a user to temporarily leave the room, assuming your "
|
||||||
|
"power level's high enough.");
|
||||||
|
commands.AddItem("kick", kick);
|
||||||
|
|
||||||
|
BMessage banMsg(IM_MESSAGE);
|
||||||
|
banMsg.AddInt32("im_what", IM_ROOM_BAN_PARTICIPANT);
|
||||||
|
ChatCommand* ban = new ChatCommand("ban", banMsg, true, kickBody);
|
||||||
|
ban->SetDesc("Kick a user out of the room and slam the door behind them― "
|
||||||
|
"locking it while you're at it.");
|
||||||
|
commands.AddItem("ban", ban);
|
||||||
|
|
||||||
|
BMessage unbanMsg(IM_MESSAGE);
|
||||||
|
unbanMsg.AddInt32("im_what", IM_ROOM_UNBAN_PARTICIPANT);
|
||||||
|
ChatCommand* unban = new ChatCommand("unban", unbanMsg, true, anyUser);
|
||||||
|
unban->SetDesc("Undo a previous ban, allowing the user to rejoin (if they "
|
||||||
|
"still want to).");
|
||||||
|
commands.AddItem("unban", unban);
|
||||||
|
|
||||||
|
BMessage muteMsg(IM_MESSAGE);
|
||||||
|
muteMsg.AddInt32("im_what", IM_ROOM_MUTE_PARTICIPANT);
|
||||||
|
ChatCommand* mute = new ChatCommand("mute", muteMsg, true, roomUser);
|
||||||
|
mute->SetDesc("Disallow a user from sending visible messages.");
|
||||||
|
commands.AddItem("mute", mute);
|
||||||
|
|
||||||
|
BMessage unmuteMsg(IM_MESSAGE);
|
||||||
|
unmuteMsg.AddInt32("im_what", IM_ROOM_UNMUTE_PARTICIPANT);
|
||||||
|
ChatCommand* unmute = new ChatCommand("unmute", unmuteMsg, true, roomUser);
|
||||||
|
unmute->SetDesc("Restore a user's ability to send messages.");
|
||||||
|
commands.AddItem("unmute", unmute);
|
||||||
|
|
||||||
|
BMessage deafenMsg(IM_MESSAGE);
|
||||||
|
deafenMsg.AddInt32("im_what", IM_ROOM_DEAFEN_PARTICIPANT);
|
||||||
|
ChatCommand* deafen = new ChatCommand("deafen", deafenMsg, true, roomUser);
|
||||||
|
deafen->SetDesc("Disallow a user from reading messages sent in the room.");
|
||||||
|
commands.AddItem("deafen", deafen);
|
||||||
|
|
||||||
|
BMessage undeafenMsg(IM_MESSAGE);
|
||||||
|
undeafenMsg.AddInt32("im_what", IM_ROOM_UNDEAFEN_PARTICIPANT);
|
||||||
|
ChatCommand* undeafen = new ChatCommand("undeafen", undeafenMsg, true, roomUser);
|
||||||
|
undeafen->SetDesc("Restore a user's ability to receive messages.");
|
||||||
|
commands.AddItem("undeafen", undeafen);
|
||||||
|
|
||||||
|
BMessage inviteMsg(IM_MESSAGE);
|
||||||
|
inviteMsg.AddInt32("im_what", IM_ROOM_SEND_INVITE);
|
||||||
|
ChatCommand* invite = new ChatCommand("invite", inviteMsg, true, knownUser);
|
||||||
|
invite->SetDesc("Invite a user to the current room.");
|
||||||
|
commands.AddItem("invite", invite);
|
||||||
|
|
||||||
|
BMessage helpMsg(CAYA_REQUEST_HELP);
|
||||||
|
ChatCommand* help = new ChatCommand("help", helpMsg, false, List<int>());
|
||||||
|
help->SetDesc("List all current commands, or get help for certain command.");
|
||||||
|
commands.AddItem("help", help);
|
||||||
|
|
||||||
|
return commands;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BObjectList<BMessage>
|
||||||
|
DefaultUserPopUpItems()
|
||||||
|
{
|
||||||
|
BObjectList<BMessage> items;
|
||||||
|
|
||||||
|
BMessage* infoMsg = new BMessage(CAYA_USER_INFO);
|
||||||
|
items.AddItem(_UserMenuItem("User info" B_UTF8_ELLIPSIS, infoMsg, 0, 0, 0,
|
||||||
|
false, false));
|
||||||
|
|
||||||
|
BMessage* kickMsg = new BMessage(IM_MESSAGE);
|
||||||
|
kickMsg->AddInt32("im_what", IM_ROOM_KICK_PARTICIPANT);
|
||||||
|
items.AddItem(_UserMenuItem("Kick user", kickMsg, PERM_KICK, 0, 0, false,
|
||||||
|
true));
|
||||||
|
|
||||||
|
BMessage* banMsg = new BMessage(IM_MESSAGE);
|
||||||
|
banMsg->AddInt32("im_what", IM_ROOM_BAN_PARTICIPANT);
|
||||||
|
items.AddItem(_UserMenuItem("Ban user", banMsg, PERM_BAN, 0, 0, false, true));
|
||||||
|
|
||||||
|
BMessage* muteMsg = new BMessage(IM_MESSAGE);
|
||||||
|
muteMsg->AddInt32("im_what", IM_ROOM_MUTE_PARTICIPANT);
|
||||||
|
items.AddItem(_UserMenuItem("Mute user", muteMsg, PERM_MUTE, PERM_WRITE, 0,
|
||||||
|
false, true));
|
||||||
|
|
||||||
|
BMessage* unmuteMsg = new BMessage(IM_MESSAGE);
|
||||||
|
unmuteMsg->AddInt32("im_what", IM_ROOM_UNMUTE_PARTICIPANT);
|
||||||
|
items.AddItem(_UserMenuItem("Unmute user", unmuteMsg, PERM_MUTE, 0,
|
||||||
|
PERM_WRITE, false, true));
|
||||||
|
|
||||||
|
BMessage* deafenMsg = new BMessage(IM_MESSAGE);
|
||||||
|
deafenMsg->AddInt32("im_what", IM_ROOM_DEAFEN_PARTICIPANT);
|
||||||
|
items.AddItem(_UserMenuItem("Deafen user", deafenMsg, PERM_DEAFEN, PERM_READ,
|
||||||
|
0, false, true));
|
||||||
|
|
||||||
|
BMessage* undeafenMsg = new BMessage(IM_MESSAGE);
|
||||||
|
undeafenMsg->AddInt32("im_what", IM_ROOM_UNDEAFEN_PARTICIPANT);
|
||||||
|
items.AddItem(_UserMenuItem("Undeafen user", undeafenMsg, PERM_DEAFEN, 0,
|
||||||
|
PERM_READ, false, true));
|
||||||
|
return items;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BMessage*
|
||||||
|
_UserMenuItem(const char* label, BMessage* msg, int32 user_perms,
|
||||||
|
int32 target_perms, int32 target_lacks, bool ignorePriority,
|
||||||
|
bool toProtocol)
|
||||||
|
{
|
||||||
|
BMessage* item = new BMessage();
|
||||||
|
item->AddString("class", "BMenuItem");
|
||||||
|
item->AddString("_label", label);
|
||||||
|
item->AddMessage("_msg", msg);
|
||||||
|
|
||||||
|
item->AddInt32("x_perms", user_perms);
|
||||||
|
item->AddInt32("x_target_perms", target_perms);
|
||||||
|
item->AddInt32("x_target_antiperms", target_lacks);
|
||||||
|
item->AddBool("x_priority", ignorePriority);
|
||||||
|
item->AddBool("x_to_protocol", toProtocol);
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2021, Jaidyn Levesque <jadedctrl@teknik.io>
|
||||||
|
* All rights reserved. Distributed under the terms of the MIT license.
|
||||||
|
*/
|
||||||
|
#ifndef DEFAULTITEMS_H
|
||||||
|
#define DEFAULTITEMS_H
|
||||||
|
|
||||||
|
#include "ChatCommand.h"
|
||||||
|
|
||||||
|
#include <ObjectList.h>
|
||||||
|
|
||||||
|
|
||||||
|
CommandMap DefaultCommands();
|
||||||
|
BObjectList<BMessage> DefaultUserPopUpItems();
|
||||||
|
BMessage* _UserMenuItem(const char* label, BMessage* msg,
|
||||||
|
int32 user_perms, int32 target_perms,
|
||||||
|
int32 target_lacks, bool ignorePriority,
|
||||||
|
bool toProtocol);
|
||||||
|
|
||||||
|
|
||||||
|
#endif // DEFAULTITEMS_H
|
|
@ -39,6 +39,7 @@ SRCS = \
|
||||||
application/ChatCommand.cpp \
|
application/ChatCommand.cpp \
|
||||||
application/Contact.cpp \
|
application/Contact.cpp \
|
||||||
application/Conversation.cpp \
|
application/Conversation.cpp \
|
||||||
|
application/DefaultItems.cpp \
|
||||||
application/EditingFilter.cpp \
|
application/EditingFilter.cpp \
|
||||||
application/ImageCache.cpp \
|
application/ImageCache.cpp \
|
||||||
application/Main.cpp \
|
application/Main.cpp \
|
||||||
|
|
|
@ -1,16 +1,20 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2009-2011, Andrea Anzani. All rights reserved.
|
* Copyright 2009-2011, Andrea Anzani. All rights reserved.
|
||||||
* Copyright 2009-2011, Pier Luigi Fiorini. All rights reserved.
|
* Copyright 2009-2011, Pier Luigi Fiorini. All rights reserved.
|
||||||
|
* Copyright 2021, Jaidyn Levesque. All rights reserved.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*
|
*
|
||||||
* Authors:
|
* Authors:
|
||||||
* Andrea Anzani, andrea.anzani@gmail.com
|
* Andrea Anzani, andrea.anzani@gmail.com
|
||||||
* Pier Luigi Fiorini, pierluigi.fiorini@gmail.com
|
* Pier Luigi Fiorini, pierluigi.fiorini@gmail.com
|
||||||
|
* Jaidyn Levesque, jadedctrl@teknik.io
|
||||||
*
|
*
|
||||||
* Contributors:
|
* Contributors:
|
||||||
* Dario Casalinuovo
|
* Dario Casalinuovo
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "Server.h"
|
||||||
|
|
||||||
#include <Application.h>
|
#include <Application.h>
|
||||||
#include <Debug.h>
|
#include <Debug.h>
|
||||||
#include <Entry.h>
|
#include <Entry.h>
|
||||||
|
@ -26,20 +30,22 @@
|
||||||
#include "CayaPreferences.h"
|
#include "CayaPreferences.h"
|
||||||
#include "CayaProtocolMessages.h"
|
#include "CayaProtocolMessages.h"
|
||||||
#include "CayaUtils.h"
|
#include "CayaUtils.h"
|
||||||
|
#include "DefaultItems.h"
|
||||||
#include "ImageCache.h"
|
#include "ImageCache.h"
|
||||||
#include "InviteDialogue.h"
|
#include "InviteDialogue.h"
|
||||||
#include "ProtocolLooper.h"
|
#include "ProtocolLooper.h"
|
||||||
#include "ProtocolManager.h"
|
#include "ProtocolManager.h"
|
||||||
#include "RoomFlags.h"
|
#include "RoomFlags.h"
|
||||||
#include "RosterItem.h"
|
#include "RosterItem.h"
|
||||||
#include "Server.h"
|
#include "UserInfoWindow.h"
|
||||||
|
|
||||||
|
|
||||||
Server::Server()
|
Server::Server()
|
||||||
:
|
:
|
||||||
BMessageFilter(B_ANY_DELIVERY, B_ANY_SOURCE)
|
BMessageFilter(B_ANY_DELIVERY, B_ANY_SOURCE),
|
||||||
|
fUserItems(DefaultUserPopUpItems()),
|
||||||
|
fCommands(DefaultCommands())
|
||||||
{
|
{
|
||||||
_InitDefaultCommands();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -113,6 +119,16 @@ Server::Filter(BMessage* message, BHandler **target)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case CAYA_USER_INFO:
|
||||||
|
{
|
||||||
|
User* user = _EnsureUser(message);
|
||||||
|
if (user != NULL) {
|
||||||
|
UserInfoWindow* win = new UserInfoWindow(user);
|
||||||
|
win->Show();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case CAYA_REQUEST_HELP:
|
case CAYA_REQUEST_HELP:
|
||||||
{
|
{
|
||||||
BString body;
|
BString body;
|
||||||
|
@ -749,19 +765,6 @@ Server::AddConversation(Conversation* chat, int64 instance)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
CommandMap
|
|
||||||
Server::Commands()
|
|
||||||
{
|
|
||||||
CommandMap commands = fCommands;
|
|
||||||
for (int i = 0; i < fAccounts.CountItems(); i++) {
|
|
||||||
ProtocolLooper* fruitLoop = fLoopers.ValueFor(fAccounts.ValueAt(i));
|
|
||||||
if (fruitLoop == NULL) continue;
|
|
||||||
commands.AddList(fruitLoop->Commands());
|
|
||||||
}
|
|
||||||
return fCommands;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ChatCommand*
|
ChatCommand*
|
||||||
Server::CommandById(BString id, int64 instance)
|
Server::CommandById(BString id, int64 instance)
|
||||||
{
|
{
|
||||||
|
@ -775,6 +778,20 @@ Server::CommandById(BString id, int64 instance)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BObjectList<BMessage>
|
||||||
|
Server::ConversationPopUpItems()
|
||||||
|
{
|
||||||
|
return fChatItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BObjectList<BMessage>
|
||||||
|
Server::UserPopUpItems()
|
||||||
|
{
|
||||||
|
return fUserItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
ProtocolLooper*
|
ProtocolLooper*
|
||||||
Server::_LooperFromMessage(BMessage* message)
|
Server::_LooperFromMessage(BMessage* message)
|
||||||
{
|
{
|
||||||
|
@ -890,74 +907,4 @@ Server::_GetRole(BMessage* msg)
|
||||||
return new Role(title, perms, priority);
|
return new Role(title, perms, priority);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
Server::_InitDefaultCommands()
|
|
||||||
{
|
|
||||||
List<int32> roomUser;
|
|
||||||
roomUser.AddItem(CMD_ROOM_PARTICIPANT);
|
|
||||||
List<int32> kickBody;
|
|
||||||
kickBody.AddItem(CMD_ROOM_PARTICIPANT);
|
|
||||||
kickBody.AddItem(CMD_BODY_STRING);
|
|
||||||
List<int32> knownUser;
|
|
||||||
knownUser.AddItem(CMD_KNOWN_USER);
|
|
||||||
List<int32> anyUser;
|
|
||||||
anyUser.AddItem(CMD_ANY_USER);
|
|
||||||
|
|
||||||
BMessage kickMsg(IM_MESSAGE);
|
|
||||||
kickMsg.AddInt32("im_what", IM_ROOM_KICK_PARTICIPANT);
|
|
||||||
ChatCommand* kick = new ChatCommand("kick", kickMsg, true, kickBody);
|
|
||||||
kick->SetDesc("Force a user to temporarily leave the room, assuming your "
|
|
||||||
"power level's high enough.");
|
|
||||||
fCommands.AddItem("kick", kick);
|
|
||||||
|
|
||||||
BMessage banMsg(IM_MESSAGE);
|
|
||||||
banMsg.AddInt32("im_what", IM_ROOM_BAN_PARTICIPANT);
|
|
||||||
ChatCommand* ban = new ChatCommand("ban", banMsg, true, kickBody);
|
|
||||||
ban->SetDesc("Kick a user out of the room and slam the door behind them― "
|
|
||||||
"locking it while you're at it.");
|
|
||||||
fCommands.AddItem("ban", ban);
|
|
||||||
|
|
||||||
BMessage unbanMsg(IM_MESSAGE);
|
|
||||||
unbanMsg.AddInt32("im_what", IM_ROOM_UNBAN_PARTICIPANT);
|
|
||||||
ChatCommand* unban = new ChatCommand("unban", unbanMsg, true, anyUser);
|
|
||||||
unban->SetDesc("Undo a previous ban, allowing the user to rejoin (if they "
|
|
||||||
"still want to).");
|
|
||||||
fCommands.AddItem("unban", unban);
|
|
||||||
|
|
||||||
BMessage muteMsg(IM_MESSAGE);
|
|
||||||
muteMsg.AddInt32("im_what", IM_ROOM_MUTE_PARTICIPANT);
|
|
||||||
ChatCommand* mute = new ChatCommand("mute", muteMsg, true, roomUser);
|
|
||||||
mute->SetDesc("Disallow a user from sending visible messages.");
|
|
||||||
fCommands.AddItem("mute", mute);
|
|
||||||
|
|
||||||
BMessage unmuteMsg(IM_MESSAGE);
|
|
||||||
unmuteMsg.AddInt32("im_what", IM_ROOM_UNMUTE_PARTICIPANT);
|
|
||||||
ChatCommand* unmute = new ChatCommand("unmute", unmuteMsg, true, roomUser);
|
|
||||||
unmute->SetDesc("Restore a user's ability to send messages.");
|
|
||||||
fCommands.AddItem("unmute", unmute);
|
|
||||||
|
|
||||||
BMessage deafenMsg(IM_MESSAGE);
|
|
||||||
deafenMsg.AddInt32("im_what", IM_ROOM_DEAFEN_PARTICIPANT);
|
|
||||||
ChatCommand* deafen = new ChatCommand("deafen", deafenMsg, true, roomUser);
|
|
||||||
deafen->SetDesc("Disallow a user from reading messages sent in the room.");
|
|
||||||
fCommands.AddItem("deafen", deafen);
|
|
||||||
|
|
||||||
BMessage undeafenMsg(IM_MESSAGE);
|
|
||||||
undeafenMsg.AddInt32("im_what", IM_ROOM_UNDEAFEN_PARTICIPANT);
|
|
||||||
ChatCommand* undeafen = new ChatCommand("undeafen", undeafenMsg, true, roomUser);
|
|
||||||
undeafen->SetDesc("Restore a user's ability to receive messages.");
|
|
||||||
fCommands.AddItem("undeafen", undeafen);
|
|
||||||
|
|
||||||
BMessage inviteMsg(IM_MESSAGE);
|
|
||||||
inviteMsg.AddInt32("im_what", IM_ROOM_SEND_INVITE);
|
|
||||||
ChatCommand* invite = new ChatCommand("invite", inviteMsg, true, knownUser);
|
|
||||||
invite->SetDesc("Invite a user to the current room.");
|
|
||||||
fCommands.AddItem("invite", invite);
|
|
||||||
|
|
||||||
BMessage helpMsg(CAYA_REQUEST_HELP);
|
|
||||||
ChatCommand* help = new ChatCommand("help", helpMsg, false, List<int>());
|
|
||||||
help->SetDesc("List all current commands, or get help for certain command.");
|
|
||||||
fCommands.AddItem("help", help);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -59,9 +59,11 @@ public:
|
||||||
Conversation* ConversationById(BString id, int64 instance);
|
Conversation* ConversationById(BString id, int64 instance);
|
||||||
void AddConversation(Conversation* chat, int64 instance);
|
void AddConversation(Conversation* chat, int64 instance);
|
||||||
|
|
||||||
CommandMap Commands();
|
|
||||||
ChatCommand* CommandById(BString id, int64 instance);
|
ChatCommand* CommandById(BString id, int64 instance);
|
||||||
|
|
||||||
|
BObjectList<BMessage> ConversationPopUpItems();
|
||||||
|
BObjectList<BMessage> UserPopUpItems();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ProtocolLooper* _LooperFromMessage(BMessage* message);
|
ProtocolLooper* _LooperFromMessage(BMessage* message);
|
||||||
|
|
||||||
|
@ -72,14 +74,18 @@ private:
|
||||||
|
|
||||||
Role* _GetRole(BMessage* msg);
|
Role* _GetRole(BMessage* msg);
|
||||||
|
|
||||||
void _InitDefaultCommands();
|
|
||||||
void _ReplicantStatusNotify(CayaStatus status);
|
void _ReplicantStatusNotify(CayaStatus status);
|
||||||
|
|
||||||
ProtocolLoopers fLoopers;
|
ProtocolLoopers fLoopers;
|
||||||
AccountInstances
|
AccountInstances
|
||||||
fAccounts;
|
fAccounts;
|
||||||
CommandMap fCommands;
|
|
||||||
BString fMySelf;
|
BString fMySelf;
|
||||||
|
|
||||||
|
CommandMap fCommands;
|
||||||
|
BObjectList<BMessage>
|
||||||
|
fChatItems;
|
||||||
|
BObjectList<BMessage>
|
||||||
|
fUserItems;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -12,8 +12,11 @@
|
||||||
#include "CayaMessages.h"
|
#include "CayaMessages.h"
|
||||||
#include "CayaProtocolMessages.h"
|
#include "CayaProtocolMessages.h"
|
||||||
#include "Conversation.h"
|
#include "Conversation.h"
|
||||||
|
#include "MainWindow.h"
|
||||||
#include "ProtocolLooper.h"
|
#include "ProtocolLooper.h"
|
||||||
#include "Role.h"
|
#include "Role.h"
|
||||||
|
#include "Server.h"
|
||||||
|
#include "TheApp.h"
|
||||||
#include "User.h"
|
#include "User.h"
|
||||||
#include "UserInfoWindow.h"
|
#include "UserInfoWindow.h"
|
||||||
#include "UserItem.h"
|
#include "UserItem.h"
|
||||||
|
@ -27,44 +30,6 @@ UserListView::UserListView(const char* name)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
UserListView::MessageReceived(BMessage* msg)
|
|
||||||
{
|
|
||||||
switch (msg->what) {
|
|
||||||
case kUserInfo:
|
|
||||||
{
|
|
||||||
UserItem* item = (UserItem*)ItemAt(CurrentSelection());
|
|
||||||
if (item == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
UserInfoWindow* win = new UserInfoWindow(item->GetUser());
|
|
||||||
win->Show();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case kKickUser:
|
|
||||||
_ModerationAction(IM_ROOM_KICK_PARTICIPANT);
|
|
||||||
break;
|
|
||||||
case kBanUser:
|
|
||||||
_ModerationAction(IM_ROOM_BAN_PARTICIPANT);
|
|
||||||
break;
|
|
||||||
case kMuteUser:
|
|
||||||
_ModerationAction(IM_ROOM_MUTE_PARTICIPANT);
|
|
||||||
break;
|
|
||||||
case kUnmuteUser:
|
|
||||||
_ModerationAction(IM_ROOM_UNMUTE_PARTICIPANT);
|
|
||||||
break;
|
|
||||||
case kDeafenUser:
|
|
||||||
_ModerationAction(IM_ROOM_DEAFEN_PARTICIPANT);
|
|
||||||
break;
|
|
||||||
case kUndeafenUser:
|
|
||||||
_ModerationAction(IM_ROOM_UNDEAFEN_PARTICIPANT);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
BListView::MessageReceived(msg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
UserListView::MouseDown(BPoint where)
|
UserListView::MouseDown(BPoint where)
|
||||||
{
|
{
|
||||||
|
@ -87,47 +52,24 @@ BPopUpMenu*
|
||||||
UserListView::_UserPopUp()
|
UserListView::_UserPopUp()
|
||||||
{
|
{
|
||||||
BPopUpMenu* menu = new BPopUpMenu("userPopUp");
|
BPopUpMenu* menu = new BPopUpMenu("userPopUp");
|
||||||
menu->AddItem(new BMenuItem("User info" B_UTF8_ELLIPSIS,
|
|
||||||
new BMessage(kUserInfo)));
|
|
||||||
menu->SetTargetForItems(this);
|
|
||||||
|
|
||||||
// Now for the moderation items
|
|
||||||
Role* role = fChat->GetRole(fChat->GetOwnId());
|
|
||||||
if (role == NULL) return menu;
|
|
||||||
int32 perms = role->fPerms;
|
|
||||||
UserItem* item = (UserItem*)ItemAt(CurrentSelection());
|
UserItem* item = (UserItem*)ItemAt(CurrentSelection());
|
||||||
User* selected_user;
|
User* selected_user;
|
||||||
|
|
||||||
if (item == NULL || (selected_user = item->GetUser()) == NULL)
|
if (item == NULL || (selected_user = item->GetUser()) == NULL)
|
||||||
return menu;
|
return _BlankPopUp();
|
||||||
|
|
||||||
|
Role* own_role = fChat->GetRole(fChat->GetOwnId());
|
||||||
|
if (own_role == NULL) return _BlankPopUp();
|
||||||
|
|
||||||
Role* selected_role = fChat->GetRole(selected_user->GetId());
|
Role* selected_role = fChat->GetRole(selected_user->GetId());
|
||||||
if (selected_role == NULL) return menu;
|
if (selected_role == NULL) return _BlankPopUp();
|
||||||
int32 selected_priority = selected_role->fPriority;
|
|
||||||
int32 selected_perms = selected_role->fPerms;
|
|
||||||
if (selected_priority > role->fPriority)
|
|
||||||
return menu;
|
|
||||||
|
|
||||||
if ((perms & PERM_DEAFEN) || (perms & PERM_MUTE) || (perms & PERM_KICK)
|
Server* server = ((TheApp*)be_app)->GetMainWindow()->GetServer();
|
||||||
|| (perms & PERM_BAN))
|
BObjectList<BMessage> items = server->UserPopUpItems();
|
||||||
menu->AddSeparatorItem();
|
|
||||||
|
|
||||||
if ((perms & PERM_DEAFEN) && (selected_perms & PERM_READ))
|
for (int i = 0; i < items.CountItems(); i++) {
|
||||||
menu->AddItem(new BMenuItem("Deafen user", new BMessage(kDeafenUser)));
|
BMessage* itemMsg = items.ItemAt(i);
|
||||||
if ((perms & PERM_DEAFEN) && !(selected_perms & PERM_READ))
|
_ProcessItem(itemMsg, menu, own_role, selected_role, selected_user->GetId());
|
||||||
menu->AddItem(new BMenuItem("Undeafen user", new BMessage(kUndeafenUser)));
|
}
|
||||||
|
|
||||||
if ((perms & PERM_MUTE) && (selected_perms & PERM_WRITE))
|
|
||||||
menu->AddItem(new BMenuItem("Mute user", new BMessage(kMuteUser)));
|
|
||||||
if ((perms & PERM_MUTE) && !(selected_perms & PERM_WRITE))
|
|
||||||
menu->AddItem(new BMenuItem("Unmute user", new BMessage(kUnmuteUser)));
|
|
||||||
|
|
||||||
if (perms & PERM_KICK)
|
|
||||||
menu->AddItem(new BMenuItem("Kick user", new BMessage(kKickUser)));
|
|
||||||
if (perms & PERM_BAN)
|
|
||||||
menu->AddItem(new BMenuItem("Ban user", new BMessage(kBanUser)));
|
|
||||||
|
|
||||||
menu->SetTargetForItems(this);
|
|
||||||
return menu;
|
return menu;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -150,19 +92,35 @@ UserListView::_BlankPopUp()
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
UserListView::_ModerationAction(int32 im_what)
|
UserListView::_ProcessItem(BMessage* itemMsg, BPopUpMenu* menu, Role* user,
|
||||||
|
Role* target, BString target_id)
|
||||||
{
|
{
|
||||||
Role* role = fChat->GetRole(fChat->GetOwnId());
|
BMessage* msg = new BMessage(*itemMsg);
|
||||||
int32 perms = role->fPerms;
|
bool priority = msg->GetBool("x_priority", false);
|
||||||
UserItem* item = (UserItem*)ItemAt(CurrentSelection());
|
int32 perms = msg->GetInt32("x_perms", 0);
|
||||||
if (item == NULL)
|
int32 target_perms = msg->GetInt32("x_target_perms", 0);
|
||||||
return;
|
int32 target_antiperms = msg->GetInt32("x_target_antiperms", 0);
|
||||||
|
|
||||||
BMessage modMsg(IM_MESSAGE);
|
BMessage toSend;
|
||||||
modMsg.AddInt32("im_what", im_what);
|
msg->FindMessage("_msg", &toSend);
|
||||||
modMsg.AddString("user_id", item->GetUser()->GetId());
|
toSend.AddString("user_id", target_id);
|
||||||
modMsg.AddString("chat_id", fChat->GetId());
|
toSend.AddString("chat_id", fChat->GetId());
|
||||||
fChat->GetProtocolLooper()->PostMessage(&modMsg);
|
toSend.AddInt64("instance", fChat->GetProtocolLooper()->GetInstance());
|
||||||
|
msg->ReplaceMessage("_msg", &toSend);
|
||||||
|
|
||||||
|
if ((perms == 0 || (user->fPerms & perms))
|
||||||
|
&& (target_perms == 0 || (target->fPerms & target_perms))
|
||||||
|
&& (target_antiperms == 0 || (!(target->fPerms & target_antiperms)))
|
||||||
|
&& ((priority == false) || (user->fPriority > target->fPriority)))
|
||||||
|
{
|
||||||
|
BMenuItem* item = new BMenuItem(msg);
|
||||||
|
if (msg->GetBool("x_to_protocol", true) == true)
|
||||||
|
item->SetTarget(fChat->GetProtocolLooper());
|
||||||
|
else
|
||||||
|
item->SetTarget(Window());
|
||||||
|
|
||||||
|
menu->AddItem(item);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,8 @@
|
||||||
|
|
||||||
#include <ListView.h>
|
#include <ListView.h>
|
||||||
|
|
||||||
|
#include "Role.h"
|
||||||
|
|
||||||
class BPopUpMenu;
|
class BPopUpMenu;
|
||||||
class Conversation;
|
class Conversation;
|
||||||
|
|
||||||
|
@ -27,8 +29,6 @@ class UserListView : public BListView {
|
||||||
public:
|
public:
|
||||||
UserListView(const char* name);
|
UserListView(const char* name);
|
||||||
|
|
||||||
void MessageReceived(BMessage* msg);
|
|
||||||
|
|
||||||
void MouseDown(BPoint where);
|
void MouseDown(BPoint where);
|
||||||
|
|
||||||
void SetConversation(Conversation* chat) { fChat = chat; }
|
void SetConversation(Conversation* chat) { fChat = chat; }
|
||||||
|
@ -38,6 +38,8 @@ private:
|
||||||
BPopUpMenu* _BlankPopUp();
|
BPopUpMenu* _BlankPopUp();
|
||||||
|
|
||||||
void _ModerationAction(int32 im_what);
|
void _ModerationAction(int32 im_what);
|
||||||
|
void _ProcessItem(BMessage* itemMsg, BPopUpMenu* menu, Role* user,
|
||||||
|
Role* target, BString target_id);
|
||||||
|
|
||||||
Conversation* fChat;
|
Conversation* fChat;
|
||||||
};
|
};
|
||||||
|
|
Ŝarĝante…
Reference in New Issue