static gboolean purple_sound_play_required(const PurpleAccount *account) { gint pref_status = purple_prefs_get_int("/purple/sound/while_status"); if (pref_status == PURPLE_SOUND_STATUS_ALWAYS) { /* Play sounds: Always */ return TRUE; } if (account != NULL) { PurpleStatus *status = purple_account_get_active_status(account); if (purple_status_is_online(status)) { gboolean available = purple_status_is_available(status); return (( available && pref_status == PURPLE_SOUND_STATUS_AVAILABLE) || (!available && pref_status == PURPLE_SOUND_STATUS_AWAY)); } } /* We get here a couple of ways. Either the request has been OK'ed * by purple_sound_play_event() and we're here because the UI has * called purple_sound_play_file(), or we're here for something * not related to an account (like testing a sound). */ return TRUE; }
static void buddy_status_changed_cb(PurpleBuddy *buddy, PurpleStatus *old_status, PurpleStatus *status) { PurpleAccount *account = purple_buddy_get_account(buddy); const gchar *name = purple_buddy_get_name(buddy); gboolean old_available, available; available = purple_status_is_available(status); old_available = purple_status_is_available(old_status); if (available && !old_available) purple_pounce_execute(account, name, PURPLE_POUNCE_AWAY_RETURN); else if (!available && old_available) purple_pounce_execute(account, name, PURPLE_POUNCE_AWAY); }
Data IMInvoker::statusToData(PurpleStatus *status) { Data data; const char* statusName = purple_status_get_name(status); if (statusName) data.compound["name"] = Data(statusName, Data::VERBATIM); PurpleStatusType* statusType = PURPLE_STATUS_GET_TYPE(status); GList *statusAttrElem; PURPLE_STATUS_ATTR* statusAttr; GList *statusAttrList = purple_status_type_get_attrs(statusType); for(statusAttrElem = statusAttrList; statusAttrElem; statusAttrElem = statusAttrElem->next) { statusAttr = (PURPLE_STATUS_ATTR*)statusAttrElem->data; const char* statusAttrId = PURPLE_STATUS_ATTR_GET_ID(statusAttr); PURPLE_VALUE* statusValue = purple_status_get_attr_value(status, statusAttrId); if (statusValue) { data.compound[statusAttrId] = purpleValueToData(statusValue); } } data.compound["active"] = Data((bool)purple_status_is_active(status)); data.compound["available"] = Data((bool)purple_status_is_available(status)); data.compound["exclusive"] = Data((bool)purple_status_is_exclusive(status)); data.compound["active"] = Data((bool)purple_status_is_active(status)); data.compound["independent"] = Data((bool)purple_status_is_independent(status)); data.compound["online"] = Data((bool)purple_status_is_online(status)); return data; }
static void buddy_status_changed_cb(PurpleBuddy *buddy, PurpleStatus *old_status, PurpleStatus *status, void *data) { gboolean available, old_available; if (!purple_status_is_exclusive(status) || !purple_status_is_exclusive(old_status)) return; available = purple_status_is_available(status); old_available = purple_status_is_available(old_status); if (purple_prefs_get_bool("/plugins/core/statenotify/notify_away")) { if (available && !old_available) write_status(buddy, _("%s is no longer away.")); else if (!available && old_available) write_status(buddy, _("%s has gone away.")); } }
static gboolean should_notify_unavailable (PurpleAccount *account) { PurpleStatus *status; if (!purple_prefs_get_bool ("/plugins/gtk/libnotify/only_available")) return TRUE; status = purple_account_get_active_status (account); return purple_status_is_online (status) && purple_status_is_available (status); }
static void buddy_typing_cb(PurpleAccount *acct, const char *name, void *data) { PurpleConversation *gconv; if(purple_prefs_get_bool(PREF_STATUS) && ! purple_status_is_available(purple_account_get_active_status(acct))) { purple_debug_info("psychic", "not available, doing nothing\n"); return; } if(purple_prefs_get_bool(PREF_BUDDIES) && ! purple_find_buddy(acct, name)) { purple_debug_info("psychic", "not in blist, doing nothing\n"); return; } if(FALSE == purple_privacy_check(acct, name)) { purple_debug_info("psychic", "user %s is blocked\n", name); return; } gconv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, name, acct); if(! gconv) { purple_debug_info("psychic", "no previous conversation exists\n"); gconv = purple_conversation_new(PURPLE_CONV_TYPE_IM, acct, name); if(purple_prefs_get_bool(PREF_RAISE)) { purple_conversation_present(gconv); } if(purple_prefs_get_bool(PREF_NOTICE)) { /* This is a quote from Star Wars. You should probably not translate it literally. If you can't find a fitting cultural reference in your language, consider translating something like this instead: "You feel a new message coming." */ purple_conversation_write(gconv, NULL, _("You feel a disturbance in the force..."), PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_NO_LOG | PURPLE_MESSAGE_ACTIVE_ONLY, time(NULL)); } /* Necessary because we may be creating a new conversation window. */ purple_conv_im_set_typing_state(PURPLE_CONV_IM(gconv), PURPLE_TYPING); } }
/** * @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); }