Counting the Days

It is never easy watching a parent die. And even more difficult watching them suffer a slow and painful death that could take their life tomorrow or take them in another 40 years. And what can make it even worse, knowing that you will likely achieve that same level of agony at some point before you die, because you too have that same medical condition. But hopefully you will know you can choose your death, even if you can’t choose the manner you are delivered to it.

I remember going with my mother to the first pain specialist in 2001. “You have Parkinson’s,” the doctor said. Parkinson’s explained her stuttering and shaking, but it didn’t explain the random pain and the doctor wasn’t sure either. He handed her a prescription for Neurontin 5 mg to be taken once daily. “We’ll see if this helps with it and address it further if this doesn’t resolve the symptoms.”

It was four years, three doctors, one new diagnosis, and many  more medications added later before the pain specialists managing my mother had finally decided that the Neurontin was not the appropriate drug for her medical conditions. But at this point, there was one problem. My mother had been on it so long and was increased so many times that her dosage now sat at 800mg daily.

The doctor who had recently taken over her care stared appalled at her. He was concerned that the previous doctors allowed her to remain on this medication for so long without trying a different one despite the fact it obviously was not effective. He requested she try to use a half dosage of Neurontin and supplement with a potentially more effective new medication. She tried. But after 14 hours the agony from her lack of Neurontin and the side effects from the new medication nearly drove her to suicide. She pleaded I call the doctors because her body hurt so bad from the pain that she feared she would not be coherent enough to express her needs to the staff. I did so and they promptly stopped trying to alter her medicine regiments. It has since become a “treat the pain and sedate the soul” until the time comes. My mother lives out of a little box filled with pain pills and antidepressants to get day in and day out.

Holidays, she will visit the family for maybe an hour and then she is spent, emotionally and physically. She fears the burden of her presence on the family will bring others down. So she returns to her small apartment where she keeps her gun and her medications to keep her from using it. I’ve watched my mother go through tests, experimental procedures, and excruciating pain for the last 8 years. She has given up. And now I have it.

The biggest differences between her and I. She was improperly treated by doctor after doctor; we knew the proper precautions to avoid triggering mine or at least advancing it. She was one of the first people to really be treated with many of the experiments’ now known to make the condition worse; I have had a few years to have results of the tests be published to research online. And lastly, my mother fears being a burden on her family and would sooner be dead to us now while she still lives than feel she is causing us despair seeing her deteriorate. I don’t care if my family feels that way, because those of my family and friends who really care will be there as I will always be there for them. Even if I can’t physically do what I once could have.

I know my mother is going to die. And it might seem odd or maybe uncaring, but I hope it’s soon. The doctors are giving her so many pills, that my mother is barely a human anymore. I can count one of three things each time I try to call my mother; she’ll be pushing herself too hard because the pains subsided for a few hours, she will be exhausted from the pain from fighting the atrophy of her legs trying to use them, or nearly dead from taking a medication at the wrong time one of these times. I just hope that when she goes, it’s not because of the pain and because of the fact her body was done. I count each day as one more my son has gotten to have with her and one more he will have with me.

No Comments

Conquest Disease

The Unseen Weapon of Mass Destruction

America, today, is a hemisphere with such an array of ethnic backgrounds but still shares one common link, immunity. This link, like many of the inhabitants, is an imported item to the Americas. This item was imported along with the cause for its existence. That cause, disease, would become the most inexpensive, effective weapon the conquests have.

Even in modern day, when a person gets sick, their loved ones care for them. Many times these loved ones are family and share similar strengths and weaknesses as those who fall ill. And with the seclusion from the rest of the world, it wasn’t just one or two diseases that those original inhabitants were weak against. And as a family member would fall to an illness they would expose the rest of their family. Those family members who were weak would eventually face a similar fate, those who were lucky to have immunity would likely go reside with other family members who were more resistant to the current strain and assist them.

But the bombardment of the new strains hitting the Americas was like a wild fire. As one strain seemed to burn out, two more would pop up unexpectedly. “Influenza, small pox, measles, mumps, and pneumonic plague arrived first, followed by typhus, diphtheria, malaria, and yellow fever” Butzer pg 351. Each disease with a swarm of symptoms, some minor and likely already treated in the old world, but others too aggressive to address. Eventually leading the populations to catastrophic levels of fatalities that delivered the old world’s inhabitants to their gods, and sparing so very few to watch their societies crumble under the new rule.

The first and still very prominent today, influenza, is easily spread through the air. Today, the symptoms are well known and are often dismissed by those infected as medicine and treatment is so readily available. Symptoms of high fever, headaches, exhaustion, cough, sore throat, running or stuffy nose, body aches, vomiting, and diarrhea for those of the ancient world without effective medicines were likely improperly addressed or under estimated and the body worsened.

With today’s medical knowledge people are still dying from dehydration and bacteria caused pneumonia and those who do live suffer advancements or are struck down by “congestive heart failure, asthma, and/or diabetes” according to the CDC. Even these health issues can lead to death today, before we had the medical treatments and diagnosis of our modern medicine, the damage of the “flu” alone was staggering to a society with no immune systems against it or knowledge of how to treat it.

Even as the flu created chaos and weakened the immune systems of the inhabitants, other diseases were waiting to flood in. The mumps and measles were airborne pathogens that with any exposure could be transferred to the inhabitants. Additional symptoms were now bombarding the locals leading to more problems of pneumonia, meningitis, encephalitis, seizures; all which without proper medicines and treatment even today can cause death. And those who lived faced blindness, deafness, and in the case of mumps, even sterilization.

Other diseases such as small pox and pneumonic plague still required physical contact, maybe not always of the person to person type, but rather bedding to person, it still was capable to giving very horrible ends to those who would be otherwise be unexposed. Rashes from small pox could be over looked as something less extensive and treated improperly leading to exposure of others in the family or worse yet, infection of the blisters for the ill. It was a war zone for each individual body, let alone each household and each city.

Even today, these diseases run rampant in parts of the world despite our attempts to vaccinate.  An outbreak of mumps 2 years ago, despite his complete vaccination record, left my son with permanent signs of his personal battle with this disease. He lived, but must be constantly watched to insure other problems have not been caused. In other places with less access to the vaccinations, the measles takes the life of 1 in every 4 lives it touches.

There is no question the ancient societies of the Americas were being murdered by unseen enemies, but those remaining were being demoralized. They watched loved ones die and in some cases, worse yet, live. It was excruciating. Their societies were being enveloped and falling into ruin under the hand of the visitors, regardless of if they wanted to fight back or not. There was no protection from this weapon. Guns were intimidating but the bullets had to strike you, but with so many of the diseases requiring only the breath of a symptomless but carrying person to touch the immuno-deficient, there was no stopping it.

The pain of knowing there is nothing you can do to fight back. Nothing you can do to reassure those who you love and care about that they aren’t going to die, is agonizing.  I can only imagine what those who lived through the wild fires of disease felt as they watched their worlds, their lives, their families fall. I was able to have faith my son would live, but for them with each death, that hope with each new victim of the diseases, that faith must have been shattered for those people.

No Comments

There’s Always a Time to Die, Rarely Time to Live

“I’m dying!?!  Wait, is he sure its brain cancer?  Is there anything else it could be?  I need to see for myself.  OK, time to get on WebMD.  What symptoms should I have?  What symptoms am I displaying?  Heck is there even enough symptoms to be sure I have it and not something else?”  These are all things that I need the answers to before I can count on the doctor telling me anything viably true.  I’m not unfamiliar with the capabilities of doctors making misdiagnoses.  “OK, let’s see, if I have fewer than 50% of the symptoms, it’s time to visit a second opinion.  Heck, even if I only have 50%, I’m going anyway.  Anymore than that; I’ve got to think.”

After spending the rest of the afternoon reading, understanding the causes, the treatments, and the likely side effects of treatment or no treatment, I decide on comfort care.  I’ve never liked pain, at least not inflicted by outside forces.  I have always had an amazing pain tolerance to my own bodies pain, just not to needles or treatments delivered by doctors unless I’m put under.  The treatments the doctors are offering are going to just be too much for me.  I mean a chance for survival is a nice thought.  But even if I recovered from this, the pain I would go through would likely still leave me debilitated because of the RSD.  Not to mention what it would put my children through, my loved ones.  I just don’t feel that the chance of recovery from this outweighs what I’m likely going to have to relive daily if the cancer doesn’t get me.

I spend the next few hours thinking, “How am I going to tell Joe?”  I get to thinking of how he has dealt with others deaths.  At first he did so well, and the depths to which he feels the sorrow of their being gone.  Heck, we have spent hours we discussing death, and what happens, and even my own death.  I choose to go somewhere special, somewhere we some great times and give him a way to try and enjoy this.  When I was pregnant I used to go to the park where his dad takes him now regularly in his home town, but unfortunately I can’t handle the drive anymore because of the pain.  So I decide to go to the park here in Cedar Falls on Franklin.  He loved the one just north of Main and First Streets, but the floods of 2008 really did it in.  For Joe’s sake, I ask his dad to come down to help Joe through this with me, because with me gone, Joe is going to depend on him a lot more now.

I break it to Joe gently asking him if he remembers swinging with me and I tell him about what I did that fall before he was born.  I talk about how we all are born and remind him that we all die.  That is when I let him know that the doctors feel that I am going to be leaving him soon and that I want to spend extra time with him doing things he enjoys, like when I went swinging with him all those years go before he was even born.  Dave’s trying to soak it in.  He has known that with my RSD so much has happened to stop my ability from doing things, but it really hasn’t him that soon Joe will be in his care for the rest of his adolescent and teen life.  My being able to be alive was the last thing he thought RSD would stop me from doing.

I express to Joe that as I get sicker, dependant on how his dad feels, any schooling he needs to do might be best done at his dads.  I want to see him every waking hour I can but he knows that we all have to make our mark in history and life, and it’s much easier to do that if we are educated.  But I make it very clear that if he wants to stay with me, he must promise me to do his homework and not try to take care of me all the time because there will be people to help with that.

I also take this time to explain that my body won’t always look like I do now.  I will get tired more often, my skin’s color will most likely change, and I will still hurt, maybe even more so.  But no matter what I am still myself inside, even if my body limits me.

Many times Joe and I have discussed that life only ends when we let it, and that as long as he loves me, then I will live forever.  In the past, I have known some very vivacious elderly and some very dead youth.  Our family and our friends keep us alive as long as they remember what we taught them and gave them throughout the time they spend with us.  It would be now that I would finally become more honest about what I believe, because what do I have to worry about, someone killing me for being too outspoken?

