You can't bump a post after a day only lol, give people some times...
Your first on text event has a wildcard match on "!hadmin", this means the whole sentence must be "!hadmin", if that event trigger, there can't possibly be a second word, so $2 will always be $null, if you want to allow for an optional second word, well it can't be done with one wildcard match, it's nicely done with a regular expression:
on $*:text:/^!hadmin( .+)?/:#:{
now you can use $2..
If you want to check that $2 is stricly "set", you should use the '==' operator, not the 'isin' operator.
I think that should resolve all your issues, unsure though.