static void netsoul_close (PurpleConnection *gc) { PurpleBlistNode *gnode, *cnode, *bnode; NetsoulData *ns = gc->proto_data; purple_debug_info("netsoul", "netsoul_close\n"); for(gnode = purple_get_blist()->root; gnode; gnode = gnode->next) { if(!PURPLE_BLIST_NODE_IS_GROUP(gnode)) continue; for(cnode = gnode->child; cnode; cnode = cnode->next) { if(!PURPLE_BLIST_NODE_IS_CONTACT(cnode)) continue; for(bnode = cnode->child; bnode; bnode = bnode->next) { if(!PURPLE_BLIST_NODE_IS_BUDDY(bnode)) continue; if(((PurpleBuddy*)bnode)->account == gc->account) { PurpleBuddy *buddy = (PurpleBuddy*)bnode; if (buddy) purple_buddy_icon_unref(purple_buddy_get_icon(buddy)); } } } } g_free(ns->challenge); g_free(ns->host); close(ns->fd); g_free(ns); purple_input_remove(gc->inpa); }
static void buddy_signed_off_cb(PurpleBuddy *buddy, void *data) { int len; char* buddy_nick, *buddy_name, *icon_path, *growl_msg; PurpleBuddyIcon* icon; DEBUG_MSG("buddy_signed_off_cb\n"); g_return_if_fail( buddy != NULL ); g_return_if_fail( is_allowed(purple_buddy_get_account(buddy)) ); buddy_nick = (char*)purple_buddy_get_alias(buddy); buddy_name = (char*)purple_buddy_get_name(buddy); icon = purple_buddy_get_icon(buddy); icon_path = (char*)purple_buddy_icon_get_full_path(icon); len = s_strlen(buddy_nick) + s_strlen(buddy_name) + 2; growl_msg = malloc( len ); g_snprintf(growl_msg, len, "%s\n%s", buddy_nick, buddy_name ); gntp_notify("buddy-sign-out", icon_path, "Signed Off", growl_msg, NULL); free(growl_msg); }
static VALUE buddy_get_avatar (VALUE self){ PurpleBuddy *buddy = NULL; PURPLE_BUDDY( self, buddy ); PurpleBuddyIcon *icon = purple_buddy_get_icon(buddy); if (icon != NULL) { size_t size = NULL; gconstpointer data = purple_buddy_icon_get_data(icon, &size); return rb_str_new(data, size); } else { return Qnil; } }
static void buddy_icon_changed_cb(PurpleBuddy *buddy) { PurpleBuddyIcon* icon; int len; char *icon_path, *buddy_nick, *buddy_name, *growl_msg; DEBUG_MSG("buddy_icon_changed_cb\n"); g_return_if_fail( buddy != NULL ); buddy_nick = (char*)purple_buddy_get_alias(buddy); buddy_name = (char*)purple_buddy_get_name(buddy); icon = purple_buddy_get_icon(buddy); icon_path = (char*)purple_buddy_icon_get_full_path(icon); if(buddy_nick == NULL) DEBUG_MSG("buddy_nick is NULL\n"); if(buddy_name == NULL) DEBUG_MSG("buddy_name is NULL\n"); if(icon == NULL) DEBUG_MSG("icon is NULL\n"); if(icon_path == NULL) DEBUG_MSG("icon_path is NULL\n"); if(icon_path != NULL) { if(g_list_find_custom(img_list, icon_path, (GCompareFunc)strcmp)) { DEBUG_MSG("icon_path found in list - leaving function\n"); return; } img_list = g_list_prepend(img_list, icon_path); if(g_list_find_custom(img_list, icon_path, (GCompareFunc)strcmp)) DEBUG_MSG("icon_path added to list of known icons\n"); } // is allowed? g_return_if_fail( is_allowed(purple_buddy_get_account(buddy)) ); //hack to hide spam when signing on to account g_return_if_fail( GetTickCount() - start_tick_image > 500 ); len = s_strlen(buddy_nick) + s_strlen(buddy_name) + 2; growl_msg = malloc( len ); g_snprintf(growl_msg, len, "%s\n%s", buddy_nick, buddy_name ); gntp_notify("buddy-change-image", icon_path, "Changed Image", growl_msg, NULL); free(growl_msg); }
static VALUE buddy_get_avatar_type (VALUE self){ PurpleBuddy *buddy = NULL; gconstpointer data; size_t size; PURPLE_BUDDY( self, buddy ); PurpleBuddyIcon *icon = purple_buddy_get_icon(buddy); if (icon != NULL) { return rb_str_new2( purple_buddy_icon_get_extension(icon) ); } else { return Qnil; } }
static void received_im_msg_cb(PurpleAccount *account, char *sender, char *buffer, PurpleConversation *conv, PurpleMessageFlags flags, void *data) { gboolean on_focus; char *message, *notification, *buddy_nick, *iconpath; PurpleBuddy* buddy; PurpleBuddyIcon* icon; int len; DEBUG_MSG("received_im_msg_cb\n"); g_return_if_fail( is_allowed(account) ); on_focus = purple_prefs_get_bool("/plugins/core/pidgin-gntp/on_focus"); if(conv != NULL && !on_focus && conv->ui_ops->has_focus(conv)) return; // copy string to temporary variable) message = malloc(s_strlen(buffer)+1); strcpy(message, buffer); special_entries(message); strip_tags(message); // nickname buddy = purple_find_buddy(account, sender); if(buddy == NULL) buddy_nick = sender; else buddy_nick = (char*)purple_buddy_get_alias( buddy ); len = s_strlen(buddy_nick) + s_strlen(message) + 3; // message notification = malloc( len ); g_snprintf(notification, len, "%s: %s", buddy_nick, message); // icon icon = purple_buddy_get_icon( buddy ); iconpath = purple_buddy_icon_get_full_path( icon ); gntp_notify("im-msg-received", iconpath, "IM Message", notification, NULL); free(message); free(notification); }
static void netsoul_tooltip_text(PurpleBuddy *gb, PurpleNotifyUserInfo *user_info, gboolean full) { purple_debug_info("netsoul", "netsoul_tooltip_text"); NetsoulBuddy *nb = gb->proto_data; char *resp, *nctxt; GList *tmp; NetsoulConn *nc; char **tab; int i; PurpleConnection *gc = purple_account_get_connection (purple_buddy_get_account(gb)); NetsoulData *ns = gc->proto_data; PurpleBuddyIcon *icon = purple_buddy_get_icon (gb); if (icon != NULL) purple_debug_info("netsoul", "netsoul_tooltip_text %s icon_type: %s\n", gb->name, purple_buddy_icon_get_extension(icon)); if (nb == NULL) { nb = g_new0(NetsoulBuddy, 1); gb->proto_data = nb; nb->login = g_strdup(gb->name); ns_watch_buddy(gc, gb); // watch_log_user ns_watch_log_user(gc); ns_list_users(gc, ns->watchlist); } if (nb->nblocations == 0) return; purple_debug_info("netsoul", "netsoul_tooltip_text nblocation != 0\n"); tab = g_new0(char *, nb->nblocations + 1); for (i = 0, tmp = nb->locationlist; tmp; tmp = tmp->next, i++) { nc = tmp->data; tab[i] = netsoul_conn_text(nc); } nctxt = g_strjoinv("", tab); g_strfreev(tab); resp = g_strdup_printf("\n<b>Status:</b> %s\n<b>Groupe:</b> %s\n<b>Connections:</b>%s", ns_state_to_text(nb->state), nb->group, nctxt); g_free(nctxt); purple_notify_user_info_add_pair(user_info, "Informations", resp); g_free(resp); }
Data IMInvoker::buddyToData(PurpleBuddy *buddy) { Data data; std::string buddyName = purple_buddy_get_name(buddy); if (purple_buddy_get_name(buddy)) data.compound["name"] = Data(purple_buddy_get_name(buddy), Data::VERBATIM); if (purple_buddy_get_alias(buddy)) data.compound["alias"] = Data(purple_buddy_get_alias(buddy), Data::VERBATIM); if (purple_buddy_get_alias_only(buddy)) data.compound["aliasOnly"] = Data(purple_buddy_get_alias_only(buddy), Data::VERBATIM); if (purple_buddy_get_server_alias(buddy)) data.compound["server"] = Data(purple_buddy_get_server_alias(buddy), Data::VERBATIM); PurpleGroup* group = purple_buddy_get_group(buddy); if (group) { if (purple_group_get_name(group)) data.compound["group"] = Data(purple_group_get_name(group), Data::VERBATIM); } PurpleBuddyIcon* icon = purple_buddy_get_icon(buddy); if (icon) { size_t iconSize = 0; gconstpointer iconData = purple_buddy_icon_get_data(icon, &iconSize); data.compound["icon"] = Data((char*)iconData, iconSize, "application/octet-stream", false); } PurplePresence* presence = purple_buddy_get_presence(buddy); if (presence) { GList *statusElem; GList *statusList = purple_presence_get_statuses(presence); PurpleStatus* status; for(statusElem = statusList; statusElem; statusElem = statusElem->next) { status = (PurpleStatus*)statusElem->data; const char* statusId = purple_status_get_id(status); PurpleStatusPrimitive statusPrimitive = purple_primitive_get_type_from_id(statusId); // only include active states if(statusPrimitive == PURPLE_STATUS_UNSET || !purple_presence_is_status_primitive_active(presence, statusPrimitive)) continue; data.compound["status"].compound[statusId] = statusToData(status); } } return data; }
static void buddy_signed_on_cb(PurpleBuddy *buddy, void *data) { int hack_ms; char* buddy_nick, *buddy_name, *icon_path, *growl_msg; PurpleBuddyIcon* icon; int len = 2; DEBUG_MSG("buddy_signed_on_cb\n"); g_return_if_fail( buddy != NULL ); g_return_if_fail( is_allowed(purple_buddy_get_account(buddy)) ); start_tick_image = GetTickCount(); //hack to hide spam when signing on to account hack_ms = purple_prefs_get_int("/plugins/core/pidgin-gntp/hack_ms"); if( GetTickCount() - start_tick_im < hack_ms) return; buddy_nick = (char*)purple_buddy_get_alias(buddy); buddy_name = (char*)purple_buddy_get_name(buddy); purple_blist_update_buddy_icon(buddy); icon = purple_buddy_get_icon(buddy); icon_path = (char*)purple_buddy_icon_get_full_path(icon); if(buddy_nick != NULL) len = strlen(buddy_nick) + 1; if(buddy_name != NULL ) len += strlen(buddy_name); growl_msg = malloc( len ); g_snprintf(growl_msg, len, "%s\n%s", buddy_nick, buddy_name ); gntp_notify("buddy-sign-in", icon_path, "Signed In", growl_msg, NULL); free(growl_msg); }
static void notify (const gchar *title, const gchar *body, PurpleBuddy *buddy, PurpleConversation *conv) { NotifyNotification *notification = NULL; GdkPixbuf *icon; PurpleBuddyIcon *buddy_icon; gchar *tr_body; PurpleContact *contact; if (buddy) contact = purple_buddy_get_contact (buddy); else contact = NULL; if (body) tr_body = truncate_escape_string (body, 60); else tr_body = NULL; if (!conv && buddy) conv = purple_find_conversation_with_account (PURPLE_CONV_TYPE_ANY, buddy->name, buddy->account); if (conv && conv->ui_ops && conv->ui_ops->has_focus) { if (conv->ui_ops->has_focus(conv) == TRUE) { /* do not notify if the conversation is currently in focus */ return; } } if (contact) notification = g_hash_table_lookup (buddy_hash, contact); else if (conv) notification = g_hash_table_lookup (buddy_hash, conv); else notification = NULL; if (notification != NULL) { notify_notification_update (notification, title, tr_body, NULL); notify_notification_set_timeout(notification, purple_prefs_get_int("/plugins/gtk/libnotify/timeout")); /* this shouldn't be necessary, file a bug */ notify_notification_show (notification, NULL); purple_debug_info (PLUGIN_ID, "notify(), update: " "title: '%s', body: '%s', buddy: '%s'\n", title, tr_body, buddy ? best_name (buddy) : ""); g_free (tr_body); return; } #ifdef LIBNOTIFY_07 notification = notify_notification_new (title, tr_body, NULL); #else notification = notify_notification_new (title, tr_body, NULL, NULL); #endif purple_debug_info (PLUGIN_ID, "notify(), new: " "title: '%s', body: '%s', buddy: '%s'\n", title, tr_body, buddy ? best_name (buddy) : ""); g_free (tr_body); if (buddy) buddy_icon = purple_buddy_get_icon (buddy); else buddy_icon = NULL; if (buddy_icon) { icon = pixbuf_from_buddy_icon (buddy_icon); purple_debug_info (PLUGIN_ID, "notify(), has a buddy icon.\n"); } else if (buddy) { icon = pidgin_create_prpl_icon (buddy->account, 1); purple_debug_info (PLUGIN_ID, "notify(), has a prpl icon.\n"); } else if (conv) { icon = pidgin_create_prpl_icon (conv->account, 1); purple_debug_info (PLUGIN_ID, "notify(), has a prpl icon.\n"); } else { icon = NULL; purple_debug_info (PLUGIN_ID, "notify(), has no icon.\n"); } if (icon) { notify_notification_set_icon_from_pixbuf (notification, icon); g_object_unref (icon); } else { purple_debug_warning (PLUGIN_ID, "notify(), couldn't find any icon!\n"); } if (contact) g_hash_table_insert (buddy_hash, contact, notification); else if (conv) g_hash_table_insert (buddy_hash, conv, notification); g_object_set_data (G_OBJECT(notification), "contact", contact); g_object_set_data (G_OBJECT(notification), "conv", conv); g_object_set_data (G_OBJECT(notification), "buddy", buddy); g_signal_connect (notification, "closed", G_CALLBACK(closed_cb), NULL); notify_notification_set_urgency (notification, NOTIFY_URGENCY_NORMAL); notify_notification_add_action (notification, "show", _("Show"), action_cb, NULL, NULL); notify_notification_set_timeout(notification, purple_prefs_get_int("/plugins/gtk/libnotify/timeout")); if (!notify_notification_show (notification, NULL)) { purple_debug_error (PLUGIN_ID, "notify(), failed to send notification\n"); } }
static void on_new_message(PurpleAccount *account, const char *remote, const char *message) { const char *command = purple_prefs_get_path(PLUGIN_PREF_COMMAND); // the command should be never NULL g_return_if_fail(command); if (!command[0]) { // no command is set return; } const char *protocol = purple_account_get_protocol_name(account); char *local = g_strdup(purple_normalize(account, purple_account_get_username(account))); char *nohtml = purple_markup_strip_html(message); PurpleBuddy *buddy = purple_find_buddy(account, remote); char *icon_encoded = NULL; if (buddy) { // get buddy alias and icon remote = purple_buddy_get_alias(buddy); PurpleBuddyIcon *icon = purple_buddy_get_icon(buddy); if (icon) { size_t len; gconstpointer data = purple_buddy_icon_get_data(icon, &len); icon_encoded = g_base64_encode(data, len); } } char *argv[2]; argv[0] = g_strdup(command); argv[1] = NULL; // prepare child's environment variables char **envp = g_get_environ(); envp = g_environ_setenv(envp, "EVENT_TYPE", "msg", TRUE); envp = g_environ_setenv(envp, "EVENT_NETWORK", protocol, TRUE); envp = g_environ_setenv(envp, "EVENT_LOCAL_USER", local, TRUE); envp = g_environ_setenv(envp, "EVENT_REMOTE_USER", remote, TRUE); if (icon_encoded) envp = g_environ_setenv(envp, "EVENT_REMOTE_USER_ICON", icon_encoded, TRUE); envp = g_environ_setenv(envp, "EVENT_MESSAGE", nohtml, TRUE); envp = g_environ_setenv(envp, "EVENT_MESSAGE_HTML", message, TRUE); // spawn the command GError *err = NULL; if (!g_spawn_async(NULL, argv, envp, G_SPAWN_SEARCH_PATH | G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL, NULL, NULL, NULL, &err)) { purple_debug_error("extaction", "%s", err->message); g_clear_error(&err); } // free all resources g_free(argv[0]); g_strfreev(envp); g_free(local); g_free(nohtml); g_free(icon_encoded); }
/************************************************************************** * Buddy List subsystem signal callbacks **************************************************************************/ static void buddy_status_changed_cb(PurpleBuddy *buddy, PurpleStatus *old_status, PurpleStatus *status) { char *status_name, *old_status_name, *status_msg; char* buddy_nick, *buddy_name, *icon_path, *growl_msg; PurpleBuddyIcon* icon; int len, hack_ms; PurpleAccount* account; DEBUG_MSG("buddy_status_changed_cb\n"); g_return_if_fail( buddy != NULL ); account = purple_buddy_get_account(buddy); g_return_if_fail( is_allowed(account) ); status_name = (char *)purple_status_get_name(status); old_status_name = (char *)purple_status_get_name(old_status); buddy_nick = (char*)purple_buddy_get_alias(buddy); buddy_name = (char*)purple_buddy_get_name(buddy); icon = purple_buddy_get_icon(buddy); icon_path = (char*)purple_buddy_icon_get_full_path(icon); status_msg = custom_get_buddy_status_text(buddy); if( status_msg == NULL ) status_msg = ""; special_entries(status_msg); strip_tags(status_msg); //hack to hide spam when signing on to account hack_ms = purple_prefs_get_int("/plugins/core/pidgin-gntp/hack_ms"); GList *node = buddy_status_is_new(buddy, status_msg); if( GetTickCount() - start_tick_im < hack_ms) return; if( node != NULL ) { DEBUG_MSG("status node received\n"); struct buddy_status* node_status = node->data; free(node_status->status); char* the_status = malloc( s_strlen(status_msg)+1 ); strcpy(the_status, status_msg); node_status->status = the_status; if(status_msg[0] == 0) { len = s_strlen(buddy_nick) + s_strlen(buddy_name) + 25; growl_msg = malloc( len ); g_snprintf(growl_msg, len, "status message removed\n%s\n%s",buddy_nick, buddy_name ); gntp_notify("buddy-change-msg", icon_path, "Status Message Changed", growl_msg, NULL); free(growl_msg); } else { len = s_strlen(buddy_nick) + s_strlen(buddy_name) + s_strlen(status_msg)+5; growl_msg = malloc( len ); g_snprintf(growl_msg, len, "\"%s\"\n%s\n%s", status_msg, buddy_nick, buddy_name ); gntp_notify("buddy-change-msg", icon_path, "Status Changed", growl_msg, NULL); free(growl_msg); } } if( strcmp(status_name, old_status_name) == 0) return; len = s_strlen(buddy_nick) + s_strlen(buddy_name) + s_strlen(status_name) + 3; growl_msg = malloc( len ); g_snprintf(growl_msg, len, "%s\n%s\n%s", status_name, buddy_nick, buddy_name ); gntp_notify("buddy-change-status", icon_path, "Status Changed", growl_msg, NULL); free(growl_msg); }