1 /* +------------------------------------+
2 * | Inspire Internet Relay Chat Daemon |
3 * +------------------------------------+
5 * InspIRCd: (C) 2002-2007 InspIRCd Development Team
6 * See: http://www.inspircd.org/wiki/index.php/Credits
8 * This program is free but copyrighted software; see
9 * the file COPYING for details.
11 * ---------------------------------------------------
15 #include "configreader.h"
19 #include "commands/cmd_privmsg.h"
23 extern "C" command_t* init_command(InspIRCd* Instance)
25 return new cmd_privmsg(Instance);
28 CmdResult cmd_privmsg::Handle (const char** parameters, int pcnt, userrec *user)
35 user->idle_lastmsg = ServerInstance->Time();
37 if (ServerInstance->Parser->LoopCall(user, this, parameters, pcnt, 0))
40 if ((parameters[0][0] == '$') && ((*user->oper) || (ServerInstance->ULine(user->server))))
43 std::string temp = parameters[1];
44 FOREACH_RESULT(I_OnUserPreMessage,OnUserPreMessage(user,(void*)parameters[0],TYPE_SERVER,temp,0,except_list));
47 parameters[1] = temp.c_str();
48 // notice to server mask
49 const char* servermask = parameters[0] + 1;
50 if (match(ServerInstance->Config->ServerName,servermask))
52 user->SendAll("PRIVMSG", "%s", parameters[1]);
54 FOREACH_MOD(I_OnUserMessage,OnUserMessage(user,(void*)parameters[0],TYPE_SERVER,parameters[1],0,except_list));
58 if ((*parameters[0] == '@') || (*parameters[0] == '%') || (*parameters[0] == '+'))
60 status = *parameters[0];
63 if (parameters[0][0] == '#')
65 chan = ServerInstance->FindChan(parameters[0]);
67 except_list[user] = user;
73 if ((chan->modes[CM_NOEXTERNAL]) && (!chan->HasUser(user)))
75 user->WriteServ("404 %s %s :Cannot send to channel (no external messages)", user->nick, chan->name);
78 if ((chan->modes[CM_MODERATED]) && (chan->GetStatus(user) < STATUS_VOICE))
80 user->WriteServ("404 %s %s :Cannot send to channel (+m)", user->nick, chan->name);
86 std::string temp = parameters[1];
87 FOREACH_RESULT(I_OnUserPreMessage,OnUserPreMessage(user,chan,TYPE_CHANNEL,temp,status,except_list));
91 parameters[1] = temp.c_str();
95 user->WriteServ("412 %s No text to send", user->nick);
101 if (ServerInstance->Config->UndernetMsgPrefix)
103 chan->WriteAllExcept(user, false, status, except_list, "PRIVMSG %c%s :%c %s", status, chan->name, status, parameters[1]);
107 chan->WriteAllExcept(user, false, status, except_list, "PRIVMSG %c%s :%s", status, chan->name, parameters[1]);
112 chan->WriteAllExcept(user, false, status, except_list, "PRIVMSG %s :%s", chan->name, parameters[1]);
115 FOREACH_MOD(I_OnUserMessage,OnUserMessage(user,chan,TYPE_CHANNEL,parameters[1],status,except_list));
119 /* no such nick/channel */
120 user->WriteServ("401 %s %s :No such nick/channel",user->nick, parameters[0]);
126 dest = ServerInstance->FindNick(parameters[0]);
129 if ((IS_LOCAL(user)) && (*dest->awaymsg))
131 /* auto respond with aweh msg */
132 user->WriteServ("301 %s %s :%s",user->nick,dest->nick,dest->awaymsg);
137 std::string temp = parameters[1];
138 FOREACH_RESULT(I_OnUserPreMessage,OnUserPreMessage(user,dest,TYPE_USER,temp,0,except_list));
142 parameters[1] = (char*)temp.c_str();
146 // direct write, same server
147 user->WriteTo(dest, "PRIVMSG %s :%s", dest->nick, parameters[1]);
150 FOREACH_MOD(I_OnUserMessage,OnUserMessage(user,dest,TYPE_USER,parameters[1],0,except_list));
154 /* no such nick/channel */
155 user->WriteServ("401 %s %s :No such nick/channel",user->nick, parameters[0]);