IRC-Server

IRC server based on TCP/IP protocol to rfc1459 standard

MIT License

Stars
28

1998 , DALnet, , IRC?, : IRC , , , , , . IRC , , , !

IRC (Internet Relay Chat) . 1988 , . , IRC , : ICQ, Skype, Discord, Telegram, Slack, etc...

IRC-, rfc1459.

:

git clone https://github.com/levensta/IRC-Server.git
cd IRC-Server/
make

:

./ircserv 6667 secretpassword

:

  • nc localhost 6667

  • Pidgin (Linux)

  • Adium (MacOS)

    IRConf.json


, , api.intra.42.fr, . :

./bot/bot IRCatBot.conf.json

:

PRIVMSG wherebot :levensta
// :[email protected] PRIVMSG lev :"Location: Russian Federation, Kazan, Spartakovskaya, 2b2 -> et-e1"

: C -. rfc1459.


IRC- , ( ) :

  • ()
  • ( 15).

**** . :, , . : .

** ** IRC- , ASCII-. - 510 . . . / , .

,    . ,    ,    2      ,       2    .

:
  • PASS-
  • NICK-
  • USER-

PASS- . , MOTD (message of the day) :

375     RPL_MOTDSTART               ":- <server> Message of the day - "
372     RPL_MOTD                    ":- <text>"
376     RPL_ENDOFMOTD               ":End of /MOTD command"

PASS

: <password>

PASS ' ', , . . , PASS NICK/USER.

:

        ERR_NEEDMOREPARAMS          ERR_ALREADYREGISTRED

:

  PASS secretpassword

NICK

: <nickname> [ <hopcount> ]

, NICK, , KILL . , , . NICK , () .

:

        ERR_NONICKNAMEGIVEN         ERR_ERRONEUSNICKNAME
        ERR_NICKNAMEINUSE           ERR_NICKCOLLISION

:

  NICK Wiz		//    "Wiz".
  :WiZ NICK Kilroy	// WiZ     Kilroy.

USER

: <username> <hostname> <servername> <realname>

USER , , .

<hostname> <servername> IRC-, , -. , <realname> , :, .

:

        RR_NEEDMOREPARAMS           ERR_ALREADYREGISTRED

:

  USER guest tolmoon tolsun :Ronnie Reagan
  //      "guest"     "Ronnie Reagan"

OPER

: <user> <password>

OPER IRC- ( ). <user> <password> , IRC-.

-, OPER , , MODE +o .

:

        ERR_NEEDMOREPARAMS          RPL_YOUREOPER
        ERR_NOOPERHOST              ERR_PASSWDMISMATCH

:

  OPER foo bar
  //    IRC-,    "foo"   "bar".

QUIT

: [<Quit message>]

QUIT-.      ,    .

, - , QUIT (, ), quit- , .

:

  QUIT :Gone to have lunch          //   .

    (9) .

: a-z, A-Z, 0-9 . -, [, ], \, ^, {, }

:
  • , .

  • .
    
  • , .

    , QUIT- .

PRIVMSG

: <receiver>{,<receiver>} <text to be sent>

PRIVMSG . <receiver> . , .

:

        ERR_NORECIPIENT             ERR_NOTEXTTOSEND
        ERR_CANNOTSENDTOCHAN        ERR_NOTOPLEVEL
        ERR_WILDTOPLEVEL            ERR_TOOMANYTARGETS
        ERR_NOSUCHNICK
        RPL_AWAY

:

  :Angel PRIVMSG Wiz :Hello are you receiving this message ?
  //   Angel  Wiz;

  PRIVMSG Angel :yes I'm receiving it !receiving it !'u>(768u+1n) .br
  //   Angel;

AWAY

: [message]

AWAY PRIVMSG, AWAY , , .

:

        RPL_UNAWAY                  RPL_NOWAWAY

:

AWAY :Gone to lunch.  Back in 5     //  away- "Gone to lunch. Back in 5".
:WiZ AWAY                           //   WiZ  AWAY.

