mIRC help? Nothing to do with eggdrop, TCL or any language that makes any sense.NoZparker wrote: it is worth looking in the help file in your mirc script
Ok but, not an analogy I would have used myself as not all use mIRC or Windows. Some of us Windows users prefer XChat (which uses TCL).NoZparker wrote:the [arg] can be found in mirc as in nick!ident@host or any combination thereof
Code: Select all
set mylist [list "element1" "others" "yet another"]
If you want to find 'others' in this list, try:element1 others {yet another}
Code: Select all
lsearch -exact $mylist others
Code: Select all
lsearch -glob $mylist yet*
Code: Select all
## WRONG CODE
if { $newflag } {
# if { $oldflag } {
puts hello
}
Code: Select all
## CORRECT CODE
if { $newflag } {
# if { $oldflag } {
puts hello
# }
}
Code: Select all
# This is a comment line that ends with a backslash \
and this line is still part of the comment
for example.:~$ tclsh8.4
% regexp -all a thisaaa
3
% regexp a thisaaa
1
Code: Select all
bind time - * {putlog "hi goober";#}
Code: Select all
if { ! [info exists ::allready_started_minute_loop] } {
set ::allready_started_minute_loop 1
call:every:minute
}
proc call:every:minute { } {
name_of_your_proc ?variables?
timer 1 [list call:every:minute]
}
Code: Select all
proc myqueue:clearqueue { } {
# some code here
after 200 myqueue:clearqueue
}
proc my:second:queue:clearqueue { } {
# some code here
after 200 my:second:queue:clearqueue
}
Code: Select all
proc lremove { list what } {
while { [set pos [lsearch -exact $list $what]] != -1 } {
set list [lreplace $list $pos $pos]
}
return $list
}
# example:
# set list "aa bb cc"
# set list [lremove $list "bb"] will set list to "aa cc"
Code: Select all
# Sendftp v1.01 (12/6/97) by Ernst <ernst@studbox.uni-stuttgart.de> ; # Ernst's eggdrop page: http://www.sodre.net/ernst/eggdrop/ (defunct)
# modified by soroh: only removed pingcheck portion, and changed the proc name ; in case users already had sendftp.tcl loaded, as well as aligned the code.
proc pisg_sendftp { localfile server user pass remotefile } {
if { ! [file exist $localfile] } {
putlog "pisg_sendftp: File $localfile does not exist."
return 0
}
set noftp [catch { set ftpprog [exec which ftd] } ]
if { $noftp } {
if { [file executable /usr/bin/ftp] } {
set ftpprog /usr/bin/ftp
set noftp 0
}
if { [file executable /bin/ftp] } {
set ftpprog /bin/ftp
set noftp 0
}
}
if { $noftp } {
putlog "pisg_sendftp: You don't seem to have the 'ftp' tool"
return 0
}
set pipe [open "|$ftpprog -n $server" w]
puts $pipe "user $user $pass"
puts $pipe "bin"
puts $pipe "put $localfile $remotefile"
puts $pipe "quit"
close $pipe
# putlog "pisg_sendftp: file send without error"
return 1
}
# this is a part of psig.tcl which can be found in egghelp.org script archive.
# i changed just the return code, 1 if file send sucess, otherwise 0
Code: Select all
eval lappend thislist $thatlist
What does this mean to eggdrop? Many scripts use [timer] and [utimer], which pass their argument to the Tcl interpreter for evaluation (albeit delayed), just like [eval] does. So if you are careless enough to write something like this:This is a short note to describe a deep "gotcha" with TCL and the standard way to handle it. Up front, TCL seems pretty straight-forward and easy to use. However, trying out some complex things will expose you to the gotcha, which is referred to as "quoting hell", "unexpected evaluation", or "just what is a TCL list?". These problems, which many very smart people have had, are indications that programmer's mental model of the TCL evaluator is incorrect. The point of this note is to sketch out the basic model, the gotcha, and the right way to think (and program) around it.
THE BASIC MODEL (courtesy of John O.)
Almost all problems can be explained with three simple rules:For example, consider the following four one-line scripts:
- Exactly one level of substitution and/or evaluation occurs in each pass through the Tcl interpreter, no more and no less.
- Each character is scanned exactly once in each pass through the interpreter.
- Any well-formed list is also a well-formed command; if evaluated, each element of the list will become exactly one word of the command with no further substitutions.
In the first script the set command passes through the interpreter once. It is chopped into three words, "set", "a", and the value of variable "b". No further substitutions are performed on the value of b: spaces inside b are not treated as word breaks in the "set" command, dollar-signs in the value of b don't cause variable substitution, etc.Code: Select all
set a $b eval {set a $b} eval "set a $b" eval [list set a $b]
In the second script the "set" command passes through the interpreter twice: once while parsing the "eval" command and again when "eval" passes its argument back to the Tcl interpreter for evaluation. However, the braces around the set command prevent the dollar-sign from inducing variable substitution: the argument to eval is "set a $b". So, when this command is evaluated it produces exactly the same effect as the first script.
In the third script double quotes are used instead of braces, so variable substitution occurs in the argument to eval, and this could cause unwanted effects when eval evaluates its argument. For example, if b contains the string "x y z" then the argument to eval will be "set a x y z"; when this is evaluated as a Tcl script it results in a "set" command with five words, which causes an error. The problem occurs because $b is first substituted and then re-evaluated. This double-evaluation can sometimes be used to produce interesting effects. For example, if the value of $b were "$c", then the script would set variable a to the value of variable c (i.e. indirection).
The fourth script is safe again. While parsing the "eval" command, command substitution occurs, which causes the result of the "list" command to be the second word of the "eval" command. The result of the list command will be a proper Tcl list with three elements: "set", "a", and the contents of variable b (all as one element). For example, if $b is "x y z" then the result of the "list" command will be "set a {x y z}". This is passed to "eval" as its argument, and when eval re-evaluates it the "set" command will be well-formed: by rule #3 above each element of the list becomes exactly one word of the command. Thus the fourth script produces the same effect as the first and second ones.
THE GOTCHA (observations by Brent Welch)
The basic theme to the problem is that you have an arbitrary string and want to protect it from evaluation while passing it around through scripts and perhaps in and out of C code you write. The short answer is that you must use the list command to protect the string if it originates in a TCL script, or you must use the Tcl_Merge library procedure if the string originiates in your C code. Also, avoid double quotes and use list instead so you can keep a grip on things.
Code: Select all
utimer 10 "putkick $chan $nick $reason"
Code: Select all
utimer 10 [list putkick $chan $nick $reason]