about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--doc/Modes.txt1
-rw-r--r--src/ngircd/defines.h2
-rw-r--r--src/ngircd/irc-mode.c1
-rw-r--r--src/ngircd/irc-op.c5
-rw-r--r--src/ngircd/messages.h3
5 files changed, 10 insertions, 2 deletions
diff --git a/doc/Modes.txt b/doc/Modes.txt
index e3b754d6..48ec5d95 100644
--- a/doc/Modes.txt
+++ b/doc/Modes.txt
@@ -58,6 +58,7 @@ users to lists (e.g. "invite list", "ban list"), others have parameters
   R	19	Only registered users are allowed to join this channel.
   s	0.9.0	Channel is "secret".
   t	0.3.0	Only ChanOps are allowed to modify the channel topic.
+  V	20	Channel doesn't allow invites.
   z	16	Only users connected via SSL are allowed to join the channel.
 
 III. Channel User Modes
diff --git a/src/ngircd/defines.h b/src/ngircd/defines.h
index ba7adf17..1eb3337d 100644
--- a/src/ngircd/defines.h
+++ b/src/ngircd/defines.h
@@ -164,7 +164,7 @@
 #define USERMODES "aBcCiorRswx"
 
 /** Supported channel modes. */
-#define CHANMODES "abehiIklmMnoOPqrRstvz"
+#define CHANMODES "abehiIklmMnoOPqrRstvVz"
 
 /** Away message for users connected to linked servers. */
 #define DEFAULT_AWAY_MSG "Away"
diff --git a/src/ngircd/irc-mode.c b/src/ngircd/irc-mode.c
index 04f50d77..a08d4d92 100644
--- a/src/ngircd/irc-mode.c
+++ b/src/ngircd/irc-mode.c
@@ -566,6 +566,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
 				goto chan_exit;
 			}
 		case 'i': /* Invite only */
+		case 'V': /* Invite disallow */
 		case 'M': /* Only identified nicks can write */
 		case 'm': /* Moderated */
 		case 'n': /* Only members can write */
diff --git a/src/ngircd/irc-op.c b/src/ngircd/irc-op.c
index 08495475..5c12faf7 100644
--- a/src/ngircd/irc-op.c
+++ b/src/ngircd/irc-op.c
@@ -164,6 +164,11 @@ IRC_INVITE(CLIENT *Client, REQUEST *Req)
 		if (!Channel_IsMemberOf(chan, from))
 			return IRC_WriteStrClient(from, ERR_NOTONCHANNEL_MSG, Client_ID(Client), Req->argv[1]);
 
+		/* Is the channel "invite-disallow"? */
+		if (strchr(Channel_Modes(chan), 'V'))
+			return IRC_WriteStrClient(from, ERR_NOINVITE_MSG,
+				Client_ID(from), Channel_Name(chan));
+
 		/* Is the channel "invite-only"? */
 		if (strchr(Channel_Modes(chan), 'i')) {
 			/* Yes. The user must be channel owner/admin/operator/halfop! */
diff --git a/src/ngircd/messages.h b/src/ngircd/messages.h
index 35d621a6..5c83c5cc 100644
--- a/src/ngircd/messages.h
+++ b/src/ngircd/messages.h
@@ -21,7 +21,7 @@
 #define RPL_YOURHOST_MSG		"002 %s :Your host is %s, running version ngircd-%s (%s/%s/%s)"
 #define RPL_CREATED_MSG			"003 %s :This server has been started %s"
 #define RPL_MYINFO_MSG			"004 %s %s ngircd-%s %s %s"
-#define RPL_ISUPPORT1_MSG		"005 %s RFC2812 IRCD=ngIRCd CHARSET=UTF-8 CASEMAPPING=ascii PREFIX=(qaohv)~&@%%+ CHANTYPES=#&+ CHANMODES=beI,k,l,imMnOPRstz CHANLIMIT=#&+:%d :are supported on this server"
+#define RPL_ISUPPORT1_MSG		"005 %s RFC2812 IRCD=ngIRCd CHARSET=UTF-8 CASEMAPPING=ascii PREFIX=(qaohv)~&@%%+ CHANTYPES=#&+ CHANMODES=beI,k,l,imMnOPRstVz CHANLIMIT=#&+:%d :are supported on this server"
 #define RPL_ISUPPORT2_MSG		"005 %s CHANNELLEN=%d NICKLEN=%d TOPICLEN=%d AWAYLEN=%d KICKLEN=%d MODES=%d MAXLIST=beI:%d EXCEPTS=e INVEX=I PENALTY :are supported on this server"
 
 #define RPL_TRACELINK_MSG		"200 %s Link %s-%s %s %s V%s %ld %d %d"
@@ -148,6 +148,7 @@
 #define ERR_UMODEUNKNOWNFLAG_MSG	"501 %s :Unknown mode"
 #define ERR_UMODEUNKNOWNFLAG2_MSG	"501 %s :Unknown mode \"%c%c\""
 #define ERR_USERSDONTMATCH_MSG		"502 %s :Can't set/get mode for other users"
+#define ERR_NOINVITE_MSG		"518 %s :Cannot invite to %s (+V)"
 
 #ifdef ZLIB
 # define RPL_STATSLINKINFOZIP_MSG	"211 %s %s %d %ld %ld/%ld %ld %ld/%ld :%ld"