# /AUTOAWAY <n> - Mark user away after <n> seconds of inactivity
# /AWAY - play nice with autoaway
# New, brighter, whiter version of my autoaway script. Actually works :)
# (c) 2000 Larry Daffner (vizzie@airmail.net)
#     You may freely use, modify and distribute this script, as long as
#      1) you leave this notice intact
#      2) you don't pretend my code is yours
#      3) you don't pretend your code is mine
#
# share and enjoy!

# A simple script. /autoaway <n> will mark you as away automatically if
# you have not typed any commands in <n> seconds. (<n>=0 disables the feature)
# It will also automatically unmark you away the next time you type a command.
# Note that using the /away command will disable the autoaway mechanism, as
# well as the autoreturn. (when you unmark yourself, the autoaway wil
# restart again)

# Thanks to Adam Monsen for multiserver and config file fix

use strict;
use Irssi;
use Irssi::Irc;

use vars qw($VERSION %IRSSI);
$VERSION = "0.5";
%IRSSI = (
    authors => 'Larry "Vizzie" Daffner',
    contact => 'vizzie@airmail.net',
    name => 'Automagic away setting',
    description => 'Automatically goes  away after defined inactivity',
    license => 'BSD',
    url => 'http://www.flamingpackets.net/~vizzie/irssi/',
    changed => '2018-12-02',
);

my ($autoaway_sec, $autoaway_to_tag, $autoaway_state);
$autoaway_state = 0;

#
# /AUTOAWAY - set the autoaway timeout
#
sub cmd_autoaway {
  my ($data, $server, $channel) = @_;

  if (!($data =~ /^[0-9]+$/)) {
    Irssi::print("autoaway: usage: /autoaway <seconds>");
    return 1;
  }

  $autoaway_sec = $data;

  if ($autoaway_sec) {
    Irssi::settings_set_int("autoaway_timeout", $autoaway_sec);
    Irssi::print("autoaway timeout set to $autoaway_sec seconds");
  } else {
    Irssi::print("autoway disabled");
  }

  if (defined($autoaway_to_tag)) {
    Irssi::timeout_remove($autoaway_to_tag);
    $autoaway_to_tag = undef;
  }

  if ($autoaway_sec) {
    $autoaway_to_tag =
      Irssi::timeout_add($autoaway_sec*1000, "auto_timeout", "");
  }
}

#
# away = Set us away or back, within the autoaway system
sub cmd_away {
  my ($data, $server, $channel) = @_;

  if ($data eq "") {
    $autoaway_state = 0;
  } else {
    if ($autoaway_state eq 0) {
      Irssi::timeout_remove($autoaway_to_tag);
      $autoaway_to_tag = undef;
      $autoaway_state = 2;
    }
  }
}

sub auto_timeout {
  my ($data, $server) = @_;

  # we're in the process.. don't touch anything.
  $autoaway_state = 3;
  foreach my $server (Irssi::servers()) {
      $server->command("/AWAY autoaway after $autoaway_sec seconds");
  }

  Irssi::timeout_remove($autoaway_to_tag);
  $autoaway_state = 1;
}

sub reset_timer {
   if ($autoaway_state eq 1) {
     $autoaway_state = 3;
     foreach my $server (Irssi::servers()) {
         $server->command("/AWAY");
     }

     $autoaway_state = 0;
   }
  if ($autoaway_state eq 0) {
    if (defined($autoaway_to_tag)) {
      Irssi::timeout_remove($autoaway_to_tag);
      $autoaway_to_tag = undef();
    }
    if ($autoaway_sec) {
      $autoaway_to_tag = Irssi::timeout_add($autoaway_sec*1000, "auto_timeout", "");
    }
  }
}

Irssi::settings_add_int("misc", "autoaway_timeout", 0);

$autoaway_sec = Irssi::settings_get_int("autoaway_timeout");
reset_timer();

Irssi::command_bind('autoaway', 'cmd_autoaway');
Irssi::command_bind('away', 'cmd_away');
Irssi::signal_add('send command', 'reset_timer');

# vim:set expandtab ts=2 sw=2:
