示例#1
0
static gchar *
stress_status_text(PurpleBuddy *buddy) {
	PurplePresence *presence = purple_buddy_get_presence(buddy);
	PurpleStatus *status = purple_presence_get_active_status(presence);
	const gchar *msg = NULL;

	msg = purple_status_get_attr_string(status, "message");

	return (msg) ? g_strdup(msg) : NULL;
}
示例#2
0
static void fx_tooltip_text(PurpleBuddy *buddy, PurpleNotifyUserInfo *user_info, gboolean UNUSED(full))
{
	PurpleStatus *status;
	const gchar *impresa, *alias, *sid, *mobileno;

	g_return_if_fail(buddy != NULL);

	status = purple_presence_get_active_status(purple_buddy_get_presence(buddy));
	impresa = purple_status_get_attr_string(status, "impresa");
	sid = purple_status_get_attr_string(status, "fetionno");
	mobileno = purple_status_get_attr_string(status, "mobileno");
	alias = purple_buddy_get_alias(buddy);

	purple_notify_user_info_add_pair(user_info, _("FetionNo"), sid);
	purple_notify_user_info_add_pair(user_info, _("MobileNo"), mobileno);
	purple_notify_user_info_add_pair(user_info, _("Alias"), alias);
	purple_notify_user_info_add_pair(user_info, _("Signature"), impresa);

}
示例#3
0
	EntryStatus FromPurpleStatus (PurpleAccount *account, PurpleStatus *status)
	{
		const auto id = purple_status_get_id (status);
		const auto statusType = purple_account_get_status_type (account, id);

		const auto message = purple_status_get_attr_string (status, "message");

		return EntryStatus (FromPurpleState (purple_status_type_get_primitive (statusType)),
				message ? QString::fromUtf8 (message) : QString ());
	}
示例#4
0
char *PurpleLine::status_text(PurpleBuddy *buddy) {
    PurplePresence *presence = purple_buddy_get_presence(buddy);
    PurpleStatus *status = purple_presence_get_active_status(presence);

    const char *msg = purple_status_get_attr_string(status, "message");
    if (msg && msg[0])
        return g_markup_escape_text(msg, -1);

    return nullptr;
}
示例#5
0
/**
 * Set the currently playing song artist and or title.
 *
 * @param user User associated with the now playing information.
 *
 * @param new_artist New artist to set, or NULL/empty to not change artist.
 *
 * @param new_title New title to set, or NULL/empty to not change title.
 *
 * If new_artist and new_title are NULL/empty, deactivate PURPLE_STATUS_TUNE.
 *
 * This function is useful because it lets you set the artist or title
 * individually, which purple_prpl_got_user_status() doesn't do.
 */
