use Irssi;
use strict;
use warnings;
use Text::ParseWords;
use vars qw($VERSION %IRSSI); 
$VERSION = "2.2";
%IRSSI = (
  authors     => "Liam Hopkins",
  contact     => "we.hopkins\@gmail.com",
  commands    => "betterlist",
  name        => "betterlist",
  description => "/betterlist <perl-regexp>",
  license     => "GPL",
  modules     => "Text::ParseWords",
);


my $running = 0; # flag to prevent overlapping requests.
my $match;

sub call_list_cmd {
  my ($server, $args) = @_;

  # set a one-time redirect for handling responses of a given command
  $server->redirect_event('list', 1, '', -1, 'redir my_timeout',
    {
      'event 321' => 'redir my_liststart',
      'event 322' => 'redir my_list',
      'event 323' => 'redir my_listend',
      ''          => 'event empty',
    });

  # execute the command
  $server->send_raw("LIST");
}

sub event_list {
    my ($server, $data) = @_;
    my $channel = ( split / +/, $data)[1];

    Irssi::active_win->print("Matched $channel", MSGLEVEL_CLIENTCRAP) if ($channel =~ /$match/)
 }

sub event_liststart {
  Irssi::active_win->print("Looking for $match", MSGLEVEL_CLIENTCRAP);
}

sub event_listend {
  Irssi::active_win->print("End of /LIST", MSGLEVEL_CLIENTCRAP);
  $running = 0;
}

sub event_timeout {
  my ($server, $data) = @_;
  Irssi::print("timeout", MSGLEVEL_CLIENTCRAP);
  $running = 0;
}

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

  if ($running) {
    Irssi::active_win->print("please try again shortly.", MSGLEVEL_CLIENTCRAP);
    return;
  } 
  $running = 1;
  my (@args)  = &quotewords(' ', 1, $data);
  ($match) = &quotewords(' ', 0, shift(@args));
  call_list_cmd($server);
  Irssi::signal_stop();
}

Irssi::signal_add_first ({
    'redir my_liststart'       => 'event_liststart',
    'redir my_list'            => 'event_list',
    'redir my_listend'         => 'event_listend',
});

Irssi::command_bind("betterlist", \&betterlist);

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