//gets the text of whatever the user sets the status to. (not necessarily what status is on the server) //client_text and server_text are freed if it returns false static gboolean getStatusText(char** client_text, char** server_text, PurpleAccount *account, const char** sid) { PurpleStatus* status; PurpleSavedStatus* savedStatus; PurpleSavedStatusSub* substat; const char* statusMessage; status = purple_account_get_active_status(account); if (status == NULL) { purple_debug_fatal("MusicInfo", "Account with NULL status\n"); return FALSE; } *sid = purple_status_get_id(status); statusMessage = purple_status_get_attr_string(status, "message"); if(statusMessage != NULL) { *server_text = g_strdup(statusMessage); } else { *server_text = g_strdup("\0"); } savedStatus = purple_savedstatus_get_current(); if (savedStatus == NULL) { purple_debug_fatal("MusicInfo", "Account with NULL saved status\n"); g_free(*server_text); return FALSE; } statusMessage = NULL; if(purple_savedstatus_has_substatuses(savedStatus)) { substat = purple_savedstatus_get_substatus(savedStatus, account); if(substat != NULL) statusMessage = purple_savedstatus_substatus_get_message(substat); } if(statusMessage == NULL) { statusMessage = purple_savedstatus_get_message(savedStatus); } if(statusMessage == NULL) { g_free(*server_text); return FALSE; } *client_text = g_strdup(statusMessage); return TRUE; }
xmlnode * _h_elim_status ( const char *name , const char *id , SEXP_VALUE *args , gpointer data ) { fprintf(stderr, "(elim-debug entered _h_elim_status)"); ASSERT_ALISTP( args, id, name ); elim_ping(); const char *sid = ALIST_VAL_STR( args, "status-id" ); const char *mesg = ALIST_VAL_STR( args, "status-message" ); signed int _stype = ALIST_VAL_INT( args, "status-type" ); PurpleSavedStatus *status = purple_savedstatus_find( sid ); PurpleStatusPrimitive stype = PURPLE_STATUS_UNSET; // create a new status: if( !status ) { CHECK_STATUS ( args, id, name, stype, _stype ); status = purple_savedstatus_new( sid, stype ); if( status ) { if ( mesg ) purple_savedstatus_set_message( status, mesg ); else if( sid ) purple_savedstatus_set_message( status, sid ); } } else { if( mesg ) purple_savedstatus_set_message( status, mesg ); } if( !status ) { sexp_val_free( args ); return response_error( EINVAL, id, name, "Could not create status" ); } purple_savedstatus_activate( status ); xmlnode *rval = xnode_new( "alist" ); AL_STR ( rval, "status-id" , purple_savedstatus_get_title (status) ); AL_STR ( rval, "status-message", purple_savedstatus_get_message(status) ); AL_ENUM( rval, "status-type" , purple_savedstatus_get_type (status) , ":status-primitive" ); sexp_val_free( args ); fprintf(stderr, "(elim-debug leaving _h_elim_status)"); return response_value( 0, id, name, rval ); }
static gboolean set_status (PurpleAccount *acnt, const char *loc) { // discover the pidgin saved status in use for this account const char *savedmessage = ""; { PurpleSavedStatus *savedstatus = purple_savedstatus_get_current(); if (savedstatus) { PurpleSavedStatusSub *savedsubstatus = purple_savedstatus_get_substatus(savedstatus, acnt); if (savedsubstatus) { // use account-specific saved status savedmessage = purple_savedstatus_substatus_get_message(savedsubstatus); } else { // don't have an account-specific saved status, use the general one savedmessage = purple_savedstatus_get_message(savedstatus); } } } /* generate status */ char *msg; if (savedmessage) { msg = (char *)malloc(strlen(savedmessage)+strlen(loc)+1); strcpy(msg, loc); strcat(msg, savedmessage); } else msg = loc; PurpleStatus *status = purple_account_get_active_status (acnt); GList *attrs = NULL; attrs = g_list_append(attrs, "message"); attrs = g_list_append(attrs, (gpointer)msg); purple_status_set_active_with_attrs_list(status, TRUE, attrs); g_list_free(attrs); trace("setup the account(%s) status: %s", acnt->username, msg); if (savedmessage) { free(msg); } return TRUE; }
static void populate_statuses(GntTree *tree) { GList *list; for (list = purple_savedstatuses_get_all(); list; list = list->next) { PurpleSavedStatus *saved = list->data; const char *title, *type, *message; if (purple_savedstatus_is_transient(saved)) continue; title = purple_savedstatus_get_title(saved); type = purple_primitive_get_name_from_type(purple_savedstatus_get_type(saved)); message = purple_savedstatus_get_message(saved); /* XXX: Strip possible markups */ gnt_tree_add_row_last(tree, saved, gnt_tree_create_row(tree, title, type, message), NULL); } }
static void received_im_msg_cb(PurpleAccount *account, char *who, char *buffer, PurpleConversation *conv, PurpleMessageFlags flags, void *data) { // A workaround to avoid skipping of the first message as a result on NULL-conv: if (conv == NULL) conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, who); PurpleBuddy *buddy = purple_find_buddy(account, who); PurplePresence *presence = purple_buddy_get_presence(buddy); msg_metadata_t msg; //Get message msg.text = purple_markup_strip_html(buffer); msg.remote_username = who; //LOCAL USER: msg.local_alias = purple_account_get_alias(account); msg.local_username = (char *) purple_account_get_name_for_display(account); //REMOTE USER (Buddy): //Get buddy alias msg.remote_alias = purple_buddy_get_alias(buddy); if(msg.remote_alias == NULL) msg.remote_alias = ""; //Get buddy group PurpleGroup *group = purple_buddy_get_group(buddy); //return empty string if not in group msg.remote_from_group = group != NULL ? purple_group_get_name(group) : ""; //Get protocol ID msg.protocol_id = purple_account_get_protocol_id(account); //trim out PROTOCOL_PREFIX (eg.: "prpl-irc" => "irc") if(!strncmp(msg.protocol_id,PROTOCOL_PREFIX,strlen(PROTOCOL_PREFIX))) msg.protocol_id += strlen(PROTOCOL_PREFIX); //Get status PurpleStatus *status = purple_account_get_active_status(account); PurpleStatusType *type = purple_status_get_type(status); //remote PurpleStatus *r_status = purple_presence_get_active_status(presence); PurpleStatusType *r_status_type = purple_status_get_type(r_status); //Get status id msg.local_status_id = NULL; msg.local_status_id = purple_primitive_get_id_from_type( purple_status_type_get_primitive(type)); //remote msg.remote_status_id = NULL; msg.remote_status_id = purple_primitive_get_id_from_type( purple_status_type_get_primitive(r_status_type)); //Get status message msg.local_status_msg = NULL; if (purple_status_type_get_attr(type, "message") != NULL) { msg.local_status_msg = purple_status_get_attr_string(status, "message"); } else { PurpleSavedStatus *savedstatus = purple_savedstatus_get_current(); if(savedstatus) msg.local_status_msg = purple_savedstatus_get_message(savedstatus); } //remote msg.remote_status_msg = NULL; if (purple_status_type_get_attr(r_status_type, "message") != NULL) { msg.remote_status_msg = purple_status_get_attr_string(r_status, "message"); } else { msg.remote_status_msg = ""; } run_lua(conv, msg); }
void finch_savedstatus_edit(PurpleSavedStatus *saved) { EditStatus *edit; GntWidget *window, *box, *button, *entry, *combo, *label, *tree; PurpleStatusPrimitive prims[] = {PURPLE_STATUS_AVAILABLE, PURPLE_STATUS_AWAY, PURPLE_STATUS_INVISIBLE, PURPLE_STATUS_OFFLINE, PURPLE_STATUS_UNSET}, current; GList *iter; int i; if (saved) { GList *iter; for (iter = edits; iter; iter = iter->next) { edit = iter->data; if (edit->saved == saved) return; } } edit = g_new0(EditStatus, 1); edit->saved = saved; edit->window = window = gnt_vbox_new(FALSE); gnt_box_set_toplevel(GNT_BOX(window), TRUE); gnt_box_set_title(GNT_BOX(window), _("Edit Status")); gnt_box_set_fill(GNT_BOX(window), TRUE); gnt_box_set_alignment(GNT_BOX(window), GNT_ALIGN_MID); gnt_box_set_pad(GNT_BOX(window), 0); edits = g_list_append(edits, edit); /* Title */ box = gnt_hbox_new(FALSE); gnt_box_set_alignment(GNT_BOX(box), GNT_ALIGN_LEFT); gnt_box_add_widget(GNT_BOX(window), box); gnt_box_add_widget(GNT_BOX(box), gnt_label_new(_("Title"))); edit->title = entry = gnt_entry_new(saved ? purple_savedstatus_get_title(saved) : NULL); gnt_box_add_widget(GNT_BOX(box), entry); /* Type */ box = gnt_hbox_new(FALSE); gnt_box_add_widget(GNT_BOX(window), box); gnt_box_add_widget(GNT_BOX(box), label = gnt_label_new(_("Status"))); gnt_widget_set_size(label, 0, 1); edit->type = combo = gnt_combo_box_new(); gnt_box_add_widget(GNT_BOX(box), combo); current = saved ? purple_savedstatus_get_type(saved) : PURPLE_STATUS_UNSET; for (i = 0; prims[i] != PURPLE_STATUS_UNSET; i++) { gnt_combo_box_add_data(GNT_COMBO_BOX(combo), GINT_TO_POINTER(prims[i]), purple_primitive_get_name_from_type(prims[i])); if (prims[i] == current) gnt_combo_box_set_selected(GNT_COMBO_BOX(combo), GINT_TO_POINTER(current)); } /* Message */ box = gnt_hbox_new(FALSE); gnt_box_add_widget(GNT_BOX(window), box); gnt_box_add_widget(GNT_BOX(box), gnt_label_new(_("Message"))); edit->message = entry = gnt_entry_new(saved ? purple_savedstatus_get_message(saved) : NULL); gnt_box_add_widget(GNT_BOX(window), entry); gnt_box_add_widget(GNT_BOX(window), gnt_hline_new()); gnt_box_add_widget(GNT_BOX(window), gnt_label_new(_("Use different status for following accounts"))); edit->hash = g_hash_table_new(g_direct_hash, g_direct_equal); edit->tree = tree = gnt_tree_new_with_columns(3); gnt_box_add_widget(GNT_BOX(window), tree); gnt_tree_set_show_title(GNT_TREE(tree), TRUE); gnt_tree_set_column_titles(GNT_TREE(tree), _("Account"), _("Status"), _("Message")); gnt_tree_set_col_width(GNT_TREE(tree), 0, 30); gnt_tree_set_col_width(GNT_TREE(tree), 1, 10); gnt_tree_set_col_width(GNT_TREE(tree), 2, 30); for (iter = purple_accounts_get_all(); iter; iter = iter->next) { add_substatus(edit, iter->data); } g_signal_connect(G_OBJECT(tree), "key_pressed", G_CALLBACK(popup_substatus), edit); /* The buttons */ box = gnt_hbox_new(FALSE); gnt_box_add_widget(GNT_BOX(window), box); /* Use */ button = gnt_button_new(_("Use")); gnt_box_add_widget(GNT_BOX(box), button); g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(use_trans_status_cb), edit); /* Save */ button = gnt_button_new(_("Save")); gnt_box_add_widget(GNT_BOX(box), button); g_object_set_data(G_OBJECT(button), "use", NULL); g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(save_savedstatus_cb), edit); /* Save & Use */ button = gnt_button_new(_("Save & Use")); gnt_box_add_widget(GNT_BOX(box), button); g_object_set_data(G_OBJECT(button), "use", GINT_TO_POINTER(TRUE)); g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(save_savedstatus_cb), edit); /* Cancel */ button = gnt_button_new(_("Cancel")); gnt_box_add_widget(GNT_BOX(box), button); g_signal_connect_swapped(G_OBJECT(button), "activate", G_CALLBACK(gnt_widget_destroy), window); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(update_edit_list), edit); gnt_widget_show(window); }