pipes-irc-server/notes.md

10 KiB

Pipes Notes

A set of monad transformers for streaming: Producers, Consumers, Pipes, ListT

They provide two primitive actions:

  • await
  • yield

Producers yield, Consumers await

Pipes both yield and await

Effects neither yield nor await

Connectors:

  • for handles yield
  • >~ handles await
  • >-> handles yield and await
  • >>= (regular monad bind) handles return values

As connectors are applied to Producers, Consumers, and Pipes; the return type changes until it becomes Effect, at which point all inputs and outputs are handled and the resulting monad can be executed.

IRC Notes

ABNF from rfc2812:

message    =  [ ":" prefix SPACE ] command [ params ] crlf
prefix     =  servername / ( nickname [ [ "!" user ] "@" host ] )
command    =  1*letter / 3digit
params     =  *14( SPACE middle ) [ SPACE ":" trailing ]
           =/ 14( SPACE middle ) [ SPACE [ ":" ] trailing ]

nospcrlfcl =  %x01-09 / %x0B-0C / %x0E-1F / %x21-39 / %x3B-FF
                ; any octet except NUL, CR, LF, " " and ":"
middle     =  nospcrlfcl *( ":" / nospcrlfcl )
trailing   =  *( ":" / " " / nospcrlfcl )

SPACE      =  %x20        ; space character
crlf       =  %x0D %x0A   ; "carriage return" "linefeed"

target     =  nickname / server
msgtarget  =  msgto *( "," msgto )
msgto      =  channel / ( user [ "%" host ] "@" servername )
msgto      =/ ( user "%" host ) / targetmask
msgto      =/ nickname / ( nickname "!" user "@" host )
channel    =  ( "#" / "+" / ( "!" channelid ) / "&" ) chanstring
              [ ":" chanstring ]
servername =  hostname
host       =  hostname / hostaddr
hostname   =  shortname *( "." shortname )
shortname  =  ( letter / digit ) *( letter / digit / "-" )
              *( letter / digit )
                ; as specified in RFC 1123 [HNAME]
hostaddr   =  ip4addr / ip6addr
ip4addr    =  1*3digit "." 1*3digit "." 1*3digit "." 1*3digit
ip6addr    =  1*hexdigit 7( ":" 1*hexdigit )
ip6addr    =/ "0:0:0:0:0:" ( "0" / "FFFF" ) ":" ip4addr
nickname   =  ( letter / special ) *8( letter / digit / special / "-" )
targetmask =  ( "$" / "#" ) mask
                ; see details on allowed masks in section 3.3.1
chanstring =  %x01-07 / %x08-09 / %x0B-0C / %x0E-1F / %x21-2B
chanstring =/ %x2D-39 / %x3B-FF
                ; any octet except NUL, BELL, CR, LF, " ", "," and ":"
channelid  = 5( %x41-5A / digit )   ; 5( A-Z / 0-9 )

user       =  1*( %x01-09 / %x0B-0C / %x0E-1F / %x21-3F / %x41-FF )
                ; any octet except NUL, CR, LF, " " and "@"
key        =  1*23( %x01-05 / %x07-08 / %x0C / %x0E-1F / %x21-7F )
                ; any 7-bit US_ASCII character,
                ; except NUL, CR, LF, FF, h/v TABs, and " "
