Include default templates, split "room"

The "room" template has been split into two seperate
templates― "join_room" and "create_room". Before, "room" was used in the
room creation window, but now that's delegated to "create_room".

"join_room" is used with the join window― so now, the add-on has total
control over the slots used to join/create rooms generally, if they
specify the templates. Even a "/join" command could be overriden by the
add-on.

Also, default templates are now in use. Rather than add-ons being
required to specify templates, there are sensible defaults included with
Cardie for each one.
This commit is contained in:
Jaidyn Ann 2021-07-05 13:40:59 -05:00
parent 23bee9b0a6
commit c0f126206a
9 changed files with 65 additions and 53 deletions

View File

@ -226,8 +226,8 @@ enum im_what_code {
/*! Create a room →Protocol /*! Create a room →Protocol
The required slots for this message are completely determined by the The required slots for this message are completely determined by the
protocol itself the protocol will just receive data from the protocol itself the protocol will just receive data from the
"room" template (which is fetched via "create_room" template (which is fetched via
ChatProtocol::SettingsTemplate("room") */ ChatProtocol::SettingsTemplate("create_room") */
IM_CREATE_ROOM = 152, IM_CREATE_ROOM = 152,
/*! Inform App room was created →App /*! Inform App room was created →App
@ -236,7 +236,8 @@ enum im_what_code {
IM_ROOM_CREATED = 153, IM_ROOM_CREATED = 153,
/*! Join a room →Protocol /*! Join a room →Protocol
Requires: String "chat_id" */ The required slots for this message are completely determined by the
protocol itself like IM_CREATE_ROOM with the "join_room" template. */
IM_JOIN_ROOM = 154, IM_JOIN_ROOM = 154,
/*! Confirm the room's been joined →App /*! Confirm the room's been joined →App
@ -308,6 +309,11 @@ enum im_what_code {
The idea is that all other metadata-related messages should only be The idea is that all other metadata-related messages should only be
called either from a request, or from a change. called either from a request, or from a change.
This shouldn't be sent automatically upon joining a room. This shouldn't be sent automatically upon joining a room.
Recommendations on default room flags: Unless your protocol has remote
logs, ROOM_LOG_LOCALLY and ROOM_POPULATE_LOGS should be enabled; and for
multi-user rooms, ROOM_AUTOJOIN should be enabled by default (again,
unless the protocol manages auto-joins).
Requires: String "chat_id" Requires: String "chat_id"
Allows: String "chat_name", String "subject", Allows: String "chat_name", String "subject",
int32 "room_default_flags", int32 "room_disallowed_flags" */ int32 "room_default_flags", int32 "room_disallowed_flags" */

View File

@ -28,6 +28,7 @@
#include "ChatProtocol.h" #include "ChatProtocol.h"
#include "ChatProtocolAddOn.h" #include "ChatProtocolAddOn.h"
#include "Utils.h"
const float kDividerWidth = 1.0f; const float kDividerWidth = 1.0f;
@ -40,6 +41,15 @@ ProtocolTemplate::ProtocolTemplate(ChatProtocol* protocol, const char* type)
{ {
// Load protocol's settings template // Load protocol's settings template
BMessage settingsTemplate = fProtocol->SettingsTemplate(type); BMessage settingsTemplate = fProtocol->SettingsTemplate(type);
if (settingsTemplate.IsEmpty() == true) {
size_t size;
const void* buff =
ChatResources()->LoadResource(B_MESSAGE_TYPE, type, &size);
if (buff != NULL)
settingsTemplate.Unflatten((const char*)buff);
}
*fTemplate = settingsTemplate; *fTemplate = settingsTemplate;
} }

View File

@ -123,26 +123,17 @@ MainWindow::MessageReceived(BMessage* message)
createMsg->AddInt32("im_what", IM_CREATE_ROOM); createMsg->AddInt32("im_what", IM_CREATE_ROOM);
TemplateWindow* win = new TemplateWindow("Create room", TemplateWindow* win = new TemplateWindow("Create room",
"room", createMsg, fServer); "create_room", createMsg, fServer);
win->Show(); win->Show();
break; break;
} }
case APP_JOIN_ROOM: case APP_JOIN_ROOM:
{ {
BMessage temp;
BMessage roomId;
roomId.AddString("name", "chat_id");
roomId.AddString("description", "Room ID:");
roomId.AddString("error", "You can't join an addressless room! "
"Please enter a valid room ID.");
roomId.AddInt32("type", 'CSTR');
temp.AddMessage("setting", &roomId);
BMessage* joinMsg = new BMessage(IM_MESSAGE); BMessage* joinMsg = new BMessage(IM_MESSAGE);
joinMsg->AddInt32("im_what", IM_JOIN_ROOM); joinMsg->AddInt32("im_what", IM_JOIN_ROOM);
TemplateWindow* win = new TemplateWindow("Join a room", TemplateWindow* win = new TemplateWindow("Join a room",
new ProtocolTemplate(temp), joinMsg, fServer); "join_room", joinMsg, fServer);
win->Show(); win->Show();
break; break;
} }

