a 0.3.0 User is away.
c 17 IRC operator wants to receive connect/disconnect NOTICEs.
+ C 19 Only users that share a channel are allowed to send messages.
i 0.0.1 User is "invisible".
o 0.0.1 User is IRC operator.
r 0.0.1 User is restricted.
#endif
/** Supported user modes. */
-#define USERMODES "aciorRswx"
+#define USERMODES "acCiorRswx"
/** Supported channel modes. */
#define CHANMODES "biIklmnoOPRstvz"
/* Validate modes */
x[0] = '\0';
switch (*mode_ptr) {
+ case 'C': /* Only messages from clients sharing a channel */
case 'i': /* Invisible */
case 's': /* Server messages */
case 'w': /* Wallops messages */
Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
{
CLIENT *cl, *from;
+ CL2CHAN *cl2chan;
CHANNEL *chan;
char *currentTarget = Req->argv[0];
char *lastCurrentTarget = NULL;
}
#endif
+ if (Client_HasMode(cl, 'C')) {
+ cl2chan = Channel_FirstChannelOf(cl);
+ while (cl2chan) {
+ chan = Channel_GetChannel(cl2chan);
+ if (Channel_IsMemberOf(chan, from))
+ break;
+ cl2chan = Channel_NextChannelOf(cl, cl2chan);
+ }
+ if (!cl2chan) {
+ if (SendErrors && !IRC_WriteStrClient(
+ from, ERR_NOTONSAMECHANNEL_MSG,
+ Client_ID(from), Client_ID(cl)))
+ return DISCONNECTED;
+ goto send_next_target;
+ }
+ }
+
if (SendErrors && (Client_Type(Client) != CLIENT_SERVER)
&& strchr(Client_Modes(cl), 'a')) {
/* Target is away */
return DISCONNECTED;
}
+ send_next_target:
currentTarget = strtok_r(NULL, ",", &lastCurrentTarget);
if (currentTarget)
Conn_SetPenalty(Client_Conn(Client), 1);
#define ERR_CANTKILLSERVER_MSG "483 %s :You can't kill a server!"
#define ERR_RESTRICTED_MSG "484 %s :Your connection is restricted"
#define ERR_NOOPERHOST_MSG "491 %s :Not configured for your host"
+#define ERR_NOTONSAMECHANNEL_MSG "493 %s :You must share a common channel with %s"
#define ERR_UMODEUNKNOWNFLAG_MSG "501 %s :Unknown mode"
#define ERR_UMODEUNKNOWNFLAG2_MSG "501 %s :Unknown mode \"%c%c\""