static void msim_set_artist_or_title(MsimUser *user, const char *new_artist, const char *new_title)
{
    PurplePresence *presence;
    const char *prev_artist, *prev_title;

    if (user->buddy == NULL)
        /* User not on buddy list so nothing to do */
        return;

    prev_artist = NULL;
    prev_title = NULL;

    if (new_artist && !*new_artist)
        new_artist = NULL;
    if (new_title && !*new_title)
        new_title = NULL;

    if (!new_artist && !new_title) {
        purple_prpl_got_user_status_deactive(user->buddy->account, user->buddy->name, "tune");
        return;
    }

    presence = purple_buddy_get_presence(user->buddy);

    if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_TUNE)) {
        PurpleStatus *status;

        status = purple_presence_get_status(presence, "tune");
        prev_title = purple_status_get_attr_string(status, PURPLE_TUNE_TITLE);
        prev_artist = purple_status_get_attr_string(status, PURPLE_TUNE_ARTIST);
    }

    if (!new_artist)
        new_artist = prev_artist;

    if (!new_title)
        new_title = prev_title;

    purple_prpl_got_user_status(user->buddy->account, user->buddy->name, "tune",
                                PURPLE_TUNE_TITLE, new_title,
                                PURPLE_TUNE_ARTIST, new_artist,
                                NULL);
}
示例#6
0
static void waprpl_set_status(PurpleAccount * acct, PurpleStatus * status)
{
	whatsapp_connection *wconn = purple_connection_get_protocol_data(purple_account_get_connection(acct));
	const char *sid = purple_status_get_id(status);
	const char *mid = purple_status_get_attr_string(status, "message");
	if (mid == 0)
		mid = "";

	waAPI_setmypresence(wconn->waAPI, sid, mid);
	waprpl_check_output(purple_account_get_connection(acct));
}
示例#7
0
文件: worker.c 项目: freewizard/jiwai
void jidgin_worker_cb_status(PurpleBuddy *buddy, PurpleStatus *old_status, PurpleStatus *status) {
  const char *sig_new = purple_status_get_attr_string(status, "message");
  pJidginMsg pmsg;
  PurpleAccount *account;

  if (sig_new) {
    account = purple_buddy_get_account(buddy);
    pmsg = jidgin_msg_init(ROBOTMSG_TYPE_SIG);
    pmsg->from    = g_strdup(buddy->name);
    pmsg->to      = g_strdup(account->username);
    pmsg->msg     = g_strdup(sig_new);
    pmsg->device  = g_strdup(account->protocol_id);

    jidgin_reactor_emit(pmsg);
    jidgin_msg_destroy(pmsg);
    jidgin_log(LOG_INFO, "[jidgin_worker_cb_status]%s %s\n",
        buddy->name,
        purple_status_get_attr_string(status, "message"));
  }
}
示例#8
0
static gchar *fx_status_text(PurpleBuddy *buddy)
{
	PurplePresence *presence;
	PurpleStatus   *status;
	const gchar    *msg;

	presence = purple_buddy_get_presence(buddy);
	status   = purple_presence_get_active_status(presence);
	msg = purple_status_get_attr_string(status, "impresa");
	if(msg && *msg)	return g_markup_escape_text(msg, -1);
	return NULL;
}
示例#9
0
void
pn_update_personal_message (MsnSession *session)
{
    PurpleAccount *account;
    PurplePresence *presence;
    gchar *current_media;

    g_return_if_fail (session);

    if (!session->logged_in)
        return;

    account = msn_session_get_user_data (session);
    presence = purple_account_get_presence (account);

    current_media = create_current_media_string (presence);

#ifndef PECAN_USE_PSM
    const gchar *msg;

    msg = purple_account_get_string (account, "personal_message", "");
    pn_set_personal_message (session, (gchar *) msg, current_media);
#else
    PurpleStatus *status;
    const gchar *formatted_msg;

    status = purple_account_get_active_status (account);
    formatted_msg = purple_status_get_attr_string (status, "message");

    if (formatted_msg)
    {
        gchar *msg;
        gchar *tmp;

        tmp = purple_markup_strip_html (formatted_msg);
        msg = g_markup_escape_text (tmp, -1);
        pn_set_personal_message (session, msg, current_media);

        g_free (tmp);
        g_free (msg);
    }
    else
    {
        pn_set_personal_message (session, NULL, current_media);
    }
#endif /* PECAN_USE_PSM */

    if (current_media)
        g_free (current_media);
}
示例#10
0
void sipe_purple_set_status(PurpleAccount *account,
			    PurpleStatus *status)
{
	SIPE_DEBUG_INFO("sipe_purple_set_status[CB]: status=%s",
			purple_status_get_id(status));

	if (!purple_status_is_active(status))
		return;

	if (account->gc) {
		const gchar *status_id = purple_status_get_id(status);
		const gchar *note      = purple_status_get_attr_string(status,
								       SIPE_PURPLE_STATUS_ATTR_ID_MESSAGE);
		sipe_core_status_set(PURPLE_ACCOUNT_TO_SIPE_CORE_PUBLIC,
				     sipe_purple_token_to_activity(status_id),
				     note);
	}
}
示例#11
0
bool SpectrumBuddy::getStatus(PurpleStatusPrimitive &status, std::string &statusMessage) {
	PurplePresence *pres = purple_buddy_get_presence(m_buddy);
	if (pres == NULL)
		return false;
	PurpleStatus *stat = purple_presence_get_active_status(pres);
	if (stat == NULL)
		return false;
	status = purple_status_type_get_primitive(purple_status_get_type(stat));
	const char *message = purple_status_get_attr_string(stat, "message");

	if (message != NULL) {
		char *stripped = purple_markup_strip_html(message);
		statusMessage = std::string(stripped);
		g_free(stripped);
	}
	else
		statusMessage = "";
	return true;
}
示例#12
0
文件: qq.c 项目: anchowee/AdiumQQ
/* a short status text beside buddy icon*/
static gchar *qq_status_text(PurpleBuddy *b)
{
	PurpleStatus *status;
	PurplePresence *presence;
	gchar *moodtext, *ret;

	presence = purple_buddy_get_presence(b);
	status = purple_presence_get_status(presence, "mood");

	/* we only provide Mood here
	switch(bd->status) {
		case QQ_BUDDY_OFFLINE:
			g_string_append(status, _("Offline"));
			break;
		case QQ_BUDDY_ONLINE_NORMAL:
			g_string_append(status, _("Online"));
			break;
		case QQ_BUDDY_CHANGE_TO_OFFLINE:
			g_string_append(status, _("Offline"));
			break;
		case QQ_BUDDY_ONLINE_AWAY:
			g_string_append(status, _("Away"));
			break;
		case QQ_BUDDY_ONLINE_INVISIBLE:
			g_string_append(status, _("Invisible"));
			break;
		case QQ_BUDDY_ONLINE_BUSY:
			g_string_append(status, _("Busy"));
			break;
		default:
			g_string_printf(status, _("Unknown-%d"), bd->status);
	}
	*/
	moodtext = purple_status_get_attr_string(status, PURPLE_MOOD_COMMENT);
	if (moodtext)
	{
		ret = g_strdup(moodtext);		//ret will be free by invoker
		return ret;
	}

	return NULL;
}
示例#13
0
gboolean sipe_backend_status_changed(struct sipe_core_public *sipe_public,
				     guint activity,
				     const gchar *message)
{
	struct sipe_backend_private *purple_private = sipe_public->backend_private;
	PurpleStatus *status = purple_account_get_active_status(purple_private->account);
	const gchar *status_id = sipe_purple_activity_to_token(activity);
	gboolean changed = TRUE;

	if (g_str_equal(status_id, purple_status_get_id(status)) &&
	    sipe_strequal(message,
			  purple_status_get_attr_string(status,
							SIPE_PURPLE_STATUS_ATTR_ID_MESSAGE)))
	{
		changed = FALSE;
	}

	if (purple_savedstatus_is_idleaway()) {
		changed = FALSE;
	}

	return(changed);
}
示例#14
0
static void
write_status(PurpleBuddy *buddy, const char *fmt)
{
	const char *message;
	const char *status_type;
	const char *alias = purple_buddy_get_alias(buddy);
	char *log_entry;

	PurpleStatus *status = purple_presence_get_active_status(buddy->presence);

	/* Collect data */
	message = purple_status_get_attr_string(status, "message");
	if (message == NULL) {
		/* Don't bother with no message only
		 * if we have something other to say */
		if (fmt) 
			message = _("");
		else
			return;
	}
	
	if (!fmt) {
		/* No fmt? Use default */
		fmt = _("%s status is: %s (%s)");	
	}

	if (!status) {
		status_type = _("Unknown status type");
	} else {
		status_type = purple_status_get_name(status);
	}

	log_entry = g_strdup_printf(fmt, alias, status_type, message);
	write_message(buddy, log_entry);
	g_free(log_entry);
	return;
}
示例#15
0
文件: irc.c 项目: arminius2/apolloim
static void irc_set_status(PurpleAccount *account, PurpleStatus *status)
{
	PurpleConnection *gc = purple_account_get_connection(account);
	struct irc_conn *irc;
	const char *args[1];
	const char *status_id = purple_status_get_id(status);

	g_return_if_fail(gc != NULL);
	irc = gc->proto_data;

	if (!purple_status_is_active(status))
		return;

	args[0] = NULL;

	if (!strcmp(status_id, "away")) {
		args[0] = purple_status_get_attr_string(status, "message");
		if ((args[0] == NULL) || (*args[0] == '\0'))
			args[0] = _("Away");
		irc_cmd_away(irc, "away", NULL, args);
	} else if (!strcmp(status_id, "available")) {
		irc_cmd_away(irc, "back", NULL, args);
	}
}
示例#16
0
static void discover_status(PurpleConnection *from, PurpleConnection *to,
                            gpointer userdata) {
  const char *from_username = purple_account_get_username(purple_connection_get_account(from));
  const char *to_username = purple_account_get_username(purple_connection_get_account(to));

  if (purple_blist_find_buddy(purple_connection_get_account(from), to_username)) {
    PurpleStatus *status = purple_account_get_active_status(purple_connection_get_account(to));
    const char *status_id = purple_status_get_id(status);
    const char *message = purple_status_get_attr_string(status, "message");

    if (!strcmp(status_id, NULL_STATUS_ONLINE) ||
        !strcmp(status_id, NULL_STATUS_AWAY) ||
        !strcmp(status_id, NULL_STATUS_OFFLINE)) {
      purple_debug_info("nullprpl", "%s sees that %s is %s: %s\n",
                        from_username, to_username, status_id, message);
      purple_prpl_got_user_status(purple_connection_get_account(from), to_username, status_id,
                                  (message) ? "message" : NULL, message, NULL);
    } else {
      purple_debug_error("nullprpl",
                         "%s's buddy %s has an unknown status: %s, %s",
                         from_username, to_username, status_id, message);
    }
  }
}
示例#17
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));
	}
}
示例#18
0
static void pipe_handle_subscribe(struct purple_subscribe *subscribe) {
	PurpleAccount *account = NULL;
	extern_account_t *accounts = NULL;
	extern_user_t *users = NULL;
	int naccounts = 0, nusers = 0;
	int i, j;
	PurpleBuddy *buddy = NULL;

	int d = 0;

	const char *note;
	enum purple_publish_basic basic;
	enum purple_publish_activity activity;

	LM_DBG("calling find_accounts(\"%s\", &naccounts)\n", subscribe->from);
	accounts = find_accounts(subscribe->from, &naccounts);
	LM_DBG("found %d extra account(s) for <%s>", naccounts, subscribe->from);
	
	LM_DBG("calling find_users(\"%s\", &nusers)\n", subscribe->to);
	users = find_users(subscribe->to, &nusers);
	LM_DBG("found %d extra user(s) for <%s>", nusers, subscribe->to);

	for (i = 0; i < naccounts; i++) {
		LM_DBG("calling client_find_account(\"%s\")\n", accounts[i].username);
		account = client_find_account(&accounts[i]);
		//if ((account) && (purple_account_is_connected(account) || purple_account_is_connecting(account))) {
		if (account) {
			for (j = 0; j < nusers; j++) {
				if (!strcmp(accounts[i].protocol, users[j].protocol)) {
					LM_DBG("found matching protocol: %s\n", accounts[i].protocol);

					LM_DBG("subscribe expires : %d\n", subscribe->expires);
					if (subscribe->expires == 0)
						d = hashtable_dec_counter(users[j].username);
					else
						d = hashtable_inc_counter(users[j].username);
					
					LM_DBG("<%s> is now referenced %d times\n", users[j].username, d);
					if (d == 0) {
						LM_DBG("<%s> is no more referenced, removing presence...\n", users[j].username);
						if (purple_send_sip_publish(subscribe->to, users[j].username, PURPLE_BASIC_CLOSED, 0, NULL) < 0)
							LM_ERR("error sending presence for %s", subscribe->to);
						else
							LM_DBG("presence message sent successfully\n");
					}

					else {
	
						buddy = purple_find_buddy(account, users[j].username);
						if (buddy == NULL) {
							LM_DBG("<%s> not found in <%s> buddy list, adding\n", users[j].username, accounts[i].username);
							buddy = purple_buddy_new(account, users[j].username, users[j].username);
							//purple_blist_add_buddy(buddy, NULL, NULL, NULL);
							purple_account_add_buddy(account, buddy);
						}
						else {
							LM_DBG("<%s> found in <%s> buddy list, sending publish\n", users[j].username, accounts[i].username);
							PurplePresence *presence = purple_buddy_get_presence(buddy);
							PurpleStatus *status = purple_presence_get_active_status(presence);
							PurpleStatusType *type = purple_status_get_type(status);
							PurpleStatusPrimitive primitive = purple_status_type_get_primitive(type);
							note = purple_status_get_attr_string(status, "message");
							primitive_parse(primitive, &basic, &activity);

							if (purple_send_sip_publish(subscribe->to, users[j].username, basic, activity, note) < 0)
								LM_ERR("error sending presence for %s", subscribe->to);
							else
								LM_DBG("presence message sent successfully\n");
							
						}	
	
					}

					break;
				}
			}
		}
	}
	if (accounts)
		extern_account_free(accounts, naccounts);
	if (users)
		extern_user_free(users, nusers);
	
}
示例#19
0
void jabber_presence_send(JabberStream *js, gboolean force)
{
	PurpleAccount *account;
	xmlnode *presence, *x, *photo;
	char *stripped = NULL;
	JabberBuddyState state;
	int priority;
	const char *artist = NULL, *title = NULL, *source = NULL, *uri = NULL, *track = NULL;
	int length = -1;
	gboolean allowBuzz;
	PurplePresence *p;
	PurpleStatus *status, *tune;

	account = purple_connection_get_account(js->gc);
	p = purple_account_get_presence(account);
	status = purple_presence_get_active_status(p);

	/* we don't want to send presence before we've gotten our roster */
	if (js->state != JABBER_STREAM_CONNECTED) {
		purple_debug_misc("jabber", "attempt to send presence before roster retrieved\n");
		return;
	}

	purple_status_to_jabber(status, &state, &stripped, &priority);

	/* check for buzz support */
	allowBuzz = purple_status_get_attr_boolean(status,"buzz");
	/* changing the buzz state has to trigger a re-broadcasting of the presence for caps */

	tune = purple_presence_get_status(p, "tune");
	if (js->googletalk && !stripped && purple_status_is_active(tune)) {
		stripped = jabber_google_presence_outgoing(tune);
	}

#define CHANGED(a,b) ((!a && b) || (a && a[0] == '\0' && b && b[0] != '\0') || \
					  (a && !b) || (a && a[0] != '\0' && b && b[0] == '\0') || (a && b && strcmp(a,b)))
	/* check if there are any differences to the <presence> and send them in that case */
	if (force || allowBuzz != js->allowBuzz || js->old_state != state ||
		CHANGED(js->old_msg, stripped) || js->old_priority != priority ||
		CHANGED(js->old_avatarhash, js->avatar_hash) || js->old_idle != js->idle) {
		/* Need to update allowBuzz before creating the presence (with caps) */
		js->allowBuzz = allowBuzz;

		presence = jabber_presence_create_js(js, state, stripped, priority);

		/* Per XEP-0153 4.1, we must always send the <x> */
		x = xmlnode_new_child(presence, "x");
		xmlnode_set_namespace(x, "vcard-temp:x:update");
		/*
		 * FIXME: Per XEP-0153 4.3.2 bullet 2, we must not publish our
		 * image hash if another resource has logged in and updated the
		 * vcard avatar. Requires changes in jabber_presence_parse.
		 */
		if (js->vcard_fetched) {
			/* Always publish a <photo>; it's empty if we have no image. */
			photo = xmlnode_new_child(x, "photo");
			if (js->avatar_hash)
				xmlnode_insert_data(photo, js->avatar_hash, -1);
		}

		jabber_send(js, presence);

		g_hash_table_foreach(js->chats, chats_send_presence_foreach, presence);
		xmlnode_free(presence);

		/* update old values */

		if(js->old_msg)
			g_free(js->old_msg);
		if(js->old_avatarhash)
			g_free(js->old_avatarhash);
		js->old_msg = g_strdup(stripped);
		js->old_avatarhash = g_strdup(js->avatar_hash);
		js->old_state = state;
		js->old_priority = priority;
		js->old_idle = js->idle;
	}
	g_free(stripped);

	/* next, check if there are any changes to the tune values */
	if (purple_status_is_active(tune)) {
		artist = purple_status_get_attr_string(tune, PURPLE_TUNE_ARTIST);
		title = purple_status_get_attr_string(tune, PURPLE_TUNE_TITLE);
		source = purple_status_get_attr_string(tune, PURPLE_TUNE_ALBUM);
		uri = purple_status_get_attr_string(tune, PURPLE_TUNE_URL);
		track = purple_status_get_attr_string(tune, PURPLE_TUNE_TRACK);
		length = (!purple_status_get_attr_value(tune, PURPLE_TUNE_TIME)) ? -1 :
				purple_status_get_attr_int(tune, PURPLE_TUNE_TIME);
	}

	if(CHANGED(artist, js->old_artist) || CHANGED(title, js->old_title) || CHANGED(source, js->old_source) ||
	   CHANGED(uri, js->old_uri) || CHANGED(track, js->old_track) || (length != js->old_length)) {
		PurpleJabberTuneInfo tuneinfo = {
			(char*)artist,
			(char*)title,
			(char*)source,
			(char*)track,
			length,
			(char*)uri
		};
		jabber_tune_set(js->gc, &tuneinfo);

		/* update old values */
		g_free(js->old_artist);
		g_free(js->old_title);
		g_free(js->old_source);
		g_free(js->old_uri);
		g_free(js->old_track);
		js->old_artist = g_strdup(artist);
		js->old_title = g_strdup(title);
		js->old_source = g_strdup(source);
		js->old_uri = g_strdup(uri);
		js->old_length = length;
		js->old_track = g_strdup(track);
	}

