This chapter will cover various minor things that aren't big enough to have their own chapter, but are
important and usefull enough to be mentioned.
You can also make your script execute something after a certain number of minutes or seconds.
This can be done with the timer and utimer commands.
The syntax of a timer command is timer <time> "<command> [parameters]".
The <time> is after how long your command should be executed.
If you are using timer this would be have to be in minutes and if you are using utimer this
would have to be in seconds.
The <command> is the command you want to execute.
This can be a TCL command, an Eggdrop command or anything else just as long as it's a valid command.
The [parameters] are the parameters you want to give to your command.
With the commands timers and utimers you can see a list of the timers that are currently
active. These commands do not need any parameters and return a list of which each object contains information
about one of the timers that is currently running.
Note that timers are so called evaluated which means that if you have $foo that contains for instance "[foo]"
and than call the timer with utimer 30 "test $foo" it would try to execute the command "foo" since it's
enclosed in brackets and send the output of the command "foo" to the command as a parameter instead of what the
string contains.
So be extra carefull when you are using timers and escape any brackets in your strings with a command like
list or by putting backslashes in front of the brackets in the string itself like this:
set foo "\\\[foo\\\]" which would result in $foo containing "\[foo\]".
Because of this evaluation it is best to keep the syntax of the timer commands as timer <time>
[list <command> <parameters>]" when you are sending parameters to the procedure to prevent any errors from
occuring, better safe than sound.
You can get a random number with the rand command.
The syntax of a rand command is rand <number>.
The <number> is the number possibilities from which you want rand to return a number.
If you want 2 possibilities you will have to use rand 2, but rand starts counting at zero so
this will either return a 0 or a 1. Thus the return of a rand command is a random number between 0 and
(<number> - 1).
For example rand 10 would give a random number between 0 and 9.
When you try to access a string that doesn't exist TCL will give an error, because of that being able to
check if a string exist in advance is very usefull. This can be done with the info exists command.
The syntax of a info exists command is info exists <string>.
The <string> is the name of the string you want to check.
If your string is an array you can either just check if the array exists or check if a specific string
within the array exists, so both "test" for the array and "test(what)" for the string "what" in the array
"test" specifcally are both valid.
The info exists command returns a 1 if the string exists and a 0 if it doesn't.
For example, if you would do set test(foo) "bar" and you would use info exists test it would
result in a 1 and info exists test(foo) would result in a 1 aswell, so you can either check the array
itself or a string inside of it.
You already know the incr command but sometimes you might want to do a bit more than just adding up
and substracting from numbers.
You can perform more advanced math with the expr command.
The syntax of a expr command is expr <calculation>.
The <calculation> is what you want to calculate.
You can make the calculation as long as you like. The normal computer characters apply, which are a plus
sign (+) for adding up, a minus sign (-) for substracting from, an asterix (*) for multiplying, a slash (/) for
dividing and a percent sign (%) for the remainder.
The expr command goes through the calculation in the "official" way which means that asterix's are
handle before the plus signs for example.
The expr command can do a lot more than just calculating, but that won't be discussed here.
You can find more about these other functions in the man pages of TCL to which a reference is in
Chapter 3.4.
Also note that the expr command evaluates it's input like timer and utimer, therefor
you must escape any brackets and such if you want those into your calculation.
It's also possible to decorate your text a little bit.
Like mentioned in Chapter 3.3 you can use special codes
to underline your text for exmaple.
Besides underlining you can also make it bold and give it a color. You use these codes by just putting them
between the pieces of text you want decorated.
The code for underlining is \037, the code for bold is \002 and the code for colors is \003 which is followed
by the number of the color.
The newest versions of mIRC have a nice pop-up box that shows up when you type CTRL+K to make a color.
The numbers inside the colors are the same numbers to use here in the color code.
You start and end the places where you want your decoration to start and stop with the same code you started
the text decoration with.
For example "Hello \002$nick\002, welcome in $chan." would result in only "$nick" being in bold or "Hello
\002\0034$nick\003\002, welcome in \037$chan\037." would result in "$nick" being in bold and in the color red
and "$chan" underlined.
Note that when the end of the color decoration is defined only the code itself needs to be specified and
not the number of the color, if you specify the number of the color again it would just make the text switch to
that color again and not show any difference.
At some points you might want to check if a user has a certain flag before you want the bot to execute
something, you could want somebody to be at least a master for example.
This can be done with the matchattr command.
The syntax of a matchattr command is matchattr <handle> <flag(s)> [channel].
The <handle> is the name of the user you want to check, this has to be the nickname in which the bot knows
the user and not the current nickname of the user.
The <flag(s)> are the flags you want to check.
This can be a number of flags or just one.
Note that if you use "of" for instance as <flag(s)> the bot will check if the user has +o OR +f, not +o AND +f.
You can seperate the different flags with a | or & to define whether you want the bot the check if the user
has all those flags or just one of them, so "o&f" would make the bot check if the user has +o AND +f.
The [channel] is of which channel the flag will be checked.
Note that if you specify a channel, only the channel flags of the user are checked and not the global flags,
so a global moderator without a +o channel flag would turn up negative in this command unless you make it
"+o OR +o for #chan".
For example, matchattr $hand o|o $chan would check if the user is a global operator or a channel
operator of $chan, matchattr $hand o&m $chan would check if the user
is a global operator and a master of $chan.
A very usefull command is catch. With this command you can execute something
and catch the error, if there is one and prevent your script from crashing.
Under some circumstances it just might be easier to just use the catch command instead of a bunch of checks.
The syntax of a catch command is catch <command>.
The <command> is what you want to execute, including the parameters.
Just make it exactly how you would've executed it if you weren't using the catch command.
The catch command will return a 0 if there were no errors and a positive number otherwise.
For example if you were to unbind the dcc command die, it is better to do it like
catch { unbind dcc n die *dcc:server:die }, because if your bot is not connected to IRC you'd have to use
catch { unbind dcc n die *dcc:die }.
This way you can easily unbind the die command without trouble, because if you try to unbind a command that
doesn't exist your bot will give an error and crash.
|