home *** CD-ROM | disk | FTP | other *** search
/ ftp.madoka.org / 2014.12.ftp.madoka.org.tar / ftp.madoka.org / pub / plum / 2.x / plum2_28_2.lzh / module / auto / nako.plm < prev    next >
Text File  |  1998-10-15  |  25KB  |  792 lines

  1. <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"><!-- $_ if 0; # -*- perl -*-
  2. # $Id: nako.plm,v 2.14 1998/08/23 04:22:22 hasegawa Exp $
  3. # copyright (c)1998 pupu_j <hasegawa@agusa.nuie.nagoya-u.ac.jp>
  4.  
  5. package auto_nako;
  6.  
  7. $SYSFILE = '.nako.sys';
  8. $MSGFILE = '.nako.msg';
  9. $NICK = 'bot';
  10. $AWAYNICK = 'bot_inai';
  11. $SECRET = 'secret';
  12. $DBCOM = 'DB';
  13. $MEMOCOM = 'MEMO';
  14. $LEARN = 1;
  15. $LRNSPEAK = 1;
  16. $DENGONF = '.nako.dengon';
  17. $MEMOF = '.nako.memo';
  18. $OWNPASSWD = 'masterpasswd';
  19. $JOIN = 'join';
  20. $AWAY = 'away';
  21. $SHUTUPKEY = 'shutup';
  22. $SPEAKKEY = 'talk';
  23. $SHUTUPMSG = '+++ speak off';
  24. $SPEAKMSG = '+++ speak on';
  25. $SPEAKEDMSG = '+++ already speaked on';
  26. $KICKED = 'kicked';
  27. $KICK = 'kick';
  28. $QUIT = 'quit';
  29. $HAVEDN = 'i have some dengon for u.';
  30. $THANKS = 'thanks';
  31. $TAKEN = 'what shall i do?';
  32. $PART = 'bye!';
  33. $NARUTO = 'i\'ll give u chanop.';
  34. $UNNARUTO = 'i have no naruto.';
  35. $KEYWORD = 'keyword';
  36. $DENGONWRITE = 'dengon';
  37. $DENGONLISTEN = 'listen';
  38. $NODENGON = 'i have no dengon for you.';
  39. $SOMEDENGON = 'i have some dengon for you.';
  40. $DENGONOK = 'ok.';
  41. $DENGONEND = 'end..';
  42. $WRITEERROR = 'Dengon file write error!';
  43. $READERROR = 'Dengon file read error!';
  44.  
  45. $_ = 'auto_nako';
  46.  
  47. sub main_loop {
  48.   local($userno) = @_;
  49.   &load_sys($userno);
  50.   &load_msg($userno);
  51. }
  52.  
  53. sub server_open {
  54.   local($serverno) = @_;
  55.   $feeling[$serverno] = 100;
  56.   $alive[$serverno] = 1;
  57.   $last[$serverno] = '';
  58.   $time[$serverno] = time();
  59.   $lrnstr[$serverno] = '';
  60.   $selfpub[$serverno] = 0;
  61.   $selfpriv[$serverno] = 0;
  62.   $cdown[$serverno] = rand(100) + 1;
  63. }
  64.  
  65. sub ss_join {
  66.   local($serverno, $prefix, $cmd, @params) = @_;
  67.   local($userno, $nick, $str, $name, $mode);
  68.   $userno = $'userno[$serverno];
  69.   $nick = &'prefix($prefix);
  70.   ($name, $mode) = split(/\cG/, $params[0]);
  71.   if (!$joined{$serverno, $name}) {
  72.     $joined{$serverno, $name} = 1;
  73.     $str = &message($userno, 'JOIN') || $JOIN;
  74.     &privmsg($serverno, $name, '', $str);
  75.   }
  76.   if (&'exist($dnick[$userno], $nick)) {
  77.     $str = &message($userno, 'HAVEDN') || $HAVEDN;
  78.     &privmsg($serverno, $name, '', "$nick: $str");
  79.   }
  80.   return ($prefix, $cmd, @params);
  81. }
  82.  
  83. sub ss_kick {
  84.   local($serverno, $prefix, $cmd, @params) = @_;
  85.   local($userno, $nick, $str);
  86.   $userno = $'userno[$serverno];
  87.   $nick = &'prefix($prefix);
  88.   if ($params[1] eq $'nick[$serverno]) {
  89.     $feeling[$serverno] -= 50 if $feeling[$serverno] > 50;
  90.     $feeling[$serverno] -= 70 if $feeling[$serverno] > 100;
  91.     if ($alive[$serverno]) {
  92.       $str = &message($userno, 'KICKED', -1) || $KICKED;
  93.       &privmsg($serverno, $params[0], $nick, "\$nick: $str");
  94.     }
  95.   } else {
  96.     $feeling[$serverno] -= 10 if $feeling[$serverno] > 50;
  97.     $feeling[$serverno] -= 30 if $feeling[$serverno] > 100;
  98.     if ($alive[$serverno]) {
  99.       $str = &message($userno, 'KICK', -1) || $KICK;
  100.       &privmsg($serverno, $params[0], $nick, "\$nick: $str");
  101.     }
  102.   }
  103.   return ($prefix, $cmd, @params);
  104. }
  105.  
  106. sub ss_mode {
  107.   local($serverno, $prefix, $cmd, @params) = @_;
  108.   local($userno, $nick, $chan, $mode, @modes, $i, $char, $flag, $name, $str);
  109.   $userno = $'userno[$serverno];
  110.   $nick = &'prefix($prefix);
  111.   if ($nick ne $'nick[$serverno]) {
  112.     ($chan, $mode, @modes) = @params;
  113.     for ($i = 0; $i < length($mode); $i++) {
  114.       $char = substr($mode, $i, 1);
  115.       if ($char eq '+' || $char eq '-') {
  116.         $flag = $char;
  117.       } elsif ($char eq 'o') {
  118.         $name = shift(@modes);
  119.         if ($flag eq '+' && $name eq $'nick[$serverno]) {
  120.           $feeling[$serverno] += 10 if $feeling[$serverno] < 150;
  121.           if ($alive[$serverno] && !$have{$userno, $chan}) {
  122.             $str = &message($userno, 'THANKS') || $THANKS;
  123.             &privmsg($serverno, $chan, $nick, "\$nick: $str");
  124.           }
  125.           $have{$userno, $chan} = 1;
  126.         } elsif ($flag eq '-' && $name eq $'nick[$serverno]) {
  127.           $feeling[$serverno] -= 10 if $feeling[$serverno] > 50;
  128.           if ($alive[$serverno] && $have{$userno, $chan}) {
  129.             $str = &message($userno, 'TAKEN') || $TAKEN;
  130.             &privmsg($serverno, $chan, '', $str);
  131.           }
  132.           $have{$userno, $chan} = 0;
  133.         }
  134.       } elsif ($char eq 'b' || $char eq 'v' || $char eq 'k') {
  135.         shift(@modes);
  136.       } elsif ($char eq 'l' && $flag eq '+') {
  137.         shift(@modes);
  138.       }
  139.     }
  140.   }
  141.   return ($prefix, $cmd, @params);
  142. }
  143.  
  144. sub ss_nick {
  145.   local($serverno, $prefix, $cmd, @params) = @_;
  146.   local($userno, $nick, $str);
  147.   $userno = $'userno[$serverno];
  148.   $nick = &'prefix($prefix);
  149.   if ($params[0] ne $'nick[$serverno] && &'exist($dnick[$userno], $params[0])) {
  150.     $str = &message($userno, 'HAVEDN') || $HAVEDN;
  151.     &privmsg($serverno, $params[0], '', $str);
  152.   }
  153.   return ($prefix, $cmd, $params[0]);
  154. }
  155.  
  156. sub ss_part {
  157.   local($serverno, $prefix, $cmd, @params) = @_;
  158.   local($userno, $nick, $str);
  159.   $userno = $'userno[$serverno];
  160.   $nick = &'prefix($prefix);
  161.   if ($nick ne $'nick[$serverno]) {
  162.     $feeling[$serverno] -= 1 if $feeling[$serverno] > 75;
  163.     $str = &message($userno, 'PART') || $PART;
  164.     &privmsg($serverno, $nick, '', $str);
  165.   }
  166.   return ($prefix, $cmd, @params);
  167. }
  168.  
  169. sub ss_ping {
  170.   local($serverno, $prefix, $cmd, @params) = @_;
  171.   local($userno, @chan);
  172.   $userno = $'userno[$serverno];
  173.   $feeling[$serverno] -= 5 if $feeling[$serverno] > 75;
  174.   $cdown[$serverno] -= 1;
  175.   if ($cdown[$serverno] < 0) {
  176.     $cdown[$serverno] = rand(100) + 200;
  177.     if ($selfpub[$serverno]) {
  178.       @chan = &'array($'channellist[$serverno]);
  179.       &privmsg($serverno, $chan[rand(scalar(@chan))], '', &system($userno, 'PUBACT'));
  180.     }
  181.   }
  182.   return ($prefix, $cmd, @params);
  183. }
  184.  
  185. sub ss_privmsg {
  186.   local($serverno, $prefix, $cmd, @params) = @_;
  187.   local($userno, $nick, $str, $text, $euc, $op, $arg);
  188.   $userno = $'userno[$serverno];
  189.   $nick = &'prefix($prefix);
  190.   if ($params[0] =~ /^[\#\&\+]/) {
  191.     $euc = &'jis_euc($params[1]);
  192.     if (index($euc, &message($userno, 'KEYWORD', -1) || $KEYWORD) != -1) {
  193.       if ($have{$userno, $params[0]}) {
  194.         $text = &message($userno, 'NARUTO') || $NARUTO;
  195.         &privmsg($serverno, $params[0], $nick, "\$nick: $text");
  196.         &'s_print($serverno, '', 'MODE', $params[0], '+o', $nick);
  197.       } else {
  198.         $text = &message($userno, 'UNNARUTO') || $UNNARUTO;
  199.         &privmsg($serverno, $params[0], $nick, "\$nick: $text");
  200.       }
  201.     } elsif (index($euc, &message($userno, 'SHUTUPKEY', -1) || $SHUTUPKEY) != -1) {
  202.       $text = &message($userno, 'SHUTUPMSG', -1) || $SHUTUPMSG;
  203.       &privmsg($serverno, $params[0], '', $text) unless $silent{$serverno, $params[0]};
  204.       $silent{$serverno, $params[0]} = 1;
  205.     } elsif (index($euc, &message($userno, 'SPEAKKEY', -1) || $SPEAKKEY) != -1) {
  206.       if ($silent{$serverno, $params[0]}) {
  207.         $text = &message($userno, 'SPEAKMSG', -1) || $SPEAKMSG;
  208.         $silent{$serverno, $params[0]} = 0;
  209.       } else {
  210.         $text = &message($userno, 'SPEAKEDMSG', -1) || $SPEAKEDMSG;
  211.       }
  212.       &privmsg($serverno, $params[0], '', $text);
  213.     } elsif ($alive[$serverno]) {
  214.       if (index($euc, $last[$serverno]) != -1 && $time[$serverno] + 5 > time()) {
  215.         $last[$serverno] = $euc;
  216.       } else {
  217.         if (index($euc, $last[$serverno]) != -1 && time() < $time[$serverno] + 5) {
  218.           $feeling[$serverno] -= 1 if $feeling[$serverno] > 50;
  219.         }
  220.         $time[$serverno] = time();
  221.         $feeling[$serverno]++ if $feeling[$serverno] < 100;
  222.         if (!$silent{$serverno, $params[0]}) {
  223.           ($op, $arg) = split(/\s+/, $params[1], 2);
  224.           if ($op eq (&message($userno, 'DENGONLISTEN', -1) || $DENGONLISTEN)) {
  225.             &listen($serverno, $prefix, $params[0]);
  226.           } elsif ($op eq (&message($userno, 'DENGONWRITE', -1) || $DENGONWRITE)) {
  227.             &write($serverno, $prefix, $params[0], $arg);
  228.           } elsif ($op eq (&system($userno, 'MEMOCOM') || $MEMOCOM)) {
  229.             &memo($serverno, $prefix, $arg);
  230.           } else {
  231.             &reply($serverno, $prefix, $params[0], $euc);
  232.           }
  233.         }
  234.         $last[$serverno] = $euc;
  235.       }
  236.     }
  237.   } else {
  238.     &command($serverno, $prefix, $params[1]);
  239.   }
  240.   return ($prefix, $cmd, @params);
  241. }
  242.  
  243. sub ss_353 {
  244.   local($serverno, $prefix, $cmd, @params) = @_;
  245.   local($userno, $list);
  246.   $userno = $'userno[$serverno];
  247.   $list = &'list(split(/\s+/, $params[3]));
  248.   if (&'exist($list, "\@$'nick[$serverno]")) {
  249.     $have{$userno, $params[2]} = 1;
  250.   }
  251.   return ($prefix, $cmd, @params);
  252. }
  253.  
  254. sub command {
  255.   local($serverno, $prefix, $msg) = @_;
  256.   local($userno, $nick, $euc, $op, $arg, $ch, $str, $pass, $i);
  257.   $userno = $'userno[$serverno];
  258.   $nick = &'prefix($prefix);
  259.   ($op, $arg) = (split(/\s+/, $msg, 2), '');
  260.   if ($op eq 'P' || $op eq 'p') {
  261.     ($ch, $str) = split(/\s+/, $arg, 2);
  262.     &privmsg($serverno, $ch, '', $str);
  263.   } elsif ($op eq 'T' || $op eq 't') {
  264.     ($ch, $str) = split(/\s+/, $arg, 2);
  265.     &'s_print($serverno, '', 'TOPIC', $ch, $str) if $str;
  266.   } elsif ($op eq 'N' || $op eq 'n') {
  267.     ($pass, $str) = split(/\s+/, $arg, 2);
  268.     &'s_print($serverno, '', 'NICK', $str) if ($str && $pass eq (&system($userno, 'OWNPASSWD') || $OWNPASSWD));
  269.   } elsif ($op eq 'FEEL?') {
  270.     &privmsg($serverno, $nick, '', "value: $feeling[$serverno]");
  271.   } elsif ($op eq 'STATUS?') {
  272.     &privmsg($serverno, $nick, '', 'Version 1.56+a3r1');
  273.     &privmsg($serverno, $nick, '', "IRC server is $'servername[$serverno]");
  274.     &privmsg($serverno, $nick, '', "selfpub : $selfpub");
  275.     &privmsg($serverno, $nick, '', "selfpriv: $selfpriv");
  276.   } elsif ($op eq 'STRING?') {
  277.     &privmsg($serverno, $nick, '', 'learned string is :' . ($lrnstr[$serverno] || '(null)'));
  278.   } elsif ($op eq 'FORGET!') {
  279.     $lrnstr[$serverno] = '';
  280.   } elsif ($op eq 'CHANNEL?') {
  281.     $i = 0;
  282.     foreach $ch (&'array($'channellist[$serverno])) {
  283.       $i++;
  284.       &privmsg($serverno, $nick, '', "channel:[$i]$ch");
  285.     }
  286.   } elsif ($op eq '*HELP*') {
  287.     &privmsg($serverno, $nick, '', 'FEEL? : check status.');
  288.     $str = &message($userno, 'KEYWORD', -1) || $KEYWORD;
  289.     &privmsg($serverno, $nick, '', "$str : the bot will give you chanop.");
  290.     $str = &message($userno, 'SHUTUPKEY', -1) || $SHUTUPKEY;
  291.     &privmsg($serverno, $nick, '', "$str : shut up.");
  292.     $str = &message($userno, 'SPEAKKEY', -1) || $SPEAKKEY;
  293.     &privmsg($serverno, $nick, '', "$str : speak again.");
  294.     $str = &message($userno, 'DENGONLISTEN', -1) || $DENGONLISTEN;
  295.     &privmsg($serverno, $nick, '', "$str : check and read dengon message.");
  296.     $str = &message($userno, 'DENGONWRITE', -1) || $DENGONWRITE;
  297.     &privmsg($serverno, $nick, '', "$str : get dengon message by heart.");
  298.     &privmsg($serverno, $nick, '', '*HELP* : this help.');
  299.   } elsif ($op eq (&system($userno, 'SECRET') || $SECRET)) {
  300.     if ($have{$userno, $arg}) {
  301.       $str = &message($userno, 'NARUTO') || $NARUTO;
  302.       &privmsg($serverno, $arg, $nick, $str);
  303.       &'s_print($serverno, '', 'MODE', $arg, '+o', $nick);
  304.     } else {
  305.       $str = &message($userno, 'UNNARUTO') || $UNNARUTO;
  306.       &privmsg($serverno, $nick, $nick, $str);
  307.     }
  308.   } elsif ($op eq '*rehash*') {
  309.     &load_msg($userno) if $arg eq (&system($userno, 'OWNPASSWD') || $OWNPASSWD);
  310.   } elsif ($op eq 'EXIT') {
  311.     if ($arg eq (&system($userno, 'OWNPASSWD') || $OWNPASSWD)) {
  312.       $str = &message($userno, 'QUIT') || $QUIT;
  313.       foreach $ch (&'array($'channellist[$serverno])) {
  314.         &privmsg($serverno, $ch, '', $str);
  315.       }
  316.       &'s_print($serverno, '', 'QUIT', $str);
  317.       &'s_flush($serverno);
  318.       exit(0);
  319.     }
  320.   } elsif ($op eq 'I' || $op eq 'i') {
  321.     &'s_print($serverno, '', 'JOIN', $arg) if $arg;
  322.   } elsif ($op eq 'L' || $op eq 'l') {
  323.     &'s_print($serverno, '', 'PART', $arg) if $arg;
  324.   } elsif ($op eq 'A' || $op eq 'a') {
  325.     if ($arg eq (&system($userno, 'OWNPASSWD') || $OWNPASSWD)) {
  326.       $str = &message($userno, 'AWAY') || $AWAY;
  327.       if ($str) {
  328.         foreach $ch (&'array($'channellist[$serverno])) {
  329.           &privmsg($serverno, $ch, '', $str);
  330.         }
  331.       }
  332.       &'s_print($serverno, '', 'NICK', &system($userno, 'AWAYNICK') || $AWAYNICK);
  333.       $alive[$serverno] = 0;
  334.     }
  335.   } elsif ($op eq 'J' || $op eq 'j') {
  336.     if ($arg eq (&system($userno, 'OWNPASSWD') || $OWNPASSWD)) {
  337.       $str = &message($userno, 'JOIN') || $JOIN;
  338.       if ($str) {
  339.         foreach $ch (&'array($'channellist[$serverno])) {
  340.           &privmsg($serverno, $ch, '', $str);
  341.         }
  342.       }
  343.       &'s_print($serverno, '', 'NICK', &system($userno, 'NICK') || $NICK);
  344.       $alive[$serverno] = 1;
  345.     }
  346.   } elsif ($op eq (&system($userno, 'DBCOM') || $DBCOM)) {
  347.     &database($serverno, $prefix, $arg);
  348.   } elsif ($selfpriv[$serverno] && time() > $time[$serverno]) {
  349.     $time[$serverno] = time();
  350.     $str = &message($userno, 'PRVACT');
  351.     &prvmsg($serverno, $nick, $nick, $str);
  352.   }
  353. }
  354.  
  355. sub database {
  356.   local($serverno, $prefix, $msg) = @_;
  357.   &access($serverno, $prefix, '.nako.db', $msg);
  358. }
  359.  
  360. sub memo {
  361.   local($serverno, $prefix, $msg) = @_;
  362.   local($userno, $file);
  363.   $userno = $'userno[$serverno];
  364.   $file = &system($userno, 'MEMOF') || $MEMOF;
  365.   &access($serverno, $prefix, $file, $msg);
  366. }
  367.  
  368. sub access {
  369.   local($serverno, $prefix, $file, $msg) = @_;
  370.   local($nick, $cmd, $item, $var, $arg, $num, $line, @list);
  371.   $nick = &'prefix($prefix);
  372.   ($cmd, $item) = split(/\s+/, $msg, 2);
  373.   if ($cmd eq 'read') {
  374.     if (open(FILE, $file)) {
  375.       $num = 0;
  376.       while (defined($line = <FILE>)) {
  377.         $line =~ tr/\r\n//d;
  378.         ($var, $arg) = split(/\:/, $line, 2);
  379.         next unless $var eq $item;
  380.         &privmsg($serverno, $nick, '', $line);
  381.         $num++;
  382.       }
  383.       close(FILE);
  384.       if ($num) {
  385.         &privmsg($serverno, $nick, '', 'thats all.');
  386.       } else {
  387.         &privmsg($serverno, $nick, '', 'nothing');
  388.       }
  389.     }
  390.   } elsif ($cmd eq 'write') {
  391.     if (index($item, ':') != -1) {
  392.       if (open(FILE, ">>$file")) {
  393.         print FILE $item, "\n";
  394.         close(FILE);
  395.       }
  396.       &privmsg($serverno, $nick, '', 'data added.');
  397.     } else {
  398.       &privmsg($serverno, $nick, '', 'wrong data format. ');
  399.       &privmsg($serverno, $nick, '', 'format is "fieldname:contents"');
  400.     }
  401.   } elsif ($cmd eq 'delete') {
  402.     @list = ();
  403.     if (open(FILE, $file)) {
  404.       while (defined($line = <FILE>)) {
  405.         $line =~ tr/\r\n//d;
  406.         ($var, $arg) = split(/\:/, $line, 2);
  407.         next if $var eq $item;
  408.         push(@list, $line);
  409.       }
  410.       close(FILE);
  411.       if (open(FILE, ">$file")) {
  412.         foreach $line (@list) {
  413.           print FILE $line, "\n";
  414.         }
  415.         close(FILE);
  416.       }
  417.     }
  418.   }
  419. }
  420.  
  421. sub listen {
  422.   local($serverno, $prefix, $chan) = @_;
  423.   local($userno, $nick, $file, $idx, $name, $code, $line, $reply, @data, @list, @rest);
  424.   $userno = $'userno[$serverno];
  425.   $nick = &'prefix($prefix);
  426.   @list = ();
  427.   @rest = ();
  428.   $file = &system($userno, 'DENGONF') || $DENGONF;
  429.   if (($idx = rindex($file, ';')) != -1) {
  430.     $name = substr($file, 0, $idx);
  431.     $code = substr($file, $idx + 1);
  432.   } else {
  433.     $name = $file;
  434.     $code = '';
  435.   }
  436.   $name = &'expand($name);
  437.   if ($name && open(FILE, $name)) {
  438.     while (defined($line = <FILE>)) {
  439.       $line =~ tr/\r\n//d;
  440.       @data = split(/\s+/, $line, 2);
  441.       if ("\L$data[0]\E" eq "\L$nick\E") {
  442.         push(@list, $data[1]);
  443.       } else {
  444.         push(@rest, $line);
  445.       }
  446.     }
  447.     close(FILE);
  448.     if (@list) {
  449.       $reply = &message($userno, 'SOMEDENGON', -1) || $SOMEDENGON;
  450.       &privmsg($serverno, $chan, '', "$nick: $reply");
  451.       foreach $str (@list) {
  452.         &privmsg($serverno, $nick, '', "- $str");
  453.       }
  454.       $reply = &message($userno, 'DENGONEND', -1) || $DENGONEND;
  455.       &privmsg($serverno, $chan, '', "$nick: $reply");
  456.     } else {
  457.       $reply = &message($userno, 'NODENGON', -1) || $NODENGON;
  458.       &privmsg($serverno, $chan, '', "$nick: $reply");
  459.     }
  460.     $dnick[$userno] = &'remove($dnick[$userno], $nick);
  461.     if (open(FILE, ">$file")) {
  462.       foreach $line (@rest) {
  463.         print FILE $line, "\n";
  464.       }
  465.       close(FILE);
  466.     } else {
  467.       $reply = &message($userno, 'WRITEERROR', -1) || $WRITEERROR;
  468.       &privmsg($serverno, $chan, '', $reply);
  469.     }
  470.   } else {
  471.     $reply = &message($userno, 'READERROR', -1) || $READERROR;
  472.     &privmsg($serverno, $chan, '', $reply);
  473.   }
  474. }
  475.  
  476. sub write {
  477.   local($serverno, $prefix, $chan, $msg) = @_;
  478.   local($userno, $nick, $file, $line, $name, $str, @time);
  479.   $userno = $'userno[$serverno];
  480.   $nick = &'prefix($prefix);
  481.   ($name, $str) = split(/\s+/, $msg, 2);
  482.   if ($str) {
  483.     $file = &system($userno, 'DENGONF') || $DENGONF;
  484.     if ($file && open(FILE, ">>$file")) {
  485.       @time = localtime();
  486.       print FILE $name, &'date(' [ %a %b %d %H:%M:%S %Y ] '), $str, ' ( from ', $nick,' )', "\n";
  487.       close(FILE);
  488.       $dnick[$userno] = &'add($dnick[$userno], $name);
  489.       $str = &message($userno, 'DENGONOK', -1) || $DENGONOK;
  490.       &privmsg($serverno, $chan, '', "$nick: $str");
  491.     } else {
  492.       $str = &message($userno, 'WRITEERROR', -1) || $WRITEERROR;
  493.       &privmsg($serverno, $chan, '', $str);
  494.     }
  495.   }
  496. }
  497.  
  498. sub reply {
  499.   local($serverno, $prefix, $chan, $msg) = @_;
  500.   local($userno, $nick, $rate, $i, $str, @list, $learn, $lrnspeak);
  501.   $userno = $'userno[$serverno];
  502.   $nick = &'prefix($prefix);
  503.   $rate = rand(100) * (100 / $feeling[$serverno]);
  504.   for ($i = 0; $i <= $count[$userno]; $i++) {
  505.     next unless $prob{$userno, $i} > $rate;
  506.     next unless &match($msg, $pattern{$userno, $i});
  507.     @list = &'array($answer{$userno, $i});
  508.     $str = $list[rand(scalar(@list))];
  509.     foreach $sub (split(/\&/, $str)) {
  510.       next unless $sub;
  511.       &privmsg($serverno, $chan, $nick, $sub);
  512.     }
  513.     last;
  514.   }
  515.   $rate = rand(100);
  516.   $learn = &system($userno, 'LEARN');
  517.   $learn = $LEARN unless defined($learn);
  518.   if ($rate <= $learn || !$lrnstr[$serverno]) {
  519.     $lrnstr[$serverno] = $msg;
  520.     $lrnchn[$userno] = $chan;
  521.   }
  522.   $lrnspeak = &system($userno, 'LRNSPEAK');
  523.   $lrnspeak = $LRNSPEAK unless defined($lrnspeak);
  524.   &privmsg($serverno, $lrnchn[$userno], '', $lrnstr[$serverno]) if $lrnspeak >= 100 -$rate;
  525. }
  526.  
  527. sub match {
  528.   local($msg, $pattern) = @_;
  529.   foreach $sub (split(/\|/, $pattern)) {
  530.     return 0 if index($msg, $sub) == -1;
  531.   }
  532.   return 1;
  533. }
  534.  
  535. sub system {
  536.   local($userno, $key, $num) = @_;
  537.   local($list, @array);
  538.   $list = $system{$userno, $key};
  539.   if (defined($list)) {
  540.     @array = &'array($list);
  541.     if (defined($num)) {
  542.       if ($num >= 0 && $num < scalar(@array)) {
  543.         return $array[$num];
  544.       } elsif ($num < 0 && scalar(@array) + $num >= 0) {
  545.         return $array[scalar(@array) + $num];
  546.       } else {
  547.         return undef;
  548.       }
  549.     } elsif (wantarray) {
  550.       return @array;
  551.     } else {
  552.       return $array[rand(scalar(@array))];
  553.     }
  554.   } elsif (wantarray) {
  555.     return ();
  556.   } else {
  557.     return undef;
  558.   }
  559. }
  560.  
  561. sub message {
  562.   local($userno, $key, $num) = @_;
  563.   local($list, @array);
  564.   $list = $message{$userno, $key};
  565.   if (defined($list)) {
  566.     @array = &'array($list);
  567.     if (defined($num)) {
  568.       if ($num >= 0 && $num < scalar(@array)) {
  569.         return $array[$num];
  570.       } elsif ($num < 0 && scalar(@array) + $num >= 0) {
  571.         return $array[scalar(@array) + $num];
  572.       } else {
  573.         return undef;
  574.       }
  575.     } elsif (wantarray) {
  576.       return @array;
  577.     } else {
  578.       return $array[rand(scalar(@array))];
  579.     }
  580.   } elsif (wantarray) {
  581.     return ();
  582.   } else {
  583.     return undef;
  584.   }
  585. }
  586.  
  587. sub load_sys {
  588.   local($userno) = @_;
  589.   local($file, $idx, $name, $code, $mtime, $line, $var, $arg);
  590.   $file = &'property($userno, 'sysfile') || $SYSFILE;
  591.   if (($idx = rindex($file, ';')) != -1) {
  592.     $name = substr($file, 0, $idx);
  593.     $code = substr($file, $idx + 1);
  594.   } else {
  595.     $name = $file;
  596.     $code = '';
  597.   }
  598.   $name = &'expand($name);
  599.   $mtime = (stat($name))[9];
  600.   if (defined($mtime) && ($sysmod[$userno] || 0) != $mtime) {
  601.     $sysmod[$userno] = $mtime;
  602.     if ($name && open(SYS, $name)) {
  603.       while (defined($line = <SYS>)) {
  604.         $line =~ s/^\s+//;
  605.         next if $line =~ /^[\#\;]/;
  606.         $line =~ tr/\r\n//d;
  607.         next unless $line;
  608.         $line = &code_euc($line, $code) if $code;
  609.         next unless (($var, $arg) = split(/\:/, $line, 2)) == 2;
  610.         next unless $var =~ /\S/;
  611.         next unless $arg =~ /\S/;
  612.         $system{$userno, $var} = &'add($system{$userno, $var}, $arg);
  613.       }
  614.       close(SYS);
  615.       if (!$system{$userno, 'MSGACT'}) {
  616.         $selfpub = 0;
  617.         $selfpriv = 0;
  618.       } elsif ($system{$userno, 'MSGACT'} == 1) {
  619.         $selfpub = 0;
  620.         $selfpriv = 1;
  621.       } elsif ($system{$userno, 'MSGACT'} == 2) {
  622.         $selfpub = 1;
  623.         $selfpriv = 0;
  624.       } elsif ($system{$userno, 'MSGACT'} == 3) {
  625.         $selfpub = 1;
  626.         $selfpriv = 1;
  627.       }
  628.     }
  629.   }
  630. }
  631.  
  632. sub load_msg {
  633.   local($userno) = @_;
  634.   local($file, $idx, $name, $code, $mtime, $line, $var, $arg);
  635.   $file = &'property($userno, 'msgfile') || $MSGFILE;
  636.   if (($idx = rindex($file, ';')) != -1) {
  637.     $name = substr($file, 0, $idx);
  638.     $code = substr($file, $idx + 1);
  639.   } else {
  640.     $name = $file;
  641.     $code = '';
  642.   }
  643.   $name = &'expand($name);
  644.   $mtime = (stat($name))[9];
  645.   if (defined($mtime) && ($msgmod[$userno] || 0) != $mtime) {
  646.     $msgmod[$userno] = $mtime;
  647.     if ($name && open(MSG, $name)) {
  648.       foreach $key (keys(%message)) {
  649.         ($no, $var) = split(/$;/, $key, 2);
  650.         next unless $no == $userno;
  651.         delete $message{$key};
  652.       }
  653.       $count[$userno] = -1;
  654.       while (defined($line = <MSG>)) {
  655.         $line =~ s/^\s+//;
  656.         next if $line =~ /^[\#\;]/;
  657.         $line =~ tr/\r\n//d;
  658.         next unless $line;
  659.         $line = &code_euc($line, $code) if $code;
  660.         $line = &read_line($userno, $line);
  661.         next if index($line, ':') == -1;
  662.         next unless (($var, $arg) = split(/\:/, $line, 2)) == 2;
  663.         next unless $var =~ /\S/;
  664.         next unless $arg =~ /\S/;
  665.         if ($var eq 'PATTERN') {
  666.           $count[$userno]++;
  667.           $pattern{$userno, $count[$userno]} = $arg;
  668.           $answer{$userno, $count[$userno]} = '';
  669.         } elsif ($var eq 'PROB') {
  670.           $prob{$userno, $count[$userno]} = $arg;
  671.         } elsif ($var eq 'ANSWER') {
  672.           $answer{$userno, $count[$userno]} = &'add($answer{$userno, $count[$userno]}, $arg);
  673.         } else {
  674.           $message{$userno, $var} = &'add($message{$userno, $var}, $arg);
  675.         }
  676.       }
  677.       close(MSG);
  678.     }
  679.   }
  680. }
  681.  
  682. sub privmsg {
  683.   local($serverno, $to, $nick, $msg) = @_;
  684.   local($userno, $src, $dst, $replace);
  685.   $userno = $'userno[$serverno];
  686.   if ($msg) {
  687.     if ($nick) {
  688.       $replace = 0;
  689.       foreach $alias (&system($userno, 'ALIAS')) {
  690.         ($src, $dst) = split(/ /, $alias, 2);
  691.         if (index($nick, $src) != -1) {
  692.           $replace = 1;
  693.           last;
  694.         }
  695.       }
  696.       if (!$replace) {
  697.         $dst = $nick . &'jis_euc('$B$5$s(B');
  698.       }
  699.       $msg =~ s/\$nick/$dst/;
  700.     }
  701.     $msg = &'euc_jis($msg);
  702.     &'s_print($serverno, '', 'PRIVMSG', $to, $msg);
  703.     foreach $cno (&'array($'clientlist)) {
  704.       next unless $'avail[$cno];
  705.       next unless $'server[$cno] == $serverno;
  706.       &'c_print($cno, &'user($cno), 'PRIVMSG', $to, $msg);
  707.     }
  708.   }
  709. }
  710.  
  711. sub code_euc {
  712.   local($line, $list) = @_;
  713.   foreach $code (split(/\,/, "\L$list\E")) {
  714.     if ($code eq 'euc') {
  715.       $line = &'euc_euc($line);
  716.     } elsif ($code eq 'jis') {
  717.       $line = &'jis_euc($line);
  718.     } elsif ($code eq 'sjis') {
  719.       $line = &'sjis_euc($line);
  720.     }
  721.   }
  722.   return $line;
  723. }
  724.  
  725. sub read_line {
  726.   local($userno, $line) = @_;
  727.   foreach $kanji (&'property($userno, 'kanji')) {
  728.     foreach $code (split(/\,/, "\L$kanji\E")) {
  729.       if ($code eq 'euc') {
  730.         $line = &'euc_euc($line);
  731.       } elsif ($code eq 'jis') {
  732.         $line = &'jis_euc($line);
  733.       } elsif ($code eq 'sjis') {
  734.         $line = &'sjis_euc($line);
  735.       }
  736.     }
  737.   }
  738.   return $line;
  739. }
  740.  
  741. __END__
  742. --><HTML><HEAD>
  743. <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-2022-JP">
  744. <LINK REV="made" HREF="mailto:hasegawa@agusa.nuie.nagoya-u.ac.jp">
  745. <TITLE>auto/nako.plm</TITLE></HEAD><BODY>
  746.  
  747. $B%*%s%i%$%s%I%-%e%a%s%H(B
  748.  
  749.  
  750. <HR><H3>$BL>A0(B</H3>
  751.  
  752. auto/nako.plm - Internet Relay Chat Robot nako$B$N%(%_%e%l!<%7%g%s$r9T$&(B
  753.  
  754.  
  755. <HR><H3>$B@bL@(B</H3>
  756.  
  757. Internet Relay Chat Robot nako$B$N%(%_%e%l!<%7%g%s$r9T$$$^$9!#(B
  758. nako$B$G;HMQ$7$F$$$k@_Dj%U%!%$%k$r$=$N$^$^MxMQ$9$k$3$H$,$G$-$^$9!#(B
  759. $B>\$7$/$O(Bnako$B$N%I%-%e%a%s%H$r;2>H$7$F2<$5$$!#(B
  760.  
  761.  
  762. <HR><H3>$B%W%m%Q%F%#(B</H3>
  763.  
  764. <DL>
  765. <DT>  auto.nako.sysfile $B%U%!%$%kL>(B[;({jis|euc|sjis})]
  766. </DT>
  767. <DD>    $B%7%9%F%`$N@_Dj%U%!%$%k$r;XDj$7$^$9!#(B
  768.         $B%G%U%)%k%H$G$O!V(B.nako.sys$B!W$K$J$C$F$$$^$9!#(B
  769. </DD>
  770. <DT>  auto.nako.msgfile $B%U%!%$%kL>(B[;({jis|euc|sjis})]
  771. </DT>
  772. <DD>    $B%a%C%;!<%8%G!<%?$N@_Dj%U%!%$%k$r;XDj$7$^$9!#(B
  773.         $B%G%U%)%k%H$G$O!V(B.nako.msg$B!W$K$J$C$F$$$^$9!#(B
  774. </DD>
  775. </DL>
  776.  
  777.  
  778. <HR><H3>$B@_DjNc(B</H3>
  779.  
  780. <PRE>
  781. + auto/nako.plm
  782. auto.nako.sysfile: .nako.sys;euc,jis
  783. auto.nako.msgfile: .nako.msg;euc,jis
  784. </PRE>
  785.  
  786. $B%7%9%F%`@_Dj$N%U%!%$%k$H%a%C%;!<%8%G!<%?@_Dj$N%U%!%$%k$K$=$l$>$l(B
  787. $B!V(B.nako.sys$B!W$H!V(B.nako.msg$B!W$r;HMQ$7$^$9!#(B
  788. $B$3$l$i$N%U%!%$%k$O$$$:$l$b4A;z%3!<%I$,(Beuc$B$b$7$/$O(Bjis$B$GJ]B8$5$l$F$$$k(B
  789. $BI,MW$,$"$j$^$9!#(B
  790.  
  791. </BODY></HTML>
  792.