I suggest to use a named timer (or to check if there's already such a timer running) - else you'll have multiple timers running for the same channel in case of rejoin.
Example: By using a named timer it's "restarting" (overwriting) the timer for this chan at every join. In addition it's checking if you're still on that channel. If you are it's sending the msg, if you're not it's stopping the timer.
on me:*:join:#yourchannel:{
var %msg = No working server. No voice. No exceptions.
.timerMsgTo $+ $chan 0 3600 $!iif(( $!me ison $safe($chan) ), msg $!v2 %msg , .timer $!+ $!ctimer off)
}
alias safe { return $!decode( $encode($1,m) ,m) }