Personally, what little faith I have has led me on a path to learn about belief and religions in general, to try and find answers according to whatever omnipotent being there might be and to live life that way.  One of those things I have come to believe that the way we are, we act, we think is bound to the soul/spirit.  And one of my greatest fears is of being trapped, my spirit bound to my body in which I could no longer do the one thing I live for.  I desire to bring a genuine smile to someone’s face every day.  Being in a place where I could not interact with others; that would be worse than any torture hell could devise.

After telling Joe, I break the news to my father and mother; they try handle it as best they can, but I can tell it hurts them deeply, especially my mother.  I let them choose to break news to the rest my family, I let my brother and close friends know.  It is these people whom have been there through the rough times, standing by me through the pain of the RSD, that I owe them the information in person.  So I ask them to come over for dinner to discuss the philosophy of life for an opening break it to them.  For those at a distance, I attempt to at least do it over the phone so I could comfort them in some small way.

Time moves along and I start to become weary of life, the pain would steepen, amplified by the RSD.  At points I feel life is worth living and again consider suicide again or even assisted suicide.  As I have so many times before, considered them both for present and future means, I remember that even if we don’t enjoy my life, we are going to die, so why rush fate.  Even now I still believe everything has a reason it happens, even if it doesn’t make any sense now, those events have a place in history, unknown to future generations or not.

I try to keep a diary from the day of diagnosis till my death of the love, the joys, the pains, and the tears.  I want my family to know the depths I love them and this book gives that to them.  I have already “died” once, the second time around isn’t so scary.

No Comments

MIRC Tutorial

The best way to learn and understand the way these sections work is by studying them in consecutive order. Really! Please don’t try to take a shortcut to the Remote sections before you really understand the Aliases and Popups. The lessons you’ll learn from each are cumulative.

(A note for those familiar with ircii: mIRC’s aliasing syntax is similar to ircii’s, but not exactly the same. mIRC’s Remote Command and Event sections allow you to implement many of the same things you can do with ircii scripting, but the structure and syntax are a bit different.)


The Aliases section.

Under Tools/Aliases… the Aliases section will be found.

In this section you can define shortcuts for often-used commands such as join, part, quit, opping and deopping, and whatever else you want. Even things you frequently say can be placed in an alias… In general, ALL commands which can be used in the edit box (the line or lines you normally use to talk/type in) can be used in an alias. Aliases can also be used to execute several commands at once. You can even define aliases that are launched by the function keys F1 – F12…. (Finally some use for those never touched keys..)
In mIRC you can even call an alias from popup menu’s and remote lines.

Creating Aliases.

OK, let’s start right off the bat with an example. To join a channel, you normally have to type:

/join #{name}

…where #{name} is the name of the channel, of course. Since this command is used so often, it’d be nice to use it by typing as little as possible, right? So let’s create an alias for “/join #{name}” — let’s create a shortcut.

Instead of typing “/join #{name}”, let’s make it so that we can type “/j #{name}” with the same results.

In that case, the Alias would be:

/j /join $1

(You don’t have to understand exactly what that means to mIRC at this point, just what it will do. I’ll explain the alias syntax shortly.)

Give it a try by placing the line “/j /join $1” in the Aliases list under Tools/Aliases (if it isn’t already there). Then try it out on the command line (where you normally type) with a simple command like:
“/j #test”.

You’ll see that “/j #test” now does exactly the same thing as “/join #test” — it joins you to a channel named #test. This construction is called an alias.

Alias Syntax.

Aliases use the following format: “/{aliasname} /{command}”

In other words, first your “shortcut” name (like “/j” in the example above), then a space, and then the actual command your shortcut is pointing to (like “/join” in the example above).

But it doesn’t stop there. Aliases also use a number of special STRINGS. There are three pre-defined strings (#, $me and $! ) which always mean the same thing to mIRC (new predefined strings are the $read [-l#] and $url …. I’ll discuss them later too.), and then several variable strings (such as $1, *1, $$1, $?, #$1, #$$1, and even #$?).

Don’t worry, we’ll explain all of these in good time.

Right now, let’s concentrate on $1. After all, that’s the string we used in our example above:

/j /join $1

$1 means “the first word typed after the Alias, whatever that may be.” So if you type “/j #test”, mIRC knows that this is a shortcut for “/join #test”. If you type “/j #hello”, it will know that this is a shortcut for “/join #hello”.

Example: Multiple Commands

Now, let’s say that you’d like to join several channels at once. You can make an alias to do this. Just separate the commands with the | character (on most keyboards, this is the shifted version of the backslash key)…

Let’s say that you’d like to be able to type “/j3” and then follow it with the names of three channels, and they’ll all be joined at once. The alias would be:

/j3 /join $1 | /join $2 | /join $3

So if you placed this alias in Tools/Aliases and you were to type:

/j3 #test1 #test2 #test3

…mIRC would “/join #test1”, then “/join #test2”, and then “/join #test3”.

In this case, you see that $1 means the first word typed after the Alias. And $2 of course means the second word, and $3 the third.

Now, mIRC is obviously expecting three words — your channel names. So what would happen if you just typed “/j3 #test1”? mIRC would complain about the missing parameters, as it’s expecting more channels to be named. There is a solution to this problem, the $$1 string, which will be explained later.)

Example: /say

Let’s say that there’s something you find yourself typing into a channel all the time, like your home page address, a greeting, etc.

Take a look at these alias examples using the “/say” command: “/say” simply types the indicated text into your current channel or private message window.

(On some systems, you may need to scroll to the right to see the full text of these and other examples.)

/hello /say Hello to all of you…

/www /say The mIRC page is at

/lines /say This is the first line | /say This is the second line | /say This is the last line

The last examples show how to /say multiple lines of text in one alias. Just separate the commands with the | character. You also see that not all aliases always have Strings in them.

Example: /me

Actions in an alias…

/fun /me thinks this is fun!
/hug /me hugs $1 firmly!

The second example uses a string, $1. If you were to type “/hug everybody”, this would be equivalent to “/me hugs everybody firmly!”

Example: Shared Strings

Multiple commands can also share the same string.

/jtest /join $1 | /topic $1 just testing

In this alias definition the parameter $1 is used twice. If you were to type “/jtest #test”, it would first join the channel #test, and then change the channel topic to “just testing.”

Another example along the same lines:

/love /say I love $1 ! | /say I really love $1 !!

If you were to type “/love everybody”, mIRC would know to “/say I love everybody !” and then, “/say I really love everybody !!”

Example: Mode Changes (Opping, etc.)

To put your often-used mode changes in the aliases section, you first need to know the normal structure of the mode commands. Opping somebody on IRC normally requires the command:

/mode #{channelname} +ooo {nick1} {nick2} {nick3}

…in which up to 3 persons can be mentioned.

This can be nicely aliased with:

/op /mode # +ooo $1 $2 $3

To op John, Jake, and Joan, now you can just type: “/op John Jake Joan”

The # in this alias shows the use of one of the other pre-defined strings (# and $!). The # always stands for the #channelname of the channel on which the alias is used….

In the same way you can make aliases like…

/deop /mode # -ooo $1 $2 $3
/ban /mode # +b $1
/kick /kick # $1
/dbk /mode # -o $1 | /kick # $1 | /mode # +b $1

IMPORTANT: Proper spacing!

This is very important! You MUST include spaces between strings and the rest of your text! For example:

/like /say I really like $1!!!

…will NOT work! There needs to be a space between the string “$1” and your “!!!”‘s. (This can sometimes make your text look awkward when using commands like /say, so be careful with your phrasing.)

/like /say I really like $1 !!!

…WILL work just fine.

This is true of ALL strings. To make one particular case easier, specifying channels, a few special strings have been created that automatically prefix the parameter with the # character. These are #$1, #$$1, and #$?. See below for details.

In SOME cases you CAN do: /like /say I really like $1’s topic,
but keep in mind: NOT ALWAYS !! You have to test this in every case you want to use it…

Where can you use Aliases?

Aliases can be used in the edit box (the line or lines you normally use to type commands in), and you can even use aliases in the Popups and the Remote sections that will be explained in the following sections. The function key aliases can also be used on selected nicks in the channel names-list and in query windows, etc….depending on your alias definitions. It is even allowed for aliases to call other aliases, or even to call themselves recursively. As a safeguard against infinite loops, the default maximum recurse depth is set at 5. This can be changed with the /maxdepth command. The minimum depth allowed is 1 (aliases can’t call other aliases) and the maximum is 100. Calling aliases from within aliases uses quite a bit of memory, so this might cause problems in certain situations where memory is low etc. In case one of your aliases or remotes got into a loop use the CTRL+Break key combination to stop the process.

Special Alias Definitions ; The Function keys.

A special alias definition is possible which can launch commands using the Function keys. Define some aliases as follows:
/f1 /say Hello to you all
/f2 /topic # This is a new topic

You now can type “/f1” to say hello to all on a channel … but pressing the “F1” function will also work !! Other examples:
/f5 /me will happily send you the new mIRC.
/f6 /join #mirc
/f9 /dcc send $1
/f10 /dcc send $1
/f11 /dcc send $1

The F9 key will send the mIRC FAQ to a person selected from the channel names list. Don’t forget to select a nick first ! If you don’t, you will see strange (but logical) things… You can even use the F9 key in a Private, Query or DCC Chat window with this alias definition !
The F11 key will prompt you for the nick to whom to send a file…
Well…. invent your own custom use of the F keys ….. have fun ! You can also use -shift- and -ctrl- in combination with the F keys. Just define aliases like :
/f1 /say I used F1 to say this
/sf1 /say I used Shift+F1 to say this
/cf1 /say I used CTRL+F1 to say this

Using evaluation brackets.

You can now use [ and ] evaluation brackets in aliases to control the order of evaluation of identifiers. The brackets can be uses in popups and remotes as well. Identifiers within brackets will be evaluated first, from left to right. You can also nest brackets. This allows you to evaluate things any way you like… The brackets will not show in the resulting text or command. Example’s are :
/note /notice $1 ” $+ [ $read [ -s + [ $2 ] ] c:textnote.txt ] $+ ”
/sayvar /say % [ $+ [ $1 ] ]

Definitions without evaluation brackets are evaluated the same way as before.

String Definitions.

By now, you should have a decent grasp of the Aliases section. You might be interested in a full list of the strings and identifiers that you can use in your aliases and, later on, in popups and remote definitions as well, by now? The next two sections will introduce them all. At this point, make sure to try all of the examples given until you fully understand how to do it yourselves!


The simplest string. It contains one word, the first word after the alias command. By the same token, $2 would indicate the second word, $3 the third, etc. Example:
/op /mode $1 +o $2
Type “/op #mirc Janet John” to make Janet and John operator on #mirc.
/slap /me slaps $1 with a large $2
Type “/slap residue fish” to give residue some fish smell ;o)


