Index: cmd.c
===================================================================
--- cmd.c	(revision 4d92f0339669e7e657bc18e752df1f596f8d7c43)
+++ cmd.c	(revision bf02a602e147f10562cd02ffbd341f4275a86517)
@@ -28,7 +28,9 @@
 extern int creategroups;
 
+void icb_cmd_beep(struct icb_session *, char *);
 void icb_cmd_boot(struct icb_session *, char *);
 void icb_cmd_change(struct icb_session *, char *);
 void icb_cmd_name(struct icb_session *, char *);
+void icb_cmd_nobeep(struct icb_session *, char *);
 void icb_cmd_personal(struct icb_session *, char *);
 void icb_cmd_pass(struct icb_session *, char *);
@@ -43,4 +45,5 @@
 		void		(*handler)(struct icb_session *, char *);
 	} cmdtab[] = {
+		{ "beep",	icb_cmd_beep },
 		{ "boot",	icb_cmd_boot },
 		{ "g",		icb_cmd_change },
@@ -48,4 +51,5 @@
 		{ "msg",	icb_cmd_personal },
 		{ "name",	icb_cmd_name },
+		{ "nobeep",	icb_cmd_nobeep },
 		{ "pass",	icb_cmd_pass },
 		{ "topic",	icb_cmd_topic },
@@ -59,4 +63,35 @@
 			return (cmdtab[i].handler);
 	return (NULL);
+}
+
+void
+icb_cmd_beep(struct icb_session *is, char *arg)
+{
+	struct icb_group *ig = is->group;
+	struct icb_session *s;
+
+	if (strlen(arg) == 0) {
+		icb_error(is, "Invalid user");
+		return;
+	}
+
+	LIST_FOREACH(s, &ig->sess, entry) {
+		if (strcmp(s->nick, arg) == 0)
+			break;
+	}
+	if (s == NULL) {
+		icb_status(is, STATUS_NOTIFY, "%s is not signed on", arg);
+		return;
+	}
+
+	if (ISSETF(s->flags, ICB_SF_NOBEEP | ICB_SF_NOBEEP2)) {
+		icb_error(is, "User has nobeep enabled");
+		if (ISSETF(s->flags, ICB_SF_NOBEEP2))
+			icb_status(s, STATUS_NOBEEP,
+			    "%s attempted to beep you", is->nick);
+		return;
+	}
+
+	icb_sendfmt(s, "%c%s", ICB_M_BEEP, is->nick);
 }
 
@@ -186,4 +221,38 @@
 	    "%s changed nickname to %s", is->nick, arg);
 	strlcpy(is->nick, arg, sizeof is->nick);
+}
+
+void
+icb_cmd_nobeep(struct icb_session *is, char *arg)
+{
+	if (strlen(arg) == 0) {
+		/* fail if we have verbose turned on */
+		if (ISSETF(is->flags, ICB_SF_NOBEEP2)) {
+			icb_error(is, "Can't toggle your nobeep status");
+			return;
+		}
+		/* otherwise toggle the status */
+		if (ISSETF(is->flags, ICB_SF_NOBEEP))
+			CLRF(is->flags, ICB_SF_NOBEEP);
+		else
+			SETF(is->flags, ICB_SF_NOBEEP);
+		icb_status(is, STATUS_NOBEEP, "No-Beep %s",
+		    ISSETF(is->flags, ICB_SF_NOBEEP) ? "on" : "off");
+		return;
+	}
+
+	if (strcmp(arg, "on") == 0) {
+		SETF(is->flags, ICB_SF_NOBEEP);
+		CLRF(is->flags, ICB_SF_NOBEEP2); /* can't be on and verbose */
+		icb_status(is, STATUS_NOBEEP, "No-Beep on");
+	} else if (strcmp(arg, "verbose") == 0) {
+		SETF(is->flags, ICB_SF_NOBEEP2);
+		CLRF(is->flags, ICB_SF_NOBEEP); /* can't be on and verbose */
+		icb_status(is, STATUS_NOBEEP, "No-Beep on (verbose)");
+	} else if (strcmp(arg, "off") == 0) {
+		CLRF(is->flags, ICB_SF_NOBEEP | ICB_SF_NOBEEP2);
+		icb_status(is, STATUS_NOBEEP, "No-Beep off");
+	} else
+		icb_error(is, "Invalid nobeep mode");
 }
 
Index: icb.c
===================================================================
--- icb.c	(revision 4d92f0339669e7e657bc18e752df1f596f8d7c43)
+++ icb.c	(revision bf02a602e147f10562cd02ffbd341f4275a86517)
@@ -315,4 +315,5 @@
 		{ STATUS_DEPART,	"Depart" },
 		{ STATUS_NAME,		"Name" },
+		{ STATUS_NOBEEP,	"No-Beep" },
 		{ STATUS_NOTIFY,	"Notify" },
 		{ STATUS_SIGNON,	"Sign-on" },
@@ -452,5 +453,5 @@
 	LIST_FOREACH(s, &ig->sess, entry) {
 		(void)snprintf(buf, sizeof buf,
-		    "%c%c%s%c%d%c0%c%d%c%s%c%s%c%s",
+		    "%c%c%s%c%lld%c0%c%lld%c%s%c%s%c%s",
 		    icb_ismoder(ig, s) ? '*' : ' ', ICB_M_SEP,
 		    s->nick, ICB_M_SEP, getmonotime() - s->last,
Index: icb.h
===================================================================
--- icb.h	(revision 4d92f0339669e7e657bc18e752df1f596f8d7c43)
+++ icb.h	(revision bf02a602e147f10562cd02ffbd341f4275a86517)
@@ -33,4 +33,5 @@
 	 STATUS_DEPART,
 	 STATUS_NAME,
+	 STATUS_NOBEEP,
 	 STATUS_NOTIFY,
 	 STATUS_SIGNON,
@@ -78,9 +79,9 @@
 #define CLRF(t, f)		 ((t) &= ~(f))
 #define ISSETF(t, f)		 ((t) & (f))
-#define ICB_SF_UNKNOWN		 0x00
 #define ICB_SF_PROTOSENT	 0x01
 #define ICB_SF_LOGGEDIN		 0x02
 #define ICB_SF_NOGROUP		 0x08
-#define ICB_SF_MODERATOR	 0x10
+#define ICB_SF_NOBEEP		 0x10
+#define ICB_SF_NOBEEP2		 0x20
 };
 
