view plugins/autorecon.c @ 1466:1a24237f5865

[gaim-migrate @ 1476] jabber got chat and handles "not acceptable" JIDs better (e.g. you can sign on as "warmenhoven" or "warmenhoven@jabber.com" or "warmenhoven@jabber.com/GAIM", and all three act the exact same). also started to rewrite get file for TOC, but only got far enough that AIM aborts the transfer and gaim handles the stopped transfer gracefully (AIM doesn't segfault; it just doesn't do what I expect it to). other doc updates. committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Sat, 03 Feb 2001 13:30:57 +0000
parents 96e93119268d
children b367beee6448
line wrap: on
line source

#define GAIM_PLUGINS
#include "gaim.h"
#include "prpl.h"
#include <gtk/gtk.h>

extern GtkWidget *imaway;

static int away_state;
static int forced_off = 0;
static char *last_away = NULL;
GSList *reconnects = NULL;
GSList *recontim = NULL;

char *name() {
	return "Auto Reconnect";
}

char *description() {
	return "When AOL kicks you off, this auto-reconnects you.";
}

static void now_online(struct gaim_connection *gc, void *m) {
	gint place;
	guint recon;
	if (!g_slist_find(reconnects, gc->user))
		return;
	place = g_slist_index(reconnects, gc->user);
	recon = (guint)g_slist_nth(recontim, place);
	reconnects = g_slist_remove(reconnects, gc->user);
	recontim = g_slist_remove(recontim, (void *)recon);
	if (away_state) serv_set_away(gc, GAIM_AWAY_CUSTOM, last_away);
}

static void do_signon(struct aim_user *u) {
	gint place;
	guint recon;
	place = g_slist_index(reconnects, u);
	recon = (guint)g_slist_nth(recontim, place);
	gtk_timeout_remove(recon);
	forced_off = 0;
	serv_login(u);
}

static void reconnect(struct gaim_connection *gc, void *m) {
	guint recon;
	if (g_slist_find(reconnects, gc->user))
		return;
	recon = gtk_timeout_add(8000, (GtkFunction)do_signon, gc->user);
	reconnects = g_slist_append(reconnects, gc->user);
	recontim = g_slist_append(recontim, (void *)recon);
	forced_off = 1;
}

static void away_toggle(struct gaim_connection *gc, char *state, char *message, gpointer data) {
	if (gc->away) {
		if (last_away)
			g_free(last_away);
		last_away = g_strdup(gc->away);
		away_state = 1;
	} else if (!forced_off)
		away_state = 0;
}

char *gaim_plugin_init(GModule *handle) {
	if (awaymessage) {
		away_state = 1;
		last_away = g_strdup(awaymessage->message);
	} else
		away_state = 0;

	gaim_signal_connect(handle, event_away, away_toggle, NULL);
	gaim_signal_connect(handle, event_signoff, reconnect, NULL);
	gaim_signal_connect(handle, event_signon, now_online, NULL);

	return NULL;
}

void gaim_plugin_remove() {
	g_free(last_away);
}