diff -ur ircd-ratbox-1/include/client.h ircd-ratbox-1+opercheats/include/client.h
--- ircd-ratbox-1/include/client.h	2003-01-27 18:58:44.000000000 +0000
+++ ircd-ratbox-1+opercheats/include/client.h	2003-02-09 18:45:32.000000000 +0000
@@ -398,14 +398,14 @@
 #define OPER_REHASH             0x000080
 #define OPER_ADMIN              0x000100
 #define OPER_XLINE              0x000200
-/*      OPER_SPY                0x000400 */
+#define OPER_SPY		0x000400
 /*                              0x000800 */
 #define OPER_OPERWALL		0x001000
 #define OPER_HIDDENADMIN        0x002000
 #define OPER_FLAGS      (OPER_GLOBAL_KILL | OPER_REMOTE | OPER_UNKLINE |\
                          OPER_GLINE | OPER_N | OPER_K | OPER_DIE |\
                          OPER_REHASH | OPER_ADMIN | OPER_XLINE | OPER_OPERWALL|\
-                         0x000400 | OPER_HIDDENADMIN)
+                         OPER_HIDDENADMIN | OPER_SPY)
 
 #define FLAGS2_EXEMPTGLINE      0x004000
 #define FLAGS2_EXEMPTKLINE      0x008000
@@ -530,6 +530,9 @@
 #define IsOperHiddenAdmin(x)    ((x)->flags2 & OPER_HIDDENADMIN)
 #define IsOperAdmin(x)          (((x)->flags2 & OPER_ADMIN) || \
                                  ((x)->flags2 & OPER_HIDDENADMIN))
+#define IsOperSpy(x)            ((x)->flags2 & OPER_SPY)
+#define SetOperSpy(x)           ((x)->flags2 |= OPER_SPY)
+
 #define IsOperOperwall(x)	((x)->flags2 & OPER_OPERWALL)
 
 #define IsFloodDone(x)          ((x)->flags2 & FLAGS2_FLOODDONE)
diff -ur ircd-ratbox-1/include/newconf.h ircd-ratbox-1+opercheats/include/newconf.h
--- ircd-ratbox-1/include/newconf.h	2003-02-07 17:21:36.000000000 +0000
+++ ircd-ratbox-1+opercheats/include/newconf.h	2003-02-09 18:41:31.000000000 +0000
@@ -139,6 +139,7 @@
 void conf_set_oper_admin(void *data);
 void conf_set_oper_hidden_admin(void *data);
 void conf_set_oper_flags(void *data);
+void conf_set_oper_operspy(void *data);
 
 int conf_begin_class(struct TopConf *tc);
 int conf_end_class(struct TopConf *tc);
diff -ur ircd-ratbox-1/modules/core/m_mode.c ircd-ratbox-1+opercheats/modules/core/m_mode.c
--- ircd-ratbox-1/modules/core/m_mode.c	2003-01-05 23:55:00.000000000 +0000
+++ ircd-ratbox-1+opercheats/modules/core/m_mode.c	2003-02-09 18:46:09.000000000 +0000
@@ -42,6 +42,7 @@
 #include "parse.h"
 #include "modules.h"
 #include "packet.h"
+#include "sprintf_irc.h"
 
 static void m_mode(struct Client *, struct Client *, int, char **);
 
@@ -66,6 +67,43 @@
 
 const char *_version = "$Revision: 1.61 $";
 #endif
+
+static void
+loc_channel_modes(struct Channel *chptr, struct Client *client_p, char *mbuf, char *pbuf)
+{
+	int len;
+	*mbuf++ = '+';
+	*pbuf = '\0';
+
+	if(chptr->mode.mode & MODE_SECRET)
+		*mbuf++ = 's';
+	if(chptr->mode.mode & MODE_PRIVATE)
+		*mbuf++ = 'p';
+	if(chptr->mode.mode & MODE_MODERATED)
+		*mbuf++ = 'm';
+	if(chptr->mode.mode & MODE_TOPICLIMIT)
+		*mbuf++ = 't';
+	if(chptr->mode.mode & MODE_INVITEONLY)
+		*mbuf++ = 'i';
+	if(chptr->mode.mode & MODE_NOPRIVMSGS)
+		*mbuf++ = 'n';
+
+	if(chptr->mode.limit)
+	{
+		*mbuf++ = 'l';
+		len = ircsprintf(pbuf, "%d ", chptr->mode.limit);
+		pbuf += len;
+	}
+	if(*chptr->mode.key)
+	{
+		*mbuf++ = 'k';
+		ircsprintf(pbuf, "%s ", chptr->mode.key);
+	}
+
+	*mbuf++ = '\0';
+	return;
+}
+
 /*
  * m_mode - MODE command handler
  * parv[0] - sender
@@ -79,23 +117,33 @@
 	static char parabuf[MODEBUFLEN];
 	dlink_node *ptr;
 	int n = 2;
+	char *my_parv;
+	int whois_cheat = 0;
+
+	my_parv = parv[1];
+
+	if(IsOperSpy(source_p) && *my_parv == '!')
+	{
+		my_parv++;
+		whois_cheat = 1;
+	}
 
 	/* Now, try to find the channel in question */
