But that's fairly useless because I have to be ON the channel, I think. And it still doesn't help with access denied.
check this with "if ($me ison $1)"
In addition: tricky brackets: not "if ($1(!ischan))" but "if ($1 !ischan)...

To make the server reply "Access denied" a "conditional" part of your script - no way. At least no simple one

...Don't want too much at first.
Alias are processesd linear, that is: until they are finished or return something, or were stoped. You cannot tell a single alias "now wait for a notice of chanserv" etc.. One
could code this with raw events and/or timers; but imho thats not woth the effort.
Also, for the /i alias, is there some way to make it use the IAL and a /whois if the person isn't sharing a channel with you?
This is an analogical problem

Better remove the whole "is a user in my address list" condition if you like to invite users you don't share a channel with.
The unban thingie:
alias unban {
; if 2nd parameter is given, use it for "channel". if not, use the active window for "channel".
var %chan = $iif(($2),#$2,$active)
; 1st parameter is a user in your internal address list, and you are on "channel"
if (($ial($1)) && ($me ison %chan)) {
; use the user's fulladdress for "address"
var %address = $v1
; loop all bans of "channel" (using mIRCs internal banlist)
var %nr = 1
while ($ibl(%chan,%nr)) {
; if the ban affects "address", remove that ban
if ($v1 iswm %address) { mode %chan -b $v1 }
inc %nr
}
}
else { echo -a unban: syntax is /unban <nick> [<#chan>] - You need to share a chan with <nick>, and have to be on <#chan>. }
}