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); }
static void handle_present(PurpleConversation *conv) { if (pidgin_conv_is_hidden(PIDGIN_CONVERSATION(conv))) return; purple_conversation_present(conv); }
static gboolean buddy_click_cb(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { PurpleContact *contact = user_data; PurpleBuddy *b = purple_contact_get_priority_buddy(contact); PurpleConversation *conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, purple_buddy_get_account(b), purple_buddy_get_name(b)); purple_conversation_present(conv); return TRUE; }
void BuddyListBuddy::onActivate(Button& /*activator*/) { PurpleAccount *account = purple_buddy_get_account(buddy); const char *name = purple_buddy_get_name(buddy); PurpleConversation *conv = purple_find_conversation_with_account( PURPLE_CONV_TYPE_IM, name, account); if (!conv) conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, name); purple_conversation_present(conv); }
static void skypeweb_join_chat(PurpleConnection *pc, GHashTable *data) { SkypeWebAccount *sa = purple_connection_get_protocol_data(pc); gchar *chatname; gchar *post; GString *url; PurpleChatConversation *chatconv; chatname = (gchar *)g_hash_table_lookup(data, "chatname"); if (chatname == NULL) { return; } chatconv = purple_conversations_find_chat_with_account(chatname, sa->account); if (chatconv != NULL) { purple_conversation_present(PURPLE_CONVERSATION(chatconv)); return; } url = g_string_new("/v1/threads/"); g_string_append_printf(url, "%s", purple_url_encode(chatname)); g_string_append(url, "/members/"); g_string_append_printf(url, "8:%s", purple_url_encode(sa->username)); post = "{\"role\":\"User\"}"; skypeweb_post_or_get(sa, SKYPEWEB_METHOD_PUT | SKYPEWEB_METHOD_SSL, sa->messages_host, url->str, post, NULL, NULL, TRUE); g_string_free(url, TRUE); skypeweb_get_conversation_history(sa, chatname); skypeweb_get_thread_users(sa, chatname); chatconv = purple_serv_got_joined_chat(pc, g_str_hash(chatname), chatname); purple_conversation_set_data(PURPLE_CONVERSATION(chatconv), "chatname", g_strdup(chatname)); purple_conversation_present(PURPLE_CONVERSATION(chatconv)); }
static void searchresults_im_buddy(PurpleConnection *gc, GList *row, SIPE_UNUSED_PARAMETER void *user_data) { PurpleAccount *acct = purple_connection_get_account(gc); gchar *id = sip_uri_from_name(g_list_nth_data(row, 0)); PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, id, acct); if (conv == NULL) conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, acct, id); g_free(id); purple_conversation_present(conv); }
static void buddy_typing_cb(PurpleAccount *acct, const char *name, void *data) { PurpleConversation *gconv; if(purple_prefs_get_bool(PREF_STATUS) && ! purple_status_is_available(purple_account_get_active_status(acct))) { purple_debug_info("psychic", "not available, doing nothing\n"); return; } if(purple_prefs_get_bool(PREF_BUDDIES) && ! purple_find_buddy(acct, name)) { purple_debug_info("psychic", "not in blist, doing nothing\n"); return; } if(FALSE == purple_privacy_check(acct, name)) { purple_debug_info("psychic", "user %s is blocked\n", name); return; } gconv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, name, acct); if(! gconv) { purple_debug_info("psychic", "no previous conversation exists\n"); gconv = purple_conversation_new(PURPLE_CONV_TYPE_IM, acct, name); if(purple_prefs_get_bool(PREF_RAISE)) { purple_conversation_present(gconv); } if(purple_prefs_get_bool(PREF_NOTICE)) { /* This is a quote from Star Wars. You should probably not translate it literally. If you can't find a fitting cultural reference in your language, consider translating something like this instead: "You feel a new message coming." */ purple_conversation_write(gconv, NULL, _("You feel a disturbance in the force..."), PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_NO_LOG | PURPLE_MESSAGE_ACTIVE_ONLY, time(NULL)); } /* Necessary because we may be creating a new conversation window. */ purple_conv_im_set_typing_state(PURPLE_CONV_IM(gconv), PURPLE_TYPING); } }
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 xmpp_uri_handler(const char *proto, const char *user, GHashTable *params) { char *acct_id = params ? g_hash_table_lookup(params, "account") : NULL; PurpleAccount *acct; if (g_ascii_strcasecmp(proto, "xmpp")) return FALSE; acct = find_acct(purple_plugin_get_id(my_protocol), acct_id); if (!acct) return FALSE; /* xmpp:[email protected]?message;subject=Test%20Message;body=Here%27s%20a%20test%20message */ /* params is NULL if the URI has no '?' (or anything after it) */ if (!params || g_hash_table_lookup_extended(params, "message", NULL, NULL)) { char *body = g_hash_table_lookup(params, "body"); if (user && *user) { PurpleConversation *conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, acct, user); purple_conversation_present(conv); if (body && *body) purple_conv_send_confirm(conv, body); } } else if (g_hash_table_lookup_extended(params, "roster", NULL, NULL)) { char *name = g_hash_table_lookup(params, "name"); if (user && *user) purple_blist_request_add_buddy(acct, user, NULL, name); } else if (g_hash_table_lookup_extended(params, "join", NULL, NULL)) { PurpleConnection *gc = purple_account_get_connection(acct); if (user && *user) { GHashTable *params = jabber_chat_info_defaults(gc, user); jabber_chat_join(gc, params); } return TRUE; } return FALSE; }
/** * Initiate a peer connection with someone. */ void peer_connection_propose(OscarData *od, guint64 type, const char *bn) { PeerConnection *conn; if (type == OSCAR_CAPABILITY_DIRECTIM) { conn = peer_connection_find_by_type(od, bn, type); if (conn != NULL) { if (conn->ready) { PurpleAccount *account; PurpleConversation *conv; purple_debug_info("oscar", "Already have a direct IM " "session with %s.\n", bn); account = purple_connection_get_account(od->gc); conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, bn, account); if (conv != NULL) purple_conversation_present(conv); return; } /* Cancel the old connection and try again */ peer_connection_destroy(conn, OSCAR_DISCONNECT_RETRYING, NULL); } } conn = peer_connection_new(od, type, bn); conn->flags |= PEER_CONNECTION_FLAG_INITIATED_BY_ME; conn->flags |= PEER_CONNECTION_FLAG_APPROVED; aim_icbm_makecookie(conn->cookie); peer_connection_trynext(conn); }
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; }
static gboolean skypeweb_uri_handler(const char *proto, const char *cmd, GHashTable *params) { PurpleAccount *account; PurpleConnection *pc; if (!g_str_equal(proto, "skype")) return FALSE; /*skype uri's: skype: //does nothing skype:{buddyname} //open im with {buddyname} skype:{buddynames}?chat //open multi-user chat with {buddynames} skype:?chat&blob={blob id} //open public multi-user chat with the blob id of {blob id} skype:?chat&id={chat id} //open multi-user chat with the id of {chat id} skype:{buddyname}?add //add user to buddy list skype:{buddyname}?userinfo //get buddy's info skype:{buddynames}?call //call {buddynames} skype:{buddyname}?voicemail //send a voice mail message skype:{buddyname}?sendfile //send a file */ account = find_acct(SKYPEWEB_PLUGIN_ID, g_hash_table_lookup(params, "account")); pc = purple_account_get_connection(account); if (g_hash_table_lookup(params, "chat")) { if (cmd && *cmd) { //there'll be a bunch of usernames, seperated by semi-colon if (strchr(cmd, ';')) { gchar **users = g_strsplit_set(cmd, ";", -1); skypeweb_initiate_chat(purple_connection_get_protocol_data(pc), users[0]); //TODO the other users g_strfreev(users); } else { PurpleIMConversation *imconv; imconv = purple_conversations_find_im_with_account(cmd, account); if (!imconv) { imconv = purple_im_conversation_new(account, cmd); } purple_conversation_present(PURPLE_CONVERSATION(imconv)); } } else { //probably a public multi-user chat? GHashTable *chatinfo = NULL; if (g_hash_table_lookup(params, "id")) { chatinfo = skypeweb_chat_info_defaults(pc, g_hash_table_lookup(params, "id")); } else if (g_hash_table_lookup(params, "blob")) { chatinfo = skypeweb_chat_info_defaults(pc, g_hash_table_lookup(params, "blob")); } if (chatinfo != NULL) { skypeweb_join_chat(pc, chatinfo); g_hash_table_destroy(chatinfo); } } } else if (g_hash_table_lookup(params, "add")) { purple_blist_request_add_buddy(account, cmd, "Skype", g_hash_table_lookup(params, "displayname")); return TRUE; } else if (g_hash_table_lookup(params, "call")) { } else if (g_hash_table_lookup(params, "userinfo")) { skypeweb_get_info(pc, cmd); return TRUE; } else if (g_hash_table_lookup(params, "voicemail")) { } else if (g_hash_table_lookup(params, "sendfile")) { } else if (strlen(cmd)) { //supposed to be the same as call? } //we don't know how to handle this return FALSE; }
static void ggp_pubdir_search_results_im(PurpleConnection *gc, GList *row, gpointer _form) { purple_conversation_present(PURPLE_CONVERSATION(purple_im_conversation_new( purple_connection_get_account(gc), g_list_nth_data(row, 0)))); }
xmlnode * _h_elim_add_chat( const char *name , const char *id , SEXP_VALUE *args , gpointer data ) { ASSERT_ALISTP( args, id, name ); elim_ping(); const char *aname = ALIST_VAL_STR ( args, "account-name" ); const char *proto = ALIST_VAL_STR ( args, "im-protocol" ); const char *alias = ALIST_VAL_STR ( args, "chat-alias" ); gpointer auid = ALIST_VAL_PTR ( args, "account-uid" ); GHashTable *opts = ALIST_VAL_ALIST( args, "chat-options" ); GHashTable *options = __ghash_str_sexp__str_str( opts ); PurpleAccount *acct = auid ? find_acct_by_uid( auid ) : purple_accounts_find( aname, proto ); if( !acct ) { sexp_val_free( args ); return response_error( ENXIO, id, name, "unknown account" ); } // cook up a chat node. if it's already on our buddy list, uncook it // and use the old one instead (name should be unique per account // so the operation is reasonable - we cannot supply a name as this // parameter can be delegated to the plugin to generate automatically): // this will trigger a new_node call, and possibly a remove call PurpleChat *chat = purple_chat_new( acct, alias, options ); const char *chn = purple_chat_get_name( chat ); PurpleChat *ch_2 = purple_blist_find_chat( acct, chn ); if( ch_2 ) { fprintf( stderr, "(elim-debug chat already exists)\n" ); purple_blist_remove_chat( chat ); chat = ch_2; chn = purple_chat_get_name( chat ); purple_blist_alias_chat( chat, alias ); } fprintf( stderr, "(elim-debug adding chat to blist)\n" ); purple_blist_add_chat( chat, NULL, NULL ); // if we have a conversation already, prod the client to show it fprintf( stderr, "(elim-debug looking for conversation)\n" ); PurpleConversation *conv = purple_find_conversation_with_account( PURPLE_CONV_TYPE_CHAT, chn, acct ); if( conv ) purple_conversation_present( conv ); xmlnode *rval = xnode_new( "alist" ); AL_STR( rval, "account-name", purple_account_get_username (acct) ); AL_STR( rval, "im-protocol" , purple_account_get_protocol_id(acct) ); AL_PTR( rval, "account-uid" , acct ); AL_STR( rval, "chat-name" , chn ); if( conv ) { PurpleConversationType pct = purple_conversation_get_type ( conv ); PurpleConnectionFlags pcf = purple_conversation_get_features( conv ); AL_PTR ( rval, "conv-uid" , conv ); AL_STR ( rval, "conv-name" , purple_conversation_get_name (conv) ); AL_STR ( rval, "conv-title" , purple_conversation_get_title(conv) ); AL_ENUM( rval, "conv-type" , pct, ":conversation-type" ); AL_ENUM( rval, "conv-features", pcf, ":connection-flags" ); } sexp_val_free( args ); return response_value( 0, id, name, rval ); }