summaryrefslogtreecommitdiffstats
path: root/scripts/map.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/map.pl')
-rw-r--r--scripts/map.pl129
1 files changed, 129 insertions, 0 deletions
diff --git a/scripts/map.pl b/scripts/map.pl
new file mode 100644
index 0000000..1d4c713
--- /dev/null
+++ b/scripts/map.pl
@@ -0,0 +1,129 @@
+# Map - Generates simple tree of IRC network based on the output of the LINKS
+# command.
+#
+# $Id: map.pl,v 1.2 2002/02/01 22:21:20 pasky Exp pasky $
+
+
+use strict;
+
+use vars qw ($VERSION %IRSSI $rcsid);
+
+$rcsid = '$Id: map.pl,v 1.2 2002/02/01 22:21:20 pasky Exp pasky $';
+($VERSION) = '$Revision: 1.2 $' =~ / (\d+\.\d+) /;
+%IRSSI = (
+ name => 'map',
+ authors => 'Petr Baudis',
+ contact => 'pasky@ji.cz',
+ url => 'http://pasky.ji.cz/~pasky/dev/irssi/',
+ license => 'GPLv2, not later',
+ description => 'Generates simple tree of IRC network based on the output of the LINKS command.'
+ );
+
+
+my $root; # The root lc(server)
+my %tree; # Key is lc(server), value is lc(array of downlinks)
+my %rcase; # Key is lc(server), value is server
+my %sname; # Key is lc(server), value is server's name
+my @branches; # Index is level, value is (should_print_'|')
+
+
+use Irssi 20011112;
+use Irssi::Irc;
+
+
+sub cmd_map {
+ my ($data, $server, $channel) = @_;
+
+ # ugly, but no easy way how to distinguish between two mixes links output :/
+ $server->redirect_event('command map', 0, '',
+ (split(/\s+/, $data) > 1), undef,
+ {
+ "event 364", "redir links_line",
+ "event 365", "redir links_done",
+ } );
+
+ $server->send_raw("LINKS $data");
+
+ Irssi::signal_stop();
+}
+
+
+sub event_links_line {
+ my ($server, $data, $nick, $address) = @_;
+ my ($target, $to, $from, $hops, $name) = $data =~ /^(\S*)\s+(\S*)\s+(\S*)\s+:(\d+)\s+(.*)$/;
+
+ $rcase{lc($from)} = $from;
+ $rcase{lc($to)} = $to;
+ $sname{lc($to)} = $name;
+
+ if ($hops == 0) {
+ $root = lc($from);
+ } else {
+ push(@{$tree{lc($from)}}, lc($to));
+ }
+
+ Irssi::signal_stop();
+}
+
+sub event_links_done {
+ my ($server, $data, $nick, $address) = @_;
+
+ @branches = (' ');
+
+ print_server($root, 0) if ($root);
+
+ $root = undef;
+}
+
+sub print_server {
+ my ($parent, $level, $last) = @_;
+ my ($i, $str);
+
+ for ($i = 0; $i < $level; $i++) {
+ $str .= " " . $branches[$i];
+ }
+
+ $str .= ($level ? "-" : " ") . " ";
+ $str .= $rcase{$parent};
+ $str = sprintf('%-50s %s', $str, $sname{$parent})
+ if Irssi::settings_get_bool("show_server_names");
+
+ Irssi::print $str;
+
+ return unless ($tree{$parent});
+
+ $branches[$level - 1] = ' '
+ if ($level and $branches[$level - 1] eq '`');
+
+ $branches[$level] = '|';
+
+ while (@{$tree{$parent}}) {
+ my ($server) = shift @{$tree{$parent}};
+
+ $last = not scalar @{$tree{$parent}}; # sounds funny, eh? :^)
+ $branches[$level] = '`' if ($last);
+
+ print_server($server, $level + 1, $last);
+ }
+}
+
+
+Irssi::command_bind("map", "cmd_map");
+Irssi::signal_add("redir links_line", "event_links_line");
+Irssi::signal_add("redir links_done", "event_links_done");
+Irssi::settings_add_bool("lookandfeel", "show_server_names", 1);
+
+Irssi::Irc::Server::redirect_register("command map", 0, 0,
+ {
+ "event 364" => 1, # link line (wait...)
+ },
+ {
+ "event 402" => 1, # not found
+ "event 263" => 1, # try again
+ "event 365" => 1, # end of links
+ },
+ undef,
+ );
+
+
+Irssi::print("Map $VERSION loaded...");