3
0
mirror of https://github.com/ergochat/ergo.git synced 2024-11-25 21:39:25 +01:00

minimal channel mode command

This commit is contained in:
Jeremy Latt 2014-02-08 18:14:39 -08:00
parent a0eed1d687
commit d8951e1b48
4 changed files with 68 additions and 11 deletions

View File

@ -23,6 +23,17 @@ type ChannelCommand interface {
HandleChannel(channel *Channel) HandleChannel(channel *Channel)
} }
func IsChannel(target string) bool {
if target == "" {
return false
}
switch target[0] {
case '&', '#', '+', '!':
return true
}
return false
}
// NewChannel creates a new channel from a `Server` and a `name` // NewChannel creates a new channel from a `Server` and a `name`
// string, which must be unique on the server. // string, which must be unique on the server.
func NewChannel(s *Server, name string) *Channel { func NewChannel(s *Server, name string) *Channel {
@ -106,6 +117,11 @@ func (channel *Channel) String() string {
return channel.Id() return channel.Id()
} }
// <mode> <mode params>
func (channel *Channel) ModeString() string {
return ""
}
func (channel *Channel) Join(client *Client) { func (channel *Channel) Join(client *Client) {
channel.members[client] = true channel.members[client] = true
client.channels[channel] = true client.channels[channel] = true

View File

@ -348,11 +348,7 @@ func NewPrivMsgCommand(args []string) (EditableCommand, error) {
} }
func (m *PrivMsgCommand) TargetIsChannel() bool { func (m *PrivMsgCommand) TargetIsChannel() bool {
switch m.target[0] { return IsChannel(m.target)
case '&', '#', '+', '!':
return true
}
return false
} }
// TOPIC [newtopic] // TOPIC [newtopic]
@ -428,11 +424,22 @@ func stringToRunes(str string) <-chan rune {
return runes return runes
} }
func NewModeCommand(args []string) (EditableCommand, error) { type ChannelModeCommand struct {
if len(args) == 0 { BaseCommand
return nil, NotEnoughArgsError channel string
} }
// MODE <channel> *( ( "-" / "+" ) *<modes> *<modeparams> )
func NewChannelModeCommand(args []string) (EditableCommand, error) {
cmd := &ChannelModeCommand{
channel: args[0],
}
// TODO implement channel mode changes
return cmd, nil
}
// MODE <nickname> *( ( "+" / "-" ) *( "i" / "w" / "o" / "O" / "r" ) )
func NewUserModeCommand(args []string) (EditableCommand, error) {
cmd := &ModeCommand{ cmd := &ModeCommand{
nickname: args[0], nickname: args[0],
changes: make([]ModeChange, changes: make([]ModeChange,
@ -460,12 +467,25 @@ func NewModeCommand(args []string) (EditableCommand, error) {
return cmd, nil return cmd, nil
} }
func NewModeCommand(args []string) (EditableCommand, error) {
if len(args) == 0 {
return nil, NotEnoughArgsError
}
if IsChannel(args[0]) {
return NewChannelModeCommand(args)
} else {
return NewUserModeCommand(args)
}
}
type WhoisCommand struct { type WhoisCommand struct {
BaseCommand BaseCommand
target string target string
masks []string masks []string
} }
// [ <target> ] <mask> *( "," <mask> )
func NewWhoisCommand(args []string) (EditableCommand, error) { func NewWhoisCommand(args []string) (EditableCommand, error) {
if len(args) < 1 { if len(args) < 1 {
return nil, NotEnoughArgsError return nil, NotEnoughArgsError

View File

@ -234,6 +234,11 @@ func RplEndOfWhois(server *Server) Reply {
return NewNumericReply(server, RPL_ENDOFWHOIS, ":End of WHOIS list") return NewNumericReply(server, RPL_ENDOFWHOIS, ":End of WHOIS list")
} }
func RplChannelModeIs(server *Server, channel *Channel) Reply {
return NewNumericReply(server, RPL_CHANNELMODEIS, "%s %s",
channel.name, channel.ModeString())
}
// errors (also numeric) // errors (also numeric)
func ErrAlreadyRegistered(source Identifier) Reply { func ErrAlreadyRegistered(source Identifier) Reply {
@ -261,8 +266,8 @@ func ErrNeedMoreParams(source Identifier, command string) Reply {
"%s :Not enough parameters", command) "%s :Not enough parameters", command)
} }
func ErrNoSuchChannel(source Identifier, channel string) Reply { func ErrNoSuchChannel(server *Server, channel string) Reply {
return NewNumericReply(source, ERR_NOSUCHCHANNEL, return NewNumericReply(server, ERR_NOSUCHCHANNEL,
"%s :No such channel", channel) "%s :No such channel", channel)
} }
@ -311,3 +316,8 @@ func ErrRestricted(server *Server) Reply {
func ErrNoSuchServer(server *Server, target string) Reply { func ErrNoSuchServer(server *Server, target string) Reply {
return NewNumericReply(server, ERR_NOSUCHSERVER, "%s :No such server", target) return NewNumericReply(server, ERR_NOSUCHSERVER, "%s :No such server", target)
} }
func ErrUserNotInChannel(server *Server, nick string, channel *Channel) Reply {
return NewNumericReply(server, ERR_USERNOTINCHANNEL,
"%s %s :They aren't on that channel", nick, channel.name)
}

View File

@ -299,3 +299,14 @@ func (m *WhoisCommand) HandleServer(server *Server) {
} }
client.replies <- RplEndOfWhois(server) client.replies <- RplEndOfWhois(server)
} }
func (msg *ChannelModeCommand) HandleServer(server *Server) {
client := msg.Client()
channel := server.channels[msg.channel]
if channel == nil {
client.replies <- ErrNoSuchChannel(server, msg.channel)
return
}
client.replies <- RplChannelModeIs(server, channel)
}