This string can contain a LOT of words… It will contain the first word, *and* everything after the first word. Try:
/tell /say I’d like to tell all of you something – *1
The command “/tell mIRC is really great” with this alias will result in the text: “I’d like to tell all of you something – mIRC is really great”. *2 would contain the second word and everything after it. *3 would contain the third word and everything after it. etc.
Also try…
/note /notice $1 *2
…and type “/note {nick} {whatever text}”
/mess /msg $1 *2
…and type “/mess {nick} {whatever text}”
(Make sure you realize that these commands would have given the same result if you defined the aliases as ‘/note /notice *1’ and ‘/mess /msg *1’ respectivly.)
Note : you can also use constructions like *1-4


An alias containing this kind of string will be executed ONLY if a parameter is given; otherwise, the call to the alias will be ignored.
For example, if you try this alias:
/j /join $$1
and then type, “/j” (instead of “/j #channelname”)… mIRC will ignore you because you didn’t include a channel name.Otherwise, it works the same as $1 — it contains the first word. $$2 would contain the second word, $$3 the third, etc.


This is a nice one!
An alias with this string in it can be started without specifying the parameter. mIRC will display a Parameter Entry dialog box, in which text, a nick, or whatever, can be entered.
Try it with these examples:
/j /join $?”
/hug /me hugs $? firmly


An “extra special” version of the $? string. mIRC will again display the Parameter Entry dialog box, but will now ask for the specific kind of information to enter.
Try these:
/j /join $?=”Which channel to join?”
/hug /me hugs $?=”Who to hug?” firmly


This string is used only in conjunction with $?. If you’ve used $? earlier in the alias, you can use $! Later on to recall whatever parameter was typed in.
For example:
/j /join $?=”Which channel to join?” | /say I like channel $!
Type “/j” and it will display a Parameter Entry dialog box asking you to type in the name of the channel to join. If you type “#test”, it will join #test, and then say into the channel: “I like channel #test”.
Also try:
/friend /say $? is my friend | /say I like $! a lot

#$1 -and- #$$1 -and- #$?

These special versions of the $1, $$1, and $? strings are used in connection with channels only. All these do are affix the # character to the beginning of the parameter.
/j /join #$1″
You’ll be able to type “/j test” instead of “/join #test”.
Also try:
/j /join #$?=”Give channel name to join (No #)”



An identifier that always contains the channel name where the alias was executed. This is important because many commands, like the /mode commands, require that you specify a channel name.
/op /mode # +o $1
Type “/op Cindy”, and it will op the person with the nick Cindy in whatever channel you type this.


This identifier always contains your current nick! You can use it in all kinds of situations.
For example:
/nice /me thinks $me is a nice nick ! Or
/offer /me offers mIRC version 3.7 Do “/ctcp $me xdcc send #1” to get it. Or
/away /me is away ( *1 ) | /away *1 | /say Messages to $me will be stored.
Or give the alias:
/nick /say I like $1 better than $me | /nick $1
a try, and change your nick then by “/nick {newnick}”

$read [-l#] {filename.txt}

This identifier is a funny one. It will pick a random line from the specified file and insert that line into the alias…. The line can contain plain text and, also, commands !! (to make it easier ;o) Also $!read which is the same as $read except that it isn’t evaluated the first time it is passed through the alias routines. This allows you to use it in a /timer command if you want the $read to be re-evaluated each time.
IMPORTANT : in the file you get the random lines from the FIRST line should state the total of text lines in the file ! Otherwise only the first line will be used …. not very random, huh ?
For example:
/fun /say $read c:mircfunlines.txt
/kick /kick # $1 $read c:mircfunkicks.txt
/silly /say $read -l5 silly.txt

$readini {inifile} {section} {item}

Similar to $read this identifier reads items from .ini files. It is created in conjunction to the /writeini command. Both use the built in windows routines to read from and write to standard Windows .ini files. We think $readini and /writeini will open up new and better possibilities for writing your own automated actions on IRC.


This identifier always contains the current page your www browser Netscape shows you…
For example:
/show /say Hey guys, I found a superb www-page ! Check out $url
/mu /me found this great URL : $url

$ip Your IP Address.
$server The server you use.
$active The name of the active window in mIRC.
$time The time on your PC.
$away Tells you if you’re set away or not.
$ticks Returns the number of ticks since your O/S was first started.
$idle Returns same idle time as that returned by ctcp userinfo and finger.
$online Returns the number of seconds elapsed on your online timer.
$ctime The number of seconds elapsed since 00:00:00 GMT, January 1, 1970.
$asctime(N) Returns ctime values in a full date text format.
$day The current day. (Monday, Tuesday,…)
$date The date (european order) (YES !! mIRC is -not- made in the USA ;o) alternatively use $adate (american), $fulldate or $day.
$duration(seconds) Translates numbers like 123456 into 1day 10hrs 17mins 36secs.
$logdir, $getdir, $wavedir, $mircdir Return the paths to these directories.
$nopath(filename) Returns only the filename with no path.
$nofile(filename) Strips the filename and returns the remaining path.
$exists(filename) Checks if the given filename exists. (Returning $true or $false)
$findfile(dir,filename,N) searches the specified directory tree for the Nth specified file.

$abs(N) returns the absolute value of number N.
$chr(N) returns the character with ascii number N.
$asc(C) returns the ascii number of the character C.
$len(text) returns the length of “text”.
$upper(text) returns “text” in uppercase.
$lower(text) returns “text” in lowercase.
$left(N,text) returns the left N characters of ‘text’.
$right(N,text) returns the right N characters of ‘text’.
$mid(S,N,text) returns N characters out of ‘text’ starting at S.
$pos(string,substring) returns the position of substring in string.
$replace(string,substring,replacement) replaces a substring in a string.
$remove(string,substring) removes a substring from a string.
$strip(text) Strips out all bold, underline, reverse, and colour control codes from text.
$count(string1,string2) returns the number of times string2 occurs in string1.
$str(N,text) returns “text” repeated N times.
$rand(X,Y) returns a random char inbetween X and Y.
$lines(file) returns the number of lines in the specified file.

$usermode Returns your current personal mode.
$topic(#) returns the topic of channels which you’re currently on.

$nick(N,#) returns Nth nickname on channel #.
$snick(N,#) returns Nth selected nickname on channel #.
$opnick(N,#) returns Nth Op nickname on channel #.
$nopnick(N,#) returns Nth non-Op nickname on channel #.
$vnick(N,#) returns the Nth voiced nick on a channel.
$nvnick(N,#) returns the Nth non-op/non-voice nick on a channel.
$query(N) returns the Nth query window you have open.
$chat(N) returns the nick of the Nth dcc chat window you have open.
$fserv(N) returns the nick of the Nth file server window you have open.
$send(N) and $get(N) return the nick of the Nth open send/get window.
$notify(N) returns the Nth notify nick currently on IRC.
$token(N,C,text) returns the Nth token in ‘text’ separated by character C (C is the ascii number of a character)
$addtok(text,token,C) adds a token to the end of text but only if it’s not already in text.
$findtok(text,token,C) returns Nth position of token in text.
$gettok(text,N,C) returns Nth token in text.
$instok(text,token,N,C) inserts token into Nth position in text even if it already exists in text.
$remtok(text,token,C) removes 1 matching token from text.
$reptok(text,token,new,C) replaces 1 matching token with new token in text.

For the above identifiers you can specify N as 0 (zero) to get the total number of nicks/channels/etc. for that identifier.

$snotify returns the nick currently selected in the notify window.
$address returns the full address of the user that triggered a remote line.
$address(nickname,type) which scans the internal address list and returns a users address if it’s found.
$maddress returns the currently matched user address for an event in the remotes.
$level(address) finds a matching address in the remote users list and returns its level.
$ulevel returns the remote user levels that matched for an event.
$clevel returns the remote command levels that matched for an event.
$dlevel returns the remote default user level.
$mask(address,type) returns the address with the specified mask type.

Identifiers and variables can be placed inside the brackets.
Example: /echo $right(3,$left($len(goats),ToMooOrNotToMoo)) results in ‘ Moo’

Identifiers with properties.

Several identifiers can be used with special parameters attached. This eases up remembering their syntax and might help a lot in scriping. The syntax is $identifier(N|#|nick).property

$server(N) Gives access to the servers list under File/Setup/IRC_Servers.
$server(N) for the address, .desc for the description, .port for the port, .group for the group.
$ial(mask,N) Gives access to the Internal Address List.
$ial(mask,N) for the full address, .nick for the nick, .user for the user, .host for the host, .addr for the address.
$url(N) Gives access to the urls list.
$url(N) for the address, .desc for the description, .group for the prefix
$chan(N/#).property Returns several ‘channel’ settings of channels which you’re currently on.
$chan(N/#) returns channel name, .topic, .mode, .key, .limit,
$chat(N) nickname, .ip, .status (active, waiting, inactive)
$fserv(N) nickname, .ip, .status, .cd (current directory)
$get(N) nickname, .ip, .status, .file, .size, .rcvd, .cps, .pc
$send(N) nickname, .ip, .status, .file, .size, .sent, .lra, .cps, .pc
$timer(N) Returns the timers you’ve active
$timer(N) for the id, .com, .time, .reps, .delay, .type

User-definable identifiers. (Section originally written by Li0nheart)

As you just learned mIRC has a large number of built-in identifiers that you can use in your alias and remote definitions. It is also possible to make your own identifiers, and they can be configured to do virtually whatever you want! The identifiers are programmed in the alias section, and look exactly the same as an alias, with the only exception that at the end there is a /return X. You can have the identifier return whatever you want. For example, the sum of two numbers:
/sum {
%temp = $1 + $2
return %temp

Now you can use the $sum identier anywhere in aliases, popups, or remote. For example in the popup item:
Add:/say The sum of 45 and 78 is $sum(45,78)
Or the Alias:
/add /say The sum of $1 and $2 is $sum($1,$2)
(btw. it makes no sense to give a command like /sum .. that wont work)

All parameters given to the identifier are seperated with commas. You can use all usuall if/then/else structures to in the identifier definitions. You could for instance check if all the required parameters are there, and return an Error command instead. For example, this routine that calculates what percentage X is of Y.

/perc {
if ($1 == $null) || ($2 == $null) { return Error not enough parameters }
if ($2 != 1) { %half = $2 / 2 } | else { %half = 1 }
%dummy = $1 * 100
%perc = %dummy / $2
%remainder = %dummy % $2
if (%perc == 0) { goto return }
elseif (%remainder >= %half) { inc %perc }
return %perc

The first line makes sure all the parameters are there. The rest is calculation of the percentage, where part of it is used to make sure the total adds up to 100%. The identifier would be called with, for example, $perc(56,100) which would display 56% Numbers aren’t the only thing you can return with an identifier. You can also make it return text, or combinations of text and numbers, for example, the time in american format (7:52 pm):
/atime {
set %hr $token(1,58,$time)
set %min $token(2,58,$time)
if (%hr == 0) { set %hr 12 | set %sub am }
elseif (%hr < 12) { set %sub am }
elseif (%hr == 12) { set %sub pm }
else { %hr = %hr – 12 | set %sub pm }
return %hr $+ : $+ %min $+ %sub

With a little creativity you can make identifiers for anything you want. For example, backwards talking, or highlighting every other letter. Have fun!


The Popups section.

Popups are the menus that appear when you right-click with your mouse. If you haven’t found this nice feature of mIRC already, give it a try NOW! Some popup menu’s are predefined in the mIRC.ini from the, but they are fully customizable under Tools/Popups. If your copy of mIRC doesn’t seem to be equipped with some prefab popup menu’s (the Tools/Popups section is empty then), it is almost certain that you didn’t make sure that the prefab popups.ini file was correctly copied from the to the mirc directory, or the path to where this prefab popups.ini can be found is not correctly specified.

The popup commands work almost exactly like aliases. All of the strings mentioned in Section 7-1 are allowed in popups (and vital for the proper use of them). If you haven’t read the Aliases section (7-1), please do so now! You need to know that information before moving on.

Also: Definitely read the Help file’s explanation of popups, as well as take a look at the many popup examples included in mIRC under Tools/Popups. The more examples you try, examine, and mess around with, the better your grasp of mIRC will be.

Example: /join

Let’s say that you join a particular channel frequently, #test.

Rather than having to type in “/join #test”, wouldn’t it be easier to just right-click and select a menu item to join you there automatically?

The following popup would do that. Just enter it into Tools/Popups, making sure that “Main Window” is selected at the top. (Not Query/Chat window, Channel Names List or Menu Bar!)

Join the Test Channel:/join #test

Now right-click over your Status window or any channel window and select “Join the Test Channel”. mIRC will do exactly that.

Example: /away

Here’s an example of “away” and “back” popups… you type in the reason you’re away, and it’s sent to all the channels you’re on. (That’s what the /ame command does, it sends a /me to every channel you’re on.)

Set Away…:/ame is AWAY ( $?=”Give a reason” ) | /away Please try later ( $! ) !!
Set Back:/ame is BACK | /away

(Note again that on some systems you may need to scroll to the right to see the full text of some examples.)

Notice that the “Set Away” example uses multiple commands.

Heirarchal Menus

If you were to add a few popups like that, your screen would quickly get cluttered every time you right-click. So you can organize your popups into heirarchal menus.

Try entering all of the following popups:

Say Things
.Hello:/say Hello folks
.Goodbye:/say Goodbye folks
.Hug Somebody:/me gives $? a big hug

Here we’re specifying that the last three commands should show up _under_ “Say Things” by: 1) including them after “Say Things”, in the order we want them to appear, and 2) prefacing them all with “.” <– a period.

When you right-click, you’ll see the “Say Things” menu item. When you select that, you’ll see “Hello”, “Goodbye”, and “Hug Somebody” menu items. Select from those to perform one of the actions specified above.

If you want to get really complicated, you can make your popups many levels deep. For example, try:

Comment About People
..Nice Today:/say Wow, $? — you’re being very nice today!
..Helpful:/say Thanks for being so helpful, $?
..Friend:/say I’m glad to have $? for a friend.
..Jerk:/say Leave me alone, jerk!
..Idiot:/me wonders why $? is such an idiot sometimes.
..Enemy:/say I’m proud to have $? as my enemy!

And so on! Just order them properly, using the periods. (If the manner in which the above is organized doesn’t “click” with you, definitely try it out! Enter the above “comment” section into Tools/Popups. It’s a lot easier to grasp when you see it working.)

All popup menu items can be put under a Function key too! That’s handy as a replacement for often-used popups…. (Make sure to use the correct syntax and put them [ie.the function key replacements] in the alias section)


The Remote Section.

The Remote section can be found under Tools/Remote/. Clearly the most advanced part of mIRC, you can do things with mIRC’s Remote section that would normally require scripting or special bot software…

Things like: offering files (an XDCC list); responding to specific channel or private message text; customizing CTCP responses; setting up various user levels for your friends; …almost anything that happens on IRC can be automatically responded to, and your response can make use of almost any mIRC command or commands.

The Remote syntax can be a bit complicated at times, but it’s a simple extension of the formats explained previously for Aliases and Popups. If you understand those well, including the Strings, then please proceed. If not, go back and read (or re-read) Sections 7-1 and 7-2. The information presented there is ABSOLUTELY REQUIRED LEARNING before attempting Remote.

It’s also important to remember why Remote is called Remote. The Remote section is designed to respond to things done by users OTHER than yourself — in effect, it allows others to “remotely control” your mIRC session, according to the specific Remote features you implement. Many examples can’t be tested by simply sending the commands or typing the text yourself. They have to be sent by some other client.

Remote consists of three parts: Remote Users (the user list), Remote Commands, and Remote Events.

Remote Users.

(Also please read section 6-7.)

See Tools/Remote, the box at the top left labeled “Users”…

In this part of Remote you can assign various user levels. You can assign certain levels to your friends and certain levels to your “enemies”, and a host of levels in between.

Why is this important? Let’s say that you’ve written a Remote Event designed to kick anyone who says the word “nonsense” in your channel (just replace this in your head with whatever foul word you’d like). We’ll explain how to do this later (in Section 7-3-3), but for now it’s just the idea that’s important. Sounds reasonable, right?

OK, but perhaps you’d ONLY like regular users to be kicked for saying “nonsense.” You’d like some of your friends only to be warned. And you’d like to ignore it from still others, perhaps your closest friends. And if you don’t care for someone much at all, perhaps you’d like to kick AND ban them for saying “nonsense”!

To do these kinds of things (give different responses to different people), you need to setup a users list. For each user, you’ll specify their nick or address and the user level you’ve decided to assign them.

Here’s an example of a valid user list:


The numbers you pick for the user levels are completely up to you. You can decide what each of the user level numbers can and cannot do, as you’ll see in the next two sections. By default, mIRC assigns everyone not specified in the user list to level 1. (Depending on the setting in Tools/Remote/’Default level’.

If you specified different levels to different users you of course also need commands and events that have different reactions or power to users of these levels… That will be explained later…

As you can see, either a nick or an address are permissible. Wildcards are allowed. There are some cases where you might want to specify your users twice, by both nick and address. This case (ON OP/ON DEOP/ON SERVEROP/ON NOTIFY) is explained in Section 7-3-3.

You don’t have to do all the editing by hand … you could also use mIRC’s edit box or command line commands /auser, /guser and /ruser.

/auser /auser {level} {nick or address}
‘Auser’ (Add user) adds whatever nick or address you specify to the users list at the level you specify. It does not check for a valid address. The nick or address is added exactly as you stated it.

/guser /guser {level} {nick} [type]
‘Guser’ (Get user) adds a nick to the users list specified by address. To accomplish this mIRC does a /whois on the nick you specify, and adds the returned address at the specified level to the users list. This means that the specified nick has to be on IRC to be able to use the /guser command to add him/her to the list. By specifying the ‘type’ mIRC can add a user with several types of wildcarded addresses. This is analogous to the ‘type’ parameter used in the /ban command. Type ranges from 0 to 9.

/ruser /ruser {nick or nick! or address or nick [type]}
‘Ruser’ (Remove user) removes a nick or address from the Users list. You must know exactly how the nick or address is stated in the User list for this command to work.
If somebody is listed like nick! you can also do “/ruser nick!”. Mind the “!” to remove the entire line.
In mIRC version 3.5 an improved /ruser command was made so that it can work like /ban and /guser. /ruser {nick} [type] if you do NOT specify a type, then it works as usual and removes the specified nick from the user list. If you DO specify a type, it looks up the users address and removes that address from the user list.

Note: Using different address types allows you to specify a person or group of people with more or less wildcards. I’ll show you the different results ….. If no type is mentioned type 6 is default; Kreet!*
type 0; *!
type 1; *!*
type 2; *!*
type 3; *!*vonck@*
type 4; *!*@*
type 5; Kreet!
type 6; Kreet!*
type 7; Kreet!*
type 8; Kreet!*vonck@*
type 9; Kreet!*@*

A last remark; A user level can now even be a word, for example: mircop:*!* (You can use this with events like op:ON JOIN:#mirc:/mode $chan +o $nick)

mIRC now keeps an internal database of the people on the channels you are on. This database is used to speed up the performance of commands like /ban, /guser and /ruser a whole lot. These commands normally will make mIRC do a /whois on the person you issue the command on. The internal list stores info like nick!user@address for all users that are on the same *channels* as you. Whenever a /guser, /ruser, /ban, /finger, /ignore or /dns command is issued, the internal list is searched first to find the nick’s address. If no match is found, the normal /whois stuff is done. This will speed up your bans a lot…especially when you’re lagged… If you are on a slow PC and/or you are on a lot of large channels, mIRC’s updating of the database might slow you down quite a bit … then its probably good to switch it off ! In the Tools/Remote dialog you can deselect the use of the ‘Internal Address list’.

Remote Commands.

See Tools/Remote, the box at the bottom, with “Commands” selected…

Remote Commands refers to a very specific type of command: CTCP commands. The Remote Commands section of mIRC does one thing and one thing only — it allows you to make mIRC respond to CTCP commands sent by other users the way -you- wish. There are a lot of ctcp commands defined according to the IRC RFC’s (standards). The usual ones are version, ping, time, userinfo, clientinfo and finger. Every IRC client will respond in a standard way if one of these commands is send to it. These ctcp commands are sent by or to you in the format:

/ctcp {yournick} {command with parameter(s) if any}

Consider the simple example of a ping. The other user would type:

/ctcp {yournick} ping

(You can also send yourself a ping command! Try it! Type “/ctcp {yournick} ping”.
Under normal circumstances, mIRC would send a standard ping reply [ctcp hisnick pong]. But with Remote Commands, you can redefine the program’s response to the ping. It can now do almost whatever you’d like it to do when it receives a ping. On top of that, it can also send a normal ping reply. Or not. It’s up to you.
There is ONE exception to this … you cant hide your mIRC version reply…. We like the advertisement, you know….

You can also create new CTCP commands, and responses for them. This is how features like file offering (XDCC LISTs and SENDs) are handled.

But right now, let’s get back to our ping example.

Example: Custom Ping Response

Place the following example into your Remote Commands. Go to Tools/Remote, make sure that “Commands” is selected, and “Listening” is checked, (When “Listening” is not checked, Remote Commands are ignored.) and write in the commands box:

1:ping:/notice $nick ping? Hmmm! …pang pang pang!!

Now if someone pings you, your reply will be “ping? Hmmm ! … pang pang pang !!” in a notice sent to the person who pinged you, and not the normal reply being ‘pong’.
Test this by giving the command “/ctcp {yournick} ping”! If it doesn’t work make sure your Remote/Commands section is set to ‘Listening’! Or set it to active by the ‘/remote on’ or ‘/commands on’ command.
If you want mIRC to -not- give the default ping reply on top of your custom one you can block the default processing by the /halt command. Use it like
1:ping:/notice $nick ping? Hmmm! …pang pang pang!! | /halt
This will do the same thing as before, except it will not send your normal ping reply. Again, test it and see the difference!

Assuming you actually tried the two given ping replies, and that you got them to work, let’s go over the syntax used here a bit, and then we’ll go back to the above example and _why_ it does what it does.

Remote Command Syntax.

Remote Commands, except for some special cases, are made up of 3 portions. Each of the portions are seperated by a colon. The general syntax looks like:

{command_level}:{ctcp_command}:{triggered_command(s) with parameter(s)}

Lets go over the separate portions one by one:

{command_level} This command will respond to users with a user level equal to the command level, and to users with higher levels, unless other commands are created for them.

{ctcp_command} The CTCP command can be named anything you want it to be. It can be a standard, already existing CTCP command, like Ping or Version, or it can be one of your own creation. (like OPME, DIE, LEAVE, XDCC LIST,……)

{triggered_command(s) with parameter(s)} In this part you define the (to be) triggered command(s). Their format and the use of multiple commands is almost exactly as you define them in the aliases and popups. The strings in this section are filled in by mIRC automatically… You only have to make sure that the strings you use are defined at all… ie. make sense if used in the remote commands … (For instance the $chan is NOT defined in the remote commands !!)

Let’s take a look at our ping example and try to dissect it.

1:ping:/notice $nick ping? Hmmm! …pang pang pang!!

1 is the command level. All users with a user level equal or higher than 1 can execute or use this command.

Ping is the CTCP command this Remote Command is going to react to.

The triggered command is a /notice. In this case a notice is sent to $nick containing the entire line “ping? Hmmm! … pang pang pang!!” $nick is a pre-defined parameter that contains the nick of the person who gave you the CTCP command … in this case he pinged you. (More about the pre-defined parameters soon.)

Summarising, the effect of the command “/ctcp ping” is a “/notice {nick} ping? Hmmm! …Pang pang pang!!” This is executed as soon a CTCP Ping is received.

You can also use multiple commands, utilizing the | character, as with Aliases and Popups. That way a single Remote Command could activate multiple command lines. The use of the | is very straight forward, and we’ll cover it later. Just glue two remote commands together using the |.

Different reactions to people with different user levels

You can fine tune your reactions to remote commands by assigning different levels to them.
mIRC will always respond to a user with the highest leveled reply that fits to the command he/she gave.. Lets analyze it with these example lines…

1:ping:/notice $nick ping? Hmmmm your levels are tooooo low… | /halt
2:ping:/notice $nick ping? Hmmm! …pang pang …. Quite dead !!
3:ping:/notice $nick ping? …pang !! Hmmm… missed..
6:ping:/notice $nick ping? Hmmm! …Well I like you .. you’re allowed to ping me..

A level 1 user won’t get a ping reply but a nice “ping? Hmmmm your levels are tooooo low…”
A level 2 user (2:nick3! will not survive it when he does a /ctcp ping ;o) He will see “ping? Hmmm! …pang pang …. Quite dead !!”
A level 3 user (3:*!* will get ” ping? …pang !! Hmmm… missed…”
To level 4 and 5 users no specific reaction is defined … The highest to them available command is the level 3 one… Therefore these people (5:*!account@* will see the level 3 reaction too !!
Level 6 and higher users will all get the level 6 ping reply…

This leveling can be done for ALL remote commands (and events) ….
Make sure you get the point here !!! Maybe re-read the above sections ??

Special identifiers for Remote/Commands/ lines.

$nick, $address, $parms, $parm1, $parm2, $parm1*, $parm2* etc. are all identifiers specially created tobe used in remote lines.
You can use them whereever you want in the lines triggered by remote commands…

$nick The nick of the person who sent the command or activated the event.
$address The full address of the person who sent the command.
$site The site of the person who sent the command.
$level Represents the users remote level.
$parms Any text the person might’ve sent including (!) the command.
$parm1 Lets you break down $parms into individual words.
$parm3* Contains the third word in the command and all after it.

Note: The $chan is NOT ALWAYS DEFINED in the Remote Commands … $chan normally contains the channel from which a commands is given … CTCP commands don’t have to be given to you from a channel … or the person sending the command could be on more channels … Get the point ?? Maybe $active will do what you want ?

Example: Here’s an example using the pre-defined $address parameter…
1:address:/notice $nick Your address is $address
If a user were to send a ‘/ctcp {yournick} address’ command to you, you would reply with a notice reading, “Your address is {whatever his or her address is}”.

Example: Opping friends on demand. (Using $parms)

If you’re not clear on the basics of how all of this works yet, don’t worry. Try to follow along with the examples and see if it “clicks” in your brain. Re-read the above examples if necessary. But don’t attempt to write your own Remote Commands or move on to the next section until it “clicks.”

1:opme:/notice $nick Sorry, you won’t get opped on $parms .. your level is too low
5:opme:/mode $parms +o $nick

If a level 5 friend sends ‘/ctcp {yournick} opme {#channelname}’, this command will op them in the specified channel. Level 1 people WON’T get opped whatever they try….

Here another predefined parameter is used — $parms, which refers to everything the user typed after the CTCP command (opme). In this case, it’s the channel name.
The $parms can be used to process long lines given by a remote user in a CTCP command…

5:return:/notice $nick $parms

This command for instance will return any sentence issued by a remote user. The entire line given by the remote user after the CTCP Return command will be held in the $parms parameter. This will be sent back to them in a notice.
A “/ctcp {yournick} return Bladiebla die bladie bla bla bla” will cause your mIRC to respond by executing the command “/notice friend Bladiebla die bladie bla bla bla”.

Multiple Commands.

A Remote CTCP command can also trigger multiple commands….

5:opme:/mode $parms +o $nick | /notice $nick You are opped on $parms

Then your level 5 friend sends the command:
‘/ctcp {yournick} opme #channelname’

What happens??
In effect two commands are triggered by the Remote CTCP opme command…
one “/mode #name +o friend”
two “/notice friend You are opped on #name”

Another CTCP command triggering multiple commands:

10:part:/part $parms | /notice $nick I have left channel $parms

And if a level 10 user sends you:
‘/ctcp {yournick} part #channelname’

This command makes you leave a channel on request, and tells the requester you did so…

$parms contains the channel name you are asked to leave.
$nick is the nick of the person who asked.

*** Other Examples.

1:ping:/notice $nick Please don’t ping me.

…would respond with: “/notice {nick} Please don’t ping me.”

5:time:/notice $nick Time to get a watch.

…would respond with: “/notice {nick} Time to get a watch.

10:whoareyou:/notice $nick I am who I say I am | /notice $nick And I say that I’m YOU!

…would respond with: “/notice {nick} I am who I say I am” followed by
“/notice {nick} And I say that I’m YOU!”

The Remote Events section.

See Tools/Remote, the box at the bottom, with “Events” selected…

As you’ve seen, Remote Commands only deal with CTCP commands. Remote Events deal with just about everything else that can happen on IRC.

If that sounds daunting, don’t worry. As explained earlier, these lessons are cumulative. If you understand Remote Commands, Remote Events will be a piece of cake. You’ve already learned the really difficult stuff.

Warning: In general mIRC is very sensitive to poor Remote Event syntax. Using incorrect syntax can cause a GPF (General Protection Fault), so be careful! If ever you suddenly experience stability problems with mIRC, this is the part to check first!

Remote Event Syntax.

The Remote Events are: ON TEXT, ON JOIN, ON PART, ON KICK, ON OP, ON DEOP, ON INVITE, ON NICK, ON QUIT, ON TOPIC, ON SERVEROP, ON NOTIFY, ON MODE, ON SERVERMODE and ON SMODE. Besides ON TEXT the similar ON ACTION, ON NOTICE, ON SNOTICE, ON CHAT, ON SERV and ON WALLOPS are available for more specific text origins. New are the ON FILESENT and ON FILERCVD events as well as ON CHATOPEN, CHATCLOSE, SERVOPEN, SERVCLOSE and several others.

Exactly what they do, and how to use them, will be explained shortly. First, some quick examples and an explanation of the syntax used.

The syntax is essentially the same as with Remote Commands. Here’s a sample Remote Event for ON TEXT:

1:ON TEXT:hello:#:/msg $nick Hello back!

Place that example into your Remote Events. Go to Tools/Remote, make sure that “Events” is selected (not commands), and “Listening” is checked. (When “Listening” is not checked, Remote Events and Commands are ignored.)

This Remote Event is triggered when the word “hello” is found in any active channel. mIRC’s response is to send a private message to the person who wrote it, saying “Hello back.”

Here’s another example, this time using ON JOIN:

1:ON JOIN:#:/notice $nick You are very welcome to $chan

This one is triggered whenever a user joins a channel you’re on. A notice is sent to them that says, “You are very welcome to {channelname}”.

If you’ve made it this far, and understood Remote Commands, this should seem fairly simple to you.

Remote Events have either 3, 4 or 5 portions divided by colons. Most of the events have 4 portions, except for ON TEXT which has 5, and ON QUIT and ON NICK have only 3.

All of the events *except* for ON TEXT, ON QUIT and ON NICK are formatted like so:

{event_level}:{event}:{where}:{triggered_command(s) with parameter(s)}

{event_level} This event will effect users with this user level, and any higher levels, unless other event entries are created for them. Just like command_level in Remote Commands.

{event} The name of the event we’re listening for. ON JOIN, ON OP, etc.

{where} #, #name. Where are we listening for this event? Either # (any channel) or the name of a specific channel (like #test).
EXCEPTION: Not used with ON NICK or ON QUIT. Then just skip this part.

{triggered_command(s) with parameter(s)} The (to be) triggered command. Just like in Remote Commands except that we have a few different pre-defined parameters.
…and of course, the big exceptions here are ON TEXT and ON ACTION which work like so:

{event_level}:{event}:{what_text}:{where}:{triggered_command(s) with parameter(s)}

{command_level} Same as above.

{event} Well, obviously, it’s going to be ON TEXT or ON ACTION

{what_text} Specify the word or phrase to listen for. Like “hello” in the first example.

{where} #, #name, ?, *. Just like above, you can tell ON TEXT and ON ACTION to listen on all channels (#) or on a specific channel (like #test). But you can also tell it to listen to all of the private messages sent to you (?) or to both channel and private message text (*). An ON TEXT or ON ACTION event can’t listen for things said in DCC Chats or Server messages.

{triggered_command(s) with paramerer(s)} Same as above.

The Events

Here are the various Remote Events that mIRC can respond to…
ON TEXT Occurs when specified words/phrases are found in a channel or private message. ON ACTION works just the same …

1:ON TEXT:nonsense:#:/kick $chan $nick No nonsense!
This will look for the word “nonsense” in any channel and kick the user who said it.

1:ON TEXT:nonsense:#test:/kick $chan $nick | /notice $nick Hello $nick , you said ‘nonsense’ and that’s not allowed on #test…

If the word “nonsense” is said in #test, the sayer is kicked (if you’re ‘op’ on #test) and sent a notice: “Hello {nick} , you said ‘nonsense’ and that’s not allowed on #test…”

5:ON TEXT:help:?:/notice $nick I wish I could help you, but I can’t.

If it finds the word “help” in any of your private messages, it replies to the user,
“I wish I could help you, but I can’t” in a notice.

You can specify wildcards in the text mIRC should react to:

* reacts to any text
word if a user said only (and exactly) this word the event will trigger. Exact match required.
word* if a user started a line with this word the event will trigger.
*word if a user ended any line with this word the event will trigger.
*word* if a user said this word or phrase anywhere the event will trigger.

5:ON TEXT:help:?:/notice $nick I wish I could help you, but I can’t.

This event will only react to a call for help if the msg only contained the word help … not if a line containing the word ‘help’ was sent to you…

5:ON TEXT:hello*:?:/notice $nick Hello to you too !

This event will only react to private message lines sent to you starting with the word ‘hello’.

ON ACTION See ON TEXT …. it works exactly the same….

ON NOTICE See ON TEXT …. it works exactly the same….

ON CHAT Works like ON TEXT but listens to a DCC Chat text.

ON CHAT:blabla:/msg $me $nick said $parms to you in a DCC Chat.

ON SERV Works like ON CHAT but listens to DCC Fileserver text.

* ON SERV:get mirc:/echo server 6 To $nick the mIRC zip is sent.

ON JOIN Occurs when a user joins a channel.

1:ON JOIN:#test:/notice $nick Welcome to the #test channel!
Sends a notice saying “Welcome to the #test channel!” to anyone who joins #test.

25:ON JOIN:#cool:/kick $chan $nick You’re not welcome here!
Kicks any level 25 user who joins #cool with the message, “You’re not welcome here!”

ON PART Occurs when a user leaves a channel.

10:ON PART:#:/notice $nick Hey, thanks for stopping by $chan !
Sends a notice saying, “Hey, thanks for stopping by {channel} !” to any level 10 who leaves a channel you’re on.

90:ON PART:#:/msg $chan Yahoo! $nick is gone! Sends a message to the channel saying, “Yahoo, {nick} is gone!” if any level 90 leaves a channel you’re on.

ON KICK Occurs when a user is kicked from a channel.

100:ON KICK:#:/kick $chan $nick | /invite $knick $chan | /notice $nick That person is my friend!
If any level 100 person is kicked from any channel, you kick the kicker off the channel, invite the kicked person back and send “That person is my friend!” to the kicker.
NOTE: $knick is the parameter for the kicked nick in this event. Also note that this example shows multiple commands. It works just like in Remote Commands.

ON OP Occurs when a user is opped.

Note: This event requires people to be mentioned by NICK in your Remote/Users list !

1:ON OP:#test:/notice $opnick You were opped by $nick . Welcome!
If someone is opped on #test, they’re sent a notice: “You were opped by {opper}.
NOTE: $opnick is the parameter for the opped user’s nick in this event.

ON DEOP Occurs when a user is deopped.

Note: This event requires people to be mentioned by NICK in your Remote/Users list !

1:ON DEOP:#:/msg $opnick Tough luck. You were deopped by $nick
If someone is deopped, they’re sent a message: “Tough luck. You were deopped by {deopper}.
NOTE: $opnick is the parameter for the deopped user’s nick in this event.


Explaining the ON OP, ON DEOP, ON SERVEROP as well as the ON NOTIFY event an important remark should be made. Due to the fact that servers only report the nick’s of the people who are opped, deopped or notified on a channel or IRC, the ON OP, ON DEOP, ON SERVEROP and ON NOTIFY events only work properly if the nicks of the people who are opped, de-opped or notified are mentioned in the Users list. Specifying even the full address (nick! is NOT enough… mIRC won’t distillate the nick from such a statement. The only exception to this is if you wish the event to affect everyone by giving it an access level of 1, or whatever you have set the default user level to. This is the only case where it is not necessary to have a user in your User list by nick.

If you want to give people a level fitting to your ON OP, ON DEOP, ON SERVEROP or ON NOTIFY events you have to put them in your Users list by nick, like:


This construction can give you a good reason to specify people in your Users list by both their full address (wildcards are permitted) and their nick. This could then guarantee the proper reaction to an ON OP ON DEOP or ON SERVEROP without giving ALL people around with by accident (?) the same nick the same rights as your friends (or enemies).


ON UNBANWith the ON BAN you can easily auto-unban your friends.

5:ON BAN:#tree:/mode $chan -b $banmask
The $banmask will contain th

ON INVITE Occurs when you are invited to a channel.

5:ON INVITE:#test:/join $chan | /describe $chan thanks you for inviting him!
If invited to #test, join the channel and use an action to say “{me} thanks you for inviting him!”

ON NICK Occurs when a user changes his or her nick.

1:ON NICK:/notice $newnick I thought $nick was a nicer nickname!
Send a notice to anyone who changes nicks, “I though {your old nick} was a nicer nickname!”
NOTE: $nick is the parameter for the old nick, and $newnick for the (guess what?) new nick.
NOTE: The {where} portion is not used in ON NICK.

ON QUIT Occurs when a user quits IRC.

2:ON QUIT:/notice $me Time to party! $nick just quit the IRC!
Whenever someone quits, send a notice to yourself: “Time to party! {Nick} just quit the IRC!”
NOTE: The {where} portion is not used in ON QUIT.

ON TOPIC Occurs when a channel’s topic is changed.

1:ON TOPIC:#:/msg $chan Wow, I love the new topic!
Whenever a channel topic changes, sends a message to the channel saying, “Wow, I love the new topic!”

ON SERVEROP Occurs when a server gives operator status (back) to a user on a channel.

Note: This event requires people to be mentioned by NICK in your Remote/Users list !

1:ON SERVEROP:#mirc:/mode $chan -o $nick | /notice $opnick Sorry, serverops not allowed on $chan
Whenever a person is opped on #mirc by a server, the opped person is deopped and receives a notice “Sorry, serverops not allowed on #mirc” Serverops normally occur after a netjoin when the two splitted nets exchange and update all current channel modes.

ON NOTIFY This event triggers as soon as people in your notify list join IRC.

Note: This event requires people to be mentioned by NICK in your Remote/Users list !

You could use this event to do a /whois on the notified nick to make sure it is the correct guy…. Remember that this event ONLY works on nicks mentioned in the remote/user list by NICK…. (like ON OP, ON DEOP and ON SERVEROP) This is due to the IRC protocols which don’t pass through the address of the notified person…

1:ON NOTIFY:/notice $nick If you are the real $nick then please join #mine !
3:ON NOTIFY:/whois $nick
5:ON NOTIFY:/beep 10 50 | /whois $nick

ON SERVERMODE These events can force a certain set of channel modes.

Use this event to make sure that when someone changes the channel modes, mIRC enforces the channel modes YOU want instead.

Syntax and examples :
1!:ON MODE:#name:-spmi+tnlk 20 mykey:/notice $nick illegal $chan
mode change!
1!:ON SERVERMODE:#name:-spmi+tnlk 20 mykey:/notice $me illegal
$chan mode change by server !

The ON MODE’s react to any channel mode change, so there is no way to react to specific mode changes. This structure is certainly not perfect but it works…
Popular settings are :
1!:ON MODE:#mirc:-spmilk+tn:/notice $nick illegal $chan mode change!
1!:ON SERVERMODE:#mirc:-spmilk+tn:/notice $me illegal mode change!

Keep in mind that if you allow a higher level person to change mode settings without you reacting, lower level users can mess that up ! As soon as they change a mode (or the server does) then the forced modes are set; mIRC does NOT keep in mind that part of the new modes might be set by higher level persons … Also beware of loops of more people on a channel forcing mis-matching modes !!

ON DEVOICEThese events react to people getting or loosing voice on channels. Examples:
1:ON VOICE:/notice $nick Welcome in the speaking world!
1:ON DEVOICE:/notice $vnick Hey, $nick is allowed to speak here!

ON SNOTICE This event listens for server notices. Server notices tell you all kind of things happening at and with the IRC server you use. To recieve them you have to set your user mode to +s (/mode #nickname +s). Most people don’t need this setting… It is mostly meant for IRCOps and server maintainers. With this event you can filter the server notices send to you and you can filter them ie. prevent them from being displayed or automatically react to them. The event syntax is very much like the ON TEXT event…
1:ON SNOTICE:servers_text:/echo 6 status The server noticed you about $parms

ON FILESENT This event will react to all successful DCC Send file transers. You can use it to send you or the reciever a small message…
1:ON FILESENT:*.txt,*.ini:/echo Sent $filename to $nick ( $+ $address $+ )
1:ON FILESENT:mirc4516.exe:/notice $nick Have fun with the 16 bit mIRC
1:ON FILESENT:mirc4532.exe:/notice $nick Have fun with the 32 bit mIRC

ON FILERCVD This event will react to all successful DCC Get file transers. It will trigger as soon as a file is succesfully retrieved to your harddisk. You can use it to send you or the sender a small message, or to start a helper application to view the recieved picture, play a sound file or read the text.
1:ON FILERCVD:*.txt,*.ini:/run notepad.exe $filename
1:ON FILERCVD:*.wav:/wavplay $filename
1:ON FILERCVD:*.gif:/run c:windowswingifwingif.exe $filename
1:ON FILERCVD:*.jpg:/run c:windowslviewlviewp19.exe $filename
1:ON FILERCVD:*.mid,*.voc:/run wplany.exe $filename
1:ON FILERCVD:*.*:/notice $nick Thanks for the file!

ON CTCPREPLY Listen for replies to ctcps. eg.:
1:ON CTCPREPLY:PING*:/echo $active Got ping reply from $nick
1:ON CTCPREPLY:*mirc*:/echo $active Wow $nick uses mIRC too!

Special identifiers for Remote/Events/ lines.

$nick, $address, $site etc. are all identifiers specially created tobe used in remote lines. You can use them whereever you want in the lines triggered by remote events…

$nick The nick of the person who sent the command or activated the event.
$address The full address of the person who sent the command.
$site The site of the person who sent the command.
$level Represents the users remote level.
$chan The channel on which some event triggered a Remote/Events line.
$parms Any text in the line that triggered the event.
$parm1 Lets you break down $parms into individual words.
$parm3* Contains the third word and all after it.

Various flags you can use in front of Command or Event lines in Remote.

Finally some remarks have to be made about the various flags you can use in the Remote section. (With Commands and/or Events)

*** The ! flag. (Events only)

This flag causes events not to be triggered by things you do yourselves…. …. mIRC will not react to things said or done from clients with your address. (A similar flag is the ‘me’ flag..which makes sure things wont be triggered by the IRC client -you- use. ie. it will react to any other IRC clients you may be running simultaneously)

1!:ON JOIN:#mine:/notice $nick Welcome here.
This will not react to you joining #mine ….everybody else will get the Welcome message..

*** The = flag. (Events only)

This flag is used to prevent anything from happening…. you can use it to not bother higher level people with events meant for lower level people.

1:ON JOIN:#mine:/ctcp $nick VERSION
3:ON JOIN:#mine:=
Level 1 and 2 users will be versioned while level 3 and higher users will not see anything at all,… nor you. (In version 3.2 you had to set up an harmless event to do this.)

1:ON JOIN:#test1:/notice $nick Welcome to #test1
1:ON JOIN:#test2:/notice $nick Welcome to #test2
Level 3 and higher users won’t be noticed Welcome…. lower level users only on #test1 and #test2.

*** The + flag.

This flag makes a certain command available ONLY to users with the EXACT level of the command… Higher (and of course lower) level users can’t use/access it !

1:ON JOIN:#mine:/ctcp $nick VERSION
+3:ON JOIN:#mine:/notice $nick Welcome here.
All users EXCEPT level 3 users will be versioned on channel ‘mine’ … Level 3 users will be welcomed…

+5:ON JOIN:#mirc:/msg $nick Welcome level 5 user!

*** The ; and REM flag.

These flags can be used to switch off commands or events temporarily by ‘commenting them out’.
;1:ON JOIN:#mine:/notice $nick Welcome here.
REM 1:ON JOIN:#mine:/notice $nick Welcome here.

*** The * and @ flags.
Thise flags makes mIRC to execute an event or command ONLY if you’re operator on the channel the event or commands if used on.
*1:ON JOIN:#mine:/notice $nick Welcome here.

*** The me flag.
This flag is designed to make sure you can make events only work if somebody with exactly the same address as you use does something. This other person normally would be your 2nd instance of mIRC running from the same PC. Keep in mind that with proper leveling of your users in the Remote/users section you never (?) need this flag.

In mIRC version 3.7 some additional flags for the EVENTS were introduced. With these flags you can make mIRC to take into account the level of the person that started an EVENT.
These flags can only be used with the ON OP, DEOP and KICK events since these are the only events that deal with somebody doing something to somebody else.
The three flags you can add are >, < and =. But you can make mathematical combinations of them leading to a set of 6 flags: <, >, <=, >=, <> and =.

These flags will make the event only be triggered if FIRST the level of the event fits the Opped, Deopped or Kicked guy (m/f) and then SECOND the level of the activator meets the
expression {level-activator} [flag (mathematical expression)] {level-of-event}

You look like you need some examples ….

Assume you being the GUARD with a Friend at level 2 and an Activator who can have several different levels…. Then imagine these simple EVENTS :

<2:ON DEOP:#test123:/msg $chan the < triggered
>=2:ON DEOP:#test123:/msg $chan the >= triggered

With the activator at level 1.
*** Activator sets mode: -o Friend
<GUARD> the < triggered
Your Friend has level 2, the Activator has level 1, 1<2 is valid (one is smaller than 2), the first level 2 ON DEOP event is triggered…

With the activator at level 2.
*** Activator sets mode: -o Friend
<GUARD> the >= triggered
Your Friend has level 2, the Activator has level 2, 2<2 is invalid, 2>=2 is valid (2 is larger than or equal to 2), the second level 2 ON DEOP event is triggered…

With the activator at level 3.
*** Activator sets mode: -o Friend
<GUARD> the >= triggered
Your Friend has level 2, the Activator has level 3, 3<2 is invalid, 3>=2 is valid (3 is larger than or equal to 2), the second level 2 ON DEOP event is triggered…

As you can see its pretty straight forward once you got the idea …. read this over till the coin drops… More examples :

<2:ON DEOP:#test123:/msg $chan the < triggered
>2:ON DEOP:#test123:/msg $chan the > triggered

With the activator at level 1.
*** Activator sets mode: -o Friend
<GUARD> the < triggered

With the activator at level 2.
*** Activator sets mode: -o Friend

With the activator at level 3.
*** Activator sets mode: -o Friend
<GUARD> the > triggered

=2:ON DEOP:#test123:/msg $chan the = triggered

With the activator at level 1.
*** Activator sets mode: -o Friend

With the activator at level 2.
*** Activator sets mode: -o Friend
<GUARD> the = triggered

With the activator at level 3.
*** Activator sets mode: -o Friend


See Tools/Remote, select the box called “Variables” …

mIRC now allows you to define all kinds of variables. Variables always start with a % and can have names of any length. The variables are stored between sessions in a variable file in the mIRC directory. Variables can contain numbers, words or even lines of text. With variables containing numbers you can apply mathematical manipulations to increase, decrease, add and subtract variables with given values to or from each other. Available commands are : (q=quiet; no status report of the operation is given)

/set [-q] <%var> [value] To create a variable
/unset [-q] <%var> [%var2] … [%varN] To delete a variable
/unsetall To delete all variables
/inc [-q] <%var> [value] To increase a variable by a value (number or variable)
/dec [-q] <%var> [value] To decrease a variable by a value (number or variable)

With the aid of these commands you can make all kinds of handy aliases and remote lines!

Let me give a bunch of examples :

Remote commands (see later) :
2:xdcc send #1:/dcc send $nick | /inc %mirc 1
2:xdcc send #2:/dcc send $nick | /inc %faq 1
1:stats:/notice $nick Sending stats: mIRC= %mirc and FAQ= %faq

Remote events (see later) :
2:ON TEXT:xdcc send #1*:?:/dcc send $nick | /inc %mirc 1
2:ON TEXT:xdcc send #2*:?:/dcc send $nick | /inc %faq 1

Alias :
/stats /echo 6 mIRC: %mirc and FAQ: %faq

With these lines I made a small download counter…. not perfect but working !

You can even add some alias like the next one to keep partial statistics :
/reset /set %date $day $date | /inc %mirctot %mirc | /inc %faqtot %faq | /set %mirc 0 | /set %faq 0
/stats /echo 6 Stats mIRC: %mirc ( %mirctot ) and FAQ: %faq ( %faqtot ) (Set on %date )

When you increase or decrease a non-existant variable it will be created automatically and set to the value you expect it to be. ie :
/inc %test1 6 will set %test1 to 6 if it didn’t exist before
/dec %test2 7 will set %test2 to -7 if it didn’t exist before

Note : You have to make sure you always include the % ! This is made to prevent a lot of small possible problems in mIRC’s command parsing. This does not limit the ways the variables can be used in at all since you can always use constructions like :
1:upme:/inc % $+ $site 1
2:xdcc send #1:/dcc send $nick | /inc % $+ $nick 1
2:xdcc send #2:/dcc send $nick | /inc % $+ $nick 1
2:xdcc stats:/notice $nick You downloaded %nick files already since %date

Remote Raw processing.

In the Tools/Remote/Raw section mIRC offers you the possibility to process all server to client (mIRC) processes directly and in any way you want/like. It works exactly like the Rempte/Events section except mIRC listens to the NUMERIC events. These server numerics are described in the IRC RFC1459 ( The remore/Raw has it’s own separate editbox because if mIRC had to scan your whole remote events definitions list for each numeric event, things would slow down to a crawl. Still you better use the Raw section -only- if you exactly know what you do and only if absolutely needed. Wrong use of the Raw section can mess-up mIRC totally. It can over-rule all routines hardcoded into mIRC. Example:
322:*mirc*:/echo 2 $parms

This would print all lines which have the word “mirc” in them when you do a channels /list (this is a pretty intensive test).

To echo a concise 2 line summary of the /whois return in your active window, place the following lines in your Raw section (listening on):
311:*:echo 5 $active *** $parm2*
319:*:echo 5 $active *** $parm2*

This will display the user and channels lines. The numerics for the other /whois replies are: 312, server; 313, ircop; 301, away; 317, idle; and 318, end. For a full /whois echo, simply duplicate the above lines using these numbers.

To find out the numerics the servers use you could use the new $numeric identifier that refers to the number of the (raw) event that was triggered. In the IRC RFC1459, Section 6; Numeric replies, you can look up all numerics, given with their number, name and reply string.


Advanced use of commands; Scripting.

In mIRC you can use commands and create aliases, popups and remotes with conditional statements, loops and other tricky things. To explain it all to you would would take another complete FAQ I fear, but I’ll try to get you on the road in a short section with some examples. I think its best to start right off the bat …..

First mIRC now allows multiline alias, popup, and remote definitions. This allows you to write statements in a nice and structured way like:

{prefix definition} {
/command1 …
/command2 …
/command3 …

/away /ame is AWAY ( $+ $?=”Reason” $+ ) | /away Set away at $time { $+ $! $+ }
/back /ame is back,.. what did I miss ? | /away

These aliases could also be defined as

/away {
/ame is AWAY ( $+ $?=”Reason” $+ )
/away Set away at $time { $+ $! $+ }

/back {
/ame is back,.. what did I miss ?

I agree that doesnt really help -here-, but while you’re writing and testing the new possibilities in mIRC’s conditional commands you might like this structure? Btw, the { } brackets are needed around all commands that use the new possibilitie of conditional looping etc. Now we’re at it, you could leave out all / command prefixes if you wanted to… They are no longer needed.

A /goto command is added which can be used in { } definitions.
/greet {
/set %x 0
/inc %x
/goto %x
/echo line2
/echo line1
/goto retry

This alias will echo the lines “line1” and “line2” to your screen.
Test it by giving this totally equivalent command in some editbox:
/set %x 0 | :retry | inc %x | goto %x | :2 | echo line2 | halt | :1 | echo line1 | goto retry

It will show you exactly what happens. 😉 You can also use a variable as a goto name, eg. :%jumppoint

If you “/set %jumppoint 5” then you can do “/goto 5” and mIRC will evaluate %jumppoint to 5 and jump to it. In the above example the jumppoints were fixed to ‘1’ and ‘2’. Try these 3 commands and see what happens now.
/set %jump1 1
/set %jump2 2
/set %x 0 | :retry | inc %x | goto %x | :%jump2 | echo line2 | halt | :%jump1 | echo line1 | goto retry

You can use the /return command to finish processing a command and to allow any default processing to continue. eg.
/echo 3 #mirc [Joins $nick]
/echo 3 #mirc I’m not printed!

This will result is messages like:
[Joins henk]
*** henk ( has joined #mIRC

/if /elseif /else

Now I think you’re ready for the real stuff ?? In mIRC a simple /if statement is available.
/if v1 operator v2 { … } | /elseif v1 operator v2 { … } | /else { … }

Make this alias and start it like “/test 4”;
/test { set %i 0 | :start | inc %i | if %i > $1 halt | echo $active %i | goto start }

If/elseif/else can all be nested inside each other. You should use () and {} brackets to make sure that you’re terms are evaluated correctly (in the correct order), though you don’t *have* to use them. Using brackets also speeds up processing quite a bit since mIRC then knows exactly what it has to evaluate.

Available comparisons and operators:
== equal to
!= not equal to
< less than
> larger than
>= larger than or equal to
<= smaller than or equal to
// is a multiple of
\ is not a multiple of

isin string v1 is in string v2
iswm wildcard string v1 matches string v2
ison nickname v1 is on channel v2
isop nickname v1 is an op on channel v2
isnum number v1 is a number in the range v2 which is in the form n1-n2 (v2 optional)
ischan if v1 is a channel which you are on.
isauto if v1 is a user in your auto-op list for channel v2 (v2 optional)
isignore if v1 is a user in your ignore list with the ignore switch v2 (v2 optional)
isprotect if v1 is a user in your protect list for channel v2 (v2 optional)
isnotify if v1 is a user in your notify list.

To negate the above you can prefix them with an ! exclamation mark.

/massinvite { echo 4 * Mass-inviting # | set %i $nick(0,#) | :next | if $nick(%i,#) != $me invite $nick(%i,#) $1 | dec %i | if %i > 1 goto next | echo 4 * Mass-invite # done }

Use this example alias like “/massinvite #yourchannel”. (btw massinvites are very impolite!)

/randnopkick { :begin | set %kicknick $nick($r(1,$nick(0,#)),#) | if %kicknick isop # goto begin | /echo 6 %kicknick }

If you’re an op on some channel you might like this random-non-op-kick. It kicks a random person from your channel, but never an op. Mind you…. if only ops are available you’ve a problem 😉

/line { %line = “” | if $asc($1) < $asc($2) { set %i $asc($1) | :add | %line = %line $chr(%i) | inc %i | if %i <= $asc($2) { goto add } | if (%line == “”) { halt } | else { echo # %line | halt } } else echo # sorry not valid }

Start this alias example by typing “/line d k” to see what it does. It will print a line like ‘d e f g h i j k’. Nothing much and barely useful but it shows the strength of the if/elseif/else pretty well.

/printnum1 { if $len($1) = 1 { if $1 !isin 1234567890 { echo 6 $1 is not a number | goto end } } | elseif $len($1) = 2 { if $mid(1,1,$1) !isin 1234567890 { echo 6 $mid(1,1,$1) is not a number | goto end } | elseif $mid(2,1,$1) !isin 1234567890 { echo 6 $mid(2,1,$1) is not a number | goto end } } | elseif $len($1) > 2 { echo 6 $1 has too many chars | goto end } | { set %x 1 | :begin | echo 6 %x | if %x >= $1 { goto end } | else { inc %x | goto begin } | :end } }

/printnum2 { if $1 !isnum { echo 6 $1 is not a number | goto end } | elseif $1 !isnum 0-99 { echo 6 $1 is a too large number | goto end } | { set %x 1 | :begin | echo 6 %x | if %x >= $1 { goto end } | else { inc %x | goto begin } | :end } }

These equivalent aliases will both print a list of numbers upto the value you give. Try it with “/printnum1 14” or something similar …. The second alias shows how smart use of identifiers can reduce the length of the alias a lot.

Empty or invalid identifiers

Variables or identifiers that don’t evaluate to a value now return the value $null so they can be used in the if statement for checking etc.

/listops { echo 4 * Listing Ops on # | set %i 1 | :next | set %nick $nick(%i,#) | if %nick == $null { goto done } | if %nick isop # { echo 3 %nick is an Op on # } | inc %i | goto next | :done | echo 4 * End of Ops list }

This alias will list all ops on the channel you’re on.
Or in a remote event:
if ($parm2 == $null) echo [ $+ $nick PING reply]
else {
%pt = $ctime – $parm2
if (%pt < 0) set %pt 0
echo [ $+ $nick PING reply] %pt seconds

More popup examples:

GiveOps { %i = 0 | %nicks = “” | :nextnick | inc %i | if ($snick(%i,#) == $null) { if ($len(%nicks) > 0) mode # +oooo %nicks | halt } | %nicks = %nicks $snick(%i,#) | if (4 // %i) { mode # +oooo %nicks | %nicks = “” } | goto nextnick }

This popup menu item will op all selected people on a channel where you’re operator.

Selkick:/kick # $token($r(1,$snick(0,#)),44,$snicks)

This popup will kick one random person out of the people you selected on a channel.

RandNopkick:/kick # $nopnick($r(1,$nopnick(0,#)),#)

This popup will kick a random non-operator from the channel you’re on.

RandNopkick { :begin | /set %kicknick $nick($r(1,$nick(0,#)),#) | if %kicknick isop # goto begin | /kick # %kicknick }

This popup will also kick a random non-operator from the channel you’re on.

Randkick:/kick # $nick($r(1,$nick(0,#)),#)

Arent kicks fun ???? Another one … randomly kicking just anybody …. might be -you- !

RandOpkick:/kick # $opnick($r(1,$opnick(0,#)),#)

Randomly kicking an op …. they at least can defend themselves !

Endless loops.

With all these conditional statements I foresee you ending up in some endless loop. A simple example is creating something like:

/loop { :start | echo 6 # test loop | goto start }

I case one of your aliases or remotes got into such a loop use the CTRL+Break key combination to stop the process. It will take you home safely.


Something to Think About

When you woke up this morning did you ever think, “Man, Dads going to die today, maybe I should tell him I love him?” Or maybe your best friend are fighting because your ex choose him over you. So he dies this afternoon in an accident at work. Do you think it was worth knowing you and him hadn’t talked in a couple days all because of her? Or how about her? How do you think she would feel knowing you two hadn’t spoken because of her?

Emotions are strong, very powerfully compelling things. But so often we let them control or ignore them completely.

We, most people, choose to set aside saying how we feel to keep from addressing how we feel. Not just because we want to avoid hurting others, or admitting to others how we feel, but the fact that many of us don’t want to admit how we feel because it is awkward or hard to accept maybe putting things aside and being happy for others is the best path.

Please think of all those who you love, all those who mattered in your past… Do you miss them? Do you wish you could tell them how you feel? If yes, then do it.

Yeah just maybe you would have told your friend goodbye because you really don’t like your ex.. But at least you would know you were honest with how you feel. Sometimes enough goodbye’s will allow someone to realize someone who is bad for them. Sometimes enough I love you’s can make someone who hurts feel better. Sometimes being a friend in the truest form, can change another person’s life.

No, this isn’t a forward. This is just one thing I wanted to give to you, my friends. If you choose to share, please do feel free. While you are at it, please tell them Naanad says they wish them well also.

Maybe a little positivity in this world will make up for all the negative things going on around us.

No Comments

Death and the Living, a Fatal Attraction

Yes, it is a morbid way to look at it, but it’s true. Those who are living often die when their family members die. They become so focused in the loss that many of the living have been known to stop living themselves. Recently, I lost two people very close, my father’s mother and my counterpart’s mother.

My grandmother we knew was falling away, and it didn’t hurt at all. It was almost a comfort to see her leave her body. She had 5 children, 9 grandchildren and a herd of great grandchildren to leave behind her legacy of her teachings. She was a spiritual person and very much believed in faith being a driving force in life. This is one of the facts she and I very much disagreed on but in the end I think my differences of opinion gave her the knowledge she didn’t have to lie to me, as I will tell you later.

Avis, my counterpart Leo’s mother, the loss of her took a little bit for the shock to wear off before I realized what happened. But once I was told by my counterpart and Avis’s husband what happened the day before, I knew it was going to happen. Avis apparently had a fantastic day of recovery on the 4th of July. So fantastic even the rehabilitation center was amazed she was doing so well. This bit of information threw up a red flag for me that had I known I would have encouraged Leo, my counterpart, to go to his mother and spend this GREAT day with her.

You see, I used to work in a medical office and did all the filing work for a small office. The doctor would document on how those in the nursing home that he would visit were doing. I would, in turn, file in these reports in the patients files. As I would put these notes away, I would read over them to see how our patients were doing. Often times, 9 out of 10 times in fact, the last entry remarked there were remarkable strides by the patients’ emotional & physical well being. Also one of the more common things I learned while working in this office was that many of those who pass, happen to occur on crucial birthdays, holidays or some sort of anniversary that is emotionally tied to that person.

Avis’s fantastic recovery from a double bypass surgery less than two weeks after 6 pins being put in her shattered hip, just over a year after having a partial amputation to her foot due to gang green and not quite a year from having a stroke and bad medical treatment/follow up. With all these events in such a short period of time she had such a weakened immune system this notification of great standings would have told me everything. Her body was giving her one last final great day and no one saw it. Since then Leo has suffered a lot of remorse based on “lost time.” Whereas, her husband Lonnie, wasn’t as stricken with grief, because he did go and visit her the night before.

It’s sad what people miss out when they don’t live every day as if it’s their last. People always seem to count on “tomorrow” to be the day they tell those they love how they really feel. The truth is so easy but so hard that often times people choose silence than to speak out what they feel and think.

At both passing’s funerals there was a family time to discuss the deceased. It was an uncomfortable silence by both families until I spoke out on my experiences. Avis and I had discussed this last Christmas her passing, in which she expressed her only fear was if it would hurt. My grandmother, I had a few moments with her privately about two weeks ahead her day. My grandmother confessed to me she had lied to my aunt for my aunt’s sake. Grandma had been claiming about how she must have fallen at some point and hurt herself because she needed her pain pills. When I asked her about it she just looked at me slyly and said she knew she was dying, and that she only said that to ease the pain on my aunt who was caring for her.

Death is easy for the dead and occasionally the dying, but so hard for the living. To accept the passing of someone when you have so much you want to say. That is why I cannot express enough how important it is to say what you think when you think it. We only live once, and we will die. So why leave the world silent and not stirring the waters?

No Comments