#undef CHANGED

	jabber_presence_fake_to_self(js, status);
}
示例#20
0
文件: qq.c 项目: anchowee/AdiumQQ
/* a floating text when mouse is on the icon, show connection status here */
static void qq_tooltip_text(PurpleBuddy *b, PurpleNotifyUserInfo *user_info, gboolean full)
{
	qq_buddy_data *bd;
	gchar *tmp;
	GString *str;
	PurplePresence *presence;
	PurpleStatus *status;
	gchar *moodtext;

	g_return_if_fail(b != NULL);
	presence = purple_buddy_get_presence(b);
	bd = purple_buddy_get_protocol_data(b);
	if (bd == NULL)
		return;

	if (bd->level == NULL)
		qq_request_get_level(purple_account_get_connection(purple_buddy_get_account(b)), bd->uid);

	/* if (PURPLE_BUDDY_IS_ONLINE(b) && bd != NULL) */
	if (bd->ip.s_addr != 0) {
		str = g_string_new(NULL);
		g_string_printf(str, "%s:%d", inet_ntoa(bd->ip), bd->port);
		if (bd->comm_flag & QQ_COMM_FLAG_TCP_MODE) {
			g_string_append(str, " TCP");
		} else {
			g_string_append(str, " UDP");
		}
		g_string_free(str, TRUE);
	}

	tmp = g_strdup_printf("%d", bd->age);
	purple_notify_user_info_add_pair(user_info, _("Age"), tmp);
	g_free(tmp);

	switch (bd->gender) {
		case QQ_BUDDY_GENDER_GG:
			purple_notify_user_info_add_pair(user_info, _("Gender"), _("Male"));
			break;
		case QQ_BUDDY_GENDER_MM:
			purple_notify_user_info_add_pair(user_info, _("Gender"), _("Female"));
			break;
		default:
			purple_notify_user_info_add_pair(user_info, _("Gender"), _("Unknown"));
	}

	if (bd->level) {
		tmp = g_strdup_printf("%d", bd->level);
		purple_notify_user_info_add_pair(user_info, _("Level"), tmp);
		g_free(tmp);
	}

	str = g_string_new(NULL);
	if (bd->comm_flag & QQ_COMM_FLAG_QQ_MEMBER) {
		g_string_append( str, _("Member") );
	}
	if (bd->comm_flag & QQ_COMM_FLAG_QQ_VIP) {
		g_string_append( str, _(" VIP") );
	}
	if (bd->comm_flag & QQ_COMM_FLAG_TCP_MODE) {
		g_string_append( str, _(" TCP") );
	}
	if (bd->comm_flag & QQ_COMM_FLAG_MOBILE) {
		g_string_append( str, _(" FromMobile") );
	}
	if (bd->comm_flag & QQ_COMM_FLAG_BIND_MOBILE) {
		g_string_append( str, _(" BindMobile") );
	}
	if (bd->comm_flag & QQ_COMM_FLAG_VIDEO) {
		g_string_append( str, _(" Video") );
	}
	if (bd->ext_flag & QQ_EXT_FLAG_ZONE) {
		g_string_append( str, _(" Zone") );
	}

	purple_notify_user_info_add_pair(user_info, _("Flag"), str->str);
	g_string_free(str, TRUE);

	status = purple_presence_get_status(presence, PURPLE_MOOD_NAME);
	moodtext = purple_status_get_attr_string(status, PURPLE_MOOD_COMMENT);
	if (moodtext)
	{
		purple_notify_user_info_add_pair(user_info, _("Signature"), moodtext);
	}

#ifdef DEBUG
	tmp = g_strdup_printf( "%s (%04X)",
			qq_get_ver_desc(bd->client_tag),
			bd->client_tag );
	purple_notify_user_info_add_pair(user_info, _("Ver"), tmp);
	g_free(tmp);

	tmp = g_strdup_printf( "Ext 0x%X, Comm 0x%X",
			bd->ext_flag, bd->comm_flag );
	purple_notify_user_info_add_pair(user_info, _("Flag"), tmp);
	g_free(tmp);
#endif
}
示例#21
0
char *jabber_google_presence_outgoing(PurpleStatus *tune)
{
	const char *attr = purple_status_get_attr_string(tune, PURPLE_TUNE_TITLE);
	return attr ? g_strdup_printf("♫ %s", attr) : g_strdup("");
}
示例#22
0
/**
 * @brief Append the status information to a user_info struct
 *
 * The returned information is HTML-ready, appropriately escaped, as all information in a user_info struct should be HTML.
 *
 * @param gc The PurpleConnection
 * @param user_info A PurpleNotifyUserInfo object to which status information will be added
 * @param b The PurpleBuddy whose status is desired. This or the aim_userinfo_t (or both) must be passed to oscar_user_info_append_status().
 * @param userinfo The aim_userinfo_t of the buddy whose status is desired. This or the PurpleBuddy (or both) must be passed to oscar_user_info_append_status().
 * @param use_html_status If TRUE, prefer HTML-formatted away message over plaintext available message.
 */
