* idle.c - I'dle Mak'er plugin for Gaim * This file is part of Gaim. * Gaim is the legal property of its developers, whose names are too numerous * to list here. Please refer to the COPYRIGHT file distributed with this * 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 /* This plugin no longer depends on gtk */ #define IDLE_PLUGIN_ID "core-idle" static GList *idled_accts = NULL; unidle_filter(GaimAccount *acct) if (g_list_find(idled_accts, acct)) idleable_filter(GaimAccount *account) prpl = gaim_find_prpl(gaim_account_get_protocol_id(account)); g_return_val_if_fail(prpl != NULL, FALSE); return (GAIM_PLUGIN_PROTOCOL_INFO(prpl)->set_idle != NULL); set_idle_time(GaimAccount *acct, int mins_idle) GaimConnection *gc = gaim_account_get_connection(acct); GaimPresence *presence = gaim_account_get_presence(acct); "setting idle time for %s to %d\n", gaim_account_get_username(acct), mins_idle); t = time(NULL) - (60 * mins_idle); /* subtract seconds idle from current time */ gaim_presence_set_idle(presence, mins_idle ? TRUE : FALSE, t); idle_action_ok(void *ignored, GaimRequestFields *fields) int tm = gaim_request_fields_get_integer(fields, "mins"); GaimAccount *acct = gaim_request_fields_get_account(fields, "acct"); /* only add the account to the GList if it's not already been idled */ if (!unidle_filter(acct)) "%s hasn't been idled yet; adding to list.\n", gaim_account_get_username(acct)); idled_accts = g_list_append(idled_accts, acct); idle_all_action_ok(void *ignored, GaimRequestFields *fields) GaimAccount *acct = NULL; GList *l = gaim_accounts_get_all_active(); int tm = gaim_request_fields_get_integer(fields, "mins"); const char *prpl_id = NULL; acct = (GaimAccount *)(l->data); prpl_id = gaim_account_get_protocol_id(acct); if(acct && idleable_filter(acct)) { gaim_debug_misc("idle", "Idling %s.\n", gaim_account_get_username(acct)); if(!g_list_find(idled_accts, acct)) idled_accts = g_list_append(idled_accts, acct); unidle_action_ok(void *ignored, GaimRequestFields *fields) GaimAccount *acct = gaim_request_fields_get_account(fields, "acct"); set_idle_time(acct, 0); /* unidle the account */ /* once the account has been unidled it shouldn't be in the list */ idled_accts = g_list_remove(idled_accts, acct); idle_action(GaimPluginAction *action) /* Use the super fancy request API */ GaimRequestFields *request; GaimRequestFieldGroup *group; group = gaim_request_field_group_new(NULL); field = gaim_request_field_account_new("acct", _("Account"), NULL); gaim_request_field_account_set_filter(field, idleable_filter); gaim_request_field_account_set_show_all(field, FALSE); gaim_request_field_group_add_field(group, field); field = gaim_request_field_int_new("mins", _("Minutes"), 10); gaim_request_field_group_add_field(group, field); request = gaim_request_fields_new(); gaim_request_fields_add_group(request, group); gaim_request_fields(action->plugin, _("Set Account Idle Time"), _("_Set"), G_CALLBACK(idle_action_ok), unidle_action(GaimPluginAction *action) GaimRequestFields *request; GaimRequestFieldGroup *group; gaim_notify_info(NULL, NULL, _("None of your accounts are idle."), NULL); group = gaim_request_field_group_new(NULL); field = gaim_request_field_account_new("acct", _("Account"), NULL); gaim_request_field_account_set_filter(field, unidle_filter); gaim_request_field_account_set_show_all(field, FALSE); gaim_request_field_group_add_field(group, field); request = gaim_request_fields_new(); gaim_request_fields_add_group(request, group); gaim_request_fields(action->plugin, _("Unset Account Idle Time"), _("_Unset"), G_CALLBACK(unidle_action_ok), idle_all_action(GaimPluginAction *action) GaimRequestFields *request; GaimRequestFieldGroup *group; group = gaim_request_field_group_new(NULL); field = gaim_request_field_int_new("mins", _("Minutes"), 10); gaim_request_field_group_add_field(group, field); request = gaim_request_fields_new(); gaim_request_fields_add_group(request, group); gaim_request_fields(action->plugin, _("Set Idle Time for All Accounts"), _("_Set"), G_CALLBACK(idle_all_action_ok), unidle_all_action(GaimPluginAction *action) /* freeing the list here will cause segfaults if the user idles an account * after the list is freed */ for (l = idled_accts; l; l = l->next) GaimAccount *account = l->data; set_idle_time(account, 0); g_list_free(idled_accts); actions(GaimPlugin *plugin, gpointer context) GaimPluginAction *act = NULL; act = gaim_plugin_action_new(_("Set Account Idle Time"), l = g_list_append(l, act); act = gaim_plugin_action_new(_("Unset Account Idle Time"), l = g_list_append(l, act); act = gaim_plugin_action_new(_("Set Idle Time for All Accounts"), l = g_list_append(l, act); act = gaim_plugin_action_new( _("Unset Idle Time for All Idled Accounts"), unidle_all_action); l = g_list_append(l, act); signing_off_cb(GaimConnection *gc, void *data) account = gaim_connection_get_account(gc); idled_accts = g_list_remove(idled_accts, account); plugin_load(GaimPlugin *plugin) gaim_signal_connect(gaim_connections_get_handle(), "signing-off", GAIM_CALLBACK(signing_off_cb), NULL); plugin_unload(GaimPlugin *plugin) static GaimPluginInfo info = N_("Allows you to hand-configure how long you've been idle"), N_("Allows you to hand-configure how long you've been idle"), "Eric Warmenhoven <eric@warmenhoven.org>", init_plugin(GaimPlugin *plugin) GAIM_INIT_PLUGIN(idle, init_plugin, info)