you're almost there. But some things have to be changed first.
First and most important:
Do you realise that the current way you have ur script setup, means that ANYTIME anyone says something in any channel that you are in, a new timer will be set. Im sure this is not your intention.
Here's a solution that might suit you better:
on me:*:JOIN:%clanchan: .timer 0 1800 msg %clanchan $!read(names.txt) $!read(jokes.txt)
As you can see the ON TEXT event is changed to the ON JOIN event, specifically when you join your channel %clanchan, then the timer starts, and will msg to %clanchan every 1800 seconds a joke with a nick of your clan members in front of it. Note 2:
Remember, that if you are using a command from the command line with // in front of it, like //.timer .. then the contents of the line will first be evaluated, then executed. This is the same when a command is run from a script. In other words,
on me:*:JOIN:%clanchan: .timer 0 1800 msg %clanchan $read(names.txt) $read(jokes.txt)
will send out the exact same
text message every 1800 seconds. That is cuz mIRC first evaluates $read(names.txt) and $read(jokes.txt) and then sets the timer.
In other words, you need for the two $read identifiers to be re-evaluated each time the timer triggers.
msg %clanchan $!read(names.txt) $!read(jokes.txt) or msg %clanchan $($read(names.txt) $read(jokes.txt),0)
Both solutions will make sure that the $read identifiers get sent to the timer without having been evaluated yet.