View File

@ -1,5 +1,40 @@
#include "Flags.h" #include "Flags.h"
// Default templates
resource(1001, "roster") message('IMst')
{
"setting" = message
{
"name" = "user_id",
"description" = "Username:",
"error" = "You can't friend someone without a username.",
int32 "type" = 'CSTR'
}
};
resource(1002, "create_room") message('IMst')
{
"setting" = message
{
"name" = "chat_id",
"description" = "Room:",
"error" = "You can't quite seem to find ' ' on the map.",
int32 "type" = 'CSTR'
}
};
resource(1003, "join_room") message('IMst')
{
"setting" = message
{
"name" = "chat_id",
"description" = "Room:",
"error" = "You can't quite seem to find ' ' on the map.",
int32 "type" = 'CSTR'
}
};
// User pop-up menu items // User pop-up menu items
resource(1100) message resource(1100) message
{ {
@ -173,3 +208,6 @@ resource(1148) message
bool "_proto" = true, bool "_proto" = true,
int32 "_argtype" = 1128362608 int32 "_argtype" = 1128362608
}; };

View File

@ -46,25 +46,3 @@ resource(1000, "account") message('IMst')
int32 "type" = 'LONG' int32 "type" = 'LONG'
} }
}; };
resource(1001, "roster") message('IMst')
{
"setting" = message
{
"name" = "user_id",
"description" = "Nickname:",
"error" = "You can't friend someone without a nick.",
int32 "type" = 'CSTR'
}
};
resource(1002, "room") message('IMst')
{
"setting" = message
{
"name" = "room_id",
"description" = "Room:",
"error" = "You can't friend someone without a nick.",
int32 "type" = 'CSTR'
}
};

View File

@ -197,18 +197,7 @@ PurpleApp::ImMessage(BMessage* msg)
} }
case IM_JOIN_ROOM: case IM_JOIN_ROOM:
{ {
PurpleConnection* conn = _ConnectionFromMessage(msg); serv_join_chat(_ConnectionFromMessage(msg), _ParseRoomTemplate(msg));
BString chat_id = msg->FindString("chat_id");
if (conn == NULL || chat_id.IsEmpty() == true) break;
PurplePluginProtocolInfo* info =
PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(conn));
if (info->chat_info_defaults != NULL) {
GHashTable* hash = info->chat_info_defaults(conn,
chat_id.String());
serv_join_chat(conn, hash);
}
break; break;
} }
case IM_LEAVE_ROOM: case IM_LEAVE_ROOM:

View File

@ -216,7 +216,7 @@ PurpleProtocol::SettingsTemplate(const char* name)
return _RosterTemplate(); return _RosterTemplate();
else if (strcmp(name, "account") == 0) else if (strcmp(name, "account") == 0)
fTemplates.FindMessage("account", &temp); fTemplates.FindMessage("account", &temp);
else if (strcmp(name, "room") == 0 || strcmp(name, "join") == 0) else if (strcmp(name, "create_room") == 0 || strcmp(name, "join_room") == 0)
fTemplates.FindMessage("room", &temp); fTemplates.FindMessage("room", &temp);
return temp; return temp;
} }

View File

@ -1264,7 +1264,7 @@ JabberHandler::_RoomTemplate()
BMessage roomIdentifier; BMessage roomIdentifier;
roomIdentifier.AddString("name", "chat_id"); roomIdentifier.AddString("name", "chat_id");
roomIdentifier.AddString("description", "Room ID:"); roomIdentifier.AddString("description", "Room ID:");
roomIdentifier.AddString("error", "You can't create a room without a JID!\n" roomIdentifier.AddString("error", "You can't have a room without a JID!\n"
"Use the \"name@server\" format."); "Use the \"name@server\" format.");
roomIdentifier.AddInt32("type", 'CSTR'); roomIdentifier.AddInt32("type", 'CSTR');
stemplate.AddMessage("setting", &roomIdentifier); stemplate.AddMessage("setting", &roomIdentifier);

View File

@ -48,11 +48,11 @@ JabberProtocol::Icon() const
BMessage BMessage
JabberProtocol::SettingsTemplate(const char* name) JabberProtocol::SettingsTemplate(const char* name)
{ {
if (name == BString("account")) if (strcmp(name, "account") == 0)
return JabberHandler::_SettingsTemplate("Jabber identifier:", true); return JabberHandler::_SettingsTemplate("Jabber identifier:", true);
if (name == BString("room")) if (strcmp(name, "join_room") == 0 || strcmp(name, "create_room") == 0)
return JabberHandler::_RoomTemplate(); return JabberHandler::_RoomTemplate();
if (name == BString("roster")) if (strcmp(name, "roster") == 0)
return JabberHandler::_RosterTemplate(); return JabberHandler::_RosterTemplate();
else else
return BMessage(); return BMessage();