for IRC notifications
This commit is contained in:
parent
cd68cebb55
commit
ae5e309b0c
1 changed files with 115 additions and 42 deletions
|
@ -42,6 +42,8 @@
|
||||||
|
|
||||||
#define PLUGIN_ID "pidgin-libnotify"
|
#define PLUGIN_ID "pidgin-libnotify"
|
||||||
|
|
||||||
|
#define KEY "notification_key"
|
||||||
|
|
||||||
static GHashTable *buddy_hash;
|
static GHashTable *buddy_hash;
|
||||||
|
|
||||||
static PurplePluginPrefFrame *
|
static PurplePluginPrefFrame *
|
||||||
|
@ -62,6 +64,11 @@ get_plugin_pref_frame (PurplePlugin *plugin)
|
||||||
_("Only new conversations"));
|
_("Only new conversations"));
|
||||||
purple_plugin_pref_frame_add (frame, ppref);
|
purple_plugin_pref_frame_add (frame, ppref);
|
||||||
|
|
||||||
|
ppref = purple_plugin_pref_new_with_name_and_label (
|
||||||
|
"/plugins/gtk/libnotify/all_chat_msgs",
|
||||||
|
_("All messages in chats"));
|
||||||
|
purple_plugin_pref_frame_add (frame, ppref);
|
||||||
|
|
||||||
ppref = purple_plugin_pref_new_with_name_and_label (
|
ppref = purple_plugin_pref_new_with_name_and_label (
|
||||||
"/plugins/gtk/libnotify/blocked",
|
"/plugins/gtk/libnotify/blocked",
|
||||||
_("Ignore events from blocked users"));
|
_("Ignore events from blocked users"));
|
||||||
|
@ -169,6 +176,26 @@ pixbuf_from_buddy_icon (PurpleBuddyIcon *buddy_icon)
|
||||||
return icon;
|
return icon;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** Return a pixbuf describing the buddy. It should be unref'd. */
|
||||||
|
static GdkPixbuf *
|
||||||
|
pixbuf_from_buddy(const PurpleBuddy *buddy)
|
||||||
|
{
|
||||||
|
GdkPixbuf *icon;
|
||||||
|
PurpleBuddyIcon *buddy_icon;
|
||||||
|
|
||||||
|
buddy_icon = purple_buddy_get_icon (buddy);
|
||||||
|
if (buddy_icon) {
|
||||||
|
icon = pixbuf_from_buddy_icon (buddy_icon);
|
||||||
|
purple_debug_info (PLUGIN_ID, "pixbuf_from_buddy(), icon from buddy\n");
|
||||||
|
} else {
|
||||||
|
icon = pidgin_create_prpl_icon (buddy->account, 1);
|
||||||
|
purple_debug_info (PLUGIN_ID, "pixbuf_from_buddy(), icon from account\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return icon;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
action_cb (NotifyNotification *notification,
|
action_cb (NotifyNotification *notification,
|
||||||
gchar *action, gpointer user_data)
|
gchar *action, gpointer user_data)
|
||||||
|
@ -201,13 +228,16 @@ action_cb (NotifyNotification *notification,
|
||||||
static gboolean
|
static gboolean
|
||||||
closed_cb (NotifyNotification *notification)
|
closed_cb (NotifyNotification *notification)
|
||||||
{
|
{
|
||||||
PurpleContact *contact;
|
gpointer notification_key;
|
||||||
|
|
||||||
purple_debug_info (PLUGIN_ID, "closed_cb(), notification: 0x%x\n", notification);
|
notification_key = (gpointer)g_object_get_data (G_OBJECT(notification), KEY);
|
||||||
|
|
||||||
contact = (PurpleContact *)g_object_get_data (G_OBJECT(notification), "contact");
|
purple_debug_info (PLUGIN_ID, "closed_cb(), notification: 0x%x "
|
||||||
if (contact)
|
"key: 0x%x\n", notification, notification_key
|
||||||
g_hash_table_remove (buddy_hash, contact);
|
);
|
||||||
|
|
||||||
|
if (notification_key)
|
||||||
|
g_hash_table_remove (buddy_hash, notification_key);
|
||||||
|
|
||||||
g_object_unref (G_OBJECT(notification));
|
g_object_unref (G_OBJECT(notification));
|
||||||
|
|
||||||
|
@ -255,69 +285,77 @@ should_notify_unavailable (PurpleAccount *account)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
notify (const gchar *title,
|
notify (const GdkPixbuf *icon,
|
||||||
|
const gchar *title,
|
||||||
const gchar *body,
|
const gchar *body,
|
||||||
PurpleBuddy *buddy)
|
PurpleBuddy *buddy,
|
||||||
|
gpointer notification_key)
|
||||||
{
|
{
|
||||||
NotifyNotification *notification = NULL;
|
NotifyNotification *notification = NULL;
|
||||||
GdkPixbuf *icon;
|
gchar *tr_body, *buddy_name;
|
||||||
PurpleBuddyIcon *buddy_icon;
|
|
||||||
gchar *tr_body;
|
|
||||||
PurpleContact *contact;
|
PurpleContact *contact;
|
||||||
|
|
||||||
contact = purple_buddy_get_contact (buddy);
|
|
||||||
|
|
||||||
if (body)
|
if (body)
|
||||||
tr_body = truncate_escape_string (body, 60);
|
tr_body = truncate_escape_string (body, 60);
|
||||||
else
|
else
|
||||||
tr_body = NULL;
|
tr_body = NULL;
|
||||||
|
|
||||||
notification = g_hash_table_lookup (buddy_hash, contact);
|
if (buddy) {
|
||||||
|
contact = purple_buddy_get_contact (buddy);
|
||||||
|
buddy_name = best_name (buddy);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
contact = NULL;
|
||||||
|
buddy_name = "(not-set)";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
notification = g_hash_table_lookup (buddy_hash, notification_key);
|
||||||
|
|
||||||
if (notification != NULL) {
|
if (notification != NULL) {
|
||||||
|
purple_debug_info (PLUGIN_ID, "notify(), updating 0x%x: "
|
||||||
|
"title: '%s', body: '%s', buddy: '%s'\n", notification_key, title, tr_body, buddy_name);
|
||||||
|
|
||||||
notify_notification_update (notification, title, tr_body, NULL);
|
notify_notification_update (notification, title, tr_body, NULL);
|
||||||
/* this shouldn't be necessary, file a bug */
|
/* this shouldn't be necessary, file a bug */
|
||||||
notify_notification_show (notification, NULL);
|
notify_notification_show (notification, NULL);
|
||||||
|
|
||||||
purple_debug_info (PLUGIN_ID, "notify(), update: "
|
purple_debug_info (PLUGIN_ID, "notify(), update: "
|
||||||
"title: '%s', body: '%s', buddy: '%s'\n",
|
"title: '%s', body: '%s', buddy: '%s'\n",
|
||||||
title, tr_body, best_name (buddy));
|
title, tr_body, buddy_name);
|
||||||
|
|
||||||
g_free (tr_body);
|
g_free (tr_body);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
notification = notify_notification_new (title, tr_body, NULL, NULL);
|
notification = notify_notification_new (title, tr_body, NULL, NULL);
|
||||||
purple_debug_info (PLUGIN_ID, "notify(), new: "
|
purple_debug_info (PLUGIN_ID, "notify(), new 0x%x: "
|
||||||
"title: '%s', body: '%s', buddy: '%s'\n",
|
"title: '%s', body: '%s', buddy: '%s'\n",
|
||||||
title, tr_body, best_name (buddy));
|
notification_key, title, tr_body, buddy_name);
|
||||||
|
|
||||||
g_free (tr_body);
|
g_free (tr_body);
|
||||||
|
|
||||||
buddy_icon = purple_buddy_get_icon (buddy);
|
|
||||||
if (buddy_icon) {
|
|
||||||
icon = pixbuf_from_buddy_icon (buddy_icon);
|
|
||||||
purple_debug_info (PLUGIN_ID, "notify(), has a buddy icon.\n");
|
|
||||||
} else {
|
|
||||||
icon = pidgin_create_prpl_icon (buddy->account, 1);
|
|
||||||
purple_debug_info (PLUGIN_ID, "notify(), has a prpl icon.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (icon) {
|
if (icon) {
|
||||||
notify_notification_set_icon_from_pixbuf (notification, icon);
|
notify_notification_set_icon_from_pixbuf (notification, icon);
|
||||||
g_object_unref (icon);
|
|
||||||
} else {
|
} else {
|
||||||
purple_debug_warning (PLUGIN_ID, "notify(), couldn't find any icon!\n");
|
purple_debug_warning (PLUGIN_ID, "notify(), didn't get an icon!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
g_hash_table_insert (buddy_hash, contact, notification);
|
if (body)
|
||||||
|
notify_notification_set_category (notification, "im.received");
|
||||||
|
else
|
||||||
|
notify_notification_set_category (notification, "im");
|
||||||
|
|
||||||
g_object_set_data (G_OBJECT(notification), "contact", contact);
|
g_hash_table_insert (buddy_hash, notification_key, notification);
|
||||||
|
|
||||||
|
g_object_set_data (G_OBJECT(notification), KEY, notification_key);
|
||||||
|
|
||||||
g_signal_connect (notification, "closed", G_CALLBACK(closed_cb), NULL);
|
g_signal_connect (notification, "closed", G_CALLBACK(closed_cb), NULL);
|
||||||
|
|
||||||
notify_notification_set_urgency (notification, NOTIFY_URGENCY_NORMAL);
|
notify_notification_set_urgency (notification, NOTIFY_URGENCY_NORMAL);
|
||||||
|
|
||||||
notify_notification_add_action (notification, "show", _("Show"), action_cb, NULL, NULL);
|
// notify_notification_add_action (notification, "show", _("Show"), action_cb, NULL, NULL);
|
||||||
|
|
||||||
if (!notify_notification_show (notification, NULL)) {
|
if (!notify_notification_show (notification, NULL)) {
|
||||||
purple_debug_error (PLUGIN_ID, "notify(), failed to send notification\n");
|
purple_debug_error (PLUGIN_ID, "notify(), failed to send notification\n");
|
||||||
|
@ -329,6 +367,7 @@ static void
|
||||||
notify_buddy_signon_cb (PurpleBuddy *buddy,
|
notify_buddy_signon_cb (PurpleBuddy *buddy,
|
||||||
gpointer data)
|
gpointer data)
|
||||||
{
|
{
|
||||||
|
GdkPixbuf *icon;
|
||||||
gchar *tr_name, *title;
|
gchar *tr_name, *title;
|
||||||
gboolean blocked;
|
gboolean blocked;
|
||||||
|
|
||||||
|
@ -351,8 +390,11 @@ notify_buddy_signon_cb (PurpleBuddy *buddy,
|
||||||
|
|
||||||
title = g_strdup_printf (_("%s signed on"), tr_name);
|
title = g_strdup_printf (_("%s signed on"), tr_name);
|
||||||
|
|
||||||
notify (title, NULL, buddy);
|
icon = pixbuf_from_buddy (buddy);
|
||||||
|
|
||||||
|
notify (icon, title, NULL, buddy, buddy);
|
||||||
|
|
||||||
|
g_object_unref (icon);
|
||||||
g_free (tr_name);
|
g_free (tr_name);
|
||||||
g_free (title);
|
g_free (title);
|
||||||
}
|
}
|
||||||
|
@ -361,6 +403,7 @@ static void
|
||||||
notify_buddy_signoff_cb (PurpleBuddy *buddy,
|
notify_buddy_signoff_cb (PurpleBuddy *buddy,
|
||||||
gpointer data)
|
gpointer data)
|
||||||
{
|
{
|
||||||
|
GdkPixbuf *icon;
|
||||||
gchar *tr_name, *title;
|
gchar *tr_name, *title;
|
||||||
gboolean blocked;
|
gboolean blocked;
|
||||||
|
|
||||||
|
@ -383,8 +426,11 @@ notify_buddy_signoff_cb (PurpleBuddy *buddy,
|
||||||
|
|
||||||
title = g_strdup_printf (_("%s signed off"), tr_name);
|
title = g_strdup_printf (_("%s signed off"), tr_name);
|
||||||
|
|
||||||
notify (title, NULL, buddy);
|
icon = pixbuf_from_buddy (buddy);
|
||||||
|
|
||||||
|
notify (icon, title, NULL, buddy, buddy);
|
||||||
|
|
||||||
|
g_object_unref (icon);
|
||||||
g_free (tr_name);
|
g_free (tr_name);
|
||||||
g_free (title);
|
g_free (title);
|
||||||
}
|
}
|
||||||
|
@ -395,6 +441,7 @@ notify_msg_sent (PurpleAccount *account,
|
||||||
const gchar *message)
|
const gchar *message)
|
||||||
{
|
{
|
||||||
PurpleBuddy *buddy;
|
PurpleBuddy *buddy;
|
||||||
|
GdkPixbuf *icon;
|
||||||
gchar *title, *body, *tr_name;
|
gchar *title, *body, *tr_name;
|
||||||
gboolean blocked;
|
gboolean blocked;
|
||||||
|
|
||||||
|
@ -411,8 +458,11 @@ notify_msg_sent (PurpleAccount *account,
|
||||||
title = g_strdup_printf (_("%s says:"), tr_name);
|
title = g_strdup_printf (_("%s says:"), tr_name);
|
||||||
body = purple_markup_strip_html (message);
|
body = purple_markup_strip_html (message);
|
||||||
|
|
||||||
notify (title, body, buddy);
|
icon = pixbuf_from_buddy (buddy);
|
||||||
|
|
||||||
|
notify (icon, title, body, buddy, buddy);
|
||||||
|
|
||||||
|
g_object_unref (icon);
|
||||||
g_free (tr_name);
|
g_free (tr_name);
|
||||||
g_free (title);
|
g_free (title);
|
||||||
g_free (body);
|
g_free (body);
|
||||||
|
@ -457,16 +507,38 @@ notify_chat_nick (PurpleAccount *account,
|
||||||
PurpleConversation *conv,
|
PurpleConversation *conv,
|
||||||
gpointer data)
|
gpointer data)
|
||||||
{
|
{
|
||||||
gchar *nick;
|
GdkPixbuf *icon;
|
||||||
|
PurpleBuddy *buddy;
|
||||||
|
gchar *nick, *tr_name, *title, *body;
|
||||||
|
|
||||||
nick = (gchar *)purple_conv_chat_get_nick (PURPLE_CONV_CHAT(conv));
|
nick = (gchar *)purple_conv_chat_get_nick (PURPLE_CONV_CHAT(conv));
|
||||||
if (nick && !strcmp (sender, nick))
|
if (nick && !strcmp (sender, nick))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!g_strstr_len (message, strlen(message), nick))
|
if (!purple_prefs_get_bool ("/plugins/gtk/libnotify/all_chat_msgs")
|
||||||
|
&& !g_strstr_len (message, strlen(message), nick))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
notify_msg_sent (account, sender, message);
|
tr_name = truncate_escape_string (sender, 25);
|
||||||
|
|
||||||
|
title = g_strdup_printf (_("%s says:"), tr_name);
|
||||||
|
body = purple_markup_strip_html (message);
|
||||||
|
|
||||||
|
buddy = purple_find_buddy (account, sender);
|
||||||
|
if (buddy)
|
||||||
|
icon = pixbuf_from_buddy (buddy);
|
||||||
|
else
|
||||||
|
icon = NULL;
|
||||||
|
|
||||||
|
if (!icon)
|
||||||
|
icon = pidgin_create_prpl_icon (account, PIDGIN_PRPL_ICON_MEDIUM);
|
||||||
|
|
||||||
|
notify (icon, title, body, NULL, conv);
|
||||||
|
|
||||||
|
g_object_unref (icon);
|
||||||
|
g_free (tr_name);
|
||||||
|
g_free (title);
|
||||||
|
g_free (body);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
@ -585,6 +657,7 @@ init_plugin (PurplePlugin *plugin)
|
||||||
purple_prefs_add_bool ("/plugins/gtk/libnotify/signon", TRUE);
|
purple_prefs_add_bool ("/plugins/gtk/libnotify/signon", TRUE);
|
||||||
purple_prefs_add_bool ("/plugins/gtk/libnotify/signoff", FALSE);
|
purple_prefs_add_bool ("/plugins/gtk/libnotify/signoff", FALSE);
|
||||||
purple_prefs_add_bool ("/plugins/gtk/libnotify/only_available", FALSE);
|
purple_prefs_add_bool ("/plugins/gtk/libnotify/only_available", FALSE);
|
||||||
|
purple_prefs_add_bool ("/plugins/gtk/libnotify/all_chat_msgs", FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
PURPLE_INIT_PLUGIN(notify, init_plugin, info)
|
PURPLE_INIT_PLUGIN(notify, init_plugin, info)
|
||||||
|
|
Loading…
Reference in a new issue