1# Map - Generates simple tree of IRC network based on the output of the LINKS 2# command. 3# 4# $Id: map.pl,v 1.2 2002/02/01 22:21:20 pasky Exp pasky $ 5 6 7use strict; 8 9use vars qw ($VERSION %IRSSI $rcsid); 10 11$rcsid = '$Id: map.pl,v 1.2 2002/02/01 22:21:20 pasky Exp pasky $'; 12($VERSION) = '$Revision: 1.2 $' =~ / (\d+\.\d+) /; 13%IRSSI = ( 14 name => 'map', 15 authors => 'Petr Baudis', 16 contact => 'pasky@ji.cz', 17 url => 'http://pasky.ji.cz/~pasky/dev/irssi/', 18 license => 'GPLv2, not later', 19 description => 'Generates simple tree of IRC network based on the output of the LINKS command.' 20 ); 21 22 23my $root; # The root lc(server) 24my %tree; # Key is lc(server), value is lc(array of downlinks) 25my %rcase; # Key is lc(server), value is server 26my %sname; # Key is lc(server), value is server's name 27my @branches; # Index is level, value is (should_print_'|') 28 29 30use Irssi 20011112; 31use Irssi::Irc; 32 33 34sub cmd_map { 35 my ($data, $server, $channel) = @_; 36 37 # ugly, but no easy way how to distinguish between two mixes links output :/ 38 $server->redirect_event('command map', 0, '', 39 (split(/\s+/, $data) > 1), undef, 40 { 41 "event 364", "redir links_line", 42 "event 365", "redir links_done", 43 } ); 44 45 $server->send_raw("LINKS $data"); 46 47 Irssi::signal_stop(); 48} 49 50 51sub event_links_line { 52 my ($server, $data, $nick, $address) = @_; 53 my ($target, $to, $from, $hops, $name) = $data =~ /^(\S*)\s+(\S*)\s+(\S*)\s+:(\d+)\s+(.*)$/; 54 55 $rcase{lc($from)} = $from; 56 $rcase{lc($to)} = $to; 57 $sname{lc($to)} = $name; 58 59 if ($hops == 0) { 60 $root = lc($from); 61 } else { 62 push(@{$tree{lc($from)}}, lc($to)); 63 } 64 65 Irssi::signal_stop(); 66} 67 68sub event_links_done { 69 my ($server, $data, $nick, $address) = @_; 70 71 @branches = (' '); 72 73 print_server($root, 0) if ($root); 74 75 $root = undef; 76} 77 78sub print_server { 79 my ($parent, $level, $last) = @_; 80 my ($i, $str); 81 82 for ($i = 0; $i < $level; $i++) { 83 $str .= " " . $branches[$i]; 84 } 85 86 $str .= ($level ? "-" : " ") . " "; 87 $str .= $rcase{$parent}; 88 $str = sprintf('%-50s %s', $str, $sname{$parent}) 89 if Irssi::settings_get_bool("show_server_names"); 90 91 Irssi::print $str; 92 93 return unless ($tree{$parent}); 94 95 $branches[$level - 1] = ' ' 96 if ($level and $branches[$level - 1] eq '`'); 97 98 $branches[$level] = '|'; 99 100 while (@{$tree{$parent}}) { 101 my ($server) = shift @{$tree{$parent}}; 102 103 $last = not scalar @{$tree{$parent}}; # sounds funny, eh? :^) 104 $branches[$level] = '`' if ($last); 105 106 print_server($server, $level + 1, $last); 107 } 108} 109 110 111Irssi::command_bind("map", "cmd_map"); 112Irssi::signal_add("redir links_line", "event_links_line"); 113Irssi::signal_add("redir links_done", "event_links_done"); 114Irssi::settings_add_bool("lookandfeel", "show_server_names", 1); 115 116Irssi::Irc::Server::redirect_register("command map", 0, 0, 117 { 118 "event 364" => 1, # link line (wait...) 119 }, 120 { 121 "event 402" => 1, # not found 122 "event 263" => 1, # try again 123 "event 365" => 1, # end of links 124 }, 125 undef, 126 ); 127 128 129Irssi::print("Map $VERSION loaded..."); 130