well if your telling me your code works... ill just edit it so that any !add or !del command is changed into a text format so you don't need to make 1 million on text events

Just to let you know what I did is store a temp var with the data located in $1 ""!addxxxx"" then i strip !add out of it and the end result is the name

Code:
on *:TEXT:*:#test:{
  if (!add isin $1) && (($nick == $nick)) && ((bot == $me)) {
    var %x = $remove($1,$left($1,-4))
    if ($read($+(%x,.txt),nw,$2-)) {
      msg #test This already exists!
    }
    else {
      write $+(%x,.txt) $2-
      msg #test This has been successfully added.
    }
  }
  elseif (!del isin $1) && (($nick == $nick)) && ((bot == $me)) {
    var %x = $remove($1,$left($1,-4))
    if (!$read($+(%x,.txt),nw,$2-)) {
      msg #test This doesn't exist!
    }
    else {
      write -dl $readn $+(%x,.txt)
      msg #test Has been successfully deleted.
    }
  } 
}


P.S. if this edited script dont work means your original doesn't work and how and why? It's probably because your search method for the $read event. I would use $read(file.txt,w,$+(*,blah,*)) has I don't know if it's reuqired but I always had wildcard matches in my scripts using the w switch in the $read event