html/chops.pl


   1 #!/usr/bin/perl -w
   2 
   3 # chops.pl: Simulates BitchX's /chops and /nops commands
   4 # prints list with nickname and userhost
   5 #
   6 # Written by Jakub Jankowski <shasta@atn.pl>
   7 # for irssi 0.7.98.CVS
   8 #
   9 # todo:
  10 #  - enhance the look of the script
  11 #
  12 # sample /chops output:
  13 # [11:36:33] -!- Irssi: Information about chanops on #irssi
  14 # [11:36:33] -!- Irssi: [nick]    [hostmask]
  15 # [11:36:33] -!- Irssi: shasta    shasta@quasimodo.olsztyn.tpsa.pl
  16 # [11:36:34] -!- Irssi: cras      cras@xmunkki.org
  17 # [11:36:34] -!- Irssi: fuchs     fox@wh8043.stw.uni-rostock.de
  18 # [11:36:34] -!- Irssi: End of listing
  19 #
  20 # sample /nops output:
  21 # [11:40:34] -!- Irssi: Information about non-ops on #irssi
  22 # [11:40:34] -!- Irssi: [nick]    [hostmask]
  23 # [11:40:34] -!- Irssi: globe_    ~globe@ui20i21hel.dial.kolumbus.fi
  24 # [11:40:34] -!- Irssi: shastaBX  shasta@thorn.kanal.olsztyn.pl
  25 # [11:40:34] -!- Irssi: End of listing
  26 
  27 use strict;
  28 use vars qw($VERSION %IRSSI);
  29 
  30 $VERSION = "20020223";
  31 %IRSSI = (
  32     authors     => 'Jakub Jankowski',
  33     contact     => 'shasta@atn.pl',
  34     name        => 'chops',
  35     description => 'Simulates BitchX\'s /CHOPS and /NOPS commands.',
  36     license     => 'GNU GPLv2 or later',
  37     url         => 'http://irssi.atn.pl/',
  38 );
  39 
  40 use Irssi;
  41 use Irssi::Irc;
  42 
  43 Irssi::theme_register([
  44 	'chops_nochan', 'You are not on a channel',
  45 	'chops_notsynced', 'Channel $0 is not fully synchronized yet',
  46 	'chops_noone', 'There are no $0 to list',
  47 	'chops_start', 'Information about $0 on $1',
  48 	'chops_end', 'End of listing',
  49 	'chops_header', '[nick]    [hostmask]',
  50 	'chops_line', '$[!9]0 $[!50]1'
  51 ]);
  52 
  53 sub cmd_chops {
  54 	my ($data, $server, $channel) = @_;
  55 	my @chanops = ();
  56 
  57 	# if we're not on a channel, print appropriate message and return
  58 	if (!$channel) {
  59 		Irssi::printformat(MSGLEVEL_CLIENTNOTICE, 'chops_nochan');
  60 		return;
  61 	}
  62 
  63 	# if channel is not fully synced yet, print appropriate message and return
  64 	if (!$channel->{synced}) {
  65 		Irssi::printformat(MSGLEVEL_CLIENTNOTICE, 'chops_notsynced', $channel->{name});
  66 		return;
  67 	}
  68 
  69 	# gather all opped people into an array
  70 	foreach my $nick ($channel->nicks()) {
  71 		push(@chanops, $nick) if ($nick->{op});
  72 	}
  73 
  74 	# if there are no chanops, print appropriate message and return
  75 	if (scalar(@chanops) < 1) {
  76 		Irssi::printformat(MSGLEVEL_CLIENTNOTICE, 'chops_noone', "chanops");
  77 		return;
  78 	}
  79 
  80 	# print a starting message
  81 	Irssi::printformat(MSGLEVEL_CLIENTNOTICE, 'chops_start', "chanops", $channel->{name});
  82 
  83 	# print listing header
  84 	Irssi::printformat(MSGLEVEL_CLIENTNOTICE, 'chops_header');
  85 
  86 	# print every chanop's nick, status (gone/here), userhost and hopcount
  87 	foreach my $nick (@chanops) {
  88 		my $userhost = $nick->{host};
  89 		# if user's host is longer than 50 characters, cut it to 47 to fit in column
  90 		$userhost = substr($userhost, 0, 47) if (length($userhost) > 50);
  91 		Irssi::printformat(MSGLEVEL_CLIENTNOTICE, 'chops_line', $nick->{nick}, $userhost);
  92 	}
  93 
  94 	# print listing footer
  95 	Irssi::printformat(MSGLEVEL_CLIENTNOTICE, 'chops_end');
  96 }
  97 
  98 sub cmd_nops {
  99 	my ($data, $server, $channel) = @_;
 100 	my @nonops = ();
 101 
 102 	# if we're not on a channel, print appropriate message and return
 103 	if (!$channel) {
 104 		Irssi::printformat(MSGLEVEL_CLIENTNOTICE, 'chops_nochan');
 105 		return;
 106 	}
 107 
 108 	# if channel is not fully synced yet, print appropriate message and return
 109 	if (!$channel->{synced}) {
 110 		Irssi::printformat(MSGLEVEL_CLIENTNOTICE, 'chops_notsynced', $channel->{name});
 111 		return;
 112 	}
 113 
 114 	# gather all not opped people into an array
 115 	foreach my $nick ($channel->nicks()) {
 116 		push(@nonops, $nick) if (!$nick->{op});
 117 	}
 118 
 119 	# if there are only chanops, print appropriate message and return
 120 	if (scalar(@nonops) < 1) {
 121 		Irssi::printformat(MSGLEVEL_CLIENTNOTICE, 'chops_noone', "non-ops");
 122 		return;
 123 	}
 124 
 125 	# print a starting message
 126 	Irssi::printformat(MSGLEVEL_CLIENTNOTICE, 'chops_start', "non-ops", $channel->{name});
 127 
 128 	# print listing header
 129 	Irssi::printformat(MSGLEVEL_CLIENTNOTICE, 'chops_header');
 130 
 131 	# print every chanop's nick, status (gone/here), userhost and hopcount
 132 	foreach my $nick (@nonops) {
 133 		my $userhost = $nick->{host};
 134 		# if user's host is longer than 50 characters, cut it to 47 to fit in column
 135 		$userhost = substr($userhost, 0, 47) if (length($userhost) > 50);
 136 		Irssi::printformat(MSGLEVEL_CLIENTNOTICE, 'chops_line', $nick->{nick}, $userhost);
 137 	}
 138 
 139 	# print listing footer
 140 	Irssi::printformat(MSGLEVEL_CLIENTNOTICE, 'chops_end');
 141 }
 142 
 143 Irssi::command_bind("chops", "cmd_chops");
 144 Irssi::command_bind("nops", "cmd_nops");