void flist_purple_set_status(PurpleAccount *account, PurpleStatus *status) { PurpleConnection *pc = purple_account_get_connection(account); FListAccount *fla = pc->proto_data; PurpleStatusType *statusType = purple_status_get_type(status); GList *statusTypes = flist_status_types(account); GList *cur = statusTypes; FListStatus fStatus = FLIST_STATUS_UNKNOWN; // The status isn't active! bail! if (!purple_status_is_active(status)) return; // First, get the presence. If it's idle, we default to idle. PurplePresence *presence = purple_status_get_presence(status); if(purple_presence_is_idle(presence)) { flist_set_status(fla, FLIST_STATUS_IDLE, purple_status_get_attr_string(status, FLIST_STATUS_MESSAGE_KEY)); } // Alright, not idle. Next, compare StatusType IDs. If it's a match, use that. while(cur) { PurpleStatusType *type = cur->data; if(strcmp(purple_status_type_get_id(type), purple_status_type_get_id(statusType)) == 0){ fStatus = flist_parse_status(purple_status_type_get_id(statusType)); break; } else { cur = g_list_next(cur); } } // Found a matching F-list Status. Use it! if(fStatus != FLIST_STATUS_UNKNOWN) { flist_set_status(fla, fStatus, purple_status_get_attr_string(status, FLIST_STATUS_MESSAGE_KEY)); } else { // Alright, seems the status we chose isn't an F-list one. Let's convert to the next best primitive. switch (purple_status_type_get_primitive(statusType)) { case PURPLE_STATUS_AWAY: case PURPLE_STATUS_EXTENDED_AWAY: flist_set_status(fla, FLIST_STATUS_AWAY, purple_status_get_attr_string(status, FLIST_STATUS_MESSAGE_KEY)); break; case PURPLE_STATUS_UNAVAILABLE: flist_set_status(fla, FLIST_STATUS_DND, purple_status_get_attr_string(status, FLIST_STATUS_MESSAGE_KEY)); break; // Assume AVAILABLE by default if it's not an AWAY/DND status default: flist_set_status(fla, FLIST_STATUS_AVAILABLE, purple_status_get_attr_string(status, FLIST_STATUS_MESSAGE_KEY)); } } g_list_free(statusTypes); flist_update_server_status(fla); }
static void purple_set_away( struct im_connection *ic, char *state_txt, char *message ) { PurpleAccount *pa = ic->proto_data; GList *status_types = purple_account_get_status_types( pa ), *st; PurpleStatusType *pst = NULL; GList *args = NULL; for( st = status_types; st; st = st->next ) { pst = st->data; if( state_txt == NULL && purple_status_type_get_primitive( pst ) == PURPLE_STATUS_AVAILABLE ) break; if( state_txt != NULL && g_strcasecmp( state_txt, purple_status_type_get_name( pst ) ) == 0 ) break; } if( message && purple_status_type_get_attr( pst, "message" ) ) { args = g_list_append( args, "message" ); args = g_list_append( args, message ); } purple_account_set_status_list( pa, st ? purple_status_type_get_id( pst ) : "away", TRUE, args ); g_list_free( args ); }
static void pipe_handle_publish(struct purple_publish *publish) { PurpleAccount *account = NULL; extern_account_t *accounts = NULL; int naccounts = 0; int i; LM_DBG("calling find_accounts(\"%s\", &naccoutns)\n", publish->from); accounts = find_accounts(publish->from, &naccounts); LM_DBG("found %d extra account(s) for <%s>", naccounts, publish->from); for (i = 0; i < naccounts; i++) { LM_DBG("calling client_find_account(\"%s\")\n", accounts[i].username); account = client_find_account(&accounts[i]); if (account) { if (publish->basic == PURPLE_BASIC_OPEN) { client_enable_account(account); LM_DBG("basic = open, setting up new status... %s,%d,%s\n", account[i].username, publish->primitive, publish->note); PurpleStatusType *type = purple_account_get_status_type_with_primitive(account, publish->primitive); if (purple_status_type_get_attr(type, "message")) { purple_account_set_status(account, purple_status_type_get_id(type), TRUE, "message", publish->note, NULL); } else { purple_account_set_status(account, purple_status_type_get_id(type), TRUE, NULL); } } else if (publish->basic == PURPLE_BASIC_CLOSED){ LM_DBG("basic = closed, setting up new status to offline... %s\n", account[i].username); PurpleStatusType *type = purple_account_get_status_type_with_primitive(account, PURPLE_STATUS_OFFLINE); purple_account_set_status(account, purple_status_type_get_id(type), TRUE, NULL); } } } if (accounts) extern_account_free(accounts, naccounts); }
static void export_accounts_statuses(PurpleAccount *account) { FILE *file; GList *current = purple_account_get_status_types(account); char *filename = get_accounts_subfile_name(account, AVAILABLE_STATUSES); if ((file = fopen(filename, "w")) != NULL) { for (; current != NULL; current = g_list_next(current)) { fprintf(file, "%s\n", purple_status_type_get_id( current->data)); } fclose(file); } else { mimoc_printf(MIMOC_FIFO_SYS_ERROR, "ERR:\tCould not create file \"%s\"!\n", filename); } g_free(filename); }