I went a different way with this. It all works but I've painted myself into a corner.

The issue is I didn't know you can't nest ON events. When I try I get ON Unknown command.

I need to see if the reply text matched the original text, and tell the user if it doesn't match, and to try again. It needs to be done in the routine so it's not replying to everyone that sends me text that doesn't match!

Here's what I have so far:

Code
; this is all working. It needs to do something when the text doesn't match, and I'm not sure how.
on 1:MODE:#mychan:{

  if $1- == +m {

    //echo -a autovoice activated
    enable #autovoice
  }
  elseif $1- == -m {

    //echo -a autovoice deactivated
    disable #autovoice
  }
}

#autovoice on

on *:TEXT:voiceme:?: {
  var -g %currentnick = $nick
  //echo -a voiceme message received and matched
  ;random text - working
  var %i = 0
  var -g %mytext = ""
  var %newchar = ""
  while (%i <= 3) {
    %newchar = $rand(a,z)
    %mytext = %mytext $+ %newchar
    inc %i
  }

  ;send the message
  .msg $nick Please reply with this text and I will give you voice: %mytext
}

on *:TEXT:%mytext:?: {

  if $nick ison #mychan && $nick !isvoice #mychan {
    //echo -a nick in channel

    /mode #mychan +v $nick
    .msg $nick Congrats! You have voice (+v) and can chat in channel. 
  }
  else {
    //echo -a $nick not in channel
    .ignore -pu300 $nick
  }
}

#autovoice end