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 / nako.plm < prev    next >
Text File  |  1999-03-24  |  24KB  |  768 lines

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