pidgin/purple-plugin-pack
Clone
Summary
Browse
Changes
Graph
Add the turtles target to keep the foot clan at bay
default
tip
13 months ago, Gary Kramlich
63ad7e4f10b4
Add the turtles target to keep the foot clan at bay
Testing Done:
Ran `ninja turtles` and verified it worked correctly.
Reviewed at https://reviews.imfreedom.org/r/2409/
/*
* XMPP Priority - Add Account Options to adjust the default priority values
* for XMPP accounts.
* Copyright (C) 2009 Paul Aurich <paul@darkrain42.org>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02111-1301, USA.
*/
#include
"../common/pp_internal.h"
#define PLUGIN_STATIC_NAME "xmppprio"
#define PLUGIN_ID "core-darkrain42-" PLUGIN_STATIC_NAME
#define PLUGIN_AUTHOR "Paul Aurich <paul@darkrain42.org>"
/* Purple headers */
#include
<account.h>
#include
<accountopt.h>
#include
<plugin.h>
#include
<status.h>
/* Constants */
#define XMPP_PLUGIN_ID "prpl-jabber"
#define DEFAULT_AVAIL_PRIO 1
#define DEFAULT_AWAY_PRIO 0
static
void
set_account_priorities
(
PurpleAccount
*
account
,
const
int
avail_prio
,
const
int
away_prio
)
{
PurplePresence
*
presence
;
GList
*
statuses
;
/*
* This is disgusting. Basically, PurpleStatusType contains the PurpleValues
* representing the default values of each of the status attributes. Go in
* and update the defaults for 'priority' for each status type.
*/
presence
=
purple_account_get_presence
(
account
);
statuses
=
purple_presence_get_statuses
(
presence
);
for
(
;
statuses
;
statuses
=
statuses
->
next
)
{
PurpleStatus
*
status
=
statuses
->
data
;
PurpleStatusType
*
type
=
purple_status_get_type
(
status
);
PurpleStatusAttr
*
attr
;
PurpleValue
*
default_value
;
if
(
!
purple_status_type_is_exclusive
(
type
))
continue
;
/*
* A priority for offline makes no sense. Technically, this status type
* has no priority attribute, but in case that changes, neither of these
* priority values should apply to it.
*/
if
(
PURPLE_STATUS_OFFLINE
==
purple_status_type_get_primitive
(
type
))
continue
;
attr
=
purple_status_type_get_attr
(
type
,
"priority"
);
if
(
!
attr
)
continue
;
default_value
=
purple_status_attr_get_value
(
attr
);
if
(
purple_value_get_type
(
default_value
)
==
PURPLE_TYPE_INT
)
{
if
(
purple_status_type_is_available
(
type
))
purple_value_set_int
(
default_value
,
avail_prio
);
else
purple_value_set_int
(
default_value
,
away_prio
);
}
}
}
static
void
signing_on_cb
(
PurpleConnection
*
pc
)
{
PurpleAccount
*
account
;
int
avail_prio
,
away_prio
;
g_return_if_fail
(
NULL
!=
pc
);
account
=
purple_connection_get_account
(
pc
);
g_return_if_fail
(
NULL
!=
account
);
if
(
!
g_str_equal
(
purple_account_get_protocol_id
(
account
),
XMPP_PLUGIN_ID
))
return
;
avail_prio
=
purple_account_get_int
(
account
,
PLUGIN_ID
"_avail_prio"
,
DEFAULT_AVAIL_PRIO
);
away_prio
=
purple_account_get_int
(
account
,
PLUGIN_ID
"_away_prio"
,
DEFAULT_AWAY_PRIO
);
set_account_priorities
(
account
,
avail_prio
,
away_prio
);
}
static
gboolean
plugin_load
(
PurplePlugin
*
plugin
)
{
PurplePlugin
*
xmpp_prpl
;
PurplePluginProtocolInfo
*
prpl_info
;
PurpleAccountOption
*
option
;
GList
*
list
;
xmpp_prpl
=
purple_plugins_find_with_id
(
XMPP_PLUGIN_ID
);
if
(
NULL
==
xmpp_prpl
)
return
FALSE
;
prpl_info
=
PURPLE_PLUGIN_PROTOCOL_INFO
(
xmpp_prpl
);
if
(
NULL
==
prpl_info
)
return
FALSE
;
/* Register protocol preferences */
option
=
purple_account_option_int_new
(
_
(
"Available Priority"
),
PLUGIN_ID
"_avail_prio"
,
DEFAULT_AVAIL_PRIO
);
prpl_info
->
protocol_options
=
g_list_append
(
prpl_info
->
protocol_options
,
option
);
option
=
purple_account_option_int_new
(
_
(
"Away Priority"
),
PLUGIN_ID
"_away_prio"
,
DEFAULT_AWAY_PRIO
);
prpl_info
->
protocol_options
=
g_list_append
(
prpl_info
->
protocol_options
,
option
);
/* Connect signals */
purple_signal_connect
(
purple_connections_get_handle
(),
"signing-on"
,
plugin
,
PURPLE_CALLBACK
(
signing_on_cb
),
NULL
);
/* Set the priorities for all accounts */
for
(
list
=
purple_accounts_get_all
();
list
;
list
=
list
->
next
)
{
PurpleAccount
*
account
=
list
->
data
;
if
(
g_str_equal
(
purple_account_get_protocol_id
(
account
),
XMPP_PLUGIN_ID
))
{
int
avail_prio
=
purple_account_get_int
(
account
,
PLUGIN_ID
"_avail_prio"
,
DEFAULT_AVAIL_PRIO
);
int
away_prio
=
purple_account_get_int
(
account
,
PLUGIN_ID
"_away_prio"
,
DEFAULT_AWAY_PRIO
);
set_account_priorities
(
account
,
avail_prio
,
away_prio
);
}
}
return
TRUE
;
}
static
gboolean
plugin_unload
(
PurplePlugin
*
plugin
)
{
PurplePlugin
*
xmpp_prpl
;
PurplePluginProtocolInfo
*
prpl_info
;
GList
*
list
;
/* Disconnect signals */
purple_signals_disconnect_by_handle
(
plugin
);
xmpp_prpl
=
purple_plugins_find_with_id
(
XMPP_PLUGIN_ID
);
if
(
NULL
==
xmpp_prpl
)
return
FALSE
;
prpl_info
=
PURPLE_PLUGIN_PROTOCOL_INFO
(
xmpp_prpl
);
if
(
NULL
==
prpl_info
)
return
FALSE
;
list
=
prpl_info
->
protocol_options
;
while
(
NULL
!=
list
)
{
PurpleAccountOption
*
opt
=
list
->
data
;
if
(
g_str_has_prefix
(
purple_account_option_get_setting
(
opt
),
PLUGIN_ID
"_"
))
{
list
=
g_list_delete_link
(
list
,
list
);
purple_account_option_destroy
(
opt
);
}
else
list
=
list
->
next
;
}
/* Reset the priorities for accounts */
for
(
list
=
purple_accounts_get_all
();
list
;
list
=
list
->
next
)
{
PurpleAccount
*
account
=
list
->
data
;
if
(
g_str_equal
(
purple_account_get_protocol_id
(
account
),
XMPP_PLUGIN_ID
))
set_account_priorities
(
account
,
DEFAULT_AVAIL_PRIO
,
DEFAULT_AWAY_PRIO
);
}
return
TRUE
;
}
static
PurplePluginInfo
info
=
{
PURPLE_PLUGIN_MAGIC
,
/* Magic */
PURPLE_MAJOR_VERSION
,
/* Purple Major Version */
PURPLE_MINOR_VERSION
,
/* Purple Minor Version */
PURPLE_PLUGIN_STANDARD
,
/* plugin type */
NULL
,
/* ui requirement */
0
,
/* flags */
NULL
,
/* dependencies */
PURPLE_PRIORITY_DEFAULT
,
/* priority */
PLUGIN_ID
,
/* plugin id */
NULL
,
/* name */
PP_VERSION
,
/* version */
NULL
,
/* summary */
NULL
,
/* description */
PLUGIN_AUTHOR
,
/* author */
PP_WEBSITE
,
/* website */
plugin_load
,
/* load */
plugin_unload
,
/* unload */
NULL
,
/* destroy */
NULL
,
/* ui_info */
NULL
,
/* extra_info */
NULL
,
/* prefs_info */
NULL
,
/* actions */
NULL
,
/* reserved 1 */
NULL
,
/* reserved 2 */
NULL
,
/* reserved 3 */
NULL
/* reserved 4 */
};
static
void
init_plugin
(
PurplePlugin
*
plugin
)
{
info
.
dependencies
=
g_list_prepend
(
info
.
dependencies
,
XMPP_PLUGIN_ID
);
#ifdef ENABLE_NLS
bindtextdomain
(
GETTEXT_PACKAGE
,
PP_LOCALEDIR
);
bind_textdomain_codeset
(
GETTEXT_PACKAGE
,
"UTF-8"
);
#endif
/* ENABLE_NLS */
info
.
name
=
_
(
"XMPP Priority"
);
info
.
summary
=
_
(
"Adjust the priorities of XMPP statuses"
);
info
.
description
=
_
(
"Adds account options that allow users to specify the "
"priorities used for available and away priorities "
"for XMPP accounts."
);
}
PURPLE_INIT_PLUGIN
(
PLUGIN_STATIC_NAME
,
init_plugin
,
info
)