package main import "net" type Server struct { eventChan chan Event running bool name string clientMap map[string]*Client //Map of nicks → clients channelMap map[string]*Channel //Map of channel names → channels operatorMap map[string]string //Map of usernames → SHA1 hashed passwords } type Client struct { server *Server connection net.Conn signalChan chan signalCode outputChan chan string nick string registered bool connected bool operator bool channelMap map[string]*Channel } type Event struct { client *Client input string } type Channel struct { name string topic string clientMap map[string]*Client mode ChannelMode modeMap map[string]*ClientMode } type ChannelMode struct { anonymous bool //Nicks are hidden secret bool //Channel is hidden from LIST topicLocked bool //Only ops may change topic moderated bool //Only ops and voiced may speak } func (m *ChannelMode) String() string { modeStr := "" if m.anonymous { modeStr += "a" } if m.secret { modeStr += "s" } if m.topicLocked { modeStr += "t" } if m.moderated { modeStr += "m" } return modeStr } type ClientMode struct { operator bool //Channel operator voice bool //Has voice } type signalCode int const ( signalStop signalCode = iota ) type replyCode int const ( rplWelcome replyCode = iota rplJoin rplPart rplTopic rplNoTopic rplNames rplNickChange rplKill rplMsg rplList rplOper rplChannelModeIs errMoreArgs errNoNick errInvalidNick errNickInUse errAlreadyReg errNoSuchNick errUnknownCommand errNotReg errPassword errNoPriv errCannotSend )