home *** CD-ROM | disk | FTP | other *** search
/ ftp.madoka.org / 2014.12.ftp.madoka.org.tar / ftp.madoka.org / pub / plum / plum2_33_1.lzh / module / auto / oper.plm < prev    next >
Text File  |  1999-03-24  |  11KB  |  368 lines

  1. <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"><!-- $_ if 0; # -*- perl -*-
  2. # $Id: oper.plm,v 2.36 1999/01/28 14:55:19 hasegawa Exp $
  3. # copyright (c)1997-1999 Yoshinori Hasegawa <hasegawa@madoka.org>
  4.  
  5. package auto_oper;
  6.  
  7. $_ = 'auto_oper';
  8.  
  9. sub ss_privmsg {
  10.   local($serverno, $prefix, $cmd, @params) = @_;
  11.   local($userno, $nick, %alias, $regex);
  12.   $userno = $'userno[$serverno];
  13.   $nick = &'prefix($prefix);
  14.   %alias = &get_alias_user($userno, $prefix);
  15.   $alias{'nick.now'} = $nick;
  16.   if (&'channel($params[0])) {
  17.     $alias{'channel'} = $params[0];
  18.   }
  19.   foreach $req (&'property($userno, 'request')) {
  20.     $regex = &'regex(&'jis_euc($req));
  21.     next unless &'jis_euc($params[1]) =~ /$regex/;
  22.     if (!&'channel($params[0])) {
  23.       foreach $reply (&'property($userno, 'private')) {
  24.         &privmsg($serverno, $nick, &'format($reply, %alias));
  25.       }
  26.     } elsif (!&'exist($'nameslist{$serverno, $params[0]}, $nick, "\+$nick", "\@$nick")) {
  27.       foreach $reply (&'property($userno, 'out')) {
  28.         &privmsg($serverno, $nick, &'format($reply, %alias));
  29.       }
  30.     } elsif (!&'exist($'nameslist{$serverno, $params[0]}, "\@$'nick[$serverno]")) {
  31.       foreach $reply (&'property($userno, 'notoper')) {
  32.         &privmsg($serverno, $params[0], &'format($reply, %alias));
  33.       }
  34.     } elsif (&'exist($'nameslist{$serverno, $params[0]}, "\@$nick")) {
  35.       foreach $reply (&'property($userno, 'oper')) {
  36.         &privmsg($serverno, $params[0], &'format($reply, %alias));
  37.       }
  38.     } elsif (!&check_mask($userno, $prefix, $params[0])) {
  39.       foreach $reply (&'property($userno, 'deny')) {
  40.         &privmsg($serverno, $params[0], &'format($reply, %alias));
  41.       }
  42.     } else {
  43.       foreach $reply (&'property($userno, 'message')) {
  44.         &privmsg($serverno, $params[0], &'format($reply, %alias));
  45.       }
  46.       &'s_print($serverno, '', 'MODE', $params[0], '+o', $nick);
  47.     }
  48.     last;
  49.   }
  50.   return ($prefix, $cmd, @params);
  51. }
  52.  
  53. sub privmsg {
  54.   local($serverno, $to, $msg) = @_;
  55.   if ($msg) {
  56.     &'s_print($serverno, '', 'PRIVMSG', $to, $msg);
  57.     foreach $cno (&'array($'clientlist)) {
  58.       next unless $'avail[$cno];
  59.       next unless $'server[$cno] == $serverno;
  60.       &'c_print($cno, &'user($cno), 'PRIVMSG', $to, $msg);
  61.     }
  62.   }
  63. }
  64.  
  65. sub check_mask {
  66.   local($userno, $prefix, $chan) = @_;
  67.   local($user, $chlist, $list);
  68.   foreach $mask (&'property($userno, 'mask')) {
  69.     ($user, $chlist) = split(/\s+/, $mask);
  70.     $list = '';
  71.     foreach $vchan (split(/\,/, $chlist || '')) {
  72.       $list = &'add($list, &'real($vchan));
  73.     }
  74.     if (&'channel($chan)) {
  75.       next unless (!$list || &'exist($list, $chan));
  76.     } else {
  77.       next unless (!$list || &'exist($list, '*'));
  78.     }
  79.     if ($user =~ /^\-/) {
  80.       $regex = &'regex(substr($user, 1));
  81.       return 0 if $prefix =~ /$regex/i;
  82.     }
  83.     if ($user =~ /^\+/) {
  84.       $regex = &'regex(substr($user, 1));
  85.     } else {
  86.       $regex = &'regex($user);
  87.     }
  88.     return 1 if $prefix =~ /$regex/i;
  89.   }
  90.   return 0;
  91. }
  92.  
  93. sub get_alias_user {
  94.   local($userno, $from, $prefix) = @_;
  95.   local($file, @list);
  96.   $file = &'property($userno, 'alias');
  97.   foreach $list (&split_list('nick', &read_file($file))) {
  98.     @list = &'array($list);
  99.     if (&match_alias_user($from, @list)) {
  100.       return &parse_alias($prefix, @list);
  101.     }
  102.   }
  103.   return ();
  104. }
  105.  
  106. sub match_alias_user {
  107.   local($from, @list) = @_;
  108.   local($var, $arg, $regex);
  109.   foreach $line (@list) {
  110.     ($var, $arg) = split(/\s+/, $line, 2);
  111.     next unless "\L$var\E" eq 'user';
  112.     $regex = &'regex($arg);
  113.     next unless $from =~ /$regex/i;
  114.     return 1;
  115.   }
  116.   return 0;
  117. }
  118.  
  119. sub parse_alias {
  120.   local($prefix, @list) = @_;
  121.   local(%alias, $var, $arg, $key);
  122.   %alias = ();
  123.   foreach $line (@list) {
  124.     ($var, $arg) = split(/\s+/, $line, 2);
  125.     $var = "\L$var\E";
  126.     if ($prefix) {
  127.       $key = $prefix . '.' . $var;
  128.     } else {
  129.       $key = $var;
  130.     }
  131.     next if defined($alias{$key});
  132.     if ($var eq 'nick') {
  133.       $alias{$key} = (split(/\,/, $arg))[0];
  134.     } elsif ($var eq 'name') {
  135.       $alias{$key} = (split(/\s+/, $arg))[0];
  136.     } else {
  137.       $alias{$key} = $arg;
  138.     }
  139.   }
  140.   return %alias;
  141. }
  142.  
  143. sub split_list {
  144.   local($field, @list) = @_;
  145.   local($var, $arg, @array, @entry);
  146.   $field = "\L$field\E";
  147.   @array = ();
  148.   @entry = ();
  149.   foreach $line (@list) {
  150.     ($var, $arg) = split(/\s*\:\s*/, $line, 2);
  151.     if ($field eq "\L$var\E") {
  152.       push(@array, &'list(@entry)) if @entry;
  153.       @entry = ();
  154.     }
  155.     push(@entry, $var . ' ' . $arg);
  156.   }
  157.   push(@array, &'list(@entry)) if @entry;
  158.   return @array;
  159. }
  160.  
  161. sub read_file {
  162.   local($file) = @_;
  163.   local($name, $code, $mtime, @data, $line);
  164.   ($name, $code) = &filename($file);
  165.   $mtime = (stat($name))[9];
  166.   if (defined($mtime)) {
  167.     $modify{$name} = -1 unless defined($modify{$name});
  168.     if ($modify{$name} != $mtime) {
  169.       if (open(TMP, $name)) {
  170.         @data = ();
  171.         while (defined($line = <TMP>)) {
  172.           $line =~ s/^\s+//;
  173.           next if $line =~ /^[\#\;]/;
  174.           $line =~ tr/\r\n//d;
  175.           next unless $line;
  176.           $line =~ s/\s+$//;
  177.           $line = &code_jis($line, $code) if $code;
  178.           push(@data, $line);
  179.         }
  180.         close(TMP);
  181.         $modify{$name} = $mtime;
  182.         $cache{$name} = &'list(@data);
  183.         return @data;
  184.       }
  185.     } else {
  186.       return &'array($cache{$name});
  187.     }
  188.   }
  189.   return ();
  190. }
  191.  
  192. sub filename {
  193.   local($file) = @_;
  194.   local($idx, $name, $code);
  195.   return ('', '') unless $file;
  196.   if (($idx = rindex($file, ';')) != -1) {
  197.     $name = substr($file, 0, $idx);
  198.     $code = substr($file, $idx + 1);
  199.   } else {
  200.     $name = $file;
  201.     $code = '';
  202.   }
  203.   return (&'expand($name), $code);
  204. }
  205.  
  206. sub code_jis {
  207.   local($line, $list) = @_;
  208.   foreach $code (split(/\,/, "\L$list\E")) {
  209.     if ($code eq 'euc') {
  210.       $line = &'euc_jis($line);
  211.     } elsif ($code eq 'jis') {
  212.       $line = &'jis_jis($line);
  213.     } elsif ($code eq 'sjis') {
  214.       $line = &'sjis_jis($line);
  215.     }
  216.   }
  217.   return $line;
  218. }
  219.  
  220. sub jis_code {
  221.   local($line, $list) = @_;
  222.   local($code);
  223.   $code = (split(/\,/, "\L$list\E"))[0];
  224.   if ($code eq 'euc') {
  225.     $line = &'jis_euc($line);
  226.   } elsif ($code eq 'jis') {
  227.     $line = &'jis_jis($line);
  228.   } elsif ($code eq 'sjis') {
  229.     $line = &'jis_sjis($line);
  230.   }
  231.   return $line;
  232. }
  233.  
  234. __END__
  235. --><HTML><HEAD>
  236. <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-2022-JP">
  237. <LINK REV="made" HREF="mailto:hasegawa@madoka.org">
  238. <TITLE>auto/oper.plm</TITLE></HEAD><BODY>
  239.  
  240. $B%*%s%i%$%s%I%-%e%a%s%H(B
  241.  
  242.  
  243. <HR><H3>$BL>A0(B</H3>
  244.  
  245. auto/oper.plm - $BFCDj$NH/8@$r$7$??M$r%A%c%s%M%k%*%Z%l!<%?$K$9$k(B
  246.  
  247.  
  248. <HR><H3>$B@bL@(B</H3>
  249.  
  250. $BFCDj$NJ8;zNs$rH/8@$7$??M$r%A%c%s%M%k%*%Z%l!<%?$K$7$^$9!#(B
  251. $B2?$i$+$NM}M3$G%A%c%s%M%k%*%Z%l!<%?$K$G$-$J$$$G$-$J$$>l9g$O!"(B
  252. $B$=$l$>$l$NM}M3$K1~$8$?J8;zNs$rH/8@$7$^$9!#(B
  253.  
  254.  
  255. <HR><H3>$B%W%m%Q%F%#(B</H3>
  256.  
  257. <DL>
  258. <DT>  auto.oper.alias $B%U%!%$%kL>(B[;({jis|euc|sjis})]
  259. </DT>
  260. <DD>    $B%f!<%6$N%(%$%j%"%9$r;2>H$9$k$?$a$N%U%!%$%k$r;XDj$7$^$9!#(B
  261.         $B$3$3$G;XDj$9$k%U%!%$%k$O(Bauto/alias.plm$B$G;H$&$b$N$H(B
  262.         $BF1$87A<0$N$b$N$G$9!#(B
  263. </DD>
  264. <DT>  auto.oper.request* $BJ8;zNs(B
  265. </DT>
  266. <DD>    $B%A%c%s%M%k%*%Z%l!<%?$rMW5a$9$kJ8;zNs$r;XDj$7$^$9!#(B
  267.         $B$3$3$G;XDj$7$?J8;zNs$rH/8@$7$??M$r%A%c%s%M%k%*%Z%l!<%?$K$7$^$9!#(B
  268. </DD>
  269. <DT>  auto.oper.mask* {+|-}$B%f!<%6%^%9%/(B [($B%A%c%s%M%kL>(B)]
  270. </DT>
  271. <DD>    $B%A%c%s%M%k%*%Z%l!<%?$rMW5a$7$??M$,!"$3$3$G;XDj$7$?%^%9%/$K(B
  272.         $B%^%C%A$7$J$+$C$?>l9g$O!"(Bauto.oper.deny$B$G;XDj$7$?J8;zNs$rH/8@$7!"(B
  273.         $B%A%c%s%M%k%*%Z%l!<%?$K$O$7$^$;$s!#(B
  274. </DD>
  275. <DT>  auto.oper.message* $B%U%)!<%^%C%H(B
  276. </DT>
  277. <DD>    $B%A%c%s%M%k%*%Z%l!<%?$rMW5a$7$??M$r<B:]$K%A%c%s%M%k%*%Z%l!<%?(B
  278.         $B$K$9$k$H$-!"$3$3$G;XDj$7$?$b$N$rH/8@$7!"$=$N?M$r%A%c%s%M%k(B
  279.         $B%*%Z%l!<%?$K$7$^$9!#J8;zNsCf$K(B#(nick)$B$N$h$&$K=q$/$3$H$G!"(B
  280.         $B%(%$%j%"%9$NBP1~$9$kCM$GCV$-49$($^$9!#(B
  281.         $B$^$?!"(B#(name|nick)$B$N$h$&$K!V(B|$B!W$G6h@Z$C$F=q$/$H!"(B
  282.         $B$^$:(Bname$B$NCM$GCV49$7$h$&$H$7!"(Bname$B$,Dj5A$5$l$F$$$J$1$l$P(B
  283.         nick$B$GCV49$7$^$9!#%(%$%j%"%9Cf$K@_Dj$5$l$F$$$k$b$N0J30$G$O!"(B
  284.         #(nick.now)$B$G8=:_$N%K%C%/%M!<%`$K!"(B#(channel)$B$GH/8@$N$"$C$?(B
  285.         $B%A%c%s%M%k$K$=$l$>$lCV49$5$l$^$9!#(B
  286. </DD>
  287. <DT>  auto.oper.deny* $B%U%)!<%^%C%H(B
  288. </DT>
  289. <DD>    $B%A%c%s%M%k%*%Z%l!<%?$rMW5a$7$??M$,(Bauto.oper.mask$B$G;XDj$7$?$b$N$K(B
  290.         $B%^%C%A$7$J$+$C$?>l9g!"$3$3$G;XDj$7$?$b$N$rH/8@$7$^$9!#(B
  291.         #(nick)$B$N$h$&$K=q$/$3$H$G!"%(%$%j%"%9Cf$NBP1~$9$kCM$G(B
  292.         $BCV$-49$($^$9!#(B
  293. </DD>
  294. <DT>  auto.oper.oper* $B%U%)!<%^%C%H(B
  295. </DT>
  296. <DD>    $B%A%c%s%M%k%*%Z%l!<%?$rMW5a$7$??M$,$9$G$K%A%c%s%M%k%*%Z%l!<%?$@$C$?(B
  297.         $B>l9g!"$3$3$G;XDj$7$?$b$N$rH/8@$7$^$9!#(B
  298.         #(nick)$B$N$h$&$K=q$/$3$H$G!"%(%$%j%"%9Cf$NBP1~$9$kCM$G(B
  299.         $BCV$-49$($^$9!#(B
  300. </DD>
  301. <DT>  auto.oper.notoper* $B%U%)!<%^%C%H(B
  302. </DT>
  303. <DD>    $B%A%c%s%M%k%*%Z%l!<%?$rMW5a$5$l$?$H$-$K!"(B
  304.         $B<+J,$,%A%c%s%M%k%*%Z%l!<%?$G$J$$$?$a$K$=$N?M$r%A%c%s%M%k%*%Z%l!<%?$K(B
  305.         $B$G$-$J$$>l9g!"$3$3$G;XDj$7$?$b$N$rH/8@$7$^$9!#(B
  306.         #(nick)$B$N$h$&$K=q$/$3$H$G!"%(%$%j%"%9Cf$NBP1~$9$kCM$G(B
  307.         $BCV$-49$($^$9!#(B
  308. </DD>
  309. <DT>  auto.oper.private* $B%U%)!<%^%C%H(B
  310. </DT>
  311. <DD>    $B%A%c%s%M%k%*%Z%l!<%?$NMW5a$,%A%c%s%M%k$KBP$7$F$G$O$J$/!"(B
  312.         $B<+J,$KBP$7$F$5$l$?>l9g!"$3$3$G;XDj$7$?$b$N$rH/8@$7$^$9!#(B
  313.         #(nick)$B$N$h$&$K=q$/$3$H$G!"%(%$%j%"%9Cf$NBP1~$9$kCM$G(B
  314.         $BCV$-49$($^$9!#(B
  315. </DD>
  316. <DT>  auto.oper.out* $B%U%)!<%^%C%H(B
  317. </DT>
  318. <DD>    $B%A%c%s%M%k%*%Z%l!<%?$NMW5a$,%A%c%s%M%k$N30$+$iH/8@$5$l$?>l9g!"(B
  319.         $B$3$3$G;XDj$7$?$b$N$rH/8@$7$^$9!#(B
  320.         #(nick)$B$N$h$&$K=q$/$3$H$G!"%(%$%j%"%9Cf$NBP1~$9$kCM$G(B
  321.         $BCV$-49$($^$9!#(B
  322. </DD>
  323. </DL>
  324.  
  325.  
  326. <HR><H3>$B@_DjNc(B</H3>
  327.  
  328. <PRE>
  329. + auto/oper.plm
  330. auto.oper.alias: alias.txt;euc
  331. auto.oper.request: $B$W$i$`$J$k$H(B
  332. auto.oper.mask: +*!*@*
  333. auto.oper.message: $B$O!A$$!y(B
  334. auto.oper.deny: $B$J$k$H$O$"$2$i$l$^$;$s$o!#(B
  335. auto.oper.oper: #(name|nick.now)$B$5$s$O$b$&$J$k$H;}$C$F$^$9$h!#(B
  336. auto.oper.notoper: $B$4$a$s$J$5$$!#$J$k$H;}$C$F$J$$$s$G$9!#(B
  337. auto.oper.private: $B$J$k$H$,$[$7$$%A%c%s%M%k$G8@$C$F$/$@$5$$$M!#(B
  338. auto.oper.out: $B$($C!"$I$3$K$$$k$s$G$9$+(B?
  339. </PRE>
  340.  
  341. $B!V$W$i$`$J$k$H!W$HH/8@$7$??M$r%A%c%s%M%k%*%Z%l!<%?$K$7$^$9!#(B
  342. $B$9$Y$F$N%f!<%6$r%A%c%s%M%k%*%Z%l!<%?$K$9$k$3$H$r5v2D$7$F$$$k$N$G!"(B
  343. $BC/$,$I$N%A%c%s%M%k$GMW5a$7$F$-$F$b!"$=$N?M$r%A%c%s%M%k%*%Z%l!<%?$K$7$^$9!#(B
  344. $B2?$i$+$NM}M3$G%A%c%s%M%k%*%Z%l!<%?$K$G$-$J$$$H$-$O!"(B
  345. $B$=$l$>$l$NM}M3$K1~$8$?%a%C%;!<%8$rH/8@$7$^$9!#(B
  346.  
  347. <PRE>
  348. + auto/oper.plm
  349. auto.oper.request: $B$J$k$H(B
  350. auto.oper.request: $B$J$k$H$/$l(B
  351. auto.oper.request: $B$J$k$H$/$@$5$$(B
  352. auto.oper.request: $B$J$k$H$A$g$&$@$$(B
  353. auto.oper.mask: -*!*@*.com
  354. auto.oper.mask: +*!*@* #$B$^$I$+(B:*.jp
  355. auto.oper.mask: +*!*@*.jp
  356. </PRE>
  357.  
  358. $B%A%c%s%M%k%*%Z%l!<%?$NMW5a$,(B4$B<oN`$"$kNc$G$9!#(B
  359. $B$3$N$&$A$N$I$l$+$rH/8@$7$??M$r%A%c%s%M%k%*%Z%l!<%?$K$7$^$9!#(B
  360. $B$^$?!"%A%c%s%M%k%*%Z%l!<%?$rMW5a$7$F$-$?%f!<%6$r3NG'$7!"(B
  361. $B!V(B*!*@*.com$B!W$K%^%C%A$9$k?M$O%*%Z%l!<%?$K$O$7$^$;$s!#(B
  362. $B$^$?!"!V(B#$B$^$I$+(B:*.jp$B!W$G$O$=$l0J30$N$9$Y$F$N?M$r%A%c%s%M%k%*%Z%l!<%?$K$7$^$9!#(B
  363. $B$=$NB>$N%A%c%s%M%k$G$O!V(B*!*@*.jp$B!W$K%^%C%A$9$k?M$@$1$r(B
  364. $B%A%c%s%M%k%*%Z%l!<%?$K$7$^$9!#(B
  365. $B2?$i$+$NM}M3$G%A%c%s%M%k%*%Z%l!<%?$K$G$-$J$$$H$7$F$b2?$bH/8@$7$^$;$s!#(B
  366.  
  367. </BODY></HTML>
  368.