Beispiel #1
0
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);
}
Beispiel #2
0
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 );
}
Beispiel #3
0
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);

}
Beispiel #4
0
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);

}