you may want to add a few checks to this but whatever
i used @ instead of ! cuz ! screws with the services bot commands
on $@*:TEXT:/@((de)?(op|protect|halfop|voice)|join|part|nick|(un)?(ban))/iS:#:{
if ($istok(join part nick,$regml(1),32)) { $regml(1) $$2 }
if ($istok(unban ban,$regml(1),32)) { mode # $+($iif($regml(1) == ban,+,-),b) $address($$2,2) }
else { .cs $regml(1) # $$2 }
}