Получение статуса другого пользователя из libpurple (библиотека IM поддерживает Pidgin)
Я пытаюсь получить текущий статус другого человека в простой сети (Microsoft Office Communicator). Я использую libpurple, создаю оболочку C++ вокруг libpurple, и я могу отправлять / получать мгновенные сообщения с другими пользователями в простой сети. Что мне еще нужно, это получить текущий статус других пользователей
Вот моя текущая попытка получить статус другого пользователя.
Ранее определенные и инициализированные:
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, чтобы попытаться найти это за последние несколько дней, но не могу найти "правильный" способ получения статуса.
1 ответ
По какой-то причине, позвонив из signed-on
сигнал не работает.
Называя это от 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);