html/defaultchanmode.pl
1 #!/usr/bin/perl -w
2
3 # USAGE:
4 #
5 # /SET default_chanmode <modes>
6 # - sets the desired default chanmodes
7 #
8 # Written by Jakub Jankowski <shasta@atn.pl>
9 # for Irssi 0.7.98.CVS
10 #
11 # please report any bugs
12
13 use strict;
14 use vars qw($VERSION %IRSSI);
15
16 $VERSION = "1.1";
17 %IRSSI = (
18 authors => 'Jakub Jankowski',
19 contact => 'shasta@atn.pl',
20 name => 'Default Chanmode',
21 description => 'Allows your client to automatically set desired chanmode upon a join to an empty channel.',
22 license => 'GNU GPLv2 or later',
23 url => 'http://irssi.atn.pl/',
24 );
25
26 use Irssi 20011211.0107 ();
27 use Irssi::Irc;
28
29 # defaults
30 my $default_chanmode = "";
31
32 # str parse_mode($string)
33 # gets +a-e+bc-fg xyz
34 # returns +abc-efg xyz
35 sub parse_mode {
36 my ($string) = @_;
37 my ($modeStr, $rest) = split(/ +/, $string, 2);
38 my @modeParams = split(/ +/, $rest);
39 my $ptr = 0;
40 my ($mode, $plusmodes, $minusmodes, $args, $finalstring);
41
42 # processing the default_chanmode setting
43 foreach my $char (split(//, $modeStr)) {
44 if ($char eq "+") {
45 $mode = "+";
46 } elsif ($char eq "-") {
47 $mode = "-";
48 } else {
49 if ($mode eq "+") {
50 $plusmodes .= $char;
51 } elsif ($mode eq "-") {
52 $minusmodes .= $char;
53 }
54 if ($char =~ /[beIqoOdhvk]/ || ($char eq "l" && $mode eq "+")) {
55 # those are modes with arguments, so increase the pointer
56 $args .= " ".$modeParams[$ptr++];
57 }
58 }
59 }
60
61 # concatenating results
62 $finalstring .= "+".$plusmodes if (length($plusmodes) > 0);
63 $finalstring .= "-".$minusmodes if (length($minusmodes) > 0);
64 $finalstring .= $args if (length($args) > 0);
65
66 # debug stuff if you want
67 # Irssi::print("parse_mode($string) returning '$finalstring'");
68
69 return $finalstring;
70 }
71
72 # void event_channel_sync($channel)
73 # triggered on join
74 sub event_channel_sync {
75 my ($channel) = @_;
76
77 # return unless default_chanmode contains something valuable
78 my $mode = parse_mode(Irssi::settings_get_str('default_chanmode'));
79 return unless $mode;
80
81 # return unless $channel is active, synced, not modeless, and we're a chanop
82 return unless ($channel && $channel->{synced} && $channel->{chanop} && !$channel->{no_modes});
83
84 # check if we're the only one visitor
85 my @nicks = $channel->nicks();
86 return unless (scalar(@nicks) == 1);
87
88 # final stage: issue the MODE
89 $channel->command("/MODE ".$channel->{name}." ".$mode);
90 }
91
92 Irssi::settings_add_str('misc', 'default_chanmode', $default_chanmode);
93 Irssi::signal_add_last('channel sync', 'event_channel_sync');
94
95 # changes:
96 #
97 # 25.01.2002: Initial release (v1.0)
98 # 24.02.2002: splitted into two subroutines, minor cleanups (v1.1)