From f0fc3b492cebd008cb01bb3b9ac48e178c167263 Mon Sep 17 00:00:00 2001 From: Jeremy Latt Date: Sun, 16 Feb 2014 23:51:27 -0800 Subject: [PATCH] list command --- irc/commands.go | 18 ++++++++++++++++++ irc/constants.go | 1 + irc/reply.go | 9 +++++++++ irc/server.go | 31 +++++++++++++++++++++++++++++++ 4 files changed, 59 insertions(+) diff --git a/irc/commands.go b/irc/commands.go index e546de88..0fc27c18 100644 --- a/irc/commands.go +++ b/irc/commands.go @@ -24,6 +24,7 @@ var ( ISON: NewIsOnCommand, JOIN: NewJoinCommand, KICK: NewKickCommand, + LIST: NewListCommand, MODE: NewModeCommand, MOTD: NewMOTDCommand, NICK: NewNickCommand, @@ -778,3 +779,20 @@ func NewKickCommand(args []string) (editableCommand, error) { } return cmd, nil } + +type ListCommand struct { + BaseCommand + channels []string + target string +} + +func NewListCommand(args []string) (editableCommand, error) { + cmd := &ListCommand{} + if len(args) > 0 { + cmd.channels = strings.Split(args[0], ",") + } + if len(args) > 1 { + cmd.target = args[1] + } + return cmd, nil +} diff --git a/irc/constants.go b/irc/constants.go index 2bd63fcc..df7deca5 100644 --- a/irc/constants.go +++ b/irc/constants.go @@ -31,6 +31,7 @@ const ( ISON StringCode = "ISON" JOIN StringCode = "JOIN" KICK StringCode = "KICK" + LIST StringCode = "LIST" MODE StringCode = "MODE" MOTD StringCode = "MOTD" NICK StringCode = "NICK" diff --git a/irc/reply.go b/irc/reply.go index 384d2070..87b73443 100644 --- a/irc/reply.go +++ b/irc/reply.go @@ -321,6 +321,15 @@ func RplMOTDEnd(server *Server) Reply { ":End of MOTD command") } +func RplList(channel *Channel) Reply { + return NewNumericReply(channel.server, RPL_LIST, "%s %d :%s", + channel, len(channel.members), channel.topic) +} + +func RplListEnd(server *Server) Reply { + return NewNumericReply(server, RPL_LISTEND, ":End of LIST") +} + // // errors (also numeric) // diff --git a/irc/server.go b/irc/server.go index d8d21e99..e84d727e 100644 --- a/irc/server.go +++ b/irc/server.go @@ -561,3 +561,34 @@ func (msg *KickCommand) HandleServer(server *Server) { channel.Kick(client, target, msg.Comment()) } } + +func (msg *ListCommand) HandleServer(server *Server) { + client := msg.Client() + + // TODO target server + if msg.target != "" { + client.Reply(ErrNoSuchServer(server, msg.target)) + return + } + + if len(msg.channels) == 0 { + for _, channel := range server.channels { + if channel.flags[Secret] || channel.flags[Private] { + continue + } + client.Reply(RplList(channel)) + } + } else { + for _, chname := range msg.channels { + channel := server.channels[chname] + if channel == nil || + channel.flags[Secret] || + channel.flags[Private] { + client.Reply(ErrNoSuchChannel(server, chname)) + continue + } + client.Reply(RplList(channel)) + } + } + client.Reply(RplListEnd(server)) +}