示例#1
0
static void prplcb_blist_update( PurpleBuddyList *list, PurpleBlistNode *node )
{
	if( node->type == PURPLE_BLIST_BUDDY_NODE )
	{
		PurpleBuddy *bud = (PurpleBuddy*) node;
		PurpleGroup *group = purple_buddy_get_group( bud );
		struct im_connection *ic = purple_ic_by_pa( bud->account );
		PurpleStatus *as;
		int flags = 0;
		
		if( ic == NULL )
			return;
		
		if( bud->server_alias )
			imcb_rename_buddy( ic, bud->name, bud->server_alias );
		else if( bud->alias )
			imcb_rename_buddy( ic, bud->name, bud->alias );
		
		if( group )
			imcb_add_buddy( ic, bud->name, purple_group_get_name( group ) );
		
		flags |= purple_presence_is_online( bud->presence ) ? OPT_LOGGED_IN : 0;
		flags |= purple_presence_is_available( bud->presence ) ? 0 : OPT_AWAY;
		
		as = purple_presence_get_active_status( bud->presence );
		
		imcb_buddy_status( ic, bud->name, flags, purple_status_get_name( as ),
		                   purple_status_get_attr_string( as, "message" ) );
		
		imcb_buddy_times( ic, bud->name,
		                  purple_presence_get_login_time( bud->presence ),
		                  purple_presence_get_idle_time( bud->presence ) );
	}
}
示例#2
0
static void prplcb_privacy_deny_added( PurpleAccount *account, const char *name )
{
	struct im_connection *ic = purple_ic_by_pa( account );
	
	if( !g_slist_find_custom( ic->deny, name, (GCompareFunc) ic->acc->prpl->handle_cmp ) )
		ic->deny = g_slist_prepend( ic->deny, g_strdup( name ) );
}
示例#3
0
void prplcb_conv_new(PurpleConversation *conv)
{
	if (conv->type == PURPLE_CONV_TYPE_CHAT) {
		struct im_connection *ic = purple_ic_by_pa(conv->account);
		struct groupchat *gc;

		gc = bee_chat_by_title(ic->bee, ic, conv->name);

		if (!gc) {
			gc = imcb_chat_new(ic, conv->name);
			if (conv->title != NULL) {
				imcb_chat_name_hint(gc, conv->title);
			}
		}

		/* don't set the topic if it's just the name */
		if (conv->title != NULL && strcmp(conv->name, conv->title) != 0) {
			imcb_chat_topic(gc, NULL, conv->title, 0);
		}

		conv->ui_data = gc;
		gc->data = conv;

		/* libpurple brokenness: Whatever. Show that we join right away,
		   there's no clear "This is you!" signaling in _add_users so
		   don't even try. */
		imcb_chat_add_buddy(gc, gc->ic->acc->user);
	}
}
示例#4
0
void* prplcb_request_input(const char *title, const char *primary,
        const char *secondary, const char *default_value, gboolean multiline,
        gboolean masked, gchar *hint, const char *ok_text, GCallback ok_cb,
        const char *cancel_text, GCallback cancel_cb, PurpleAccount *account,
        const char *who, PurpleConversation *conv, void *user_data)
{
	struct im_connection *ic = purple_ic_by_pa(account);
	struct purple_data *pd = ic->proto_data;
	struct request_input_data *ri = g_new0(struct request_input_data, 1);
	guint id = pd->next_request_id++;

	ri->id = id;
	ri->ic = ic;
	ri->buddy = g_strdup_printf("%s_%u", PURPLE_REQUEST_HANDLE, id);
	ri->data_callback = (ri_callback_t) ok_cb;
	ri->user_data = user_data;
	g_hash_table_insert(pd->input_requests, GUINT_TO_POINTER(id), ri);

	imcb_add_buddy(ic, ri->buddy, NULL);

	if (title && *title) {
		imcb_buddy_msg(ic, ri->buddy, title, 0, 0);
	}

	if (primary && *primary) {
		imcb_buddy_msg(ic, ri->buddy, primary, 0, 0);
	}

	if (secondary && *secondary) {
		imcb_buddy_msg(ic, ri->buddy, secondary, 0, 0);
	}

	return ri;
}
示例#5
0
static void prplcb_privacy_deny_removed( PurpleAccount *account, const char *name )
{
	struct im_connection *ic = purple_ic_by_pa( account );
	void *n;
	
	n = g_slist_find_custom( ic->deny, name, (GCompareFunc) ic->acc->prpl->handle_cmp );
	ic->deny = g_slist_remove( ic->deny, n );
}
示例#6
0
static void prplcb_conv_im( PurpleConversation *conv, const char *who, const char *message, PurpleMessageFlags flags, time_t mtime )
{
	struct im_connection *ic = purple_ic_by_pa( conv->account );
	PurpleBuddy *buddy;
	
	/* ..._SEND means it's an outgoing message, no need to echo those. */
	if( flags & PURPLE_MESSAGE_SEND )
		return;
	
	buddy = purple_find_buddy( conv->account, who );
	if( buddy != NULL )
		who = purple_buddy_get_name( buddy );
	
	imcb_buddy_msg( ic, (char*) who, (char*) message, 0, mtime );
}
示例#7
0
static void prplcb_blist_new( PurpleBlistNode *node )
{
	if( node->type == PURPLE_BLIST_BUDDY_NODE )
	{
		PurpleBuddy *bud = (PurpleBuddy*) node;
		struct im_connection *ic = purple_ic_by_pa( bud->account );
		
		if( ic == NULL )
			return;
		
		imcb_add_buddy( ic, bud->name, NULL );
		
		prplcb_blist_update( NULL, node );
	}
}
示例#8
0
void prplcb_conv_new( PurpleConversation *conv )
{
	if( conv->type == PURPLE_CONV_TYPE_CHAT )
	{
		struct im_connection *ic = purple_ic_by_pa( conv->account );
		struct groupchat *gc;
		
		gc = imcb_chat_new( ic, conv->name );
		conv->ui_data = gc;
		gc->data = conv;
		
		/* libpurple brokenness: Whatever. Show that we join right away,
		   there's no clear "This is you!" signaling in _add_users so
		   don't even try. */
		imcb_chat_add_buddy( gc, gc->ic->acc->user );
	}
}
示例#9
0
/* Generic handler for IM or chat messages, covers write_chat, write_im and write_conv */
static void handle_conv_msg(PurpleConversation *conv, const char *who, const char *message, guint32 bee_flags, time_t mtime)
{
	struct im_connection *ic = purple_ic_by_pa(conv->account);
	struct groupchat *gc = conv->ui_data;
	PurpleBuddy *buddy;

	buddy = purple_find_buddy(conv->account, who);
	if (buddy != NULL) {
		who = purple_buddy_get_name(buddy);
	}

	if (conv->type == PURPLE_CONV_TYPE_IM) {
		imcb_buddy_msg(ic, (char *) who, (char *) message, bee_flags, mtime);
	} else if (gc) {
		imcb_chat_msg(gc, who, (char *) message, bee_flags, mtime);
	}
}
示例#10
0
static void prplcb_xfer_new(PurpleXfer *xfer)
{
	if (purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE) {
		struct prpl_xfer_data *px = g_new0(struct prpl_xfer_data, 1);

		xfer->ui_data = px;
		px->xfer = xfer;
		px->fn = mktemp(g_strdup("/tmp/bitlbee-purple-ft.XXXXXX"));
		px->fd = -1;
		px->ic = purple_ic_by_pa(xfer->account);

		purple_xfer_set_local_filename(xfer, px->fn);

		/* Sadly the xfer struct is still empty ATM so come back after
		   the caller is done. */
		b_timeout_add(0, prplcb_xfer_new_send_cb, xfer);
	} else {
示例#11
0
static void *prplcb_account_request_authorize( PurpleAccount *account, const char *remote_user,
	const char *id, const char *alias, const char *message, gboolean on_list,
	PurpleAccountRequestAuthorizationCb authorize_cb, PurpleAccountRequestAuthorizationCb deny_cb, void *user_data )
{
	struct im_connection *ic = purple_ic_by_pa( account );
	char *q;
	
	if( alias )
		q = g_strdup_printf( "%s (%s) wants to add you to his/her contact "
		                     "list. (%s)", alias, remote_user, message );
	else
		q = g_strdup_printf( "%s wants to add you to his/her contact "
		                     "list. (%s)", remote_user, message );
	
	imcb_ask_with_free( ic, q, user_data, authorize_cb, deny_cb, NULL );
	g_free( q );
	
	return NULL;
}
示例#12
0
static void *prplcb_request_action( const char *title, const char *primary, const char *secondary,
                                    int default_action, PurpleAccount *account, const char *who,
                                    PurpleConversation *conv, void *user_data, size_t action_count,
                                    va_list actions )
{
	struct prplcb_request_action_data *pqad; 
	int i;
	char *q;
	
	pqad = g_new0( struct prplcb_request_action_data, 1 );
	
	for( i = 0; i < action_count; i ++ )
	{
		char *caption;
		void *fn;
		
		caption = va_arg( actions, char* );
		fn = va_arg( actions, void* );
		
		if( strstr( caption, "Accept" ) || strstr( caption, "OK" ) )
		{
			pqad->yes = fn;
			pqad->yes_i = i;
		}
		else if( strstr( caption, "Reject" ) || strstr( caption, "Cancel" ) )
		{
			pqad->no = fn;
			pqad->no_i = i;
		}
	}
	
	pqad->user_data = user_data;
	
	/* TODO: IRC stuff here :-( */
	q = g_strdup_printf( "Request: %s\n\n%s\n\n%s", title, primary, secondary );
	pqad->bee_data = query_add( local_bee->ui_data, purple_ic_by_pa( account ), q,
		prplcb_request_action_yes, prplcb_request_action_no, g_free, pqad );
	
	g_free( q );
	
	return pqad;
}
示例#13
0
/* No, this is not a ui_op but a signal. */
static void prplcb_buddy_typing( PurpleAccount *account, const char *who, gpointer null )
{
	PurpleConversation *conv;
	PurpleConvIm *im;
	int state;
	
	if( ( conv = purple_find_conversation_with_account( PURPLE_CONV_TYPE_IM, who, account ) ) == NULL )
		return;
	
	im = PURPLE_CONV_IM(conv);
	switch( purple_conv_im_get_typing_state( im ) )
	{
	case PURPLE_TYPING:
		state = OPT_TYPING;
		break;
	case PURPLE_TYPED:
		state = OPT_THINKING;
		break;
	default:
		state = 0;
	}
	
	imcb_buddy_typing( purple_ic_by_pa( account ), who, state );
}
示例#14
0
static gboolean prplcb_xfer_new_send_cb( gpointer data, gint fd, b_input_condition cond )
{
	PurpleXfer *xfer = data;
	struct im_connection *ic = purple_ic_by_pa( xfer->account );
	struct prpl_xfer_data *px = g_new0( struct prpl_xfer_data, 1 );
	PurpleBuddy *buddy;
	const char *who;
	
	buddy = purple_find_buddy( xfer->account, xfer->who );
	who = buddy ? purple_buddy_get_name( buddy ) : xfer->who;
	
	/* TODO(wilmer): After spreading some more const goodness in BitlBee,
	   remove the evil cast below. */
	px->ft = imcb_file_send_start( ic, (char*) who, xfer->filename, xfer->size );
	px->ft->data = px;
	px->xfer = data;
	px->xfer->ui_data = px;
	
	px->ft->accept = prpl_xfer_accept;
	px->ft->canceled = prpl_xfer_canceled;
	px->ft->write_request = prpl_xfer_write_request;
	
	return FALSE;
}
示例#15
0
static struct im_connection *purple_ic_by_gc( PurpleConnection *gc )
{
	return purple_ic_by_pa( purple_connection_get_account( gc ) );
}