void gaim_roomlist_room_join(GaimRoomlist *list, GaimRoomlistRoom *room) { GHashTable *components; GList *l, *j; GaimConnection *gc; g_return_if_fail(list != NULL); g_return_if_fail(room != NULL); gc = gaim_account_get_connection(list->account); if (!gc) return; components = g_hash_table_new(g_str_hash, g_str_equal); g_hash_table_replace(components, "name", room->name); for (l = list->fields, j = room->fields; l && j; l = l->next, j = j->next) { GaimRoomlistField *f = l->data; g_hash_table_replace(components, f->name, j->data); } serv_join_chat(gc, components); g_hash_table_destroy(components); }
void BuddyListChat::onActivate(Button& /*activator*/) { PurpleAccount *account = purple_chat_get_account(chat); PurplePluginProtocolInfo *prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO( purple_find_prpl(purple_account_get_protocol_id(account))); GHashTable *components = purple_chat_get_components(chat); char *chat_name = NULL; if (prpl_info && prpl_info->get_chat_name) chat_name = prpl_info->get_chat_name(components); const char *name; if (chat_name) name = chat_name; else name = purple_chat_get_name(chat); PurpleConversation *conv = purple_find_conversation_with_account( PURPLE_CONV_TYPE_CHAT, name, account); if (conv) purple_conversation_present(conv); serv_join_chat(purple_account_get_connection(account), components); g_free(chat_name); }
struct groupchat *purple_chat_join(struct im_connection *ic, const char *room, const char *nick, const char *password, set_t **sets) { struct purple_data *pd = ic->proto_data; PurplePlugin *prpl = purple_plugins_find_with_id(pd->account->protocol_id); PurplePluginProtocolInfo *pi = prpl->info->extra_info; GHashTable *chat_hash; PurpleConversation *conv; GList *info, *l; if (!pi->chat_info || !pi->chat_info_defaults || !(info = pi->chat_info(purple_account_get_connection(pd->account)))) { imcb_error(ic, "Joining chatrooms not supported by this protocol"); return NULL; } if ((conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, room, pd->account))) { purple_conversation_destroy(conv); } chat_hash = pi->chat_info_defaults( purple_account_get_connection(pd->account), room ); for (l = info; l; l = l->next) { struct proto_chat_entry *pce = l->data; if (strcmp(pce->identifier, "handle") == 0) { g_hash_table_replace(chat_hash, "handle", g_strdup(nick)); } else if (strcmp(pce->identifier, "password") == 0) { g_hash_table_replace(chat_hash, "password", g_strdup(password)); } else if (strcmp(pce->identifier, "passwd") == 0) { g_hash_table_replace(chat_hash, "passwd", g_strdup(password)); } g_free(pce); } g_list_free(info); serv_join_chat(purple_account_get_connection(pd->account), chat_hash); g_hash_table_destroy(chat_hash); return imcb_chat_new(ic, room); }
/* * call-seq: * join_chat(chat_id) * * Join chat */ static VALUE account_join_chat(VALUE self, VALUE name) { PurpleAccount *account; Data_Get_Struct(self, PurpleAccount, account); GHashTable *data; if (purple_account_is_connected(account)) { data = g_hash_table_new(g_str_hash, g_str_equal); g_hash_table_insert(data, "chat_id", StringValueCStr(name)); serv_join_chat(purple_account_get_connection(account), data); g_hash_table_destroy(data); return Qtrue; } return Qfalse; }
static int account_join_chat(LuaState *L) { PurpleAccount **account = ms_lua_checkclass(L, "purple.account", 1); const char *name = luaL_checkstring(L, 2); g_return_val_if_fail(purple_account_is_connected(*account), 0); PurpleConnection *pc = purple_account_get_connection(*account); PurpleConversation *conv = purple_find_conversation_with_account( PURPLE_CONV_TYPE_CHAT, name, *account); if (conv) { purple_conversation_present(conv); } else { conv = purple_conversation_new( PURPLE_CONV_TYPE_CHAT, *account, name); purple_conv_chat_left(PURPLE_CONV_CHAT(conv)); } GHashTable *hash; PurpleChat *chat = purple_blist_find_chat(*account, name); if (chat == NULL) { PurplePluginProtocolInfo *info = PURPLE_PLUGIN_PROTOCOL_INFO( purple_connection_get_prpl(pc)); if (info->chat_info_defaults != NULL) hash = info->chat_info_defaults(pc, name); } else { hash = purple_chat_get_components(chat); } serv_join_chat(pc, hash); if (chat == NULL && hash != NULL) g_hash_table_destroy(hash); return 0; }
static gboolean yahoo_uri_handler(const char *proto, const char *cmd, GHashTable *params) { char *acct_id = g_hash_table_lookup(params, "account"); PurpleAccount *acct; if (g_ascii_strcasecmp(proto, "ymsgr")) return FALSE; acct = find_acct(purple_plugin_get_id(my_protocol), acct_id); if (!acct) return FALSE; /* ymsgr:SendIM?screename&m=The+Message */ if (!g_ascii_strcasecmp(cmd, "SendIM")) { char *sname = NULL; g_hash_table_foreach(params, yahoo_find_uri_novalue_param, &sname); if (sname) { char *message = g_hash_table_lookup(params, "m"); PurpleConversation *conv = purple_find_conversation_with_account( PURPLE_CONV_TYPE_IM, sname, acct); if (conv == NULL) conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, acct, sname); purple_conversation_present(conv); if (message) { /* Spaces are encoded as '+' */ g_strdelimit(message, "+", ' '); purple_conv_send_confirm(conv, message); } } /* else **If pidgindialogs_im() was in the core, we could use it here. * It is all purple_request_* based, but I'm not sure it really belongs in the core pidgindialogs_im(); */ return TRUE; } /* ymsgr:Chat?roomname */ else if (!g_ascii_strcasecmp(cmd, "Chat")) { char *rname = NULL; g_hash_table_foreach(params, yahoo_find_uri_novalue_param, &rname); if (rname) { /* This is somewhat hacky, but the params aren't useful after this command */ g_hash_table_insert(params, g_strdup("room"), g_strdup(rname)); g_hash_table_insert(params, g_strdup("type"), g_strdup("Chat")); serv_join_chat(purple_account_get_connection(acct), params); } /* else ** Same as above (except that this would have to be re-written using purple_request_*) pidgin_blist_joinchat_show(); */ return TRUE; } /* ymsgr:AddFriend?name */ else if (!g_ascii_strcasecmp(cmd, "AddFriend")) { char *name = NULL; g_hash_table_foreach(params, yahoo_find_uri_novalue_param, &name); purple_blist_request_add_buddy(acct, name, NULL, NULL); return TRUE; } return FALSE; }
void PurpleIMChat::createPurpleChat(PurpleConnection *gGC, int id, GList *users, PurpleIMChat & imChat, PurpleAccount* gAccount) //VOXOX - JRT - 2009.07.10 { char chatName[256]; mConvInfo_t *mConv = FindChatStructById(id); PurpleConversation *gConv = NULL; EnumIMProtocol::IMProtocol protocol = PurpleIMPrcl::GetEnumIMProtocol(gGC->account->protocol_id); if (mConv == NULL) { //Create IMChatSession and copy some values from IMChat. mConv = CreateChatSession(true, imChat); mConv->conv_session->setIMChatType( imChat.getIMChatType() ); // mConv->conv_session->getGroupChatInfo() = imChat.getGroupChatInfo(); } //VOXOX - JRT - 2009.06.15 - purple_conversation_get_name() uses this to id (numeric)! // Since id is ChatSession Address (0x), if you change this, then some 'find's will fail. // You will need your own data members to track alias, etc. // NOTE: This may be JABBER ONLY. // snprintf(chatName, sizeof(chatName), "Chat%d", mConv->conv_id); strcpy( chatName, imChat.getGroupChatInfo().getAlias().c_str() ); if (protocol == EnumIMProtocol::IMProtocolMSN) { //VOXOX - JRT - 2009.06.18 - TODO: check on use of 'chatname'; move to switch in following else-clause. gConv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, chatName, gGC->account); if (!gConv) LOG_FATAL("Chat doesn't exist !!"); mConv->purple_conv_session = gConv; // gConv->ui_data = mConv; } else { GHashTable *components; components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); char *room = NULL; char *server = NULL; g_hash_table_replace(components, g_strdup("room"), g_strdup(chatName)); switch( protocol ) { case EnumIMProtocol::IMProtocolYahoo: g_hash_table_replace(components, g_strdup("topic"), g_strdup("Join my conference...")); g_hash_table_replace(components, g_strdup("type"), g_strdup("Conference")); break; case EnumIMProtocol::IMProtocolAIM: case EnumIMProtocol::IMProtocolICQ: //Defaults for: // "room" - empty or passed in value (NULL below) // "exchange" - "4" components = serv_chat_info_defaults( gGC, NULL ); g_hash_table_replace(components, g_strdup("exchange"), g_strdup("16")); //VOXOX - JRT - 2009.06.14 - why do we use "16"? g_hash_table_replace(components, g_strdup("room"), g_strdup(chatName)); room = (char*)g_hash_table_lookup(components, "room"); // server = (char*)g_hash_table_lookup(components, "server"); //TODO: break; case EnumIMProtocol::IMProtocolJabber: std::string userChatRoomName = (imChat.getGroupChatInfo().getAlias().empty() ? chatName : imChat.getGroupChatInfo().getAlias()); //This will return defaults for: // "server" - conference.im.voxox.com // "room" - user-defined, or parsed from room@server/handle // "handle" - user id without domain. "*****@*****.**" -> "user" components = serv_chat_info_defaults( gGC, NULL ); //VOXOX - JRT - 2009.06.14 - Get defaults, like server (conference.im.voxox.com) g_hash_table_replace(components, g_strdup("room"), g_strdup(chatName)); room = (char*)g_hash_table_lookup(components, "room"); server = (char*)g_hash_table_lookup(components, "server"); break; } std::string fullRoomName = room; if ( server != NULL ) //VOXOX - JRT - 2009.10.12 - AIM gives NULL server. { fullRoomName += "@"; fullRoomName += server; } mConv->conv_session->getGroupChatInfo().setChatRoom( fullRoomName ); mConv->pending_invites = users; // purple_conversation_new(PURPLE_CONV_TYPE_CHAT, gAccount, fullRoomName.c_str()); //JRT-XXX serv_join_chat(gGC, components); g_hash_table_destroy(components); } }