Code:
alias addreply { hadd -m replies $1 $$2- }
alias clearreplies { 
  if ($hget(replies)) { hfree $v1 }
}
alias isreply { return $iif($hget(replies,$1) != $null,$true,$false) }
alias removereply {
  if ($isreply($1)) { 
    hdel replies $1 
    if (!$hget(replies,0).item) { hfree replies }
  }
}
alias _ban {
  if ($istok(begin end,$1,32)) { return - }
  if ($1 isnum 1-20) { return Mask $1: ban $!chan $!1 $1 }
}
alias _replies {
  if ($istok(begin end,$1,32)) { return - }
  if ($hget(replies,$1).item) { return $replace($v1,% $+ 20,$chr(32)) $+ : msg $!1 $hget(replies,$v1) }
}

menu nicklist {
  Ban
  .$submenu($_ban($1))
}
menu nicklist,query {
  Replies
  .$submenu($_replies($1))
  .-
  .Add Reply:{
    var %reply = $replace($input(Enter name:,dei,Prompt),$chr(32),% $+ 20)
    if ($isreply(%reply)) { noop $input(That reply already exists,dho,Error) }
    else { addreply %reply $input(Enter text:,deo,Prompt) }
  }
  .Clear Replies:{
    if ($input(Are you sure you want to clear all replies?,devy,Prompt) == $yes) { clearreplies }
  }
  .Remove Reply:{
    var %reply = $replace($input(Enter name:,dei,Prompt),$chr(32),% $+ 20)
    if (!$isreply(%reply)) { noop $input(That reply doesn't exist,dho,Error) }
    else { removereply %reply }
  }
}

on *:exit:{
  if ($hget(replies)) { hsave -o $qt($scriptdir $+ replies.hsh) }
  else { .remove $qt($scriptdir $+ replies.hsh) }
}
on *:start:{
  if ($isfile($scriptdir $+ replies.hsh)) {
    if ($hget(replies)) { hfree $v1 }
    hmake replies 2
    hload replies $qt($scriptdir $+ replies.hsh)
  }
}


Right click on nicklist for ban options, right click on nicklist or in a query window for automated replies.

I didn't check if it saves the replies on exit and loads them on startup, but it should do. If it doesn't just post here.

Requires mIRC 6.17 or above.