@natty @angelthorns Yeah, the problem is IRC's state machine is enormous. Clients alone have 20+ pieces of state (nick, ident/username, host, real name, mpsc queue, modeset, target change, token bucket, last ping received, pending ping, away message if any, channel membership list (needed for WHOIS), MONITOR list, capabilities list, quit flag and message (if the user is leaving, you need to broadcast it and send an ERROR to the client before disconnecting them)... things like nick, ident/username, host, mpsc queue, modeset, capabilities, etc. all affect how a message is set, what kind of message is sent (with or without tags, etc.), what is sent with it (nick/user/host is included in most messages from a user), etc. Much of this state doesn't change often, but other state is pretty changeable (like nickname or away message or channel membership), sometimes by the user, sometimes by other users (think /SANICK etc.) so it is extremely painful to deal with it.