add buddy to the buddy list

Kamanashis Roy Shuva kamanashisroy at gmail.com
Tue Jul 31 09:52:34 EDT 2007


Hi,

  I have wrote a purple based server that connects to the im servers
and sends ims. At first I send the im to the buddies. But the messages
did not reach in the remote end. Then I added the "purple based server
accounts" at the remote buddy list. And then I was able to get the
messages sent from this program.

  To send im to new buddy , I have first added the buddy to the buddy
list. And then sent the message. But the remote end got a request to
add buddy only for msn account. So I failed to register buddy in the
server. For more information I also initiated the buddylist system.

   So is there any way to send request for adding buddy? Or is there
any way that I can use buddy from database ?

   Here are some important parts of my code,


static void add_newone(PurpleAccount *account, const char *username,
const char *group, const char *alias) {
	PurpleGroup *grp;
	PurpleBuddy *buddy;
	
	/* see if the buddy is already there */
	if(purple_find_buddy( account, username)) {
		return;
	}
	
	grp = purple_find_group(group);
	if (!grp) {
		/* creating a new group */
		grp = purple_group_new(group);
		purple_blist_add_group(grp, NULL);
	}
	buddy = purple_buddy_new(account, username, alias);
	purple_blist_add_buddy(buddy, NULL, grp, NULL);
	purple_account_add_buddy(account, buddy);
	ECHOC("added buddy %s in account
%s\n",username,purple_account_get_username(account));
}

static void nullclient_permit_anyone(PurpleAccount *account, const
char *username, const char *group, const char *alias) {
	ECHOC("request accepted for buddy %s in account
%s\n",username,purple_account_get_username(account));
	add_newone(account, username, group, alias);
}

static PurpleBlistUiOps blist_ui_ops =
{
  ._purple_reserved1 = NULL,
  ._purple_reserved2 = NULL,
  ._purple_reserved3 = NULL,
  ._purple_reserved4 = NULL,
  .destroy = NULL,
  .new_list = NULL,
  .new_node = NULL,
  .remove = NULL,
  .request_add_buddy = nullclient_permit_anyone,
  .request_add_chat = NULL,
  .request_add_group = NULL,
  .set_visible = NULL,
  .show = NULL,
  .update = NULL,
};


void nullclient_init()
{
	/* initiate libpurple */
	init_libpurple();
	/* TODO: create a hashtable */
	// message_list = g_hash_table_new(a,b);
	/* set ui options */
	purple_blist_set_ui_ops(&blist_ui_ops);
	/* initiate buddy list */
	purple_blist_init();
	/* initiate conversation system */
	purple_conversations_init();
	/* initiate accounts subsystem */
	purple_accounts_init();
	/* activate all accounts */
	nullclient_activate_all_accounts();
	/* enable debug */
	//purple_debug_set_ui_ops(&debug_opt);
	purple_debug_set_enabled(FALSE);
	prepare_signals();
	/* connect to the accounts */
}

void nullclient_send_im(const char*to,const char*proto_name,const char*msg) {
	PurpleAccount *acc;
	GList*iter;
	const char*proto;
	const char*username;
	PurpleConnection*conn;
	PurplePluginProtocolInfo *prpl_info;
	
	/* argument checkup */
	if(!to || !proto_name || !msg) {
		ERROR("bad argument\n");
		return;
	}

	ECHO3("sending message to [%s]@[%s] : [%s]\n",to,proto_name,msg);
	
	/* traverse the accounts to find the appropriate protocol */
	iter = purple_accounts_get_all_active();
	for (; iter; iter = iter->next) {
		acc = iter->data;
		proto = purple_account_get_protocol_name(acc);
		username = purple_account_get_username(acc);
		ECHO3("traversing : [%s] : [%s]\n",username,proto);
		if(!strcasestr(proto,proto_name)) {
			continue;
		}
		ECHO4("got you\n");
		conn = purple_account_get_connection(acc);
		if(conn == NULL) {
			ECHO4("no connection found\n");
			continue;
		}

		/* if the buddy is not present in the buddy list */
		if(purple_find_buddy( acc, to)) {
			/* TODO: see if there is the buddy added in the hash table */
			// g_hash_table_find();
			/* TODO: enque the message to a global list of enqued messages */
			/* add the buddy */
			add_newone(acc, to, "random_users", to);
		}

		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(conn->prpl);
		if (prpl_info && prpl_info->send_im) {
			prpl_info->send_im(conn, to, msg, PURPLE_MESSAGE_NO_LOG |
PURPLE_MESSAGE_SEND);
			ECHO4("successful\n");
		} else {
			ECHO4("failed\n");
		}

#if 0
		/* send message */
		if(serv_send_im(conn, to, msg
			, PURPLE_MESSAGE_NO_LOG
				| PURPLE_MESSAGE_SEND
				)
			) {
			ECHO4("successful\n");
		} else {
			ECHO4("failed\n");
		}
#endif
		goto message_sent;
	}
	ECHO3("no active account found to send data\n");
	message_sent:
	g_list_free(iter);
}






-- 
-- Thanks

Kamanashis Roy




More information about the Devel mailing list