diff --git a/client.go b/client.go
index acc7cdf..438b151 100644
--- a/client.go
+++ b/client.go
@@ -173,6 +173,15 @@ func (c *Client) Fingerprint() string {
 	return c.Conn.Permissions.Extensions["fingerprint"]
 }
 
+// Emote formats and sends an emote
+func (c *Client) Emote(message string) {
+	formatted := fmt.Sprintf("** %s%s", c.ColoredName(), message)
+	if c.IsSilenced() || len(message) > 1000 {
+		c.SysMsg("Message rejected")
+	}
+	c.Server.Broadcast(formatted, nil)
+}
+
 func (c *Client) handleShell(channel ssh.Channel) {
 	defer channel.Close()
 
@@ -229,12 +238,16 @@ func (c *Client) handleShell(channel ssh.Channel) {
 				if me == "" {
 					me = " is at a loss for words."
 				}
-				msg := fmt.Sprintf("** %s%s", c.ColoredName(), me)
-				if c.IsSilenced() || len(msg) > 1000 {
-					c.SysMsg("Message rejected.")
-				} else {
-					c.Server.Broadcast(msg, nil, false)
+				c.Emote(me)
+			case "/slap":
+				slappee := "themself"
+				if len(parts) > 1 {
+					slappee = parts[1]
+					if len(parts[1]) > 100 {
+						slappee = "some long-named jerk"
+					}
 				}
+				c.Emote(fmt.Sprintf(" slaps %s around a bit with a large trout.", slappee))
 			case "/nick":
 				if len(parts) == 2 {
 					c.Server.Rename(c, parts[1])
diff --git a/colors.go b/colors.go
index c0e5a0f..6bfc5ca 100644
--- a/colors.go
+++ b/colors.go
@@ -42,9 +42,20 @@ func DeColorString(s string) string {
 	return s
 }
 
+func randomReadableColor() int {
+	for {
+		i := rand.Intn(256)
+		if (16 <= i && i <= 18) || (232 <= i && i <= 237) {
+			// Remove the ones near black, this is kinda sadpanda.
+			continue
+		}
+		return i
+	}
+}
+
 // RandomColor256 returns a random (of 256) color
 func RandomColor256() string {
-	return fmt.Sprintf("38;05;%d", rand.Intn(256))
+	return fmt.Sprintf("38;05;%d", randomReadableColor())
 }
 
 // RandomColor returns a random color
diff --git a/server.go b/server.go
index a204068..2f39941 100644
--- a/server.go
+++ b/server.go
@@ -167,7 +167,7 @@ func (s *Server) Add(client *Client) {
 
 	newName, err := s.proposeName(client.Name)
 	if err != nil {
-		client.SysMsg("Your name '%s' is not available, renamed to '%s'. Use /nick <name> to change it.", client.ColoredName(), ColorString(client.Color, newName))
+		client.SysMsg("Your name '%s' is not available, renamed to '%s'. Use /nick <name> to change it.", client.Name, ColorString(client.Color, newName))
 	}
 
 	client.Rename(newName)
@@ -175,7 +175,7 @@ func (s *Server) Add(client *Client) {
 	num := len(s.clients)
 	s.Unlock()
 
-	s.Broadcast(ContinuousFormat(systemMessageFormat, fmt.Sprintf(" * %s joined. (Total connected: %d)", client.ColoredName(), num)), client, false)
+	s.Broadcast(ContinuousFormat(systemMessageFormat, fmt.Sprintf(" * %s joined. (Total connected: %d)", client.Name, num)), client)
 }
 
 // Remove removes the given client from the list of clients
@@ -184,7 +184,7 @@ func (s *Server) Remove(client *Client) {
 	delete(s.clients, strings.ToLower(client.Name))
 	s.Unlock()
 
-	s.SysMsg("%s left.", client.ColoredName())
+	s.SysMsg("%s left.", client.Name)
 }
 
 func (s *Server) proposeName(name string) (string, error) {