⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 irc.pli

📁 net plug source code
💻 PLI
📖 第 1 页 / 共 5 页
字号:
    if {[catch {uplevel #0 $p} res]} {      irc_fshow $n "+++ Error evaluating \"$p\" : $res" \        error;    } else {      irc_fshow $n "+++ Tcl \"$p\" : $res" \        system;    }    return;  }  CLEAR {      set w $conn($n,txt);      $w configure -state normal;      $w delete 1.0 end;      $w configure -state disabled;      return;  }  CONFIG {IrcConfigEdit; return}  HELP {    irc_fshow $n "+++ Available commands : [lsort [array names ircCmd]]" \      system;     return;  }  UNALIAS {    foreach elem $p {      set elem [string toupper $0];      unset ircAlias($elem);    }    irc_fshow $n "+++ Removed Alias(es) : $p" system;    return;  }  QUOTE {    irc_fshow $n $p defcmd;    irc_send $n $p;    return;  }  ALIAS {    if {$np>1} {      set a [string toupper $0];      set ircAlias($a) $1p;      irc_fshow $n "+++ New Alias $a -> [list $1p]" system;    } elseif {$np} {      set a [string toupper $0];      catch {set ircAlias($a)} v;      irc_fshow $n "+++ ALIAS $a [list $v]" system;    } else {      set res {}      foreach a [lsort [array names ircAlias]] {	lappend res "+++ ALIAS $a [list $ircAlias($a)]";      }      irc_fshow $n [join $res \n] system;    }    return;  }  DCC {    if {$np>1} {      global dcc;      set what [string toupper $0];      switch -exact $what {	SEND {	  if {$np!=3} {	      irc_syntaxerror $n "/dcc SEND <nick> <filename>";	      return;	  }          set who $1;	  set filename $2;	  if {[catch {file size $filename} sz]} {	    irc_fshow $n "+++ Can't send \"$filename\" : $sz" error;	    return;	  }	  set dcc($n,file) $filename;	  set port [dcc_file_server $n 1];	  irc_send $n "PRIVMSG $who :\01DCC SEND [file tail $filename]\                       $irc($n,myip) $port $sz\01";	  irc_fshow $n "-> $who : DCC $what $filename ($sz bytes)\                          (listen on port $port)";        }	CHAT {          set who $1;	  set dcc($n,who) $who;	  set port [dcc_chat_server $n 1];          irc_send $n "PRIVMSG $who :\01DCC CHAT chat\                       $irc($n,myip) $port\01";	  irc_fshow $n "-> $who : DCC $what (listen on port $port)";	}	GET {	  if {$np!=5} {	      irc_syntaxerror $n "/dcc GET <filename> <host> <port> <size>";	      return;	  }	  set filename $1;          if {[file exists $filename]} {            irc_fshow $n "[irc_time] DCC GET $filename exists using\                          ${filename}~ instead" system;            append filename "~"          }	  set host $2;          set port $3;          set size $4;	  dcc_receive $n $filename $host $port $size;	}	CONNECT {	  if {$np!=4} {	      irc_syntaxerror $n "/dcc CONNECT <who> <host> <port>";	      return;	  }          set who  $1;	  set host $2;          set port $3;	  irc_fshow $n "[irc_time] DCC CONNECT host $host, port $port (for\             $who)";	  dcc_connect $who $host $port;	}	default {	  irc_fshow $n "+++ syntax error: /dcc type must be CHAT,\             CONNECT, GET or SEND" error;	}      }    } else {      irc_syntaxerror $n "/dcc <type> <dest> <args...>";    }    return;  }  QUERY {    if {$np!=1} {      irc_syntaxerror $n "/query <destination>";      return;    }    irc_fshow $n "+++ default destination is now $0" system;    set irc($n,curchan) $0;    set irc($n,nickquery) [regexp {^[^&+#]} $0];    return;  }  AUTOJOIN {    if {[cequal "" $irc($n,autojoin)]} {      irc_fshow $n "+++ Can't auto join, no autojoin channel set" error;    } else {      irc_add_chan $n $irc($n,autojoin) $irc($n,autojoinkey);      irc_join $n $irc($n,autojoin) $irc($n,autojoinkey);    }    return;  }  JOIN {    if {$np==0} {      irc_syntaxerror $n "/join <channel> <opt args...>";      return;    }    set chan $0;    irc_add_chan $n $chan $1p;    irc_join $n $chan $1p ;    return;  }  CYCLE {    if {$np==0} {      set chan $C      set key  $irc($n,curkey);    } elseif {$np==1} {      set chan $0      set key  [irc_get_chan_key $chan];    } else {      set chan $0      set key $1p;    }    irc_send $n "PART $chan :cycling";    irc_send $n "JOIN $chan $key";    return;  }  INVITE {    if {$np==0} {      irc_syntaxerror $n "/invite <nick>" "/invite <nick> <channel>";      return;    } elseif {$np==1} {      set p "$0 $C"    }  }  OPER {    if {$np==0} {      irc_syntaxerror $n "/oper <passwd>" "/oper <nick> <passwd>"    } elseif {$np==1} {      irc_send $n "OPER $N $0";    } else {      irc_send $n "OPER $p";    }    return;  }  KICK {    if {$np==1} {      set p "$C $0 :$irc(kickmsg)";    } elseif {$np>2} {      set p "$0 $1 :$2p";    } else {      irc_syntaxerror $n "/kick <who>" "/kick <channel> <who> <why...>";      return;    }  }  CTCP {    if {$np>1} {      set who $0;      set what [join [concat [list [string toupper $1]] [lrange $plst 2 end]]];      irc_send $n "PRIVMSG $who :\001$what\001";      irc_show $n "-> $who : CTCP $what" send    } else {      irc_syntaxerror $n "/ctcp <dest> <type><args...>";    }    return;  }  MSG {    if {$np>1} {      set who $0;      switch -exact -- $who {	"." {	  set who $irc($n,dotnick);	}	"," {	  set who $irc($n,comanick);	}      }      irc_send $n "PRIVMSG  $who :$1p";      rem_away $n;      if {[regexp {^[&+#]} $who]} {	irc_show $n ">$who> $1p" send;	if {$irc(msgmem,inclchans)} {irc_tabadd $n $who}      } else {	irc_show $n "-> *$who* $1p" send;	set irc($n,dotnick) $who;	irc_tabadd $n $who;        if {$irc(remove_away) && $irc($n,away)} {irc_send $n "AWAY"}      }    } else {      irc_syntaxerror $n "/msg <dest> <what...>" ;    }    return  }  SAY {    if {$irc($n,nickquery)} {      irc_show $n "-> *$C* $p" send    } else {      irc_show $n "> $p" send    }    irc_send $n "PRIVMSG $C :$p";    rem_away $n;    return;  }  NOTICE {    if {$np>1} {      irc_send $n "NOTICE  $0 :$1p";      if {[regexp {^[&+#]} $0]} {        irc_show $n "-$0> $1p" send;      } else {        irc_show $n "-> -$0- $1p" send;      }    } else {      irc_syntaxerror $n "/notice <dest> <what...>";    }    return  }  PING {    if {$np==0} {set p $C}    irc_fshow $n "-> $p : PING request..." send;    irc_send $n "PRIVMSG $p :\001PING [format %u [clock clicks]]\001";    return;  }  ME {    irc_send $n "PRIVMSG $C :\001ACTION $p\001";    irc_show $n "* $N $p" send;    return;  }  PART {    if {$np>0} {      if {$np>1} {        set p "$0 :$1p";      }    } else {      set p $C    }  }  QUIT {    if {$np==0} {      set p ":I use NetPlug's Irc"    } else {      set p ":$p";    }    set irc($n,quit) 1;  }  AWAY {    set irc($n,autoaway) 0;    if {$np==0} {      set irc($n,away) 0;    } else {      if $irc(away_is_auto_away) {        set irc($n,autoaway) 1;      }      set irc($n,away) 1;      irc_show $n "AWAY :$p" defcmd;      irc_away $n $p;      return;    }  }  WHO   {if {$np==0} {set p $C}}  NAMES {if {$np==0} {set p $C}}  LIST  {if {$np==0} {set p $C}}  SERVER {   if {$np>0} {     set srv $0;     if {$np<2} {       set port $irc(port);     } else {       set port $1;     }     set cmd "QUIT"; set p ":Changing Server";     if {[cequal "" $C]} {       after 1000 [list IrcConnect $srv $port $N];     } else {       after 1000 [list IrcConnect $srv $port $N [list "/join $C"]];     }     set irc($n,quit) 1;     global netmod; set netmod 0;   } else {     irc_syntaxerror $n "/server <server> <optional port>";     return;   }  }  CLOSELOG {    if {[info exist irc($n,logfile)]} {      close $irc($n,logfile);      unset irc($n,logfile);      defOut $n 0 "+++ Log file closed ([subst $irc($n,logfilename)])\n"\	system;    }    set irc($n,logmsgn) "";    return;  }  RESETLOG {    catch {eval $ircCmd(CLOSELOG)};    set fname [subst $irc($n,logfilename)];    close [open $fname w];    irc_fshow $n "+++ Log file $fname reset" system;    return;  }  KILL {    if {$np<2} {      irc_syntaxerror $n "/kill <nick> <reason...>"      return;    } else {      set p "$0 :$1p"    }  }  SQUIT {    if {$np<2} {      irc_syntaxerror $n "/squit <server> <reason...>"      return;    } else {      set p "$0 :$1p"    }  }}############# End of User commands handling code ##################proc irc_syntaxerror {n err1 {err2 ""}} {  defOut $n 0 "+++ syntax error: use \"" error;  defOut $n 0 $err1 system;  if {![cequal $err2 ""]} {    defOut $n 0 "\" or \"" error;    defOut $n 0 $err2 system;  }  defOut $n 0 "\" instead\n" error;  update;}proc irc_idle {n} {  global irc  expr int(([clock seconds]-$irc($n,lastmsg))/60);}# format current timeproc irc_time {} {  global irc;  set irc(time) [clock format [clock seconds] -format "%H:%M"];  return "\[$irc(time)\]";}#proc IrcUserInput {n str} {IrcDoN $n $str}proc rem_away {n} { global irc if {$irc($n,autoaway)} {   irc_send $n "AWAY"   irc_fshow $n "[irc_time] (auto) away removed (after [irc_idle $n] mins\                   idle)" system;   set irc($n,autoaway) 0;   set irc($n,away) 0;   set irc($n,autoawaytime) $irc(auto_away_time); } set irc($n,lastmsg) [clock seconds]; set irc($n,lastrecm) "";}proc IrcDoN {n inputstr} {  foreach str [split $inputstr \n] {      if {[cequal $str ""]} continue;      IrcDo $n $str  }}proc IrcDo {n str} { global irc conn ircCmd ircAlias dotdir release; set N $irc($n,nick); set C $irc($n,curchan); if {[string match "/*" $str]} {   set str [string range $str 1 end];   # alias substitution   set break 0;   while 1 {     if {![regexp {^([^ ]+)( +(.*))?$} $str all cmd r p]} {        puts stderr "parse error in IrcDo for '$str' !"; return;     }     set np 0;     set plst [split $p];     foreach word $plst {set $np $word;incr np}# puts "#=($np), plst=($plst), p=($p)";     set cmd [string toupper $cmd];     # often used     set 1p [join [lrange $plst 1 end]];     set 2p [join [lrange $plst 2 end]];     if {[string match "/*" $cmd]} {set cmd [string range $cmd 1 end]; break;}     if {!$break && ([info exists ircAlias($cmd)])} {       set subst $ircAlias($cmd);# puts "alias substitution for $cmd ($p) : '$subst'";       set pstr $str;       if [catch {set str [subst $subst]} res] {	 irc_fshow $n "+++ Error in alias substitution for $cmd ($subst) :\	    $res" error;	 return;       }# puts "alias substitution result : '$str'";       if {[cequal $str $subst]} {         # if subst did nothing (simple aliases), we add params if needed:	 if {![cequal "" $p]} {	   set str "$str $p";         }       }       if {[cequal $str $pstr]} {         # exactly the same string is produced, prevent loops and break:         break;       }       if {[string match "/*" $str]} {         # returned string starts with a /, the alias want the command to         # be called directly:         set str [string range $str 1 end];         set break 1; # but we need to build new $p, $0,... delay the break       }     } else {       break;     }   }# puts "#=($np), cmd=($cmd), p=($p)";

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -