4

SIMPLE ネットワーク (Microsoft Office Communicator) 上の別の人の現在のステータスを取得しようとしています。私は libpurple を使用しており、libpurple の周りに C++ ラッパーを作成しました。SIMPLE ネットワーク上で他のユーザーと IM を送受信できます。私がまだ必要としているのは、他のユーザーの現在のステータスを取得することです

これは、別のユーザーのステータスを取得するための現在の試みです。
以前に定義および初期化されたもの:

PurpleAccount *CommonIM::m_account -> このアカウントを使用してメッセージを送信できます

// the username of the person I want to get the status of, e.g. 
username = "sip:blah@blah.blah.com";

//TEST instance 1
PurpleBuddy* newbody1 = purple_buddy_new(m_account, username.c_str(), NULL);
sleep(5);
PurplePresence *p1 = purple_buddy_get_presence(newbody1);

PurpleStatus *status1 = purple_presence_get_active_status(p1);
PurpleStatusType *statusType1 = purple_status_get_type(status1);
PurpleStatusPrimitive prim1 = purple_status_type_get_primitive(statusType1);

switch(prim1)
{
case PURPLE_STATUS_UNSET:
{
    status = "unset";
}
break;
case PURPLE_STATUS_OFFLINE:
{
    status = "offline";
}
break;
case PURPLE_STATUS_AVAILABLE:
{
    status = "available";
}
break;
case PURPLE_STATUS_UNAVAILABLE:
{
    status = "unavailable";
}
break;
case PURPLE_STATUS_INVISIBLE:
{
    status = "invisible";
}
break;
case PURPLE_STATUS_AWAY:
{
    status = "away";
}
break;
case PURPLE_STATUS_EXTENDED_AWAY:
{
    status = "extended away";
}
break;
case PURPLE_STATUS_MOBILE:
{
    status = "mobile";
}
break;
case PURPLE_STATUS_TUNE:
{
    status = "tune";
}
break;
case PURPLE_STATUS_NUM_PRIMITIVES:
default:
{
    status = "unknown";
}
break;
}

//TEST instance 1 complete
cout << _TAG << "Test instance 1: Status for " << username << " is reported as " << status << endl;

このコードは、ステータスとして常にオフラインを返します。新しいインスタンスを作成した後、パープルがバディを更新しないかのように、常に「オフライン」のままです。過去数日間、libpurple と pidgin に飛び込んでこれを見つけようとしましたが、ステータスを取得する「適切な」方法が見つかりません。

4

1 に答える 1

1

何らかの理由で、signed-onシグナルからこれを呼び出しても機能しません。

信号から呼び出すとbuddy-signed-onうまくいきます。もちろん、その場合は、サインオンしたバディごとに 1 回ずつ呼び出されます...

"buddy-signed-on" シグナルから呼び出されるサンプル関数:

static void buddy_signed_on(PurpleBuddy *buddy) {
GSList *buddies = purple_blist_get_buddies();
for(; buddies; buddies = buddies->next) {
    PurpleBuddy *b = (PurpleBuddy *) buddies->data;
    PurplePresence *presence = purple_buddy_get_presence(b);
    PurpleStatus *status = purple_presence_get_active_status(presence);
    printf("%s is now %s\n", b->name, purple_status_get_id(status));
    }
}

信号を接続します。

purple_signal_connect(purple_blist_get_handle(), "buddy-signed-on", &handle,
          PURPLE_CALLBACK(buddy_signed_on), NULL);
于 2012-03-07T09:15:19.130 に答える