Buddy Status
Mark Doliner
mark at kingant.net
Mon Mar 15 17:15:16 EDT 2010
I think just because the account is online doesn't mean the list of
buddies has been received, or that we have the current status for each
buddy. We've been trending in that directory, but not all of our
protocol plugins behave that way.
Maybe try waiting 10 or 20 seconds using purple_timeout_add()? Or
attach to the buddy-signed-on signal, instead?
--Mark
On Mon, Mar 15, 2010 at 1:46 PM, Giuseppe Santoro
<giuseppesantoro87 at gmail.com> wrote:
> Hi,
>
> I tried with the example "nullclient".
> I created the function:
>
> static void
> show_buddy_list_from_active_accounts()
> {
> GList *accounts = purple_accounts_get_all_active();
> for (; accounts; accounts = g_list_delete_link(accounts, accounts)) {
> GSList *buddies = purple_find_buddies(accounts->data, NULL);
> for (; buddies; buddies = g_slist_delete_link(buddies,buddies)) {
> PurpleBuddy *b = buddies->data;
> PurplePresence *p = purple_buddy_get_presence(b);
> PurpleStatus *s = purple_presence_get_active_status(p);
> printf("status = %s buddy = %s\n",
> purple_status_get_name(s),
> purple_buddy_get_name(b));
> }
> }
> }
>
> and I modified the function "signed_on":
>
> static void
> signed_on(PurpleConnection *gc, gpointer null)
> {
> PurpleAccount *account = purple_connection_get_account(gc);
> printf("Account connected: %s %s\n", account->username,
> account->protocol_id);
> purple_accounts_add(account);
> show_buddy_list_from_active_accounts();
> }
>
> Output is:
> status = Offline buddy = xxxxxxxxxx at hotmail.xxx
> ......
> status = Offline buddy = xxxxxxxxxx at hotmail.xxx
>
> for all buddies.
> I do not understand where is the problem.
>
> Thanks,
> Santoro Giuseppe
>
>
> 2010/3/15 Sadrul Habib Chowdhury <imadil at gmail.com>
>>
>> * Giuseppe Santoro had this to say on [15 Mar 2010, 15:08:20 +0100]:
>> > Hi,
>> >
>> > yes, I'm sure the buddy is online. I tried this code:
>> >
>> > for(buddies = purple_blist_get_buddies(); buddies; buddies =
>> > buddies->next)
>> > {
>> > buddy = buddies->data;
>> > PurplePresence *presence = purple_buddy_get_presence(buddy);
>> > PurpleStatus *status =
>> > purple_presence_get_active_status(presence);
>> >
>> > printf("%s - ", purple_status_get_name(status));
>> > *printf("%s - ",
>> >
>> > purple_primitive_get_id_from_type(purple_status_type_get_primitive(purple_status_get_type(status))));
>> > * printf("%s (%s)\n", purple_buddy_get_name(buddy),
>> > purple_buddy_get_alias(buddy));
>> > }
>>
>>
>> When is this code executed? i.e. are you sure this code is executed
>> *after* your account has connected? Try printing the status of
>> buddy->account in the same loop.
>>
>> For connected accounts, the following code works for me:
>>
>> GList *accounts = purple_accounts_get_all_active();
>> for (; accounts; accounts = g_list_delete_link(accounts, accounts)) {
>> GSList *buddies = purple_find_buddies(accounts->data, NULL);
>> for (; buddies; buddies = g_slist_delete_link(buddies,buddies)) {
>> PurpleBuddy *b = buddies->data;
>> PurplePresence *p = purple_buddy_get_presence(b);
>> PurpleStatus *s = purple_presence_get_active_status(p);
>> printf("status = %s buddy = %s\n",
>> purple_status_get_name(s),
>> purple_buddy_get_name(b));
>> }
>> }
>>
>>
>> Cheers,
>> Sadrul
>>
>> > OUTPUT is:
>> >
>> > Offline - offline - xxxxxx at xxxx.com (xxxxxx at xxxx.com)
>> > Offline - offline - xxxxxx at xxxx.com (xxxxxx at xxxx.com)
>> > ......
>> > Offline - offline - xxxxxx at xxxx.com (xxxxxx at xxxx.com)
>> >
>> > I can see who are online by the name.
>> > I use MSN protocol.
>> >
>> > Other suggestions?
>> >
>> > Thanks,
>> > Giuseppe Santoro
>> >
>> >
>> > 2010/3/15 Mark Doliner <mark at kingant.net>
>> >
>> > > On Sun, Mar 14, 2010 at 11:43 AM, Giuseppe Santoro
>> > > <giuseppesantoro87 at gmail.com> wrote:
>> > > > Hi Pidgin Developers,
>> > > >
>> > > > I'm studying libpurple and pidgin to give my contribution in this
>> > > project.
>> > > >
>> > > > I have a question:
>> > > >
>> > > > if I have a PurpleBuddy, how do I get his state?
>> > > > I tried this code but state is ever "OFFLINE":
>> > > >
>> > > > presence = purple_buddy_get_presence(buddy);
>> > > > status = purple_presence_get_active_status(presence);
>> > > > printf("%s\n", purple_status_get_name(status));
>> > > >
>> > > > where am I wrong?
>> > >
>> > > That looks correct to me. Are you sure you're using the right buddy
>> > > object? Are you sure the buddy is online? Are you sure you're
>> > > printing the status while the buddy is online?
>> > >
>> > > The PurpleStatus name is actually the PurpleStatusType name. And the
>> > > PurpleStatusType name comes from the prpl. It's possible the prpl
>> > > mistakenly sets the name of the status type to "OFFLINE." You could
>> > > try printing
>> > >
>> > > purple_primitive_get_id_from_type(purple_status_type_get_primitive(purple_status_get_type(status)))
>> > > to verify that the status type really is offline.
>> > >
>> > > --Mark
More information about the Devel
mailing list