view plugins/psychic.c @ 13392:e132f0969763

[gaim-migrate @ 15765] The timestamp plugin shouldn't be disabling the "Gaim timestamps" in this way. It causes the Show Timestamps item in the conversation window's Options menu to not reflect reality (i.e. the option is checked, but no timestamps show up). I think that users can just use the Show Timestamps option to control that setting independently. If people really want this plugin to force timestamps off, it should do so by setting "/gaim/gtk/conversations/show_timestamps" to FALSE and greying out the Show Timestamps menu item. I think this fixes SF Bug #1385439. (It does if they were using this plugin.) committer: Tailor Script <tailor@pidgin.im>
author Richard Laager <rlaager@wiktel.com>
date Sat, 04 Mar 2006 20:18:34 +0000
parents c1a75785c8f2
children 465c368366f8
line wrap: on
line source



#include "internal.h"

#include "account.h"
#include "blist.h"
#include "conversation.h"
#include "debug.h"
#include "signals.h"
#include "status.h"
#include "version.h"

#include "plugin.h"
#include "pluginpref.h"
#include "prefs.h"


#define DEBUG_INFO(a...) gaim_debug_info("psychic", a)


#define PLUGIN_ID       "core-psychic"
#define PLUGIN_NAME     N_("Psychic Mode")
#define PLUGIN_SUMMARY  N_("Psychic mode for incoming conversation")
#define PLUGIN_DESC     N_("Causes conversation windows to appear as other" \
			   " users begin to message you.  This works for" \
			   " AIM, ICQ, Jabber, Sametime, and Yahoo!")
#define PLUGIN_AUTHOR   "Christopher O'Brien <siege@preoccupied.net>"


#define PREFS_BASE    "/plugins/core/psychic"
#define PREF_BUDDIES  PREFS_BASE "/buddies_only"
#define PREF_NOTICE   PREFS_BASE "/show_notice"
#define PREF_STATUS   PREFS_BASE "/activate_online"


static void
buddy_typing_cb(GaimAccount *acct, const char *name, void *data) {
  GaimConversation *gconv;

  if(gaim_prefs_get_bool(PREF_STATUS) &&
     ! gaim_status_is_available(gaim_account_get_active_status(acct))) {
    DEBUG_INFO("not available, doing nothing\n");
    return;
  }

  if(gaim_prefs_get_bool(PREF_BUDDIES) &&
     ! gaim_find_buddy(acct, name)) {
    DEBUG_INFO("not in blist, doing nothing\n");
    return;
  }

  gconv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, name, acct);
  if(! gconv) {
    DEBUG_INFO("no previous conversation exists\n");
    gconv = gaim_conversation_new(GAIM_CONV_TYPE_IM, acct, name);
    gaim_conversation_present(gconv);

    if(gaim_prefs_get_bool(PREF_NOTICE)) {
      gaim_conversation_write(gconv, NULL,
			      _("You feel a disturbance in the force..."),
			      GAIM_MESSAGE_SYSTEM | GAIM_MESSAGE_NO_LOG,
			      time(NULL));
    }

    gaim_conv_im_set_typing_state(GAIM_CONV_IM(gconv), GAIM_TYPING);
  }
}


static GaimPluginPrefFrame *
get_plugin_pref_frame(GaimPlugin *plugin) {

  GaimPluginPrefFrame *frame;
  GaimPluginPref *pref;
  
  frame = gaim_plugin_pref_frame_new();
  
  pref = gaim_plugin_pref_new_with_name(PREF_BUDDIES);
  gaim_plugin_pref_set_label(pref, _("Only enable for users on"
				     " the buddy list"));
  gaim_plugin_pref_frame_add(frame, pref);

  pref = gaim_plugin_pref_new_with_name(PREF_STATUS);
  gaim_plugin_pref_set_label(pref, _("Disable when away"));
  gaim_plugin_pref_frame_add(frame, pref);

  pref = gaim_plugin_pref_new_with_name(PREF_NOTICE);
  gaim_plugin_pref_set_label(pref, _("Display notification message in"
				     " conversations"));
  gaim_plugin_pref_frame_add(frame, pref);

  return frame;
}


static gboolean
plugin_load(GaimPlugin *plugin) {

  void *convs_handle;
  convs_handle = gaim_conversations_get_handle();

  gaim_signal_connect(convs_handle, "buddy-typing", plugin,
		      GAIM_CALLBACK(buddy_typing_cb), NULL);
  
  return TRUE;
}


static GaimPluginUiInfo prefs_info = {
  get_plugin_pref_frame,
  0,    /* page_num (Reserved) */
  NULL, /* frame (Reserved) */
};


static GaimPluginInfo info = {
  GAIM_PLUGIN_MAGIC,
  GAIM_MAJOR_VERSION,
  GAIM_MINOR_VERSION,
  GAIM_PLUGIN_STANDARD,   /**< type */
  NULL,                   /**< ui_requirement */
  0,                      /**< flags */
  NULL,                   /**< dependencies */
  GAIM_PRIORITY_DEFAULT,  /**< priority */
  
  PLUGIN_ID,              /**< id */
  PLUGIN_NAME,            /**< name */
  VERSION,                /**< version */
  PLUGIN_SUMMARY,         /**< summary */
  PLUGIN_DESC,            /**< description */
  PLUGIN_AUTHOR,          /**< author */
  GAIM_WEBSITE,           /**< homepage */
  
  plugin_load,            /**< load */
  NULL,                   /**< unload */
  NULL,                   /**< destroy */
  
  NULL,                   /**< ui_info */
  NULL,                   /**< extra_info */
  &prefs_info,            /**< prefs_info */
  NULL,                   /**< actions */
};


static void
init_plugin(GaimPlugin *plugin) {
  gaim_prefs_add_none(PREFS_BASE);
  gaim_prefs_add_bool(PREF_BUDDIES, FALSE);
  gaim_prefs_add_bool(PREF_NOTICE, TRUE);
  gaim_prefs_add_bool(PREF_STATUS, TRUE);
}


GAIM_INIT_PLUGIN(psychic, init_plugin, info)