anchor.diff:  
   parse_args(error, ":" ++ Args, Cmd) ->
       parse_error(Cmd, lists:split(string:chr(Args, $:), Args));
  -parse_args(notice, Args, Cmd) ->
  -    parse_notice(Cmd, string:tokens(Args, ":"));
  +
  +parse_args(Name, Args, Cmd) when Name == notice; Name == privmsg ->
  +    {Target, Msg} = irc_parser:split($:, Args),
  +    parse_notice_or_privmsg(Cmd#irc_cmd{target=string:strip(Target, right, $\s)},
  +                            Msg);
   
   parse_args(needmoreparams, Args, Cmd) ->
       parse_error(needmoreparams, string:tokens(Args, ":"), Cmd);
  
positive.code:     lists:flatten([irc_commands:to_list(Name),
                     " ", nick(T), " :", encode_ctcp_delims(CtcpParts)]);
  
  to_list(user, Args, _Cmd) ->
      Name = proplists:get_value(user_name, Args),
      Mode = proplists:get_value(mode, Args, "+w"),
  
negative.code:     Cmd#irc_cmd{target=Target,
                  args=[{message, Msg}]}.
  
  %%--------------------------------------------------------------------
  
  parse_nick([$@|Nick]) ->
      {op, Nick};
  parse_nick([$+|Nick]) ->
      {voice, Nick};
  parse_nick(Nick) ->
      {user, Nick}.
  
  parse_chantype("@") -> secret;
  parse_chantype("*") -> private;
  parse_chantype("=") -> public;
  parse_chantype(T) -> throw({unknown_chantype, T}).
  
  %%--------------------------------------------------------------------
  
  parse_notice_or_privmsg(Cmd, Msg) ->
      case lists:member(1, Msg) of
          true -> parse_ctcp_msg(Cmd, Msg);
          false -> Cmd#irc_cmd{args=[{message, Msg}]}
  