NOTICE

: <nickname> <text>

,  `PRIVMSG`,   ,    `AWAY`        .

NOTICE , +s.

WHO

: [<nickmask> [<o>]]

, name, (+i) o, IRC-.

:

        ERR_NOSUCHSERVER
        RPL_WHOREPLY                RPL_ENDOFWHO

:

  WHO *.fi        //  ,   "*.fi";
  WHO jto* o      //  ,   "jto*",    .

WHOIS

: <nickmask>

C . <nickmask> , , . .

:

        ERR_NOSUCHSERVER            ERR_NONICKNAMEGIVEN
        RPL_WHOISUSER               RPL_WHOISCHANNELS
        RPL_WHOISCHANNELS           RPL_WHOISSERVER
        RPL_AWAY                    RPL_WHOISOPERATOR
        RPL_WHOISIDLE               ERR_NOSUCHNICK
        RPL_ENDOFWHOIS

:

  WHOIS wiz             //      WiZ

WHOWAS

: <nickname> [<count>]

,     (        ).

<count>, <count> .

:

        ERR_NONICKNAMEGIVEN         ERR_WASNOSUCHNICK
        RPL_WHOWASUSER              RPL_WHOISSERVER
        RPL_ENDOFWHOWAS

:

  WHOWAS Wiz            //        "WiZ"
  WHOWAS Mermaid 9      //  9     -  "Mermaid"

      ,     .   ,     ,     .

