grim/purple-plugin-pack
Clone
Summary
Browse
Changes
Graph
Remove the debug option as it's meson reserved and we should just turn this on by default
2020-03-01, Gary Kramlich
f93509d302f7
Remove the debug option as it's meson reserved and we should just turn this on by default
/*--------------------------------------------------------------------------*
* AUTOPROFILE *
* *
* A Purple away message and profile manager that supports dynamic text *
* *
* AutoProfile is the legal property of its developers. Please refer to *
* the COPYRIGHT file distributed with this source distribution. *
* *
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
*--------------------------------------------------------------------------*/
#include
"autoprofile.h"
#include
"version.h"
#include
"savedstatuses.h"
/* General functions */
static
void
ap_status_changed
(
const
char
*
,
PurplePrefType
,
gconstpointer
,
gpointer
);
static
void
ap_account_connected
(
PurpleConnection
*
);
static
void
ap_delete_legacy_prefs
();
static
void
ap_update_queue_start
();
static
void
ap_update_queue_finish
();
/*--------------------------------------------------------------------------
* GENERAL VARIABLES
*------------------------------------------------------------------------*/
static
PurplePlugin
*
plugin_handle
=
NULL
;
static
PurpleSavedStatus
*
current_ap_status
=
NULL
;
static
GStaticMutex
update_timeout_mutex
=
G_STATIC_MUTEX_INIT
;
static
GHashTable
*
update_timeouts
=
NULL
;
static
gboolean
using_idleaway
=
FALSE
;
static
GStaticMutex
update_queue_mutex
=
G_STATIC_MUTEX_INIT
;
static
GList
*
queued_profiles
=
NULL
;
static
guint
update_queue_timeout
=
0
;
/* Functions related to general variables */
PurplePlugin
*
ap_get_plugin_handle
()
{
return
plugin_handle
;
}
gboolean
ap_is_currently_away
()
{
return
current_ap_status
!=
NULL
&&
purple_savedstatus_get_type
(
current_ap_status
)
==
PURPLE_STATUS_AWAY
;
}
/*--------------------------------------------------------------------------
* REQUIRED GAIM FUNCTIONS- INFO, INITIALIZATION, UNLOADING
*------------------------------------------------------------------------*/
/* What to do when plugin is loaded */
static
gboolean
plugin_load
(
PurplePlugin
*
plugin
)
{
GList
*
accounts_pref
;
ap_debug
(
"general"
,
"AutoProfile is being loaded"
);
plugin_handle
=
plugin
;
current_ap_status
=
purple_savedstatus_new
(
NULL
,
PURPLE_STATUS_UNSET
);
update_timeouts
=
g_hash_table_new
(
NULL
,
NULL
);
ap_delete_legacy_prefs
();
/* The core autoprofile tracking system */
purple_prefs_connect_callback
(
plugin_handle
,
"/purple/savedstatus/current"
,
ap_status_changed
,
NULL
);
purple_signal_connect
(
purple_connections_get_handle
(),
"signed-on"
,
plugin_handle
,
PURPLE_CALLBACK
(
ap_account_connected
),
NULL
);
ap_component_start
();
ap_gtk_start
();
accounts_pref
=
purple_prefs_get_string_list
(
"/plugins/gtk/autoprofile/profile_accounts"
);
ap_gtk_set_progress_visible
(
AP_UPDATE_PROFILE
,
(
accounts_pref
!=
NULL
));
free_string_list
(
accounts_pref
);
ap_update_after_delay
(
AP_UPDATE_STATUS
);
ap_update_after_delay
(
AP_UPDATE_PROFILE
);
ap_autoaway_start
();
ap_autoreply_start
();
ap_update_queue_start
();
return
TRUE
;
}
/* What to do when plugin is unloaded */
static
gboolean
plugin_unload
(
PurplePlugin
*
plugin
)
{
ap_update_queue_finish
();
ap_autoreply_finish
();
ap_autoaway_finish
();
/* General vars */
using_idleaway
=
FALSE
;
ap_update_stop
(
AP_UPDATE_STATUS
);
ap_update_stop
(
AP_UPDATE_PROFILE
);
/* Disconnect tracking system */
purple_signals_disconnect_by_handle
(
plugin
);
ap_actions_finish
();
ap_gtk_finish
();
ap_component_finish
();
g_hash_table_destroy
(
update_timeouts
);
return
TRUE
;
}
/* General information */
static
PurplePluginInfo
info
=
{
PURPLE_PLUGIN_MAGIC
,
PURPLE_MAJOR_VERSION
,
PURPLE_MINOR_VERSION
,
PURPLE_PLUGIN_STANDARD
,
/* type */
PIDGIN_PLUGIN_TYPE
,
/* ui_requirement */
0
,
/* flags */
NULL
,
/* dependencies */
PURPLE_PRIORITY_DEFAULT
,
/* priority */
"gtk-kluge-autoprofile"
,
/* id */
NULL
,
/* name */
PP_VERSION
,
/* version */
NULL
,
/* summary */
NULL
,
/* description */
NULL
,
/* author */
PP_WEBSITE
,
/* homepage */
plugin_load
,
/* load */
plugin_unload
,
/* unload */
NULL
,
/* destroy */
&
ui_info
,
/* ui_info */
NULL
,
/* extra_info */
NULL
,
/* prefs_info */
actions
,
/* actions */
NULL
,
NULL
,
NULL
,
NULL
};
/*--------------------------------------------------------------------------
* CORE FUNCTIONS
*------------------------------------------------------------------------*/
static
gint
get_max_size_status
(
const
PurpleAccount
*
account
,
const
PurpleStatusPrimitive
type
)
{
const
char
*
id
;
if
(
account
==
NULL
)
{
switch
(
type
)
{
case
PURPLE_STATUS_AVAILABLE
:
return
AP_SIZE_AVAILABLE_MAX
;
case
PURPLE_STATUS_AWAY
:
return
AP_SIZE_AWAY_MAX
;
default
:
return
AP_SIZE_MAXIMUM
;
}
}
else
{
id
=
purple_account_get_protocol_id
(
account
);
switch
(
type
)
{
case
PURPLE_STATUS_AVAILABLE
:
if
(
!
strcmp
(
id
,
"prpl-oscar"
))
return
AP_SIZE_AVAILABLE_AIM
;
else
if
(
!
strcmp
(
id
,
"prpl-msn"
))
return
AP_SIZE_AVAILABLE_MSN
;
else
if
(
!
strcmp
(
id
,
"prpl-yahoo"
))
return
AP_SIZE_AVAILABLE_YAHOO
;
else
return
AP_SIZE_AVAILABLE_MAX
;
case
PURPLE_STATUS_AWAY
:
if
(
!
strcmp
(
id
,
"prpl-oscar"
))
return
AP_SIZE_AWAY_AIM
;
else
return
AP_SIZE_AWAY_MAX
;
default
:
return
AP_SIZE_MAXIMUM
;
}
}
}
static
const
char
*
ap_savedstatus_get_message
(
const
PurpleSavedStatus
*
status
,
const
PurpleAccount
*
account
)
{
const
PurpleSavedStatusSub
*
substatus
;
substatus
=
purple_savedstatus_get_substatus
(
status
,
account
);
if
(
substatus
!=
NULL
)
{
return
purple_savedstatus_substatus_get_message
(
substatus
);
}
return
purple_savedstatus_get_message
(
status
);
}
static
PurpleStatusPrimitive
ap_savedstatus_get_type
(
const
PurpleSavedStatus
*
status
,
const
PurpleAccount
*
account
)
{
const
PurpleSavedStatusSub
*
substatus
;
substatus
=
purple_savedstatus_get_substatus
(
status
,
account
);
if
(
substatus
!=
NULL
)
{
return
purple_status_type_get_primitive
(
purple_savedstatus_substatus_get_type
(
substatus
));
}
return
purple_savedstatus_get_type
(
status
);
}
gchar
*
ap_get_sample_status_message
(
PurpleAccount
*
account
)
{
const
PurpleSavedStatus
*
s
;
const
gchar
*
message
;
PurpleStatusPrimitive
type
;
s
=
(
using_idleaway
?
purple_savedstatus_get_idleaway
()
:
purple_savedstatus_get_current
());
message
=
ap_savedstatus_get_message
(
s
,
account
);
type
=
ap_savedstatus_get_type
(
s
,
account
);
if
(
!
message
)
return
NULL
;
return
ap_generate
(
message
,
get_max_size_status
(
account
,
type
));
}
/* Generator helper */
static
gchar
*
ap_process_replacement
(
const
gchar
*
f
)
{
GString
*
s
;
struct
widget
*
w
;
gchar
*
result
;
w
=
ap_widget_find
(
f
);
if
(
w
)
{
result
=
w
->
component
->
generate
(
w
);
return
result
;
}
else
{
s
=
g_string_new
(
""
);
g_string_printf
(
s
,
"[%s]"
,
f
);
result
=
s
->
str
;
g_string_free
(
s
,
FALSE
);
return
result
;
}
}
/* The workhorse generation function! */
gchar
*
ap_generate
(
const
gchar
*
f
,
gint
max_length
)
{
GString
*
output
;
gchar
*
result
;
gchar
*
format
,
*
format_start
,
*
percent_start
;
gchar
*
replacement
;
int
state
;
output
=
g_string_new
(
""
);
format_start
=
format
=
purple_utf8_salvage
(
f
);
/* When a % has been read (and searching for next %), state is 1
* otherwise it is 0
*/
state
=
0
;
percent_start
=
NULL
;
while
(
*
format
)
{
if
(
state
==
1
)
{
if
(
*
format
==
'['
)
{
g_string_append_unichar
(
output
,
g_utf8_get_char
(
"["
));
*
format
=
'\0'
;
g_string_append
(
output
,
percent_start
);
percent_start
=
format
=
format
+
1
;
}
else
if
(
*
format
==
']'
)
{
*
format
=
'\0'
;
format
++
;
state
=
0
;
replacement
=
ap_process_replacement
(
percent_start
);
percent_start
=
NULL
;
g_string_append
(
output
,
replacement
);
free
(
replacement
);
}
else
{
format
=
g_utf8_next_char
(
format
);
}
}
else
{
if
(
*
format
==
'\n'
)
{
g_string_append
(
output
,
"<br>"
);
}
else
if
(
*
format
==
'['
)
{
state
=
1
;
percent_start
=
format
+
1
;
}
else
{
g_string_append_unichar
(
output
,
g_utf8_get_char
(
format
));
}
format
=
g_utf8_next_char
(
format
);
}
}
/* Deal with case where final ] not found */
if
(
state
==
1
)
{
g_string_append_unichar
(
output
,
g_utf8_get_char
(
"["
));
g_string_append
(
output
,
percent_start
);
}
/* Set size limit */
g_string_truncate
(
output
,
max_length
);
/* Finish up */
free
(
format_start
);
result
=
purple_utf8_salvage
(
output
->
str
);
g_string_free
(
output
,
TRUE
);
return
result
;
}
void
ap_account_enable_profile
(
const
PurpleAccount
*
account
,
gboolean
enable
)
{
GList
*
original
,
*
new
;
gboolean
original_status
;
gchar
*
username
,
*
protocol_id
;
GList
*
node
,
*
tmp
;
GList
*
ret
=
NULL
;
original_status
=
ap_account_has_profile_enabled
(
account
);
if
(
original_status
==
enable
)
{
ap_debug_warn
(
"profile"
,
"New status identical to original, skipping"
);
return
;
}
original
=
purple_prefs_get_string_list
(
"/plugins/gtk/autoprofile/profile_accounts"
);
username
=
strdup
(
purple_account_get_username
(
account
));
protocol_id
=
strdup
(
purple_account_get_protocol_id
(
account
));
if
(
!
enable
)
{
/* Remove from the list */
ap_debug
(
"profile"
,
"Disabling profile updates for account"
);
while
(
original
)
{
if
(
!
strcmp
(
original
->
data
,
username
)
&&
!
strcmp
(
original
->
next
->
data
,
protocol_id
))
{
node
=
original
;
tmp
=
node
->
next
;
original
=
original
->
next
->
next
;
free
(
node
->
data
);
free
(
tmp
->
data
);
g_list_free_1
(
node
);
g_list_free_1
(
tmp
);
free
(
username
);
free
(
protocol_id
);
}
else
{
node
=
original
;
original
=
original
->
next
->
next
;
node
->
next
->
next
=
ret
;
ret
=
node
;
}
}
new
=
ret
;
}
else
{
/* Otherwise add on */
GList
*
ret_start
,
*
ret_end
;
ap_debug
(
"profile"
,
"enabling profile updates for account"
);
ret_start
=
(
GList
*
)
malloc
(
sizeof
(
GList
));
ret_end
=
(
GList
*
)
malloc
(
sizeof
(
GList
));
ret_start
->
data
=
username
;
ret_start
->
next
=
ret_end
;
ret_end
->
data
=
protocol_id
;
ret_end
->
next
=
original
;
new
=
ret_start
;
}
purple_prefs_set_string_list
(
"/plugins/gtk/autoprofile/profile_accounts"
,
new
);
ap_gtk_set_progress_visible
(
AP_UPDATE_PROFILE
,
(
new
!=
NULL
));
free_string_list
(
new
);
}
gboolean
ap_account_has_profile_enabled
(
const
PurpleAccount
*
account
)
{
GList
*
accounts_list
,
*
start_list
;
accounts_list
=
purple_prefs_get_string_list
(
"/plugins/gtk/autoprofile/profile_accounts"
);
start_list
=
accounts_list
;
/* Search through list of values */
while
(
accounts_list
)
{
// Make sure these things come in pairs
if
(
accounts_list
->
next
==
NULL
)
{
ap_debug_error
(
"is_account_profile_enabled"
,
"invalid account string"
);
free_string_list
(
start_list
);
return
FALSE
;
}
// Check usernames
if
(
!
strcmp
((
char
*
)
accounts_list
->
data
,
account
->
username
))
{
// Check protocol
if
(
!
strcmp
((
char
*
)
accounts_list
->
next
->
data
,
account
->
protocol_id
))
{
free_string_list
(
start_list
);
return
TRUE
;
}
}
accounts_list
=
accounts_list
->
next
->
next
;
}
/* Not found, hence it wasn't enabled */
free_string_list
(
start_list
);
return
FALSE
;
}
/* Profiles: Update every so often */
static
gboolean
ap_update_profile
()
{
PurpleAccount
*
account
;
const
GList
*
purple_accounts
;
gboolean
account_updated
;
const
char
*
format
;
const
char
*
old_info
;
char
*
generated_profile
;
/* Generate the profile text */
format
=
purple_prefs_get_string
(
"/plugins/gtk/autoprofile/profile"
);
if
(
format
==
NULL
)
{
ap_debug_error
(
"general"
,
"profile is null"
);
return
FALSE
;
}
generated_profile
=
ap_generate
(
format
,
AP_SIZE_PROFILE_MAX
);
// If string is blank, nothing would happen
if
(
*
generated_profile
==
'\0'
)
{
free
(
generated_profile
);
ap_debug_misc
(
"general"
,
"empty profile set"
);
generated_profile
=
strdup
(
" "
);
}
/* Get all accounts and search through each */
account_updated
=
FALSE
;
for
(
purple_accounts
=
purple_accounts_get_all
();
purple_accounts
!=
NULL
;
purple_accounts
=
purple_accounts
->
next
)
{
account
=
(
PurpleAccount
*
)
purple_accounts
->
data
;
old_info
=
purple_account_get_user_info
(
account
);
/* Check to see if update option set on account */
if
(
ap_account_has_profile_enabled
(
account
)
&&
(
old_info
==
NULL
||
strcmp
(
old_info
,
generated_profile
)))
{
purple_account_set_user_info
(
account
,
generated_profile
);
account_updated
=
TRUE
;
if
(
purple_account_is_connected
(
account
))
{
g_static_mutex_lock
(
&
update_queue_mutex
);
if
(
g_list_find
(
queued_profiles
,
account
)
==
NULL
)
{
queued_profiles
=
g_list_append
(
queued_profiles
,
account
);
}
g_static_mutex_unlock
(
&
update_queue_mutex
);
}
else
{
ap_debug_misc
(
"general"
,
"account not online, not setting profile"
);
}
}
}
if
(
account_updated
)
{
ap_gtk_add_message
(
AP_UPDATE_PROFILE
,
AP_MESSAGE_TYPE_PROFILE
,
generated_profile
);
}
free
(
generated_profile
);
return
account_updated
;
}
static
gboolean
ap_update_status
()
{
const
PurpleSavedStatus
*
template_status
;
GHashTable
*
substatus_messages
;
gchar
*
new_message
,
*
new_substatus_message
;
const
gchar
*
sample_message
,
*
old_message
;
const
GList
*
accounts
;
gboolean
updated
;
PurpleStatusPrimitive
old_type
,
new_type
;
const
PurpleStatusType
*
substatus_type
;
PurpleAccount
*
account
;
PurpleSavedStatusSub
*
substatus
;
template_status
=
(
using_idleaway
?
purple_savedstatus_get_idleaway
()
:
purple_savedstatus_get_current
());
updated
=
FALSE
;
/* If there are substatuses */
if
(
purple_savedstatus_has_substatuses
(
template_status
))
{
substatus_messages
=
g_hash_table_new
(
NULL
,
NULL
);
for
(
accounts
=
purple_accounts_get_all
();
accounts
!=
NULL
;
accounts
=
accounts
->
next
)
{
account
=
(
PurpleAccount
*
)
accounts
->
data
;
substatus
=
purple_savedstatus_get_substatus
(
template_status
,
account
);
if
(
substatus
)
{
new_type
=
purple_status_type_get_primitive
(
purple_savedstatus_substatus_get_type
(
substatus
));
sample_message
=
purple_savedstatus_substatus_get_message
(
substatus
);
if
(
sample_message
)
{
new_substatus_message
=
ap_generate
(
sample_message
,
get_max_size_status
(
account
,
new_type
));
}
else
{
new_substatus_message
=
NULL
;
}
g_hash_table_insert
(
substatus_messages
,
account
,
new_substatus_message
);
if
(
!
updated
)
{
old_type
=
ap_savedstatus_get_type
(
current_ap_status
,
account
);
old_message
=
ap_savedstatus_get_message
(
current_ap_status
,
account
);
if
((
old_type
!=
new_type
)
||
((
old_message
==
NULL
||
new_substatus_message
==
NULL
)
&&
(
old_message
!=
new_substatus_message
))
||
(
old_message
!=
NULL
&&
new_substatus_message
!=
NULL
&&
strcmp
(
old_message
,
new_substatus_message
)))
{
updated
=
TRUE
;
}
}
}
}
}
else
{
substatus_messages
=
NULL
;
}
/* And then the generic main message */
sample_message
=
purple_savedstatus_get_message
(
template_status
);
if
(
sample_message
)
{
new_message
=
ap_generate
(
sample_message
,
get_max_size_status
(
NULL
,
purple_savedstatus_get_type
(
template_status
)));
}
else
{
new_message
=
NULL
;
}
new_type
=
purple_savedstatus_get_type
(
template_status
);
if
(
!
updated
)
{
old_type
=
purple_savedstatus_get_type
(
current_ap_status
);
old_message
=
purple_savedstatus_get_message
(
current_ap_status
);
if
((
old_type
!=
new_type
)
||
((
old_message
==
NULL
||
new_message
==
NULL
)
&&
(
old_message
!=
new_message
))
||
(
old_message
!=
NULL
&&
new_message
!=
NULL
&&
strcmp
(
old_message
,
new_message
)))
{
updated
=
TRUE
;
}
}
if
(
updated
)
{
APMessageType
type
;
PurpleSavedStatus
*
new_status
;
new_status
=
purple_savedstatus_new
(
NULL
,
new_type
);
if
(
new_message
)
{
purple_savedstatus_set_message
(
new_status
,
new_message
);
}
for
(
accounts
=
purple_accounts_get_all
();
accounts
!=
NULL
;
accounts
=
accounts
->
next
)
{
account
=
(
PurpleAccount
*
)
accounts
->
data
;
substatus
=
purple_savedstatus_get_substatus
(
template_status
,
account
);
if
(
substatus
!=
NULL
)
{
substatus_type
=
purple_savedstatus_substatus_get_type
(
substatus
);
new_substatus_message
=
(
gchar
*
)
g_hash_table_lookup
(
substatus_messages
,
account
);
purple_savedstatus_set_substatus
(
new_status
,
account
,
substatus_type
,
new_substatus_message
);
free
(
new_substatus_message
);
}
purple_savedstatus_activate_for_account
(
new_status
,
account
);
}
current_ap_status
=
new_status
;
if
(
new_type
==
PURPLE_STATUS_AVAILABLE
)
type
=
AP_MESSAGE_TYPE_AVAILABLE
;
else
if
(
new_type
==
PURPLE_STATUS_AWAY
)
type
=
AP_MESSAGE_TYPE_AWAY
;
else
type
=
AP_MESSAGE_TYPE_STATUS
;
ap_gtk_add_message
(
AP_UPDATE_STATUS
,
type
,
new_message
);
}
if
(
new_message
)
free
(
new_message
);
if
(
substatus_messages
)
{
g_hash_table_destroy
(
substatus_messages
);
}
ap_update_queueing
();
return
updated
;
}
static
gboolean
ap_update_cb
(
gpointer
data
)
{
gboolean
result
;
guint
timeout
;
guint
delay
;
g_static_mutex_lock
(
&
update_timeout_mutex
);
/* Start by removing timeout to self no matter what */
timeout
=
GPOINTER_TO_INT
(
g_hash_table_lookup
(
update_timeouts
,
data
));
if
(
timeout
)
purple_timeout_remove
(
timeout
);
/* In future, check here if widget content has changed? */
switch
(
GPOINTER_TO_INT
(
data
))
{
case
AP_UPDATE_STATUS
:
result
=
ap_update_status
();
break
;
case
AP_UPDATE_PROFILE
:
result
=
ap_update_profile
();
break
;
default
:
result
=
TRUE
;
}
if
(
!
result
)
{
ap_debug
(
"general"
,
"Content hasn't changed, updating later"
);
delay
=
AP_SCHEDULE_UPDATE_DELAY
;
}
else
{
ap_debug
(
"general"
,
"Content updated"
);
delay
=
purple_prefs_get_int
(
"/plugins/gtk/autoprofile/delay_update"
)
*
1000
;
}
timeout
=
purple_timeout_add
(
delay
,
ap_update_cb
,
data
);
g_hash_table_insert
(
update_timeouts
,
data
,
GINT_TO_POINTER
(
timeout
));
g_static_mutex_unlock
(
&
update_timeout_mutex
);
return
FALSE
;
}
void
ap_update
(
APUpdateType
type
)
{
ap_update_cb
(
GINT_TO_POINTER
(
type
));
}
void
ap_update_after_delay
(
APUpdateType
type
)
{
guint
timeout
;
g_static_mutex_lock
(
&
update_timeout_mutex
);
timeout
=
GPOINTER_TO_INT
(
g_hash_table_lookup
(
update_timeouts
,
GINT_TO_POINTER
(
type
)));
if
(
timeout
)
purple_timeout_remove
(
timeout
);
timeout
=
purple_timeout_add
(
AP_SCHEDULE_UPDATE_DELAY
,
ap_update_cb
,
GINT_TO_POINTER
(
type
));
g_hash_table_insert
(
update_timeouts
,
GINT_TO_POINTER
(
type
),
GINT_TO_POINTER
(
timeout
));
g_static_mutex_unlock
(
&
update_timeout_mutex
);
}
void
ap_update_stop
(
APUpdateType
type
)
{
guint
timeout
;
g_static_mutex_lock
(
&
update_timeout_mutex
);
timeout
=
GPOINTER_TO_INT
(
g_hash_table_lookup
(
update_timeouts
,
GINT_TO_POINTER
(
type
)));
if
(
timeout
)
purple_timeout_remove
(
timeout
);
g_hash_table_insert
(
update_timeouts
,
GINT_TO_POINTER
(
type
),
0
);
g_static_mutex_unlock
(
&
update_timeout_mutex
);
}
static
void
ap_account_connected
(
PurpleConnection
*
gc
)
{
ap_debug
(
"general"
,
"Account connection detected"
);
ap_update_after_delay
(
AP_UPDATE_PROFILE
);
ap_update_after_delay
(
AP_UPDATE_STATUS
);
}
void
ap_update_queueing
()
{
if
(
ap_is_currently_away
())
{
if
(
purple_prefs_get_bool
(
"/plugins/gtk/autoprofile/queue_messages_when_away"
))
{
purple_prefs_set_string
(
PIDGIN_PREFS_ROOT
"/conversations/im/hide_new"
,
"away"
);
}
else
{
purple_prefs_set_string
(
PIDGIN_PREFS_ROOT
"/conversations/im/hide_new"
,
"never"
);
}
}
}
/* Called whenever current status is changed by Purple's status menu
(in buddy list) */
static
void
ap_status_changed
(
const
char
*
name
,
PurplePrefType
type
,
gconstpointer
val
,
gpointer
data
)
{
ap_debug
(
"general"
,
"Status change detected"
);
using_idleaway
=
FALSE
;
ap_autoaway_touch
();
ap_update
(
AP_UPDATE_STATUS
);
}
void
ap_autoaway_enable
()
{
ap_debug
(
"idle"
,
"Using idleaway"
);
using_idleaway
=
TRUE
;
ap_update
(
AP_UPDATE_STATUS
);
}
void
ap_autoaway_disable
()
{
ap_debug
(
"idle"
,
"Disabling idleaway"
);
using_idleaway
=
FALSE
;
ap_update
(
AP_UPDATE_STATUS
);
}
gboolean
ap_autoaway_in_use
()
{
return
using_idleaway
;
}
static
gboolean
ap_update_queue
(
gpointer
data
)
{
PurpleAccount
*
account
=
NULL
;
PurpleConnection
*
gc
=
NULL
;
g_static_mutex_lock
(
&
update_queue_mutex
);
if
(
queued_profiles
!=
NULL
)
{
account
=
(
PurpleAccount
*
)
queued_profiles
->
data
;
queued_profiles
=
queued_profiles
->
next
;
}
g_static_mutex_unlock
(
&
update_queue_mutex
);
gc
=
purple_account_get_connection
(
account
);
if
(
gc
!=
NULL
)
{
serv_set_info
(
gc
,
purple_account_get_user_info
(
account
));
}
return
TRUE
;
}
static
void
ap_update_queue_start
()
{
update_queue_timeout
=
purple_timeout_add
(
2000
,
ap_update_queue
,
NULL
);
}
static
void
ap_update_queue_finish
()
{
purple_timeout_remove
(
update_queue_timeout
);
update_queue_timeout
=
0
;
}
/*--------------------------------------------------------------------------*
* Preferences *
*--------------------------------------------------------------------------*/
static
void
ap_delete_legacy_prefs
()
{
if
(
purple_prefs_exists
(
"/plugins/gtk/autoprofile/tab_number"
))
{
ap_debug
(
"general"
,
"Deleting legacy preferences"
);
purple_prefs_remove
(
"/plugins/gtk/autoprofile/components"
);
purple_prefs_remove
(
"/plugins/gtk/autoprofile/tab_number"
);
purple_prefs_remove
(
"/plugins/gtk/autoprofile/accounts/enable_away"
);
purple_prefs_remove
(
"/plugins/gtk/autoprofile/accounts/enable_profile"
);
purple_prefs_remove
(
"/plugins/gtk/autoprofile/accounts"
);
purple_prefs_remove
(
"/plugins/gtk/autoprofile/message_titles"
);
purple_prefs_remove
(
"/plugins/gtk/autoprofile/message_texts"
);
purple_prefs_remove
(
"/plugins/gtk/autoprofile/default_profile"
);
purple_prefs_remove
(
"/plugins/gtk/autoprofile/default_away"
);
purple_prefs_remove
(
"/plugins/gtk/autoprofile/current_away"
);
purple_prefs_remove
(
"/plugins/gtk/autoprofile/added_text"
);
purple_prefs_remove
(
"/plugins/gtk/autoprofile/delay_profile"
);
purple_prefs_remove
(
"/plugins/gtk/autoprofile/delay_away"
);
purple_prefs_rename
(
"/plugins/gtk/autoprofile/text_respond"
,
"/plugins/gtk/autoprofile/autorespond/text"
);
purple_prefs_rename
(
"/plugins/gtk/autoprofile/text_trigger"
,
"/plugins/gtk/autoprofile/autorespond/trigger"
);
purple_prefs_rename
(
"/plugins/gtk/autoprofile/delay_respond"
,
"/plugins/gtk/autoprofile/autorespond/delay"
);
purple_prefs_rename
(
"/plugins/gtk/autoprofile/use_trigger"
,
"/plugins/gtk/autoprofile/autorespond/enable"
);
}
}
static
void
ap_init_preferences
()
{
ap_debug
(
"general"
,
"Initializing preference defaults if necessary"
);
/* Adding the folders */
purple_prefs_add_none
(
"/plugins/gtk"
);
purple_prefs_add_none
(
"/plugins/gtk/autoprofile"
);
purple_prefs_add_none
(
"/plugins/gtk/autoprofile/widgets"
);
purple_prefs_add_none
(
"/plugins/gtk/autoprofile/autorespond"
);
/* Behavior-settings */
purple_prefs_add_int
(
"/plugins/gtk/autoprofile/delay_update"
,
30
);
purple_prefs_add_string
(
"/plugins/gtk/autoprofile/show_summary"
,
"always"
);
purple_prefs_add_bool
(
"/plugins/gtk/autoprofile/queue_messages_when_away"
,
FALSE
);
purple_prefs_add_bool
(
"/plugins/gtk/autoprofile/away_when_idle"
,
purple_prefs_get_bool
(
"/purple/away/away_when_idle"
));
/* Auto-response settings */
purple_prefs_add_string
(
"/plugins/gtk/autoprofile/autorespond/auto_reply"
,
purple_prefs_get_string
(
"/purple/away/auto_reply"
));
purple_prefs_add_string
(
"/plugins/gtk/autoprofile/autorespond/text"
,
_
(
"Say the magic word if you want me to talk more!"
));
purple_prefs_add_string
(
"/plugins/gtk/autoprofile/autorespond/trigger"
,
_
(
"please"
));
purple_prefs_add_int
(
"/plugins/gtk/autoprofile/autorespond/delay"
,
2
);
purple_prefs_add_bool
(
"/plugins/gtk/autoprofile/autorespond/enable"
,
TRUE
);
/* Profile settings */
purple_prefs_add_string_list
(
"/plugins/gtk/autoprofile/profile_accounts"
,
NULL
);
purple_prefs_add_string
(
"/plugins/gtk/autoprofile/profile"
,
_
(
"Get AutoProfile for Purple at <a href=
\"
"
"http://autoprofile.sourceforge.net/
\"
>"
"autoprofile.sourceforge.net</a><br><br>[Timestamp]"
));
}
/*--------------------------------------------------------------------------*
* Last Call *
*--------------------------------------------------------------------------*/
static
void
init_plugin
(
PurplePlugin
*
plugin
)
{
info
.
name
=
_
(
"AutoProfile"
);
info
.
summary
=
_
(
"User profile and status message content generator"
);
info
.
description
=
_
(
"Allows user to place dynamic text into profiles
\n
"
"and status messages, with the text automatically
\n
"
"updated whenever content changes"
);
info
.
author
=
_
(
"Casey Ho <casey at hkn-berkeley-edu>
\n\t\t\t
aim:caseyho"
);
ap_debug
(
"general"
,
"Initializing AutoProfile"
);
ap_init_preferences
();
ap_widget_init
();
}
PURPLE_INIT_PLUGIN
(
autoprofile
,
init_plugin
,
info
)