Remove cruft left behind by removed stats_p_hook.
[seven-1.x.git] / modules / m_cmessage.c
blobcdace80002208482bbdbd6451d664c01e843c406
1 /*
2 * ircd-ratbox: an advanced Internet Relay Chat Daemon(ircd).
3 * m_cmessage.c: Handles CPRIVMSG/CNOTICE, target change limitation free
4 * PRIVMSG/NOTICE implementations.
6 * Copyright (C) 2005 Lee Hardy <lee -at- leeh.co.uk>
7 * Copyright (C) 2005 ircd-ratbox development team
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions are
11 * met:
13 * 1.Redistributions of source code must retain the above copyright notice,
14 * this list of conditions and the following disclaimer.
15 * 2.Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3.The name of the author may not be used to endorse or promote products
19 * derived from this software without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
25 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
29 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
30 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 * POSSIBILITY OF SUCH DAMAGE.
33 #include "stdinc.h"
34 #include "client.h"
35 #include "channel.h"
36 #include "numeric.h"
37 #include "msg.h"
38 #include "modules.h"
39 #include "hash.h"
40 #include "send.h"
41 #include "s_conf.h"
42 #include "packet.h"
44 static int m_cmessage(int, const char *, struct Client *, struct Client *, int, const char **);
45 static int m_cprivmsg(struct Client *, struct Client *, int, const char **);
46 static int m_cnotice(struct Client *, struct Client *, int, const char **);
48 struct Message cprivmsg_msgtab = {
49 "CPRIVMSG", 0, 0, 0, MFLG_SLOW,
50 {mg_ignore, {m_cprivmsg, 4}, mg_ignore, mg_ignore, mg_ignore, {m_cprivmsg, 4}}
52 struct Message cnotice_msgtab = {
53 "CNOTICE", 0, 0, 0, MFLG_SLOW,
54 {mg_ignore, {m_cnotice, 4}, mg_ignore, mg_ignore, mg_ignore, {m_cnotice, 4}}
57 mapi_clist_av1 cmessage_clist[] = { &cprivmsg_msgtab, &cnotice_msgtab, NULL };
58 DECLARE_MODULE_AV1(cmessage, NULL, NULL, cmessage_clist, NULL, NULL, "$Revision: 26 $");
60 #define PRIVMSG 0
61 #define NOTICE 1
63 static int
64 m_cprivmsg(struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
66 return m_cmessage(PRIVMSG, "PRIVMSG", client_p, source_p, parc, parv);
69 static int
70 m_cnotice(struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
72 return m_cmessage(NOTICE, "NOTICE", client_p, source_p, parc, parv);
75 static int
76 m_cmessage(int p_or_n, const char *command,
77 struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
79 struct Client *target_p;
80 struct Channel *chptr;
81 struct membership *msptr;
83 if(!IsFloodDone(source_p))
84 flood_endgrace(source_p);
86 if((target_p = find_named_person(parv[1])) == NULL)
88 if(p_or_n != NOTICE)
89 sendto_one_numeric(source_p, ERR_NOSUCHNICK,
90 form_str(ERR_NOSUCHNICK), parv[1]);
91 return 0;
94 if((chptr = find_channel(parv[2])) == NULL)
96 if(p_or_n != NOTICE)
97 sendto_one_numeric(source_p, ERR_NOSUCHCHANNEL,
98 form_str(ERR_NOSUCHCHANNEL), parv[2]);
99 return 0;
102 if((msptr = find_channel_membership(chptr, source_p)) == NULL)
104 if(p_or_n != NOTICE)
105 sendto_one_numeric(source_p, ERR_NOTONCHANNEL,
106 form_str(ERR_NOTONCHANNEL),
107 chptr->chname);
108 return 0;
111 if(!is_chanop_voiced(msptr))
113 if(p_or_n != NOTICE)
114 sendto_one(source_p, form_str(ERR_VOICENEEDED),
115 me.name, source_p->name, chptr->chname);
116 return 0;
119 if(!IsMember(target_p, chptr))
121 if(p_or_n != NOTICE)
122 sendto_one_numeric(source_p, ERR_USERNOTINCHANNEL,
123 form_str(ERR_USERNOTINCHANNEL),
124 target_p->name, chptr->chname);
125 return 0;
128 if(MyClient(target_p) && (IsSetCallerId(target_p) || (IsSetRegOnlyMsg(target_p) && !source_p->user->suser[0])) &&
129 !accept_message(source_p, target_p) && !IsOper(source_p))
131 if (IsSetRegOnlyMsg(target_p) && !source_p->user->suser[0])
133 if (p_or_n != NOTICE)
134 sendto_one_numeric(source_p, ERR_NONONREG,
135 form_str(ERR_NONONREG),
136 target_p->name);
137 return 0;
139 if(p_or_n != NOTICE)
140 sendto_one_numeric(source_p, ERR_TARGUMODEG,
141 form_str(ERR_TARGUMODEG), target_p->name);
143 if((target_p->localClient->last_caller_id_time +
144 ConfigFileEntry.caller_id_wait) < CurrentTime)
146 if(p_or_n != NOTICE)
147 sendto_one_numeric(source_p, RPL_TARGNOTIFY,
148 form_str(RPL_TARGNOTIFY),
149 target_p->name);
151 sendto_one(target_p, form_str(RPL_UMODEGMSG),
152 me.name, target_p->name, source_p->name,
153 source_p->username, source_p->host);
155 target_p->localClient->last_caller_id_time = CurrentTime;
158 return 0;
161 if(p_or_n != NOTICE)
162 source_p->localClient->last = CurrentTime;
164 sendto_anywhere(target_p, source_p, command, ":%s", parv[3]);
165 return 0;