How to IRC with a TELNET client, in a nutshell, by EA 4/2005: ^] toggle crlf first... send max 512 chars per command... shorthands used in this text: $S name of the IRC server on the other end $Y your own nickname $O the nickname of somebody else $M a message text $Description a variable sent to the server, or received from it. Note that there are no literal $ in actual IRC. $N a numerical value received from the server. $#C the name of a channel... do not include the $ character, it only marks a shorthand here... Getting started: Do something like "telnet servername 6667" to connect. you receive a greeting when you connect: :$S NOTICE AUTH :$M >> you send now: NICK $Y >> and then: USER $Y 0 * $Realname you get: :$S 001 $Y :Welcome to $Network $Y!$Youruser@$Yourhost :$S 002 $Y :Your host is $S, running version $Version :$S 003 $Y :This server was created $Date_as_text :$S 004 $Y $S $Version $Usermodes $Channelmodes ... where usermodes and channelmodes are letterbag strings :$S 005 $Y $Comments_and_redirects :$S 251 $Y :There are $N users and $N invisible on $N servers :$S 252 $Y $N :operator(s) online :$S 254 $Y $N :channels formed :$S 255 $Y :I have $N clients and $N servers :$S 265 $Y :Current Local Users: $N Max: $N :$S 266 $Y :Current Global Users: $N Max: $N depending on whether there is a motto of the day: :$S 422 $Y :MOTD File is missing or alternatively: ... a 375 MOTD start line / some 372 MOTD lines / a 376 MOTD end line >> then send: JOIN $#C :$S 332 $Y $#C :$Channel_topic_text :$S 333 $Y $#C $O $Operator_login_time :$S 353 $Y = $#C :$O $O ... $@Operator_nick $O ... :$S 366 $Y $#C :End of /NAMES list. ... where the 353 list can contain several members and operators, ... and where the 333 line tells you who is your operator. if you get: PING :$S >> then reply: PONG :$S >> to send chan: PRIVMSG $#C :$M >> to send one: PRIVMSG $O :$M can cause auto-reply from users who are away: :$S 301 $Y $O :$M ... use NOTICE instead of PRIVMSG to avoid away autoreply reactions receiving messages: :$O!$Sendername@$Senderhost PRIVMSG $#C :$M :$O!$Sendername@$Senderhost PRIVMSG $Y :$M >> leave chan: PART $#C >> to leave: QUIT :$M >> to be away: AWAY :$M confirmation for that: :$S 306 $Y :$Some_confirmation_message >> to be back: AWAY confirmation for that: :$S 305 $Y :$Some_confirmation_message >> to list chan: NAMES $#C ... returns 353 and 366 message, as described above... >> to get user: WHO $O returns: :$S 352 $Y $#C $Username $Userhost $Userserver $O H :0 $Realname :$S 315 $Y $O :End of /WHO list. >> get details: WHOIS $O returns, can contain several $#C in the 319 line if on several channels: :$S 311 $Y $O $Username $Userhost * :$Realname :$S 319 $Y $O :$#C :$S 312 $Y $O $Userhost :$Server_description_text :$S 317 $Y $O $N $N :seconds idle, signon time :$S 318 $Y $O :End of /WHOIS list. >> to ask time: TIME returns: :$S 391 $Y $S :$Freeform_date_time_string other messages: 381 - you are now an op 2xx - trace related stuff 4xx - all kinds of errors, e.g. 433 $Y :nick already in use 5xx - some more error messages Further reading: Read the RFC2812 and related documents if you want a complete and formal description along with examples for the full IRC chat protocol. Enjoy.