pidgin/purple-plugin-pack
Clone
Summary
Browse
Changes
Graph
fixed the crash on disconnect by closing conversation windows when that buddy is done with it's events, rather than when processing each event.
2009-08-30, Gary Kramlich
8ab9212b3ed3
fixed the crash on disconnect by closing conversation windows when that buddy is done with it's events, rather than when processing each event.
added status text support as a status of the stress
/*--------------------------------------------------------------------------*
* 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
"comp_logstats.h"
#include
"request.h"
GtkWidget
*
checkbox
=
NULL
;
GtkListStore
*
alias_list
=
NULL
;
GtkWidget
*
alias_view
=
NULL
;
/* General callbacks from main preferences */
static
void
logstats_response_cb
(
GtkDialog
*
dialog
,
gint
id
,
GtkWidget
*
widget
)
{
purple_prefs_set_bool
(
"/plugins/gtk/autoprofile/components/logstat/enabled"
,
TRUE
);
logstats_load
(
NULL
);
gtk_widget_set_sensitive
(
widget
,
TRUE
);
gtk_widget_destroy
(
GTK_WIDGET
(
dialog
));
}
static
void
toggle_enable
(
GtkButton
*
button
,
gpointer
data
)
{
GtkWidget
*
popup
,
*
vbox
,
*
label
;
vbox
=
data
;
if
(
purple_prefs_get_bool
(
"/plugins/gtk/autoprofile/components/logstat/enabled"
))
{
logstats_unload
(
NULL
);
purple_prefs_set_bool
(
"/plugins/gtk/autoprofile/components/logstat/enabled"
,
FALSE
);
gtk_widget_set_sensitive
(
vbox
,
FALSE
);
}
else
{
popup
=
gtk_dialog_new_with_buttons
(
"Enable stats for logs"
,
NULL
,
0
,
GTK_STOCK_OK
,
42
,
NULL
);
g_signal_connect
(
G_OBJECT
(
popup
),
"response"
,
G_CALLBACK
(
logstats_response_cb
),
vbox
);
label
=
gtk_label_new
(
NULL
);
gtk_label_set_markup
(
GTK_LABEL
(
label
),
"
\n
Enabling this component will have some minor side effects. Doing so "
"will cause Purple to take slightly longer to start up because it must "
"parse a large amount of data to gather statistics. On average, this "
"can take slightly over a second for every 100,000 messages in your "
"logs.
\n\n
The time from when you press the OK button to the time "
"when this dialog vanishes is a good approximation of how much extra "
"time will elapse before the login screen is shown.
\n
"
);
gtk_label_set_line_wrap
(
GTK_LABEL
(
label
),
TRUE
);
gtk_misc_set_alignment
(
GTK_MISC
(
label
),
0
,
0
);
gtk_box_pack_start
(
GTK_BOX
(
GTK_DIALOG
(
popup
)
->
vbox
),
label
,
FALSE
,
FALSE
,
0
);
gtk_widget_show_all
(
popup
);
}
}
static
gboolean
logstat_format
(
GtkWidget
*
widget
,
GdkEventFocus
*
event
,
gpointer
data
)
{
purple_prefs_set_string
(
"/plugins/gtk/autoprofile/components/logstat/format"
,
gtk_entry_get_text
(
GTK_ENTRY
(
widget
)));
return
FALSE
;
}
static
void
new_alias
(
gpointer
data
,
PurpleRequestFields
*
fields
)
{
GtkTreeIter
iter
;
GList
*
aliases
;
const
char
*
alias
;
alias
=
purple_request_fields_get_string
(
fields
,
"alias"
);
aliases
=
purple_prefs_get_string_list
(
"/plugins/gtk/autoprofile/components/logstat/aliases"
);
aliases
=
g_list_append
(
aliases
,
strdup
(
alias
));
purple_prefs_set_string_list
(
"/plugins/gtk/autoprofile/components/logstat/aliases"
,
aliases
);
free_string_list
(
aliases
);
gtk_list_store_insert
(
alias_list
,
&
iter
,
0
);
gtk_list_store_set
(
alias_list
,
&
iter
,
0
,
alias
,
-1
);
}
static
void
alias_add
(
GtkButton
*
button
,
gpointer
data
)
{
PurpleRequestFields
*
fields
;
PurpleRequestFieldGroup
*
group
;
PurpleRequestField
*
field
;
fields
=
purple_request_fields_new
();
group
=
purple_request_field_group_new
(
NULL
);
purple_request_fields_add_group
(
fields
,
group
);
field
=
purple_request_field_string_new
(
"alias"
,
_
(
"Alias"
),
NULL
,
FALSE
);
purple_request_field_set_required
(
field
,
TRUE
);
purple_request_field_set_type_hint
(
field
,
"alias"
);
purple_request_field_group_add_field
(
group
,
field
);
purple_request_fields
(
purple_get_blist
(),
_
(
"Add Alias"
),
NULL
,
_
(
"Type in the alias that you use"
),
fields
,
_
(
"OK"
),
G_CALLBACK
(
new_alias
),
_
(
"Cancel"
),
NULL
,
NULL
,
NULL
,
NULL
,
NULL
);
}
static
void
alias_delete
(
GtkButton
*
button
,
gpointer
data
)
{
GtkTreeSelection
*
selection
;
GtkTreeIter
iter
;
char
*
alias
;
GList
*
aliases
,
*
aliases_start
,
*
new_aliases
;
selection
=
gtk_tree_view_get_selection
(
GTK_TREE_VIEW
(
alias_view
));
if
(
!
gtk_tree_selection_get_selected
(
selection
,
NULL
,
&
iter
))
return
;
gtk_tree_model_get
(
GTK_TREE_MODEL
(
alias_list
),
&
iter
,
0
,
&
alias
,
-1
);
gtk_list_store_remove
(
alias_list
,
&
iter
);
aliases
=
purple_prefs_get_string_list
(
"/plugins/gtk/autoprofile/components/logstat/aliases"
);
aliases_start
=
aliases
;
new_aliases
=
NULL
;
while
(
aliases
)
{
if
(
strcmp
((
char
*
)
aliases
->
data
,
alias
))
{
new_aliases
=
g_list_append
(
new_aliases
,
aliases
->
data
);
}
aliases
=
aliases
->
next
;
}
purple_prefs_set_string_list
(
"/plugins/gtk/autoprofile/components/logstat/aliases"
,
new_aliases
);
free_string_list
(
aliases_start
);
g_list_free
(
new_aliases
);
free
(
alias
);
}
static
void
alias_what
(
GtkButton
*
button
,
gpointer
data
)
{
purple_notify_formatted
(
NULL
,
_
(
"Aliases"
),
_
(
"What this list is for"
),
NULL
,
_
(
"Logs in Purple are stored verbatim with what you see on the screen. "
"The names of the people in the conversation (both yourself and your "
"buddy) are shown with their given aliases as opposed to actual screen "
"names. If you have given yourself an alias in a conversation, list "
"it using this dialog. If you do not, messages written by you will "
"be incorrectly identified as received instead of sent.<br><br>Correct "
"capitalization and whitespace are not required for detection to "
"work.<br><br>You must disable/re-enable log stats to refresh the "
"database after an alias change."
),
NULL
,
NULL
);
}
/* The main window */
GtkWidget
*
logstats_prefs
(
struct
widget
*
w
)
{
GtkWidget
*
ret
,
*
vbox
,
*
hbox
;
GtkWidget
*
label
,
*
button
,
*
entry
,
*
sw
;
GtkCellRenderer
*
renderer
;
GtkTreeSelection
*
selection
;
GtkTreeViewColumn
*
col
;
GtkTreeIter
iter
;
GList
*
aliases
,
*
aliases_start
;
ret
=
gtk_vbox_new
(
FALSE
,
6
);
/* Checkbox for enabling/disabling */
checkbox
=
gtk_check_button_new_with_mnemonic
(
"Enable statistics for logs"
);
gtk_toggle_button_set_active
(
GTK_TOGGLE_BUTTON
(
checkbox
),
purple_prefs_get_bool
(
"/plugins/gtk/autoprofile/components/logstat/enabled"
));
gtk_box_pack_start
(
GTK_BOX
(
ret
),
checkbox
,
FALSE
,
FALSE
,
0
);
vbox
=
gtk_vbox_new
(
FALSE
,
6
);
gtk_box_pack_start
(
GTK_BOX
(
ret
),
vbox
,
TRUE
,
TRUE
,
0
);
/* Le format string */
label
=
gtk_label_new
(
NULL
);
gtk_label_set_markup
(
GTK_LABEL
(
label
),
"<b>Format string for output</b>"
);
gtk_misc_set_alignment
(
GTK_MISC
(
label
),
0
,
0
);
gtk_box_pack_start
(
GTK_BOX
(
vbox
),
label
,
FALSE
,
FALSE
,
0
);
entry
=
gtk_entry_new
();
gtk_box_pack_start
(
GTK_BOX
(
vbox
),
entry
,
FALSE
,
FALSE
,
0
);
gtk_entry_set_max_length
(
GTK_ENTRY
(
entry
),
1000
);
gtk_entry_set_text
(
GTK_ENTRY
(
entry
),
purple_prefs_get_string
(
"/plugins/gtk/autoprofile/components/logstat/format"
));
g_signal_connect
(
G_OBJECT
(
entry
),
"focus-out-event"
,
G_CALLBACK
(
logstat_format
),
NULL
);
label
=
gtk_label_new
(
_
(
"%R
\t
Total messages received
\n
"
"%r
\t
Total words received
\n
"
"%S
\t
Total messages sent
\n
"
"%s
\t
Total words sent
\n
"
"%T
\t
Total messages sent/received
\n
"
"%t
\t
Total words sent/received
\n
"
"%D
\t
Number of days since first logged conversation
\n
"
"%d
\t
Number of days with logged conversations
\n
"
"%N
\t
Number of logged conversations
\n
"
"%n
\t
Average number of conversations per day with logs
\n
"
"%i
\t
Most conversations in a single day
\n
"
"%I
\t
Date with most conversations
\n
"
"%j
\t
Most messages sent in a single day
\n
"
"%J
\t
Date with most messages sent
\n
"
"%k
\t
Most messages received in a single day
\n
"
"%K
\t
Date with most messages received
\n
"
"%l
\t
Most total messages sent/received in a single day
\n
"
"%L
\t
Date with most total messages sent/received
\n
"
"%f
\t
Date of first logged conversation
\n
"
"%u
\t
Average words per message received
\n
"
"%v
\t
Average words per message sent
\n
"
"%w
\t
Average words per message sent/received
\n
"
"%U
\t
Average messages received per conversation
\n
"
"%V
\t
Average messages sent per conversation
\n
"
"%W
\t
Average messages sent/received per conversation
\n
"
"%x
\t
Average words received per day with logs
\n
"
"%y
\t
Average words sent per day with logs
\n
"
"%z
\t
Average words sent/received per day with logs
\n
"
"%X
\t
Average messages received per day with logs
\n
"
"%Y
\t
Average messages sent per day with logs
\n
"
"%Z
\t
Average messages sent/received per day with logs
\n
"
"%p
\t
Percentage of days with logs
\n
"
"%a
\t
Number of messages received today
\n
"
"%b
\t
Number of messages sent today
\n
"
"%c
\t
Number of conversations started today
\n
"
"%e
\t
Number of messages sent/received today
\n
"
"%A
\t
Number of messages received in last week
\n
"
"%B
\t
Number of messages sent in last week
\n
"
"%C
\t
Number of conversations started in last week
\n
"
"%E
\t
Number of messages sent/received in last week
\n
"
"%%
\t
%"
));
gtk_misc_set_alignment
(
GTK_MISC
(
label
),
0
,
0
);
sw
=
gtk_scrolled_window_new
(
NULL
,
NULL
);
gtk_scrolled_window_set_policy
(
GTK_SCROLLED_WINDOW
(
sw
),
GTK_POLICY_NEVER
,
GTK_POLICY_ALWAYS
);
gtk_box_pack_start
(
GTK_BOX
(
vbox
),
sw
,
TRUE
,
TRUE
,
0
);
gtk_scrolled_window_add_with_viewport
(
GTK_SCROLLED_WINDOW
(
sw
),
label
);
/* Aliases */
label
=
gtk_label_new
(
NULL
);
gtk_label_set_markup
(
GTK_LABEL
(
label
),
"<b>Personal aliases</b>"
);
gtk_misc_set_alignment
(
GTK_MISC
(
label
),
0
,
0
);
gtk_box_pack_start
(
GTK_BOX
(
vbox
),
label
,
FALSE
,
FALSE
,
0
);
label
=
gtk_label_new
(
NULL
);
gtk_label_set_markup
(
GTK_LABEL
(
label
),
"You need this if you have an alias for your own screen name,
\n
"
"else IM's you sent will be incorrectly counted as received"
);
gtk_misc_set_alignment
(
GTK_MISC
(
label
),
0
,
0
);
gtk_box_pack_start
(
GTK_BOX
(
vbox
),
label
,
FALSE
,
FALSE
,
0
);
hbox
=
gtk_hbox_new
(
FALSE
,
3
);
gtk_box_pack_start
(
GTK_BOX
(
vbox
),
hbox
,
FALSE
,
FALSE
,
0
);
button
=
gtk_button_new_with_label
(
_
(
"Add alias"
));
g_signal_connect
(
G_OBJECT
(
button
),
"clicked"
,
G_CALLBACK
(
alias_add
),
NULL
);
gtk_box_pack_start
(
GTK_BOX
(
hbox
),
button
,
TRUE
,
TRUE
,
0
);
button
=
gtk_button_new_with_label
(
_
(
"Delete alias"
));
g_signal_connect
(
G_OBJECT
(
button
),
"clicked"
,
G_CALLBACK
(
alias_delete
),
NULL
);
gtk_box_pack_start
(
GTK_BOX
(
hbox
),
button
,
TRUE
,
TRUE
,
0
);
button
=
gtk_button_new_with_label
(
_
(
"?"
));
g_signal_connect
(
G_OBJECT
(
button
),
"clicked"
,
G_CALLBACK
(
alias_what
),
NULL
);
gtk_box_pack_start
(
GTK_BOX
(
hbox
),
button
,
FALSE
,
FALSE
,
0
);
sw
=
gtk_scrolled_window_new
(
0
,
0
);
gtk_box_pack_start
(
GTK_BOX
(
vbox
),
sw
,
FALSE
,
FALSE
,
0
);
gtk_scrolled_window_set_policy
(
GTK_SCROLLED_WINDOW
(
sw
),
GTK_POLICY_NEVER
,
GTK_POLICY_NEVER
);
gtk_scrolled_window_set_shadow_type
(
GTK_SCROLLED_WINDOW
(
sw
),
GTK_SHADOW_IN
);
alias_list
=
gtk_list_store_new
(
1
,
G_TYPE_STRING
);
alias_view
=
gtk_tree_view_new_with_model
(
GTK_TREE_MODEL
(
alias_list
));
gtk_container_add
(
GTK_CONTAINER
(
sw
),
alias_view
);
renderer
=
gtk_cell_renderer_text_new
();
gtk_tree_view_set_headers_visible
(
GTK_TREE_VIEW
(
alias_view
),
FALSE
);
selection
=
gtk_tree_view_get_selection
(
GTK_TREE_VIEW
(
alias_view
));
gtk_tree_selection_set_mode
(
selection
,
GTK_SELECTION_SINGLE
);
col
=
gtk_tree_view_column_new_with_attributes
(
_
(
"Alias"
),
renderer
,
"text"
,
0
,
NULL
);
gtk_tree_view_append_column
(
GTK_TREE_VIEW
(
alias_view
),
col
);
aliases
=
purple_prefs_get_string_list
(
"/plugins/gtk/autoprofile/components/logstat/aliases"
);
aliases_start
=
aliases
;
while
(
aliases
)
{
gtk_list_store_append
(
alias_list
,
&
iter
);
gtk_list_store_set
(
alias_list
,
&
iter
,
0
,
(
char
*
)
aliases
->
data
,
-1
);
aliases
=
aliases
->
next
;
}
free_string_list
(
aliases_start
);
/* Finish up the checkbox stuff */
g_signal_connect
(
G_OBJECT
(
checkbox
),
"clicked"
,
G_CALLBACK
(
toggle_enable
),
vbox
);
if
(
!
purple_prefs_get_bool
(
"/plugins/gtk/autoprofile/components/logstat/enabled"
))
{
gtk_widget_set_sensitive
(
vbox
,
FALSE
);
}
else
{
gtk_widget_set_sensitive
(
vbox
,
TRUE
);
}
return
ret
;
}