void
oscar_user_info_append_status(PurpleConnection *gc, PurpleNotifyUserInfo *user_info, PurpleBuddy *b, aim_userinfo_t *userinfo, gboolean use_html_status)
{
	PurpleAccount *account = purple_connection_get_account(gc);
	OscarData *od;
	PurplePresence *presence = NULL;
	PurpleStatus *status = NULL;
	gchar *message = NULL, *itmsurl = NULL, *tmp;
	gboolean escaping_needed = TRUE;

	od = purple_connection_get_protocol_data(gc);

	if (b == NULL && userinfo == NULL)
		return;

	if (b == NULL)
		b = purple_find_buddy(purple_connection_get_account(gc), userinfo->bn);
	else
		userinfo = aim_locate_finduserinfo(od, purple_buddy_get_name(b));

	if (b) {
		presence = purple_buddy_get_presence(b);
		status = purple_presence_get_active_status(presence);
	}

	/* If we have both b and userinfo we favor userinfo, because if we're
	   viewing someone's profile then we want the HTML away message, and
	   the "message" attribute of the status contains only the plaintext
	   message. */
	if (userinfo) {
		if ((userinfo->flags & AIM_FLAG_AWAY) && use_html_status && userinfo->away_len > 0 && userinfo->away != NULL && userinfo->away_encoding != NULL) {
			/* Away message */
			message = oscar_encoding_to_utf8(userinfo->away_encoding, userinfo->away, userinfo->away_len);
			escaping_needed = FALSE;
		} else {
			/*
			 * Available message or non-HTML away message (because that's
			 * all we have right now.
			 */
			if ((userinfo->status != NULL) && userinfo->status[0] != '\0') {
				message = oscar_encoding_to_utf8(userinfo->status_encoding, userinfo->status, userinfo->status_len);
			}
#if defined (_WIN32) || defined (__APPLE__)
			if (userinfo->itmsurl && (userinfo->itmsurl[0] != '\0')) {
				itmsurl = oscar_encoding_to_utf8(userinfo->itmsurl_encoding, userinfo->itmsurl, userinfo->itmsurl_len);
			}
#endif
		}
	} else {
		message = g_strdup(purple_status_get_attr_string(status, "message"));
		itmsurl = g_strdup(purple_status_get_attr_string(status, "itmsurl"));
	}

	if (message) {
		tmp = oscar_util_format_string(message, purple_account_get_username(account));
		g_free(message);
		message = tmp;
		if (escaping_needed) {
			tmp = purple_markup_escape_text(message, -1);
			g_free(message);
			message = tmp;
		}
	}

	if (use_html_status && itmsurl) {
		tmp = g_strdup_printf("<a href=\"%s\">%s</a>", itmsurl, message);
		g_free(message);
		message = tmp;
	}

	if (b) {
		if (purple_presence_is_online(presence)) {
			gboolean is_away = ((status && !purple_status_is_available(status)) || (userinfo && (userinfo->flags & AIM_FLAG_AWAY)));
			if (oscar_util_valid_name_icq(purple_buddy_get_name(b)) || is_away || !message || !(*message)) {
				/* Append the status name for online ICQ statuses, away AIM statuses, and for all buddies with no message.
				 * If the status name and the message are the same, only show one. */
				const char *status_name = purple_status_get_name(status);
				if (status_name && message && !strcmp(status_name, message))
					status_name = NULL;

				tmp = g_strdup_printf("%s%s%s",
									   status_name ? status_name : "",
									   ((status_name && message) && *message) ? ": " : "",
									   (message && *message) ? message : "");
				g_free(message);
				message = tmp;
			}

		} else if (aim_ssi_waitingforauth(od->ssi.local,
			aim_ssi_itemlist_findparentname(od->ssi.local, purple_buddy_get_name(b)),
			purple_buddy_get_name(b)))
		{
			/* Note if an offline buddy is not authorized */
			tmp = g_strdup_printf("%s%s%s",
					_("Not Authorized"),
					(message && *message) ? ": " : "",
					(message && *message) ? message : "");
			g_free(message);
			message = tmp;
		} else {
			g_free(message);
			message = g_strdup(_("Offline"));
		}
	}

	if (presence) {
		const char *mood;
		const char *comment;
		char *description;
		status = purple_presence_get_status(presence, "mood");
		mood = icq_get_custom_icon_description(purple_status_get_attr_string(status, PURPLE_MOOD_NAME));
		if (mood) {
			comment = purple_status_get_attr_string(status, PURPLE_MOOD_COMMENT);
			if (comment) {
				char *escaped_comment = purple_markup_escape_text(comment, -1);
				description = g_strdup_printf("%s (%s)", _(mood), escaped_comment);
				g_free(escaped_comment);
			} else {
				description = g_strdup(_(mood));
			}
			purple_notify_user_info_add_pair(user_info, _("Mood"), description);
			g_free(description);
		}
	}

	purple_notify_user_info_add_pair(user_info, _("Status"), message);
	g_free(message);
}
static void received_im_msg_cb(PurpleAccount *account, char *who, char *buffer,
    PurpleConversation *conv, PurpleMessageFlags flags, void *data) {
    // A workaround to avoid skipping of the first message as a result on NULL-conv:
    if (conv == NULL) conv = purple_conversation_new(PURPLE_CONV_TYPE_IM,
        account, who); 
    PurpleBuddy *buddy = purple_find_buddy(account, who);
    PurplePresence *presence = purple_buddy_get_presence(buddy);
    msg_metadata_t msg;

    //Get message
    msg.text = purple_markup_strip_html(buffer);
    msg.remote_username = who;

    //LOCAL USER:
    msg.local_alias = purple_account_get_alias(account);
    msg.local_username = (char *) purple_account_get_name_for_display(account);

    //REMOTE USER (Buddy):
    //Get buddy alias
    msg.remote_alias = purple_buddy_get_alias(buddy);
    if(msg.remote_alias == NULL) msg.remote_alias = "";

    //Get buddy group
    PurpleGroup *group = purple_buddy_get_group(buddy);
    //return empty string if not in group
    msg.remote_from_group = group != NULL ? purple_group_get_name(group) : ""; 

    //Get protocol ID
    msg.protocol_id = purple_account_get_protocol_id(account);
    //trim out PROTOCOL_PREFIX (eg.: "prpl-irc" => "irc")
    if(!strncmp(msg.protocol_id,PROTOCOL_PREFIX,strlen(PROTOCOL_PREFIX))) 
        msg.protocol_id += strlen(PROTOCOL_PREFIX); 

    //Get status
    PurpleStatus *status = purple_account_get_active_status(account);
    PurpleStatusType *type = purple_status_get_type(status);
    //remote
    PurpleStatus *r_status = purple_presence_get_active_status(presence);
    PurpleStatusType *r_status_type =	purple_status_get_type(r_status);

    //Get status id
    msg.local_status_id = NULL;
    msg.local_status_id = purple_primitive_get_id_from_type(
        purple_status_type_get_primitive(type));
    //remote
    msg.remote_status_id = NULL;
    msg.remote_status_id = purple_primitive_get_id_from_type(
        purple_status_type_get_primitive(r_status_type));

    //Get status message
    msg.local_status_msg = NULL;
    if (purple_status_type_get_attr(type, "message") != NULL) {
        msg.local_status_msg = purple_status_get_attr_string(status, "message");
    } else {
        PurpleSavedStatus *savedstatus = purple_savedstatus_get_current();
        if(savedstatus)
            msg.local_status_msg = purple_savedstatus_get_message(savedstatus);
    }
    //remote
    msg.remote_status_msg = NULL;
    if (purple_status_type_get_attr(r_status_type, "message") != NULL) {
        msg.remote_status_msg = purple_status_get_attr_string(r_status, "message");
    } else {
        msg.remote_status_msg = "";
    }

    run_lua(conv, msg);
}
示例#24
0
/**
 * Append user information to a PurpleNotifyUserInfo, given an MsimUser.
 * Used by msim_tooltip_text() and msim_get_info_cb() to show a user's profile.
 */
