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");