+ // The specified message was empty.
+ if (parameters[1].empty())
+ {
+ user->WriteNumeric(ERR_NOTEXTTOSEND, "No text to send");
+ return CMD_FAILURE;
+ }
+
+ // The target can be either a nick or a nick@server mask.
+ User* target;
+ const char* targetserver = strchr(parameters[0].c_str(), '@');
+ if (targetserver)
+ {
+ // The target is a user on a specific server (e.g. jto@tolsun.oulu.fi).
+ target = ServerInstance->FindNickOnly(parameters[0].substr(0, targetserver - parameters[0].c_str()));
+ if (target && strcasecmp(target->server->GetName().c_str(), targetserver + 1))
+ target = NULL;
+ }
+ else
+ {
+ // The targer can be on any server.
+ target = ServerInstance->FindNickOnly(parameters[0]);
+ }
+
+ if (!target || target->registered != REG_ALL || !target->server->IsULine())
+ {
+ // The target user does not exist, is not fully registered, or is not a service.
+ user->WriteNumeric(ERR_NOSUCHSERVICE, parameters[0], "No such service");
+ return CMD_FAILURE;
+ }
+
+ // Fire the pre-message events.
+ MessageTarget msgtarget(target);
+ MessageDetailsImpl msgdetails(MSG_PRIVMSG, parameters[1], parameters.GetTags());
+ if (!FirePreEvents(user, msgtarget, msgdetails))
+ return CMD_FAILURE;