-	if(!IsChanPrefix(parv[1][0]))
+	if(!IsChanPrefix(*my_parv))
 	{
 		/* if here, it has to be a non-channel name */
 		user_mode(client_p, source_p, parc, parv);
 		return;
 	}
 
-	if(!check_channel_name(parv[1]))
+	if(!check_channel_name(my_parv))
 	{
 		sendto_one(source_p, form_str(ERR_BADCHANNAME),
 			   me.name, parv[0], (unsigned char *) parv[1]);
 		return;
 	}
 
-	chptr = hash_find_channel(parv[1]);
+	chptr = hash_find_channel(my_parv);
 
 	if(chptr == NULL)
 	{
@@ -108,7 +156,11 @@
 
 	if(parc < n + 1)
 	{
-		channel_modes(chptr, source_p, modebuf, parabuf);
+		if(whois_cheat)
+			loc_channel_modes(chptr, source_p, modebuf, parabuf);
+		else
+			channel_modes(chptr, source_p, modebuf, parabuf);
+
 		sendto_one(source_p, form_str(RPL_CHANNELMODEIS),
 			   me.name, parv[0], parv[1], modebuf, parabuf);
 
diff -ur ircd-ratbox-1/modules/m_who.c ircd-ratbox-1+opercheats/modules/m_who.c
--- ircd-ratbox-1/modules/m_who.c	2003-02-07 18:15:54.000000000 +0000
+++ ircd-ratbox-1+opercheats/modules/m_who.c	2003-02-09 18:41:31.000000000 +0000
@@ -87,6 +87,7 @@
 	struct Channel *mychannel = NULL;
 	int server_oper = parc > 2 ? (*parv[2] == 'o') : 0;	/* Show OPERS only */
 	int member;
+	int whois_cheat = 0;
 
 	/* See if mask is there, collapse it or return if not there */
 
@@ -129,6 +130,12 @@
 		return;
 	}
 
+	if(IsOperSpy(source_p) && *mask == '!')
+	{
+		mask++;
+		whois_cheat = 1;
+	}
+
 	/* '/who #some_channel' */
 
 	if(IsChannelName(mask))
@@ -139,7 +146,7 @@
 		chptr = hash_find_channel(mask);
 		if(chptr != NULL)
 		{
-			if(IsMember(source_p, chptr))
+			if(IsMember(source_p, chptr) || whois_cheat)
 				do_who_on_channel(source_p, chptr, chptr->chname, NO, YES);
 			else if(!SecretChannel(chptr))
 				do_who_on_channel(source_p, chptr, chptr->chname, NO, NO);
Only in ircd-ratbox-1+opercheats/modules: m_who.c.orig
diff -ur ircd-ratbox-1/modules/m_whois.c ircd-ratbox-1+opercheats/modules/m_whois.c
--- ircd-ratbox-1/modules/m_whois.c	2003-02-07 17:21:36.000000000 +0000
+++ ircd-ratbox-1+opercheats/modules/m_whois.c	2003-02-09 18:41:31.000000000 +0000
@@ -47,8 +47,8 @@
 #include "hook.h"
 
 static int do_whois(struct Client *client_p, struct Client *source_p, int parc, char *parv[]);
-static int single_whois(struct Client *source_p, struct Client *target_p, int wilds, int glob);
-static void whois_person(struct Client *source_p, struct Client *target_p, int glob);
+static int single_whois(struct Client *source_p, struct Client *target_p, int wilds, int glob, int);
+static void whois_person(struct Client *source_p, struct Client *target_p, int glob, int);
 static int global_whois(struct Client *source_p, char *nick, int wilds, int glob);
 
 static void m_whois(struct Client *, struct Client *, int, char **);
@@ -169,6 +169,7 @@
 	int found = NO;
 	int wilds;
 	int glob = 0;
+	int whois_cheat = 0;
 
 	/* This lets us make all "whois nick" queries look the same, and all
 	 * "whois nick nick" queries look the same.  We have to pass it all
@@ -184,6 +185,12 @@
 	(void) collapse(nick);
 	wilds = (strchr(nick, '?') || strchr(nick, '*'));
 
+	if(IsOperSpy(source_p) && *nick == '!')
+	{
+		whois_cheat = 1;
+		nick++;
+	}
+
 	if(!wilds)
 	{
 		if((target_p = find_client(nick)) != NULL)
@@ -197,7 +204,7 @@
 
 			if(IsPerson(target_p))
 			{
-				(void) single_whois(source_p, target_p, wilds, glob);
+				(void) single_whois(source_p, target_p, wilds, glob, whois_cheat);
 				found = YES;
 			}
 		}
@@ -259,7 +266,7 @@
 		if(!IsRegistered(target_p))
 			continue;
 
-		if(single_whois(source_p, target_p, wilds, glob))
+		if(single_whois(source_p, target_p, wilds, glob, 0))
 			found = 1;
 	}
 
@@ -277,7 +284,8 @@
  * 		  writing results to source_p
  */
 static int
-single_whois(struct Client *source_p, struct Client *target_p, int wilds, int glob)
+single_whois(struct Client *source_p, struct Client *target_p, int wilds, int glob,
+		int whois_cheat)
 {
 	dlink_node *ptr;
 	struct Channel *chptr;
@@ -324,7 +332,7 @@
 	}
 
 	if(showperson)
-		whois_person(source_p, target_p, glob);
+		whois_person(source_p, target_p, glob, whois_cheat);
 
 	return showperson;
 }
@@ -338,7 +346,8 @@
  * Side Effects	- 
  */
 static void
-whois_person(struct Client *source_p, struct Client *target_p, int glob)
+whois_person(struct Client *source_p, struct Client *target_p, int glob,
+		int whois_cheat)
 {
 	char buf[BUFSIZE];
 	char *chname;
@@ -352,6 +361,7 @@
 	int tlen;
 	int reply_to_send = NO;
 	struct hook_mfunc_data hd;
+	int whois_len = 4;
 
 	a2client_p = find_server(target_p->user->server);
 
@@ -366,15 +376,18 @@
 	cur_len = mlen;
 	t = buf + mlen;
 
+	if(whois_cheat)
+	  whois_len = 5;
+
 	DLINK_FOREACH(lp, target_p->user->channel.head)
 	{
 		chptr = lp->data;
 		chname = chptr->chname;
 
-		if(ShowChannel(source_p, chptr))
+		if(ShowChannel(source_p, chptr) || whois_cheat)
 		{
 
-			if((cur_len + strlen(chname) + 2) > (BUFSIZE - 4))
+			if((cur_len + strlen(chname) + 2) > (BUFSIZE - whois_cheat))
 			{
 				sendto_one(source_p, "%s", buf);
 				cur_len = mlen;
@@ -387,7 +400,9 @@
 			}
 			else
 			{
-				ircsprintf(t, "%s%s ", channel_chanop_or_voice(chptr, target_p),
+				ircsprintf(t, "%s%s%s ", 
+				    	   ShowChannel(source_p, chptr) ? "" : "!",
+				    	   channel_chanop_or_voice(chptr, target_p),
 					   chname);
 			}
 
diff -ur ircd-ratbox-1/src/newconf.c ircd-ratbox-1+opercheats/src/newconf.c
--- ircd-ratbox-1/src/newconf.c	2003-02-07 17:21:36.000000000 +0000
+++ ircd-ratbox-1+opercheats/src/newconf.c	2003-02-09 18:41:31.000000000 +0000
@@ -348,6 +348,7 @@
 	add_conf_item("operator", "rehash", CF_YESNO, conf_set_oper_rehash);
 	add_conf_item("operator", "admin", CF_YESNO, conf_set_oper_admin);
 	add_conf_item("operator", "hidden_admin", CF_YESNO, conf_set_oper_hidden_admin);
+	add_conf_item("operator", "oper_spy", CF_YESNO, conf_set_oper_operspy);
 	add_conf_item("operator", "encrypted", CF_YESNO, conf_set_oper_encrypted);
 	add_conf_item("operator", "rsa_public_key_file", CF_QSTRING,
 		      conf_set_oper_rsa_public_key_file);
@@ -1272,6 +1273,17 @@
 		yy_achead->port &= ~OPER_HIDDENADMIN;
 }
 
+void
+conf_set_oper_operspy(void *data)
+{
+	int yesno = *(int *) data;
+
+	if(yesno)
+		yy_achead->port |= OPER_SPY;
+	else
+		yy_achead->port &= ~OPER_SPY;
+}
+
 int
 conf_begin_class(struct TopConf *tc)
 {
Only in ircd-ratbox-1+opercheats/src: newconf.c.orig