void
msim_append_user_info(MsimSession *session, PurpleNotifyUserInfo *user_info, MsimUser *user, gboolean full)
{
    PurplePresence *presence;
    gchar *str;
    guint cv;

    /* Useful to identify the account the tooltip refers to.
     *  Other prpls show this. */
    if (user->username) {
        purple_notify_user_info_add_pair(user_info, _("User"), user->username);
    }

    /* a/s/l...the vitals */
    if (user->age) {
        char age[16];
        g_snprintf(age, sizeof(age), "%d", user->age);
        purple_notify_user_info_add_pair(user_info, _("Age"), age);
    }

    if (user->gender && *user->gender) {
        purple_notify_user_info_add_pair(user_info, _("Gender"), user->gender);
    }

    if (user->location && *user->location) {
        purple_notify_user_info_add_pair(user_info, _("Location"), user->location);
    }

    /* Other information */
    if (user->headline && *user->headline) {
        purple_notify_user_info_add_pair(user_info, _("Headline"), user->headline);
    }

    if (user->buddy != NULL) {
        presence = purple_buddy_get_presence(user->buddy);

        if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_TUNE)) {
            PurpleStatus *status;
            const char *artist, *title;

            status = purple_presence_get_status(presence, "tune");
            title = purple_status_get_attr_string(status, PURPLE_TUNE_TITLE);
            artist = purple_status_get_attr_string(status, PURPLE_TUNE_ARTIST);

            str = msim_format_now_playing(artist, title);
            if (str && *str) {
                purple_notify_user_info_add_pair(user_info, _("Song"), str);
            }
            g_free(str);
        }
    }

    /* Note: total friends only available if looked up by uid, not username. */
    if (user->total_friends) {
        char friends[16];
        g_snprintf(friends, sizeof(friends), "%d", user->total_friends);
        purple_notify_user_info_add_pair(user_info, _("Total Friends"), friends);
    }

    if (full) {
        /* Client information */
        char *client = NULL;

        str = user->client_info;
        cv = user->client_cv;

        if (str && cv != 0) {
            client = g_strdup_printf("%s (build %d)", str, cv);
        } else if (str) {
            client = g_strdup(str);
        } else if (cv) {
            client = g_strdup_printf("Build %d", cv);
        }
        if (client && *client)
            purple_notify_user_info_add_pair(user_info, _("Client Version"), client);
        g_free(client);
    }

    if (full && user->id) {
        /* TODO: link to username, if available */
        char *profile;
        purple_notify_user_info_add_section_break(user_info);
        if (user->buddy != NULL)
            profile = g_strdup_printf("<a href=\"http://myspace.com/%s\">%s</a>",
                                      purple_buddy_get_name(user->buddy), _("View web profile"));
        else
            profile = g_strdup_printf("<a href=\"http://myspace.com/%d\">%s</a>",
                                      user->id, _("View web profile"));
        purple_notify_user_info_add_pair(user_info, NULL, profile);
        g_free(profile);
    }
}