** ** ( & #) 200 .

   ,    [`JOIN`](#join) .   ,   ,      .    ,          ,      -   . ,      (invite-only), ( +i),         .
  ,     (10) .

   ASCII-,  `\r`, `\n`, `\g`, `SPACE`, `\0`, `,`.

:
  • , , .
    , . & .
  • `#`.
    
      *-*,      .
    

, @, , , (, NAMES, WHO WHOIS). , , . :

  • MODE
  • TOPIC (+t)
  • INVITE (+i)
  • KICK

MODE

MODE .

:

        ERR_NEEDMOREPARAMS          RPL_CHANNELMODEIS
        ERR_CHANOPRIVSNEEDED        ERR_NOSUCHNICK
        ERR_NOTONCHANNEL            ERR_KEYSET
        RPL_BANLIST                 RPL_ENDOFBANLIST
        ERR_UNKNOWNMODE             ERR_NOSUCHCHANNEL

        ERR_USERSDONTMATCH          RPL_UMODEIS
        ERR_UMODEUNKNOWNFLAG

: <channel> {[+|-]|o|p|s|i|t|n|b|v} [<limit>] [<user>] [<ban mask>]

     .. ,   .

:

  • o /
  • p ;
  • s ;
  • i invite-only;
  • t , ;
  • n ;
  • m ;
  • l ;
  • b ;
  • v / ;
  • k .

:

  MODE #Finnish +im                 //   #Finnish   'invite-only'.
  MODE #Finnish +o Kilroy           //    Kilroy   #Finnish.
  MODE #Finnish +v Wiz              //  WiZ     #Finnish.
  MODE #Fins -s                     //   'secret'   #Fins.
  MODE #42 +k oulu                  //     "oulu".
  MODE #eu-opers +l 10              //       (10).
  MODE &oulu +b                     //      .
  MODE &oulu +b *!*@*               //       .
  MODE &oulu +b *!*@*.edu           //         *.edu.

: <nickname> {[+|-]|i|w|s|o}

,    ,      ''-  .

MODE , . :

:

  :MODE WiZ -w                      //    WALLOPS  WiZ.
  :Angel MODE Angel +i              //   Angel   .
  MODE WiZ -o                       // WiZ    .

TOPIC

: <channel> [<topic>]

  .   `<channel>`  ,       `<topic>`.

<topic> , . t, .

:

        ERR_NEEDMOREPARAMS          ERR_NOTONCHANNEL
        RPL_NOTOPIC                 RPL_TOPIC
        ERR_CHANOPRIVSNEEDED

:

  :Wiz TOPIC #test :New topic       //  Wiz  .
  TOPIC #test :another topic        //   #test  "another topic".
  TOPIC #test                       //    #test.

JOIN

: <channel>{,<channel>} [<key>{,<key>}]

JOIN . , :

  1. , invite-only.
  2. / / .
  3. , .
,        .     `MODE`, `KICK`, `PART`, `QUIT` ,  , `PRIVMSG`/`NOTICE`.

JOIN , ( RPL_TOPIC) , ( RPL_NAMREPLY).

:

        ERR_NEEDMOREPARAMS          ERR_BANNEDFROMCHAN
        ERR_INVITEONLYCHAN          ERR_BADCHANNELKEY
        ERR_CHANNELISFULL           ERR_BADCHANMASK
        ERR_NOSUCHCHANNEL           ERR_TOOMANYCHANNELS
        RPL_TOPIC

:

  JOIN #foobar                      //    #foobar.
  JOIN &foo fubar                   //    &foo,   "fubar".
  JOIN #foo,&bar fubar              //    #foo,   "fubar"    &bar   .
  JOIN #foo,#bar fubar,foobar       //    #foo,   "fubar"    #bar,   "foobar".
  JOIN #foo,#bar                    //    #foo  #bar.
  :WiZ JOIN #Twilight_zone          // JOIN-  WiZ

INVITE

: <nickname> <channel>

INVITE . <nickname> , <channel>. invite-only (MODE +i), .

:

        ERR_NEEDMOREPARAMS          ERR_NOSUCHNICK
        ERR_NOTONCHANNEL            ERR_USERONCHANNEL
        ERR_CHANOPRIVSNEEDED
        RPL_INVITING                RPL_AWAY

:

  :Angel INVITE Wiz #Dust           //  Angel  WiZ   #Dust
  INVITE Wiz #Twilight_Zone         //   WiZ   #Twilight_zone

KICK

: <channel> <user> [<comment>]

KICK .

:

        ERR_NEEDMOREPARAMS          ERR_NOSUCHCHANNEL
        ERR_BADCHANMASK             ERR_CHANOPRIVSNEEDED
        ERR_NOTONCHANNEL

:

  KICK &Melbourne Matthew                 //  Matthew   &Melbourne
  KICK #Finnish John :Speaking English    //  John  #Finnish,  / "Speaking English".
  :WiZ KICK #Finnish John                 // KICK- WiZ  John   #Finnish

PART

: <channel>{,<channel>}

PART , .

:

        ERR_NEEDMOREPARAMS          ERR_NOSUCHCHANNEL
        ERR_NOTONCHANNEL

:

  PART #twilight_zone               //   "#twilight_zone"
  PART #oz-ops,&group5              //   "&group5"  "#oz-ops".

NAMES

: [<channel>{,<channel>}]

NAMES, , ( , ). , (+p), (+s) . - .

<channel> , , . , .

:

        RPL_NAMREPLY                RPL_ENDOFNAMES

:

  NAMES #twilight_zone,#42          //      #twilight_zone  #42,    .
  NAMES                             //      .

LIST

: [<channel>{,<channel>} [<server>]]

LIST . <channel>, .

( ) "Prv", , . , .

:

        ERR_NOSUCHSERVER            RPL_LISTSTART
        RPL_LIST                    RPL_LISTEND

:

  LIST                              //   .
  LIST #twilight_zone,#42           //   #twilight_zone  #42

IRC-

IRC- , :

  • RESTART . :

      ERR_NOPRIVILEGES
    
  • KILL . <user> <message> :

      ERR_NOPRIVILEGES                ERR_NEEDMOREPARAMS
      ERR_NOSUCHNICK                  ERR_CANTKILLSERVER
    
  • REHASH , IRC-. :

      RPL_REHASHING                   ERR_NOPRIVILEGES
    

IRC-, , . IRC-, OPER.

 ,    .     :
  •  .
    
  •  .
    
  • (, /, ..).
  • e-mail.
    
  • IRC-.

IRC- . , SHA256

WALLOPS

: <message>

IRC-,   ,  ,      `MODE -w`.
`WALLOPS`,       .

:

        ER_NEEDMOREPARAMS

PING / PONG

: <server1> [<server2>]

PING . , , . PONG PING .

:

        ERR_NOORIGIN                ERR_NOSUCHSERVER

ISON

: <nickname>{<space><nickname>}

`<nickname>`  ,  .
 ,       ,     .
    ,    .

:

        RPL_ISON                    ERR_NEEDMOREPARAMS

USERHOST

: <nickname>{<space><nickname>}

USERHOST 5- , , .

:

        RPL_USERHOST                ERR_NEEDMOREPARAMS

:

  USERHOST Wiz Michael Marty p          // USERHOST     "Wiz", "Michael", "Marty"  "p"

VERSION

: [<server>]

<server>, , .

:

        ERR_NOSUCHSERVER            RPL_VERSION

INFO

: [<server>]

.    ,   ,    ,  ,    ,    .

:

        ERR_NOSUCHSERVER
        RPL_INFO                    RPL_ENDOFINFO

ADMIN

: [<server>]

   ,    -.

:

        ERR_NOSUCHSERVER
        RPL_ADMINME                 RPL_ADMINLOC
        RPL_ADMINLOC2               RPL_ADMINEMAIL

TIME

: [<server>]

  .

:

        ERR_NOSUCHSERVER            RPL_TIME

,      .

401     ERR_NOSUCHNICK              "<nickname> :No such nick/channel"
402     ERR_NOSUCHSERVER            "<server name> :No such server"
403     ERR_NOSUCHCHANNEL           "<channel name> :No such channel"
404     ERR_CANNOTSENDTOCHAN        "<channel name> :Cannot send to channel"
405     ERR_TOOMANYCHANNELS         "<channel name> :You have joined too many channels"
406     ERR_WASNOSUCHNICK           "<nickname> :There was no such nickname"
407     ERR_TOOMANYTARGETS          "<target> :Duplicate recipients. No message delivered"
409     ERR_NOORIGIN                ":No origin specified"
411     ERR_NORECIPIENT             ":No recipient given (<command>)"
412     ERR_NOTEXTTOSEND            ":No text to send"
413     ERR_NOTOPLEVEL              "<mask> :No toplevel domain specified"
414     ERR_WILDTOPLEVEL            "<mask> :Wildcard in toplevel domain"
421     ERR_UNKNOWNCOMMAND          "<command> :Unknown command"
422     ERR_NOMOTD                  ":MOTD File is missing"
423     ERR_NOADMININFO             "<server> :No administrative info available"
424     ERR_FILEERROR               ":File error doing <file op> on <file>"
431     ERR_NONICKNAMEGIVEN         ":No nickname given"
432     ERR_ERRONEUSNICKNAME        "<nick> :Erroneus nickname"
433     ERR_NICKNAMEINUSE           "<nick> :Nickname is already in use"
436     ERR_NICKCOLLISION           "<nick> :Nickname collision KILL"
441     ERR_USERNOTINCHANNEL        "<nick> <channel> :They aren't on that channel"
442     ERR_NOTONCHANNEL            "<channel> :You're not on that channel"
443     ERR_USERONCHANNEL           "<user> <channel> :is already on channel"
444     ERR_NOLOGIN                 "<user> :User not logged in"
445     ERR_SUMMONDISABLED          ":SUMMON has been disabled"
446     ERR_USERSDISABLED           ":USERS has been disabled"
451     ERR_NOTREGISTERED           ":You have not registered"
461     ERR_NEEDMOREPARAMS          "<command> :Not enough parameters"
462     ERR_ALREADYREGISTRED        ":You may not reregister"
463     ERR_NOPERMFORHOST           ":Your host isn't among the privileged"
464     ERR_PASSWDMISMATCH          ":Password incorrect"
465     ERR_YOUREBANNEDCREEP        ":You are banned from this server"
467     ERR_KEYSET                  "<channel> :Channel key already set"
471     ERR_CHANNELISFULL           "<channel> :Cannot join channel (+l)"
472     ERR_UNKNOWNMODE             "<char> :is unknown mode char to me"
473     ERR_INVITEONLYCHAN          "<channel> :Cannot join channel (+i)"
474     ERR_BANNEDFROMCHAN          "<channel> :Cannot join channel (+b)"
475     ERR_BADCHANNELKEY           "<channel> :Cannot join channel (+k)"
481     ERR_NOPRIVILEGES            ":Permission Denied- You're not an IRC operator"
482     ERR_CHANOPRIVSNEEDED        "<channel> :You're not channel operator"
483     ERR_CANTKILLSERVER          ":You cant kill a server!"
491     ERR_NOOPERHOST              ":No O-lines for your host"
501     ERR_UMODEUNKNOWNFLAG        ":Unknown MODE flag"
502     ERR_USERSDONTMATCH          ":Cant change mode for other users"

300     RPL_NONE
302     RPL_USERHOST                ":[<reply>{<space><reply>}]"
303     RPL_ISON                    ":[<nick> {<space><nick>}]"
301     RPL_AWAY                    "<nick> :<away message>"
305     RPL_UNAWAY                  ":You are no longer marked as being away"
306     RPL_NOWAWAY                 ":You have been marked as being away"
311     RPL_WHOISUSER               "<nick> <user> <host> * :<real name>"
312     RPL_WHOISSERVER             "<nick> <server> :<server info>"
313     RPL_WHOISOPERATOR           "<nick> :is an IRC operator"
317     RPL_WHOISIDLE               "<nick> <integer> :seconds idle"
318     RPL_ENDOFWHOIS              "<nick> :End of /WHOIS list"
319     RPL_WHOISCHANNELS           "<nick> :{[@|+]<channel><space>}"
314     RPL_WHOWASUSER              "<nick> <user> <host> * :<real name>"
369     RPL_ENDOFWHOWAS             "<nick> :End of WHOWAS"
321     RPL_LISTSTART               "Channel :Users  Name"
322     RPL_LIST                    "<channel> <# visible> :<topic>"
323     RPL_LISTEND      	        ":End of /LIST"
324     RPL_CHANNELMODEIS           "<channel> <mode> <mode params>"
331     RPL_NOTOPIC                 "<channel> :No topic is set"
332     RPL_TOPIC                   "<channel> :<topic>"
341     RPL_INVITING                "<channel> <nick>"
342     RPL_SUMMONING               "<user> :Summoning user to IRC"
351     RPL_VERSION                 "<version>.<debuglevel> <server> :<comments>"
352     RPL_WHOREPLY                "<channel> <user> <host> <server> <nick> <H|G>[*][@|+] :<hopcount> <real name>"
315     RPL_ENDOFWHO                "<name> :End of /WHO list"
353     RPL_NAMREPLY                "<channel> :[[@|+]<nick> [[@|+]<nick> [...]]]"
366     RPL_ENDOFNAMES              "<channel> :End of /NAMES list"
364     RPL_LINKS                   "<mask> <server> :<hopcount> <server info>"
365     RPL_ENDOFLINKS              "<mask> :End of /LINKS list"
367     RPL_BANLIST                 "<channel> <banid>"
368     RPL_ENDOFBANLIST            "<channel> :End of channel ban list"
371     RPL_INFO                    ":<string>"
374     RPL_ENDOFINFO               ":End of /INFO list"
375     RPL_MOTDSTART               ":- <server> Message of the day - "
372     RPL_MOTD                    ":- <text>"
376     RPL_ENDOFMOTD               ":End of /MOTD command"
381     RPL_YOUREOPER               ":You are now an IRC operator"
382     RPL_REHASHING               "<config file> :Rehashing"
391     RPL_TIME                    "<server> :<string showing server's local time>"
392     RPL_USERSSTART              ":UserID   Terminal  Host"
393     RPL_USERS                   ":%-8s %-9s %-8s"
394     RPL_ENDOFUSERS              ":End of users"
395     RPL_NOUSERS                 ":Nobody logged in"
200     RPL_TRACELINK               "Link <version & debug level> <destination> <next server>"
201     RPL_TRACECONNECTING         "Try. <class> <server>"
202     RPL_TRACEHANDSHAKE          "H.S. <class> <server>"
203     RPL_TRACEUNKNOWN            "???? <class> [<client IP address in dot form>]"
204     RPL_TRACEOPERATOR           "Oper <class> <nick>"
205     RPL_TRACEUSER               "User <class> <nick>"
206     RPL_TRACESERVER             "Serv <class> <int>S <int>C <server> <nick!user|*!*>@<host|server>"
208     RPL_TRACENEWTYPE            "<newtype> 0 <client name>"
261     RPL_TRACELOG                "File <logfile> <debug level>"
211     RPL_STATSLINKINFO           "<linkname> <sendq> <sent messages> <sent bytes> <received messages> <received bytes> <time open>"
212     RPL_STATSCOMMANDS           "<command> <count>"
213     RPL_STATSCLINE              "C <host> * <name> <port> <class>"
214     RPL_STATSNLINE              "N <host> * <name> <port> <class>"
215     RPL_STATSILINE              "I <host> * <host> <port> <class>"
216     RPL_STATSKLINE              "K <host> * <username> <port> <class>"
218     RPL_STATSYLINE              "Y <class> <ping frequency> <connect frequency> <max sendq>"
219     RPL_ENDOFSTATS              "<stats letter> :End of /STATS report"
221     RPL_UMODEIS                 "<user mode string>"
241     RPL_STATSLLINE              "L <hostmask> * <servername> <maxdepth>"
242     RPL_STATSUPTIME             ":Server Up %d days %d:%02d:%02d"
243     RPL_STATSOLINE              "O <hostmask> * <name>"
244     RPL_STATSHLINE              "H <hostmask> * <servername>"
251     RPL_LUSERCLIENT             ":There are <integer> users and <integer> invisible on <integer> servers"
252     RPL_LUSEROP                 "<integer> :operator(s) online"
253     RPL_LUSERUNKNOWN            "<integer> :unknown connection(s)"
254     RPL_LUSERCHANNELS           "<integer> :channels formed"
255     RPL_LUSERME                 ":I have <integer> clients and <integer> servers"
256     RPL_ADMINME                 "<server> :Administrative info"
257     RPL_ADMINLOC1               ":<admin info>"
258     RPL_ADMINLOC2               ":<admin info>"
259     RPL_ADMINEMAIL              ":<admin info>"

209     RPL_TRACECLASS              217     RPL_STATSQLINE
231     RPL_SERVICEINFO             232     RPL_ENDOFSERVICES
233     RPL_SERVICE                 234     RPL_SERVLIST
235     RPL_SERVLISTEND
316     RPL_WHOISCHANOP             361     RPL_KILLDONE
362     RPL_CLOSING                 363     RPL_CLOSEEND
373     RPL_INFOSTART               384     RPL_MYPORTIS
466     ERR_YOUWILLBEBANNED         476     ERR_BADCHANMASK
492     ERR_NOSERVICEHOST

  1. https://datatracker.ietf.org/doc/html/rfc1459 rfc1459
  2. https://www.lissyara.su/doc/rfc/rfc1459/ rfc1459,
  3. https://ru.wikipedia.org/wiki/_IRC- wiki IRC
  4. https://masandilov.ru/network/guide_to_network_programming
  5. https://ncona.com/2019/04/building-a-simple-server-with-cpp/ TCP- C++
  6. https://youtu.be/cNdlrbZSkyQ