I could be wrong on this but I think the $ignore() and $protect identifiers wont match all addresses like you've stated because if two people with the ident foo and foobar and it matches on *foo*. And you happen to have a script that will give them operator status they could take it over. As I said I could be wrong, but it could happen.

You could use something like this without having to use the $protect() identifier. It's just a thought.


[04:41] * TecnoVM64 has joined #Andy
[04:41] <Andy> TecnoVM64 is in my protect list. Now Opping.
[04:41] * Andy sets mode: +o TecnoVM64


Code:
menu nicklist {
  Protect
  .Add: {
    if ($read(protect.txt,w,$address($$1,8))) { 
      echo 2 -a *** $$1 ( $+ $address($$1,8) $+ ) is already in protect list.
    }
    else {
      echo 2 -a *** Added $$1 ( $+ $address($$1,8) $+ ) to protect list.
      .write protect.txt $address($$1,8)
    }
  }
  .Del: {
    if (!$read(protect.txt,w,$address($$1,8))) { 
      echo 2 -a *** $$1 ( $+ $address($$1,8) $+ )  isn't in protect list. 
    }
    else { 
      echo 2 -a *** Removed $$1 ( $+ $address($$1,8) $+ ) from protect list. 
      write -dw $+ "* $+ $address($$1,8) $+ *" protect.txt
    }
  }
}

on @*:Join:[color:red]#channel[/color]: {
  if ($read(protect.txt,w,$address($nick,8))) { 
    msg $chan $nick is in my protect list.  Now Opping. 
    mode $chan +o $nick
  }
}