diff --git a/irc/channel.go b/irc/channel.go index 907ac2c7..7a26e4a4 100644 --- a/irc/channel.go +++ b/irc/channel.go @@ -102,6 +102,11 @@ func (channel *Channel) GetUsers(replier Replier) { replier.Reply(NewNamesReply(channel)) } +func (channel *Channel) ClientIsOperator(client *Client) bool { + // TODO client-channel relations + return false +} + func (channel *Channel) Nicks() []string { nicks := make([]string, len(channel.members)) i := 0 @@ -219,12 +224,15 @@ func (msg *ChannelModeCommand) HandleChannel(channel *Channel) { } client.Reply(RplEndOfBanList(channel)) case NoOutside: - // TODO perms - switch modeOp.op { - case Add: - channel.noOutside = true - case Remove: - channel.noOutside = false + if channel.ClientIsOperator(client) { + switch modeOp.op { + case Add: + channel.noOutside = true + case Remove: + channel.noOutside = false + } + } else { + client.Reply(ErrChanOPrivIsNeeded(channel)) } } } diff --git a/irc/reply.go b/irc/reply.go index 24e0d8db..2a369d76 100644 --- a/irc/reply.go +++ b/irc/reply.go @@ -334,3 +334,9 @@ func ErrCannotSendToChan(channel *Channel) Reply { return NewNumericReply(channel.server, ERR_CANNOTSENDTOCHAN, "%s :Cannot send to channel", channel.name) } + +// :You're not channel operator +func ErrChanOPrivIsNeeded(channel *Channel) Reply { + return NewNumericReply(channel.server, ERR_CHANOPRIVSNEEDED, + "%s :You're not channel operator", channel.name) +}