home *** CD-ROM | disk | FTP | other *** search
/ ftp.madoka.org / 2014.12.ftp.madoka.org.tar / ftp.madoka.org / pub / plum / 2.x / plum2_32_1.lzh / module / ctcp / dcc / get.plm < prev    next >
Text File  |  1999-02-20  |  7KB  |  233 lines

  1. <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"><!-- $_ if 0; # -*- perl -*-
  2. # $Id: get.plm,v 2.37 1999/01/21 03:56:30 hasegawa Exp $
  3. # copyright (c)1997-1999 Yoshinori Hasegawa <hasegawa@madoka.org>
  4.  
  5. package ctcp_dcc_get;
  6.  
  7. $RECVSIZE = 65536;
  8. $DIRECTORY = '.';
  9. $CLIENTINFO = 'DCC';
  10. $TIMEOUT = 3600;
  11.  
  12. $_ = 'ctcp_dcc_get';
  13.  
  14. sub main_loop {
  15.   local($userno) = @_;
  16.   local($socket, $recv, $length, $size, $tmp, $timeout);
  17.   $recv = &'property($userno, 'recvsize') || $RECVSIZE;
  18.   $timeout = &'property($userno, 'timeout') || $TIMEOUT;
  19.   foreach $sno (&'array($dccserverlist)) {
  20.     next unless $'userno[$server[$sno]] == $userno;
  21.     if (vec($'rout, $sno, 1)) {
  22.       if ($size[$sno] - $done[$sno] < $recv) {
  23.         $size = $size[$sno] - $done[$sno];
  24.       } else {
  25.         $size = $recv;
  26.       }
  27.       $tmp = '';
  28.       $socket = $'socket[$sno];
  29.       if ($length = sysread($socket, $tmp, $size)) {
  30.         if (open(FILE, ">>$file[$sno]")) {
  31.           select((select(FILE), $| = 1)[0]);
  32.           print FILE $tmp;
  33.           close(FILE);
  34.         }
  35.         $done[$sno] += $length;
  36.         print $socket pack('N', $done[$sno]);
  37.         if ($done[$sno] >= $size[$sno]) {
  38.           &dcc_close($sno);
  39.         }
  40.       } else {
  41.         &dcc_close($sno);
  42.       }
  43.       vec($'rout, $sno, 1) = 0;
  44.     } elsif (time() - $'access[$sno] > $timeout) {
  45.       &'close($sno);
  46.       $dccserverlist = &'remove($dccserverlist, $sno);
  47.     }
  48.   }
  49. }
  50.  
  51. sub module_disable {
  52.   local($userno) = @_;
  53.   foreach $sno (&'array($dccserverlist)) {
  54.     next unless $'userno[$server[$sno]] == $userno;
  55.     &'close($sno);
  56.     $dccserverlist = &'remove($dccserverlist, $sno);
  57.   }
  58. }
  59.  
  60. sub cpss_dcc {
  61.   local($serverno, $prefix, $cmd, @params) = @_;
  62.   local($userno, $regex);
  63.   $userno = $'userno[$serverno];
  64.   if (&check_mask($userno, $prefix, $params[0])) {
  65.     ($cmd, $params[1]) = &dcc_open($serverno, $cmd, $params[1]);
  66.     return ($prefix, $cmd, @params);
  67.   }
  68.   return ($prefix, $cmd, @params);
  69. }
  70.  
  71. sub dcc_open {
  72.   local($serverno, $cmd, $msg) = @_;
  73.   local($userno, $nick, $dir, $name, $mode, @params, $sno);
  74.   $userno = $'userno[$serverno];
  75.   $nick = &'prefix($prefix);
  76.   @params = split(/\s+/, $msg);
  77.   if ("\L$params[0]\E" eq 'send') {
  78.     $dir = &'expand(&'property($userno, 'directory') || $DIRECTORY);
  79.     $name = "$dir/" . &newfile($dir, $params[1]);
  80.     if (open(FILE, ">$name")) {
  81.       close(FILE);
  82.       $mode = &'property($userno, 'mode');
  83.       if (defined($mode)) {
  84.         chmod(oct($mode), $name);
  85.       }
  86.       if ($sno = &'connect($params[2], $params[3])) {
  87.         $file[$sno] = $name;
  88.         $size[$sno] = $params[4];
  89.         $done[$sno] = 0;
  90.         $nick[$sno] = $nick;
  91.         $server[$sno] = $serverno;
  92.         $dccserverlist = &'add($dccserverlist, $sno);
  93.         foreach $cno (&'array($'clientlist)) {
  94.           next unless $'avail[$cno];
  95.           next unless $'server[$cno] == $serverno;
  96.           &'c_print($cno, '', 'NOTICE', $'nick[$cno], "*** DCC SEND request from $nick: $params[1] ($params[4] bytes)");
  97.           &'c_print($cno, '', 'NOTICE', $'nick[$cno], "*** DCC getting file $name ($params[4] bytes) from $nick");
  98.         }
  99.         return ();
  100.       }
  101.     }
  102.   }
  103.   return ($prefix, $cmd, $msg);
  104. }
  105.  
  106. sub dcc_close {
  107.   local($sno) = @_;
  108.   foreach $cno (&'array($'clientlist)) {
  109.     next unless $'avail[$cno];
  110.     next unless $'server[$cno] == $server[$sno];
  111.     &'c_print($cno, '', 'NOTICE', $'nick[$cno], "*** DCC got file $file[$sno] ($size[$sno] bytes) from $nick[$sno]");
  112.   }
  113.   &'close($sno);
  114.   $dccserverlist = &'remove($dccserverlist, $sno);
  115. }
  116.  
  117. sub newfile {
  118.   local($dir, $file) = @_;
  119.   local($name, $ext, $num);
  120.   $file =~ s/^.*[\\\/]([^\\\/]+)$/$1/;
  121.   $name = $file;
  122.   if (-e "$dir/$name") {
  123.     $ext = '';
  124.     if (rindex($file, '.') > 0) {
  125.       $ext = substr($file, rindex($file, '.'));
  126.       $file = substr($file, 0, rindex($file, '.'));
  127.     }
  128.     $num = 1;
  129.     $name = "$file-$num$ext";
  130.     while (-e "$dir/$name") {
  131.       $num++;
  132.       $name = "$file-$num$ext";
  133.     }
  134.   }
  135.   return $name;
  136. }
  137.  
  138. sub check_mask {
  139.   local($userno, $prefix, $chan) = @_;
  140.   local($user, $chlist, $list);
  141.   foreach $mask (&'property($userno, 'mask')) {
  142.     ($user, $chlist) = split(/\s+/, $mask);
  143.     $list = '';
  144.     foreach $vchan (split(/\,/, $chlist || '')) {
  145.       $list = &'add($list, &'real($vchan));
  146.     }
  147.     if (&'channel($chan)) {
  148.       next unless (!$list || &'exist($list, $chan));
  149.     } else {
  150.       next unless (!$list || &'exist($list, '*'));
  151.     }
  152.     if ($user =~ /^\-/) {
  153.       $regex = &'regex(substr($user, 1));
  154.       return 0 if $prefix =~ /$regex/i;
  155.     }
  156.     if ($user =~ /^\+/) {
  157.       $regex = &'regex(substr($user, 1));
  158.     } else {
  159.       $regex = &'regex($user);
  160.     }
  161.     return 1 if $prefix =~ /$regex/i;
  162.   }
  163.   return 0;
  164. }
  165.  
  166. __END__
  167. --><HTML><HEAD>
  168. <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-2022-JP">
  169. <LINK REV="made" HREF="mailto:hasegawa@madoka.org">
  170. <TITLE>ctcp/dcc.get.plm</TITLE></HEAD><BODY>
  171.  
  172. $B%*%s%i%$%s%I%-%e%a%s%H(B
  173.  
  174.  
  175. <HR><H3>$BL>A0(B</H3>
  176.  
  177. ctcp/dcc/get.plm - DCC SEND$B$KH?1~$7$FAw$i$l$F$-$?%U%!%$%k$r<u$1<h$k(B
  178.  
  179.  
  180. <HR><H3>$B@bL@(B</H3>
  181.  
  182. DCC SEND$B%j%/%(%9%H$,Aw$i$l$F$-$?$H$-!"(B
  183. $B$=$l$KH?1~$7$FAw$i$l$F$-$?%U%!%$%k$r<+F0E*$K<u?.$7$^$9!#(B
  184.  
  185.  
  186. <HR><H3>$B%W%m%Q%F%#(B</H3>
  187.  
  188. <DL>
  189. <DT>  ctcp.dcc.get.directory $B%G%#%l%/%H%j(B
  190. </DT>
  191. <DD>    $B<u?.$7$?%U%!%$%k$rCV$/%G%#%l%/%H%j$r;XDj$7$^$9(B
  192.         $B%G%#%l%/%H%j$,B8:_$7$J$$$H$-$d!"(B
  193.         $B%G%#%l%/%H%j$K=q$-9~$_$,$G$-$J$$$H$-$O%U%!%$%k$r<u?.$7$^$;$s!#(B
  194.         $B%G%U%)%k%H$G$O%+%l%s%H%G%#%l%/%H%j$G$9!#(B
  195. </DD>
  196. <DT>  ctcp.dcc.get.mask* $B%f!<%6%^%9%/(B [($B%A%c%s%M%kL>(B)]
  197. </DT>
  198. <DD>    $B%U%!%$%k$rAw?.$7$F$-$??M$,$3$3$G;XDj$5$l$?$b$N$K%^%C%A$7$?$i!"(B
  199.         $BAw$i$l$F$-$?%U%!%$%k$r<u?.$7$^$9!#(B
  200. </DD>
  201. <DT>  ctcp.dcc.get.mode $B%U%!%$%k%b!<%I(B
  202. </DT>
  203. <DD>    $B%U%!%$%k$r<u?.$7$?$H$-!"$=$N%U%!%$%k$N%U%!%$%k$N%b!<%I$r(B
  204.         $B$3$3$G;XDj$7$?CM$K$7$^$9!#(B
  205. </DD>
  206. </DL>
  207.  
  208.  
  209. <HR><H3>$B@_DjNc(B</H3>
  210.  
  211. <PRE>
  212. + ctcp/dcc/get.plm
  213. ctcp.dcc.get.mask: *!*@*
  214. </PRE>
  215.  
  216. DCC SEND$B$G%U%!%$%k$,Aw?.$5$l$F$-$?$H$-!"(B
  217. $B$=$l$,C/$+$iAw$i$l$F$-$?$+$K$+$+$o$i$:!"$=$N%U%!%$%k$r<u?.$7$^$9!#(B
  218. $B<u?.$7$?%U%!%$%k$O%+%l%s%H%G%#%l%/%H%j$K:n@.$5$l$^$9!#(B
  219.  
  220. <PRE>
  221. + ctcp/dcc/get.plm
  222. ctcp.dcc.get.directory: dcc
  223. ctcp.dcc.get.mask: *!*@*.jp
  224. </PRE>
  225.  
  226. DCC SEND$B$G%U%!%$%k$,Aw?.$5$l$F$-$?$H$-!"(B
  227. $BAw?.$7$F$-$??M$,!V(B*!*@*.jp$B!W$K%^%C%A$7$?$i!"$=$N%U%!%$%k$r<u?.$7$^$9!#(B
  228. $B<u?.$7$?%U%!%$%k$O!V(Bdcc$B!W$H$$$&%G%#%l%/%H%j$NCf$K:n@.$5$l$^$9!#(B
  229. $B!V(Bdcc$B!W$H$$$&L>A0$N%G%#%l%/%H%j$,B8:_$7$J$$>l9g$d!"(B
  230. $B=q$-9~$_$,$G$-$J$$>l9g$O%U%!%$%k$O<u?.$7$^$;$s!#(B
  231.  
  232. </BODY></HTML>
  233.