(purple) Joining rooms, receiving chat messages

This commit is contained in:
Jaidyn Ann 2021-06-28 12:13:24 -05:00
parent 30e3d6eefd
commit 82cf946bc8
2 changed files with 88 additions and 30 deletions

View File

@ -55,7 +55,7 @@ PurpleApp::PurpleApp()
_GetProtocolsInfo(); _GetProtocolsInfo();
new BMessageRunner(this, new BMessage(G_MAIN_LOOP), 100000, -1); new BMessageRunner(this, new BMessage(G_MAIN_LOOP), 100000, -1);
new BMessageRunner(this, new BMessage(CHECK_APP), 60000000, -1); new BMessageRunner(this, new BMessage(CHECK_APP), 30000000, -1);
} }
@ -230,7 +230,7 @@ PurpleApp::_ParseProtoOptions(PurplePluginProtocolInfo* info)
} }
} }
// Add any UserSplits (that is, parts of the protocols 'username' format) // Add any UserSplits (that is, parts of the protocol's "username" format)
GList* splitIter = info->user_splits; GList* splitIter = info->user_splits;
for (int i = 0; splitIter != NULL; splitIter = splitIter->next) for (int i = 0; splitIter != NULL; splitIter = splitIter->next)
{ {
@ -452,24 +452,22 @@ init_signals()
{ {
int handle; int handle;
purple_signal_connect(purple_connections_get_handle(), "signed-on",
&handle, PURPLE_CALLBACK(signal_signed_on), NULL);
purple_signal_connect(purple_connections_get_handle(), "connection-error", purple_signal_connect(purple_connections_get_handle(), "connection-error",
&handle, PURPLE_CALLBACK(signal_connection_error), NULL); &handle, PURPLE_CALLBACK(signal_connection_error), NULL);
purple_signal_connect(purple_connections_get_handle(), "account-status-changed", purple_signal_connect(purple_accounts_get_handle(), "account-signed-on",
&handle, PURPLE_CALLBACK(signal_account_signed_on), NULL);
purple_signal_connect(purple_accounts_get_handle(), "account-status-changed",
&handle, PURPLE_CALLBACK(signal_account_status_changed), NULL); &handle, PURPLE_CALLBACK(signal_account_status_changed), NULL);
}
purple_signal_connect(purple_conversations_get_handle(), "chat-joined",
static void &handle, PURPLE_CALLBACK(signal_chat_joined), NULL);
signal_signed_on(PurpleConnection* gc) purple_signal_connect(purple_conversations_get_handle(), "chat-left",
{ &handle, PURPLE_CALLBACK(signal_chat_left), NULL);
BMessage readyMsg(IM_MESSAGE); purple_signal_connect(purple_conversations_get_handle(), "received-chat-msg",
readyMsg.AddInt32("im_what", IM_PROTOCOL_READY); &handle, PURPLE_CALLBACK(signal_received_chat_msg), NULL);
purple_signal_connect(purple_conversations_get_handle(), "received-im-msg",
PurpleApp* app = (PurpleApp*)be_app; &handle, PURPLE_CALLBACK(signal_received_chat_msg), NULL);
app->SendMessage(purple_connection_get_account(gc), readyMsg);
} }
@ -477,7 +475,23 @@ static void
signal_connection_error(PurpleConnection* gc, PurpleConnectionError err, signal_connection_error(PurpleConnection* gc, PurpleConnectionError err,
const gchar* desc) const gchar* desc)
{ {
std::cout << "Connection failed: " << (const char*)desc << std::endl; std::cerr << "Connection failed: " << (const char*)desc << std::endl;
}
static void
signal_account_signed_on(PurpleAccount* account)
{
BMessage readyMsg(IM_MESSAGE);
readyMsg.AddInt32("im_what", IM_PROTOCOL_READY);
PurpleApp* app = (PurpleApp*)be_app;
((PurpleApp*)be_app)->SendMessage(account, readyMsg);
BMessage info(IM_MESSAGE);
info.AddInt32("im_what", IM_OWN_CONTACT_INFO);
info.AddString("user_id", purple_account_get_username(account));
info.AddString("user_name", purple_account_get_alias(account));
((PurpleApp*)be_app)->SendMessage(account, info);
} }
@ -492,6 +506,41 @@ signal_account_status_changed(PurpleAccount* account, PurpleStatus* old,
} }
static void
signal_chat_joined(PurpleConversation* conv)
{
BMessage join(IM_MESSAGE);
join.AddInt32("im_what", IM_ROOM_JOINED);
join.AddString("chat_id", purple_conversation_get_name(conv));
((PurpleApp*)be_app)->SendMessage(purple_conversation_get_account(conv),
join);
}
static void
signal_chat_left(PurpleConversation* conv)
{
BMessage left(IM_MESSAGE);
left.AddInt32("im_what", IM_ROOM_LEFT);
left.AddString("chat_id", purple_conversation_get_name(conv));
((PurpleApp*)be_app)->SendMessage(purple_conversation_get_account(conv),
left);
}
static void
signal_received_chat_msg(PurpleAccount* account, char* sender, char* message,
PurpleConversation* conv, PurpleMessageFlags flags)
{
BMessage chat(IM_MESSAGE);
chat.AddInt32("im_what", IM_MESSAGE_RECEIVED);
chat.AddString("chat_id", purple_conversation_get_name(conv));
chat.AddString("user_id", sender);
chat.AddString("body", message);
((PurpleApp*)be_app)->SendMessage(account, chat);
}
PurpleStatusPrimitive PurpleStatusPrimitive
cardie_status_to_purple(UserStatus status) cardie_status_to_purple(UserStatus status)
{ {

View File

@ -96,25 +96,34 @@ private:
}; };
status_t init_libpurple(); status_t init_libpurple();
void init_ui_ops(); void init_ui_ops();
void init_signals(); void init_signals();
// Connection signals // Connection signals
static void signal_signed_on(PurpleConnection* gc); static void signal_connection_error(PurpleConnection* gc,
static void signal_connection_error(PurpleConnection* gc, PurpleConnectionError err, const gchar* desc);
PurpleConnectionError err, const gchar* desc);
// Account signals // Account signals
static void signal_account_status_changed(PurpleAccount* account, static void signal_account_signed_on(PurpleAccount* account);
PurpleStatus* old, PurpleStatus* cur); static void signal_account_status_changed(PurpleAccount* account,
PurpleStatus* old, PurpleStatus* cur);
PurpleStatusPrimitive cardie_status_to_purple(UserStatus status); // Conversation signals
UserStatus purple_status_to_cardie(PurpleStatus* status); static void signal_chat_joined(PurpleConversation* conv);
static void signal_chat_left(PurpleConversation* conv);
static void signal_received_chat_msg(PurpleAccount* account,
char* sender, char* message,
PurpleConversation* conv, PurpleMessageFlags flags);
static guint _purple_glib_input_add(gint fd, PurpleInputCondition condition, // Util
PurpleInputFunction function, gpointer data); PurpleStatusPrimitive cardie_status_to_purple(UserStatus status);
static gboolean _purple_glib_io_invoke(GIOChannel *source, UserStatus purple_status_to_cardie(PurpleStatus* status);
GIOCondition condition, gpointer data);
static guint _purple_glib_input_add(gint fd,
PurpleInputCondition condition,
PurpleInputFunction function, gpointer data);
static gboolean _purple_glib_io_invoke(GIOChannel *source,
GIOCondition condition, gpointer data);
#endif // _PURPLE_APP_H #endif // _PURPLE_APP_H