letter     =  %x41-5A / %x61-7A       ; A-Z / a-z
digit      =  %x30-39                 ; 0-9
hexdigit   =  digit / "A" / "B" / "C" / "D" / "E" / "F"
special    =  %x5B-60 / %x7B-7D
                ; "[", "]", "\", "`", "_", "^", "{", "|", "}"

mask       =  *( nowild / noesc wildone / noesc wildmany )
wildone    =  %x3F
wildmany   =  %x2A
nowild     =  %x01-29 / %x2B-3E / %x40-FF
                ; any octet except NUL, "*", "?"
noesc      =  %x01-5B / %x5D-FF
                ; any octet except NUL and "\"
matchone   =  %x01-FF
                ; matches wildone
matchmany  =  *matchone
                ; matches wildmany

Examples:

a?c         ; Matches any string of 3 characters in length starting
            with "a" and ending with "c"

a*c         ; Matches any string of at least 2 characters in length
            starting with "a" and ending with "c"

Server State

  • List of local connections, which may belong to clients (users and services) or other servers

  • List of servers in the network

    • Server name, max of 63 chars
    • Hostmasks can group servers with matching names into a 'virtual server' seen by non-matching servers
    • Hopcount
    • Peer identifier token
    • Link flags
  • List of clients in the network

    • Network-unique identifier; format depends on type
    • Server to which the client is connected
  • List of users in the network

    • Has a unique nickname on the network (std says 9 chars max)
    • Name of the host the user is running on
    • Username of user on that host
    • Server the user is connected to
  • List of services in the network known by the server

    • Service name = nickname + server name
    • Service type
  • List of channels in the network known by the server

    • Channel name (prefix + up to 49 other chars)
    • Channel members
    • Channel modes
  • Recent nickname changes

  • Nickname re-use delay

Connection State

  • A new connection starts out as Unregistered

  • A password before registering is optional

  • Connection can register as a user, service, or server

  • Once registered, a client is told the id it was registered with

  • Idle connections are periodically sent a PING and are disconnected if a PONG is not received in reply

  • Flood control applicability and timer information

User State

  • User has a nickname that is first set during registration, but can later change.

  • User has mode flags that can also be set during registration and change during operation.

    • a: away (set by AWAY, not MODE)
    • i: invisible
    • w: receives wallops
    • r: restricted connection (can't be cleared with MODE, but can be set)
    • o: operator (set by OPER, cleared with MODE)
    • O: local operator (set by OPER, cleared with MODE)
    • s: receives server notices
  • User has a user name, hostname, and real name. These are set at registration and do not change thereafter.

  • User has a hopcount to determine distance from local server

  • Connection by which user can be sent messages

Service State

  • Service name

  • Servertoken

  • Distribution mask

  • Hopcount

  • Type

Channel State

  • Channels are typically created when users join them

  • Services cannot join channels

  • A channel has a name

    • Up to 50 chars, first char is prefix
    • &: local to single server
    • #: normal distribution
    • +: no channel modes
    • !: safe channels
  • A channel (that is not a local-only channel) may have a channel mask to limit distribution

  • A channel has a topic

  • A channel has a set of joined users

  • Channels may require keys to join

  • Channels have modes, some of which are flags and some of which are records of management-related data, such as a list of channel ops.

  • Channels may keep track of users that have been invited when they are set +i (invite-only)

Connection Registration

Valid combinations of registration commands are:

NICK -> USER
PASS -> NICK -> USER
NICK -> PASS -> USER
PASS -> SERVICE
SERVICE

When registration succeeds for a user, the server sends the following:

RPL_WELCOME
RPL_YOURHOST
RPL_CREATED
RPL_MYINFO
LUSER
MOTD

When registration succeds for a service, the server sends the following:

RPL_YOURESERVICE
RPL_YOURHOST
RPL_MYINFO

The server then informs any other servers it is connected to of the new client.

Commands

Connection Registration

  • PASS Needs server env for password Modifies connection state Errors: ERR_NEEDMOREPARAMS, ERR_ALREADYREGISTERED

  • NICK [ ] Hopcount should only be sent by servers Needs currently registered nicks to check for uniqueness Errors: ERR_NONICKNAMEGIVEN, ERR_ERRONEUSNICKNAME, ERR_NICKNAMEINUSE, ERR_NICKCOLLISION

  • USER <:realname> hostname and servername are ignored when coming from clients Errors: ERR_NEEDMOREPARAMS, ERR_ALREADYREGISTERED

  • SERVER <:info> Errors: ERR_ALREADYREGISTERED

  • OPER Errors: ERR_NEEDMOREPARAMS, ERR_NOOPERHOST, ERR_PASSWDMISMATCH Reply: RPL_YOUREOPER

  • QUIT <:quit message>

  • SQUIT <:comment> Errors: ERR_NOPRIVILEGES, ERR_NOSUCHSERVER

Channel Operations

  • JOIN {,} [{,}] Errors: ERR_NEEDMOREPARAMS, ERR_BANNEDFROMCHAN, ERR_INVITEONLYCHAN, ERR_CHANNELISFULL, ERR_BADCHANNELKEY, ERR_BADCHANMASK, ERR_NOSUCHCHANNEL, ERR_TOOMANYCHANNELS Reply: RPL_TOPIC

  • PART {,} Errors: ERR_NEEDMOREPARAMS, ERR_NOSUCHCHANNEL, ERR_NOTONCHANNEL

  • MODE {[+|-]o|p|s|i|t|n|b|v} [] [] [] Errors: ERR_NEEDMOREPARAMS, ERR_CHANOPRIVSNEEDED, ERR_NOTONCHANNEL, ERR_UNKNOWNMODE, ERR_NOSUCHNICK, ERR_KEYSET, ERR_NOSUCHCHANNEL Reply: RPL_CHANNELMODEIS, RPL_BANLIST, RPL_ENDOFBANLIST

  • TOPIC [<:topic>] Errors: ERR_NEEDMOREPARAMS, ERR_NOTONCHANNEL, ERR_CHANOPRIVSNEEDED Reply: RPL_NOTOPIC, RPL_TOPIC

  • NAMES [{,}] Reply: RPL_NAMREPLY, RPL_ENDOFNAMES

  • LIST [{,} []] Errors: ERR_NOSUCHSERVER Reply: RPL_LISTSTART, RPL_LIST, RPL_LISTEND

  • INVITE Errors: ERR_NEEDMOREPARAMS, ERR_NOSUCHNICK, ERR_NOTONCHANNEL, ERR_USERONCHANNEL, ERR_CHANOPRIVSNEEDED Reply: RPL_INVITING, RPL_AWAY

  • KICK [<:comment>] Errors: ERR_NEEDMOREPARAMS, ERR_NOSUCHCHANNEL, ERR_BADCHANMASK, ERR_CHANOPRIVSNEEDED, ERR_NOTONCHANNEL

User Operations

  • MODE {[+|-]i|w|s|o} Errors: ERR_USERSDONTMATCH, ERR_UMODEUNKNOWNFLAG Reply: RPL_UMODEIS

Server Queries and Commands

  • VERSION []
  • STATS [ []]
  • LINKS [[] ]
  • TIME []
  • CONNECT [ []]
  • TRACE []
  • ADMIN []
  • INFO []

Sending Messages

  • PRIVMSG {,} <:text to be sent>
  • NOTICE <:text>

User Based Queries

  • WHO [ [o]]
  • WHOIS [] [,[,...]]
  • WHOWAS [ []]

Miscellaneous Messages

  • KILL <:comment>
  • PING []
  • PONG []
  • ERROR <:error message>

Optional Messages

  • AWAY [<:message>]
  • REHASH
  • RESTART
  • SUMMON []
  • USERS []
  • WALLOPS <:text for opers>
  • USERHOST { }
  • ISON { }