File:  [Coherent Logic Development] / ChivanetAimPidgin / oscarprpl / src / c / visibility.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Mon Jan 27 19:48:25 2025 UTC (6 months ago) by snw
Branches: MAIN, CoherentLogicDevelopment
CVS tags: test-tag, start, HEAD
Pidgin AIM Plugin for ChivaNet

    1: /*
    2:  * Purple's oscar protocol plugin
    3:  * This file is the legal property of its developers.
    4:  * Please see the AUTHORS file distributed alongside this file.
    5:  *
    6:  * This library is free software; you can redistribute it and/or
    7:  * modify it under the terms of the GNU Lesser General Public
    8:  * License as published by the Free Software Foundation; either
    9:  * version 2 of the License, or (at your option) any later version.
   10:  *
   11:  * This library is distributed in the hope that it will be useful,
   12:  * but WITHOUT ANY WARRANTY; without even the implied warranty of
   13:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   14:  * Lesser General Public License for more details.
   15:  *
   16:  * You should have received a copy of the GNU Lesser General Public
   17:  * License along with this library; if not, write to the Free Software
   18:  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
   19: */
   20: 
   21: #include "visibility.h"
   22: 
   23: /* Translators: This string is a menu option that, if selected, will cause
   24:    you to appear online to the chosen user even when your status is set to
   25:    Invisible. */
   26: #define APPEAR_ONLINE		N_("Appear Online")
   27: 
   28: /* Translators: This string is a menu option that, if selected, will cause
   29:    you to appear offline to the chosen user when your status is set to
   30:    Invisible (this is the default). */
   31: #define DONT_APPEAR_ONLINE	N_("Don't Appear Online")
   32: 
   33: /* Translators: This string is a menu option that, if selected, will cause
   34:    you to always appear offline to the chosen user (even when your status
   35:    isn't Invisible). */
   36: #define APPEAR_OFFLINE		N_("Appear Offline")
   37: 
   38: /* Translators: This string is a menu option that, if selected, will cause
   39:    you to appear offline to the chosen user if you are invisible, and
   40:    appear online to the chosen user if you are not invisible (this is the
   41:    default). */
   42: #define DONT_APPEAR_OFFLINE	N_("Don't Appear Offline")
   43: 
   44: static guint16
   45: get_buddy_list_type(OscarData *od)
   46: {
   47: 	PurpleAccount *account = purple_connection_get_account(od->gc);
   48: 	return purple_account_is_status_active(account, OSCAR_STATUS_ID_INVISIBLE) ? AIM_SSI_TYPE_PERMIT : AIM_SSI_TYPE_DENY;
   49: }
   50: 
   51: static gboolean
   52: is_buddy_on_list(OscarData *od, const char *bname)
   53: {
   54: 	return aim_ssi_itemlist_finditem(od->ssi.local, NULL, bname, get_buddy_list_type(od)) != NULL;
   55: }
   56: 
   57: static void
   58: visibility_cb(PurpleBlistNode *node, gpointer whatever)
   59: {
   60: 	PurpleBuddy *buddy = PURPLE_BUDDY(node);
   61: 	const char* bname = purple_buddy_get_name(buddy);
   62: 	OscarData *od = purple_connection_get_protocol_data(purple_account_get_connection(purple_buddy_get_account(buddy)));
   63: 	guint16 list_type = get_buddy_list_type(od);
   64: 
   65: 	if (!is_buddy_on_list(od, bname)) {
   66: 		aim_ssi_add_to_private_list(od, bname, list_type);
   67: 	} else {
   68: 		aim_ssi_del_from_private_list(od, bname, list_type);
   69: 	}
   70: }
   71: 
   72: PurpleMenuAction *
   73: create_visibility_menu_item(OscarData *od, const char *bname)
   74: {
   75: 	PurpleAccount *account = purple_connection_get_account(od->gc);
   76: 	gboolean invisible = purple_account_is_status_active(account, OSCAR_STATUS_ID_INVISIBLE);
   77: 	gboolean on_list = is_buddy_on_list(od, bname);
   78: 	const gchar *label;
   79: 
   80: 	if (invisible) {
   81: 		label = on_list ? _(DONT_APPEAR_ONLINE) : _(APPEAR_ONLINE);
   82: 	} else {
   83: 		label = on_list ? _(DONT_APPEAR_OFFLINE) : _(APPEAR_OFFLINE);
   84: 	}
   85: 	return purple_menu_action_new(label, PURPLE_CALLBACK(visibility_cb), NULL, NULL);
   86: }
   87: 
   88: static void
   89: show_private_list(PurplePluginAction *action, guint16 list_type, const gchar *title, const gchar *list_description, const gchar *menu_action_name)
   90: {
   91: 	PurpleConnection *gc = (PurpleConnection *) action->context;
   92: 	OscarData *od = purple_connection_get_protocol_data(gc);
   93: 	PurpleAccount *account = purple_connection_get_account(gc);
   94: 	GSList *buddies, *filtered_buddies, *cur;
   95: 	gchar *text, *secondary;
   96: 
   97: 	buddies = purple_find_buddies(account, NULL);
   98: 	filtered_buddies = NULL;
   99: 	for (cur = buddies; cur != NULL; cur = cur->next) {
  100: 		PurpleBuddy *buddy;
  101: 		const gchar *bname;
  102: 
  103: 		buddy = cur->data;
  104: 		bname = purple_buddy_get_name(buddy);
  105: 		if (aim_ssi_itemlist_finditem(od->ssi.local, NULL, bname, list_type)) {
  106: 			filtered_buddies = g_slist_prepend(filtered_buddies, buddy);
  107: 		}
  108: 	}
  109: 
  110: 	g_slist_free(buddies);
  111: 
  112: 	filtered_buddies = g_slist_reverse(filtered_buddies);
  113: 	text = oscar_format_buddies(filtered_buddies, _("you have no buddies on this list"));
  114: 	g_slist_free(filtered_buddies);
  115: 
  116: 	secondary = g_strdup_printf(_("You can add a buddy to this list "
  117: 					"by right-clicking on them and "
  118: 					"selecting \"%s\""), menu_action_name);
  119: 	purple_notify_formatted(gc, title, list_description, secondary, text, NULL, NULL);
  120: 	g_free(secondary);
  121: 	g_free(text);
  122: }
  123: 
  124: void
  125: oscar_show_visible_list(PurplePluginAction *action)
  126: {
  127: 	show_private_list(action, AIM_SSI_TYPE_PERMIT, _("Visible List"),
  128: 							_("These buddies will see "
  129: 							"your status when you switch "
  130: 							"to \"Invisible\""),
  131: 							_(APPEAR_ONLINE));
  132: }
  133: 
  134: void
  135: oscar_show_invisible_list(PurplePluginAction *action)
  136: {
  137: 	show_private_list(action, AIM_SSI_TYPE_DENY, _("Invisible List"),
  138: 							_("These buddies will always see you as offline"),
  139: 							_(APPEAR_OFFLINE));
  140: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>