root/lang/perl/plum/module/channel/join/connect.plm @ 3664

Revision 3664, 7.6 kB (checked in by knu, 6 years ago)

lang/perl/plum: Introduce &'abspath() and handle relative paths properly.

RevLine 
[3394]1# $Id: connect.plm 102 2007-12-14 09:39:10Z knu $
2# copyright (c)1998-2000 Yoshinori Hasegawa <hasegawa@madoka.org>
3
4package channel_join_connect;
5
6$_ = 'channel_join_connect';
7
8sub initialize {
9}
10
11sub server_open {
12  local($serverno) = @_;
13  local($userno, $i, $chan, $key, @chan, @key, $name, $keylist);
14  $userno = $'userno[$serverno];
15  if (!defined($joinlist[$userno])) {
16    $joinlist[$userno] = '';
17    $keylist = '';
18    local(%tbl, $_, $dir, $file);
[3664]19    $dir = &'abspath($userno, &'property($userno, 'directory'));
[3394]20    foreach $i (&'property($userno, 'keyfile')) {
21      $file = "$dir/$i";
22      open(H, "< $i") || next;
23      while (<H>) {
24        chomp;
25        ($chan, $key) = split(' ', $_, 2);
26        $tbl{$chan} = $key unless defined $tbl{$chan};
27      }
28      close(H);
29    }
30    foreach $channel (&'property($userno, 'channel')) {
31      ($chan, $key) = split(/\s+/, $channel, 2);
32      @chan = split(/\,/, $chan);
33      @key = split(/\,/, $key || '');
34      for ($i = 0; $i < @chan; $i++) {
35        $name = &'real($chan[$i]);
36        next unless $name;
37        $joinlist[$userno] = &'add($joinlist[$userno], $name);
38        $key = $key[$i] || $tbl{$name};
39        if ($key && !$keyword{$userno, $name}) {
40          $keyword{$userno, $name} = $key;
41        }
42        $keylist = &'add($keylist, $keyword{$userno, $name} || '');
43      }
44    }
45  }
46  foreach $i (&'property($userno, 'operserv')) {
47    &'s_print($serverno, '', 'PRIVMSG', 'OperServ', $i);
48    sleep 0.5;
49  }
50  foreach $i (&'property($userno, 'nickserv')) {
51    &'s_print($serverno, '', 'PRIVMSG', 'NickServ', $i);
52    sleep 0.5;
53  }
54  if ($joinlist[$userno]) {
55    &'s_print($serverno, '', 'JOIN', join(',', &'array($joinlist[$userno])), join(',', &'array($keylist)));
56  }
57  foreach $i (&'property($userno, 'chanserv')) {
58    &'s_print($serverno, '', 'PRIVMSG', 'ChanServ', $i);
59    sleep 0.5;
60  }
61}
62
63sub module_disable {
64  local($userno) = @_;
65  local($no, $chan);
66  undef($joinlist[$userno]);
67  foreach $key (keys(%keyword)) {
68    ($no, $chan) = split(/$;/, $key, 2);
69    next unless $no == $userno;
70    delete $keyword{$key};
71  }
72}
73
74sub ss_join {
75  local($serverno, $prefix, $cmd, @params) = @_;
76  local($name, $mode);
77  ($name, $mode) = (split(/\cG/, $params[0]), '');
78  $joinlist[$'userno[$serverno]] = &'add($joinlist[$'userno[$serverno]], $name) if &'prefix($prefix) eq $'nick[$serverno];
79  return ($prefix, $cmd, @params);
80}
81
82sub ss_kick {
83  local($serverno, $prefix, $cmd, @params) = @_;
84  $joinlist[$'userno[$serverno]] = &'remove($joinlist[$'userno[$serverno]], $params[0]) if $params[1] eq $'nick[$serverno];
85  return ($prefix, $cmd, @params);
86}
87
88sub ss_part {
89  local($serverno, $prefix, $cmd, @params) = @_;
90  $joinlist[$'userno[$serverno]] = &'remove($joinlist[$'userno[$serverno]], $params[0]) if &'prefix($prefix) eq $'nick[$serverno];
91  return ($prefix, $cmd, @params);
92}
93
94sub ss_mode {
95  local($serverno, $prefix, $cmd, @params) = @_;
96  local($chan, $mode, @modes, $char, $flag, $name, $i);
97  ($chan, $mode, @modes) = @params;
98  if (&'channel($chan)) {
99    for ($i = 0; $i < length($mode); $i++) {
100      $char = substr($mode, $i, 1);
101      if ($char eq '+' || $char eq '-') {
102        $flag = $char;
103      } elsif ($char eq 'b') {
104        shift(@modes);
105      } elsif ($char eq 'e') {
106        shift(@modes);
107      } elsif ($char eq 'I') {
108        shift(@modes);
109      } elsif ($char eq 'k') {
[3664]110        local($userno, $key);
[3394]111        $userno = $'userno[$serverno];
112        if ($flag eq '+') {
113          $key = $keyword{$userno, $chan} = shift(@modes);
114        } else {
115          $key = '';
116          delete $keyword{$userno, $chan};
117          shift(@modes);
118        }
119        local($file) = &'property($userno, 'keyfile');
[3664]120        $file = &'abspath($userno, &'property($userno, 'directory'), $file);
[3394]121        if ($file) {
122          if (open(H, "+< $file")) {
123            local(@lines, $_);
124            while (<H>) {
125              chomp;
126              local($c, $k) = split(' ', $_, 2);
127              if ($c eq $chan) {
128                $k = $key;
129                $key = '';
130              }
131              push(@lines, "$c $k\n") if $k ne '';
132            }
133            seek(H, 0, 0);
134            print H @lines;
135            print H "$chan $key\n" if $key ne '';
136            truncate(H, tell(H));
137            close(H);
138          } elsif ($key ne '' && open(H, "> $file")) {
139            print H "$chan $key\n";
140            close(H);
141          }
142        }
143      } elsif ($char eq 'l') {
144        if ($flag eq '+') {
145          shift(@modes);
146        }
147      } elsif ($char eq 'O') {
148        shift(@modes);
149      } elsif ($char eq 'o') {
150        shift(@modes);
151      } elsif ($char eq 'v') {
152        shift(@modes);
153      }
154    }
155  }
156  return ($prefix, $cmd, @params);
157}
158
159__END__
160
161=head1 名前
162
163channel/join/connect.plm - サーバに接続したときに指定したチャンネルに入る
164
165=head1 説明
166
167サーバに接続したときに、指定したチャンネルに入ります。
168サーバとの接続が切れて再び接続し直したときは、
169指定したチャンネルとは関係なく、
170接続が切れる前に入っていたチャンネルに入ります。
171
172=head1 プロパティ
173
174=over 4
175
176=item channel.join.connect.nickserv* (メッセージ)
177
178サーバに接続したときに nickserv に送るメッセージを指定します。
179メッセージはチャンネルに入る前に送られます。
180
181=item channel.join.connect.operserv* (メッセージ)
182
183サーバに接続したときに operserv に送るメッセージを指定します。
184メッセージはチャンネルに入る前に送られます。
185
186=item channel.join.connect.channel* (チャンネル) (キー)
187
188サーバに接続したときに入るチャンネルを指定します。
189チャンネルのキーが指定されているときは、そのキーを使います。
190
191=item channel.join.connect.chanserv* (メッセージ)
192
193チャンネルに入った直後に chanserv に送るメッセージを指定します。
194
195=item channel.join.connect.keyfile* (ファイル名)
196
197チャンネルとキーの対を読み込み、またキーの変更(mode +k)にしたがって
198保存するファイルを指定します。ファイルの形式は、行ごとにスペースで
199区切ってチャンネル名とキーを並べたものです。
200
201複数指定した場合、すべてのファイルからチャンネル名とキーの対を
202読み込みますが、最初に指定したファイルのみが更新対象になります。
203
204(注意)
205キーファイルが読み込まれるのはモジュールがロードされたとき
206のみです。接続中にキーファイルを書き換えても内部状態には
207反映されません。
208
209=back
210
211=head1 設定例
212
213    + channel/join/connect.plm
214    channel.join.connect.channel: #まどか mdk
215
216サーバに接続したときに、「#まどか」に「mdk」というキーで入ります。
217
218    + channel/join/connect.plm
219    channel.join.connect.channel: #まどか:*.jp,#ぷらむ:*.jp
220    channel.join.connect.channel: #ぷらむ
221
222サーバに接続したときに、「#まどか:*.jp」、「#ぷらむ:*.jp」、
223「#ぷらむ」の3つのチャンネルに入ります。
224
225    + channel/join/connect.plm
226    channel.join.connect.nickserv: identify foobar
227    channel.join.connect.channel: #somechannel
228    channel.join.connect.chanserv: op #somechannel
229
230nickserv サービスに登録されたニックを認証し、 #somechannel に入った後、
231chanserv に op を要求します。
232
233    + channel/join/connect.plm
234    channel.join.connect.keyfile: plum.key
235
236ファイル plum.key からチャンネルとキーの対を読み込み、また変更に
237応じて保存します。
238
239=cut
Note: See TracBrowser for help on using the browser.