libpurple/plugins/statenotify.c

changeset 16238
33bf2fd32108
parent 12600
7ecd4441fdc7
parent 15884
4de1981757fc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/plugins/statenotify.c	Mon Apr 16 00:44:33 2007 +0000
@@ -0,0 +1,172 @@
+#include "internal.h"
+
+#include "blist.h"
+#include "conversation.h"
+#include "debug.h"
+#include "signals.h"
+#include "version.h"
+
+#include "plugin.h"
+#include "pluginpref.h"
+#include "prefs.h"
+
+#define STATENOTIFY_PLUGIN_ID "core-statenotify"
+
+static void
+write_status(PurpleBuddy *buddy, const char *message)
+{
+	PurpleConversation *conv;
+	const char *who;
+	char buf[256];
+	char *escaped;
+
+	conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM,
+											   buddy->name, buddy->account);
+
+	if (conv == NULL)
+		return;
+	g_return_if_fail(conv->type == PURPLE_CONV_TYPE_IM);
+
+	who = purple_buddy_get_alias(buddy);
+	escaped = g_markup_escape_text(who, -1);
+
+	g_snprintf(buf, sizeof(buf), message, escaped);
+	g_free(escaped);
+
+	purple_conv_im_write(conv->u.im, NULL, buf, PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_ACTIVE_ONLY, time(NULL));
+}
+
+static void
+buddy_status_changed_cb(PurpleBuddy *buddy, PurpleStatus *old_status,
+                        PurpleStatus *status, void *data)
+{
+	gboolean available, old_available;
+
+	available = purple_status_is_available(status);
+	old_available = purple_status_is_available(old_status);
+
+	if (purple_prefs_get_bool("/plugins/core/statenotify/notify_away")) {
+		if (available && !old_available)
+			write_status(buddy, _("%s is no longer away."));
+		else if (!available && old_available)
+			write_status(buddy, _("%s has gone away."));
+	}
+}
+
+static void
+buddy_idle_changed_cb(PurpleBuddy *buddy, gboolean old_idle, gboolean idle,
+                      void *data)
+{
+	if (purple_prefs_get_bool("/plugins/core/statenotify/notify_idle")) {
+		if (idle) {
+			write_status(buddy, _("%s has become idle."));
+		} else {
+			write_status(buddy, _("%s is no longer idle."));
+		}
+	}
+}
+
+static void
+buddy_signon_cb(PurpleBuddy *buddy, void *data)
+{
+	if (purple_prefs_get_bool("/plugins/core/statenotify/notify_signon"))
+		write_status(buddy, _("%s has signed on."));
+}
+
+static void
+buddy_signoff_cb(PurpleBuddy *buddy, void *data)
+{
+	if (purple_prefs_get_bool("/plugins/core/statenotify/notify_signon"))
+		write_status(buddy, _("%s has signed off."));
+}
+
+static PurplePluginPrefFrame *
+get_plugin_pref_frame(PurplePlugin *plugin)
+{
+	PurplePluginPrefFrame *frame;
+	PurplePluginPref *ppref;
+
+	frame = purple_plugin_pref_frame_new();
+
+	ppref = purple_plugin_pref_new_with_label(_("Notify When"));
+	purple_plugin_pref_frame_add(frame, ppref);
+
+	ppref = purple_plugin_pref_new_with_name_and_label("/plugins/core/statenotify/notify_away", _("Buddy Goes _Away"));
+	purple_plugin_pref_frame_add(frame, ppref);
+
+	ppref = purple_plugin_pref_new_with_name_and_label("/plugins/core/statenotify/notify_idle", _("Buddy Goes _Idle"));
+	purple_plugin_pref_frame_add(frame, ppref);
+
+	ppref = purple_plugin_pref_new_with_name_and_label("/plugins/core/statenotify/notify_signon", _("Buddy _Signs On/Off"));
+	purple_plugin_pref_frame_add(frame, ppref);
+
+	return frame;
+}
+
+static gboolean
+plugin_load(PurplePlugin *plugin)
+{
+	void *blist_handle = purple_blist_get_handle();
+
+	purple_signal_connect(blist_handle, "buddy-status-changed", plugin,
+	                    PURPLE_CALLBACK(buddy_status_changed_cb), NULL);
+	purple_signal_connect(blist_handle, "buddy-idle-changed", plugin,
+	                    PURPLE_CALLBACK(buddy_idle_changed_cb), NULL);
+	purple_signal_connect(blist_handle, "buddy-signed-on", plugin,
+	                    PURPLE_CALLBACK(buddy_signon_cb), NULL);
+	purple_signal_connect(blist_handle, "buddy-signed-off", plugin,
+	                    PURPLE_CALLBACK(buddy_signoff_cb), NULL);
+
+	return TRUE;
+}
+
+static PurplePluginUiInfo prefs_info =
+{
+	get_plugin_pref_frame,
+	0,   /* page_num (Reserved) */
+	NULL /* frame (Reserved) */
+};
+
+static PurplePluginInfo info =
+{
+	PURPLE_PLUGIN_MAGIC,
+	PURPLE_MAJOR_VERSION,
+	PURPLE_MINOR_VERSION,
+	PURPLE_PLUGIN_STANDARD,                             /**< type           */
+	NULL,                                             /**< ui_requirement */
+	0,                                                /**< flags          */
+	NULL,                                             /**< dependencies   */
+	PURPLE_PRIORITY_DEFAULT,                            /**< priority       */
+
+	STATENOTIFY_PLUGIN_ID,                            /**< id             */
+	N_("Buddy State Notification"),                   /**< name           */
+	VERSION,                                          /**< version        */
+	                                                  /**  summary        */
+	N_("Notifies in a conversation window when a buddy goes or returns from "
+	   "away or idle."),
+	                                                  /**  description    */
+	N_("Notifies in a conversation window when a buddy goes or returns from "
+	   "away or idle."),
+	"Christian Hammond <chipx86@gnupdate.org>",       /**< author         */
+	PURPLE_WEBSITE,                                     /**< homepage       */
+
+	plugin_load,                                      /**< load           */
+	NULL,                                             /**< unload         */
+	NULL,                                             /**< destroy        */
+
+	NULL,                                             /**< ui_info        */
+	NULL,                                             /**< extra_info     */
+	&prefs_info,                                      /**< prefs_info     */
+	NULL
+};
+
+static void
+init_plugin(PurplePlugin *plugin)
+{
+	purple_prefs_add_none("/plugins/core/statenotify");
+	purple_prefs_add_bool("/plugins/core/statenotify/notify_away", TRUE);
+	purple_prefs_add_bool("/plugins/core/statenotify/notify_idle", TRUE);
+	purple_prefs_add_bool("/plugins/core/statenotify/notify_signon", TRUE);
+}
+
+PURPLE_INIT_PLUGIN(statenotify, init_plugin, info)

mercurial