Register commands & pop-up items through messages
Use IM_MESSAGEs, IM_REGISTER_COMMAND and IM_REGISTER_USER_ITEM, for registering commands and user-list pop-up items. The former replaces CayaProtocol::Commands(), which was a real bad idea in the first place. Just awful. No idea why I did that instead of this, which is nicer and significantly easier anyway.
This commit is contained in:
parent
a03746c034
commit
8a9cb9effd
|
@ -9,8 +9,6 @@
|
|||
|
||||
#include <Messenger.h>
|
||||
|
||||
#include "ChatCommand.h"
|
||||
|
||||
class BBitmap;
|
||||
|
||||
|
||||
|
@ -65,9 +63,6 @@ public:
|
|||
|
||||
//! Messenger interface used
|
||||
virtual CayaProtocolMessengerInterface* MessengerInterface() const = 0;
|
||||
|
||||
//! Return a map of any custom commands
|
||||
virtual CommandMap Commands() = 0;
|
||||
};
|
||||
|
||||
#endif // _CAYA_PROTOCOL_H
|
||||
|
|
|
@ -365,7 +365,30 @@ enum im_what_code {
|
|||
IM_SPECIAL_FROM_PROTOCOL = 1001,
|
||||
|
||||
//! Protocol is ready to receive messages
|
||||
IM_PROTOCOL_READY = 1002
|
||||
IM_PROTOCOL_READY = 1002,
|
||||
|
||||
|
||||
/*
|
||||
* GUI-related messages
|
||||
*/
|
||||
|
||||
//! Register a chat command →Caya
|
||||
// Just an archived ChatCommand; if "instance" isn't specified, the command
|
||||
// is global, rather than protocol-only.
|
||||
// Requires: String "_name", String "_desc", Bool "_proto",
|
||||
// Message "_msg", int32s "_argtype",
|
||||
// String "class" = "ChatCommand"
|
||||
// Allowed: int64 "instance"
|
||||
IM_REGISTER_COMMAND = 1100,
|
||||
|
||||
//! Register a pop-up item →Caya
|
||||
// Just an archived BMenuItem with extra slots; if "instance" isn't
|
||||
// specified, the item is global, rather than protocol-only.
|
||||
// Requires: String "_label", Message "_msg", String "class" = "BMenuItem"
|
||||
// Bool "x_to_protocol", Bool "x_priority", int32 "x_perms",
|
||||
// int32 "x_target_perms", int32 "x_target_antiperms"
|
||||
// Allowed: int64 "instance"
|
||||
IM_REGISTER_USER_ITEM = 1101
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -5,15 +5,17 @@
|
|||
|
||||
#include "DefaultItems.h"
|
||||
|
||||
#include <Looper.h>
|
||||
#include <InterfaceDefs.h>
|
||||
|
||||
#include "CayaMessages.h"
|
||||
#include "CayaProtocolMessages.h"
|
||||
#include "ChatCommand.h"
|
||||
#include "Role.h"
|
||||
|
||||
|
||||
CommandMap
|
||||
DefaultCommands()
|
||||
void
|
||||
DefaultCommands(BLooper* target)
|
||||
{
|
||||
List<int32> roomUser;
|
||||
roomUser.AddItem(CMD_ROOM_PARTICIPANT);
|
||||
|
@ -83,48 +85,54 @@ DefaultCommands()
|
|||
help->SetDesc("List all current commands, or get help for certain command.");
|
||||
commands.AddItem("help", help);
|
||||
|
||||
return commands;
|
||||
for (int i = 0; i < commands.CountItems(); i++) {
|
||||
BMessage* item = new BMessage(IM_MESSAGE);
|
||||
item->AddInt32("im_what", IM_REGISTER_COMMAND);
|
||||
ChatCommand* cmd = commands.ValueAt(i);
|
||||
cmd->Archive(item);
|
||||
target->PostMessage(item);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
BObjectList<BMessage>
|
||||
DefaultUserPopUpItems()
|
||||
void
|
||||
DefaultUserPopUpItems(BLooper* target)
|
||||
{
|
||||
BObjectList<BMessage> items;
|
||||
|
||||
BMessage* infoMsg = new BMessage(CAYA_USER_INFO);
|
||||
items.AddItem(_UserMenuItem("User info" B_UTF8_ELLIPSIS, infoMsg, 0, 0, 0,
|
||||
false, false));
|
||||
target->PostMessage(_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));
|
||||
target->PostMessage(_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));
|
||||
target->PostMessage(_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));
|
||||
target->PostMessage(_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));
|
||||
target->PostMessage(_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));
|
||||
target->PostMessage(_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;
|
||||
target->PostMessage(_UserMenuItem("Undeafen user", undeafenMsg, PERM_DEAFEN,
|
||||
0, PERM_READ, false, true));
|
||||
}
|
||||
|
||||
|
||||
|
@ -133,7 +141,9 @@ _UserMenuItem(const char* label, BMessage* msg, int32 user_perms,
|
|||
int32 target_perms, int32 target_lacks, bool ignorePriority,
|
||||
bool toProtocol)
|
||||
{
|
||||
BMessage* item = new BMessage();
|
||||
BMessage* item = new BMessage(IM_MESSAGE);
|
||||
item->AddInt32("im_what", IM_REGISTER_USER_ITEM);
|
||||
|
||||
item->AddString("class", "BMenuItem");
|
||||
item->AddString("_label", label);
|
||||
item->AddMessage("_msg", msg);
|
||||
|
|
|
@ -5,13 +5,14 @@
|
|||
#ifndef DEFAULTITEMS_H
|
||||
#define DEFAULTITEMS_H
|
||||
|
||||
#include "ChatCommand.h"
|
||||
|
||||
#include <ObjectList.h>
|
||||
|
||||
class BLooper;
|
||||
class BMessage;
|
||||
|
||||
CommandMap DefaultCommands();
|
||||
BObjectList<BMessage> DefaultUserPopUpItems();
|
||||
|
||||
void DefaultCommands(BLooper* target);
|
||||
void DefaultUserPopUpItems(BLooper* target);
|
||||
BMessage* _UserMenuItem(const char* label, BMessage* msg,
|
||||
int32 user_perms, int32 target_perms,
|
||||
int32 target_lacks, bool ignorePriority,
|
||||
|
|
|
@ -24,8 +24,7 @@ ProtocolLooper::ProtocolLooper(CayaProtocol* protocol, int64 instance)
|
|||
BLooper(),
|
||||
fProtocol(protocol),
|
||||
fInstance(instance),
|
||||
fListItem(NULL),
|
||||
fCommands(protocol->Commands())
|
||||
fListItem(NULL)
|
||||
{
|
||||
Account* account = reinterpret_cast<Account*>(
|
||||
protocol->MessengerInterface());
|
||||
|
@ -158,6 +157,27 @@ ProtocolLooper::CommandById(BString id)
|
|||
}
|
||||
|
||||
|
||||
void
|
||||
ProtocolLooper::AddCommand(ChatCommand* cmd)
|
||||
{
|
||||
fCommands.AddItem(cmd->GetName(), cmd);
|
||||
}
|
||||
|
||||
|
||||
BObjectList<BMessage>
|
||||
ProtocolLooper::UserPopUpItems() const
|
||||
{
|
||||
return fUserItems;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ProtocolLooper::AddUserPopUpItem(BMessage* archived)
|
||||
{
|
||||
fUserItems.AddItem(archived);
|
||||
}
|
||||
|
||||
|
||||
BString
|
||||
ProtocolLooper::GetOwnId()
|
||||
{
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
#define _PROTOCOL_LOOPER_H
|
||||
|
||||
#include <Looper.h>
|
||||
#include <ObjectList.h>
|
||||
#include <String.h>
|
||||
|
||||
#include <libsupport/KeyMap.h>
|
||||
|
@ -50,6 +51,11 @@ public:
|
|||
|
||||
CommandMap Commands() const;
|
||||
ChatCommand* CommandById(BString id);
|
||||
void AddCommand(ChatCommand* cmd);
|
||||
|
||||
BObjectList<BMessage>
|
||||
UserPopUpItems() const;
|
||||
void AddUserPopUpItem(BMessage* archived);
|
||||
|
||||
BString GetOwnId();
|
||||
void SetOwnId(BString user_id);
|
||||
|
@ -68,7 +74,9 @@ private:
|
|||
ChatMap fChatMap;
|
||||
RosterMap fRosterMap;
|
||||
UserMap fUserMap;
|
||||
|
||||
CommandMap fCommands;
|
||||
BObjectList<BMessage> fUserItems;
|
||||
|
||||
ConversationAccountItem*
|
||||
fListItem;
|
||||
|
|
|
@ -42,9 +42,7 @@
|
|||
|
||||
Server::Server()
|
||||
:
|
||||
BMessageFilter(B_ANY_DELIVERY, B_ANY_SOURCE),
|
||||
fUserItems(DefaultUserPopUpItems()),
|
||||
fCommands(DefaultCommands())
|
||||
BMessageFilter(B_ANY_DELIVERY, B_ANY_SOURCE)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -522,6 +520,27 @@ Server::ImMessage(BMessage* msg)
|
|||
|
||||
break;
|
||||
}
|
||||
case IM_REGISTER_COMMAND:
|
||||
{
|
||||
ChatCommand* cmd = new ChatCommand(msg);
|
||||
if (cmd == NULL) break;
|
||||
|
||||
ProtocolLooper* looper = _LooperFromMessage(msg);
|
||||
if (looper == NULL)
|
||||
fCommands.AddItem(cmd->GetName(), cmd);
|
||||
else
|
||||
looper->AddCommand(cmd);
|
||||
break;
|
||||
}
|
||||
case IM_REGISTER_USER_ITEM:
|
||||
{
|
||||
ProtocolLooper* looper = _LooperFromMessage(msg);
|
||||
if (looper == NULL)
|
||||
fUserItems.AddItem(new BMessage(*msg));
|
||||
else
|
||||
looper->AddUserPopUpItem(new BMessage(*msg));
|
||||
break;
|
||||
}
|
||||
case IM_PROTOCOL_READY:
|
||||
{
|
||||
// Ready notification
|
||||
|
|
|
@ -1,12 +1,13 @@
|
|||
/*
|
||||
* Copyright 2021, Jaidyn Levesque. All rights reserved.
|
||||
* Copyright 2009-2011, Andrea Anzani. 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.
|
||||
*
|
||||
* Authors:
|
||||
* Andrea Anzani, andrea.anzani@gmail.com
|
||||
* Pier Luigi Fiorini, pierluigi.fiorini@gmail.com
|
||||
* Jaidyn Levesque, jadedctrl@teknik.io
|
||||
*/
|
||||
|
||||
#include <Application.h>
|
||||
|
@ -23,6 +24,7 @@
|
|||
#include "ConversationItem.h"
|
||||
#include "ConversationListView.h"
|
||||
#include "ConversationView.h"
|
||||
#include "DefaultItems.h"
|
||||
#include "EditingFilter.h"
|
||||
#include "JoinWindow.h"
|
||||
#include "MainWindow.h"
|
||||
|
@ -51,6 +53,10 @@ MainWindow::MainWindow()
|
|||
fServer = new Server();
|
||||
AddFilter(fServer);
|
||||
|
||||
// Register default commands & items
|
||||
DefaultCommands(this);
|
||||
DefaultUserPopUpItems(this);
|
||||
|
||||
// Also through the editing filter (enter to send)
|
||||
AddCommonFilter(new EditingFilter(fSendView));
|
||||
fSendView->MakeFocus(true);
|
||||
|
|
|
@ -341,13 +341,6 @@ JabberHandler::UpdateSettings(BMessage* msg)
|
|||
}
|
||||
|
||||
|
||||
CommandMap
|
||||
JabberHandler::Commands()
|
||||
{
|
||||
return CommandMap();
|
||||
}
|
||||
|
||||
|
||||
uint32
|
||||
JabberHandler::GetEncoding()
|
||||
{
|
||||
|
|
|
@ -34,7 +34,6 @@
|
|||
|
||||
#include <CayaProtocol.h>
|
||||
#include <CayaConstants.h>
|
||||
#include <ChatCommand.h>
|
||||
#include <libsupport/KeyMap.h>
|
||||
|
||||
class BList;
|
||||
|
@ -71,8 +70,6 @@ public:
|
|||
|
||||
virtual status_t UpdateSettings(BMessage* msg);
|
||||
|
||||
virtual CommandMap Commands();
|
||||
|
||||
virtual uint32 GetEncoding();
|
||||
|
||||
virtual CayaProtocolMessengerInterface*
|
||||
|
|
Ŝarĝante…
Reference in New Issue