Started support for Channel Modes
This commit is contained in:
parent
b354ba7187
commit
a6e09ed19f
101
commands.go
101
commands.go
@ -486,4 +486,105 @@ func UserModeHandler(message *irc.Message, client *Client) {
|
||||
// Implemented according to RFC 1459 Section 4.2.3.1 and RFC 2811
|
||||
func ChannelModeHandler(message *irc.Message, client *Client) {
|
||||
|
||||
if len(message.Params) == 0 {
|
||||
m := irc.Message{Prefix: client.Server.Prefix, Command: irc.ERR_NEEDMOREPARAMS, Trailing: "Not enough parameters"}
|
||||
client.Encode(&m)
|
||||
return
|
||||
}
|
||||
|
||||
channelName := message.Params[0]
|
||||
channel, ok := client.Server.GetChannel(channelName)
|
||||
if !ok {
|
||||
m := irc.Message{Prefix: client.Server.Prefix, Command: irc.ERR_NOSUCHCHANNEL, Trailing: "No such channel"}
|
||||
client.Encode(&m)
|
||||
return
|
||||
}
|
||||
|
||||
if len(message.Params) == 1 { // just channel name is provided
|
||||
// return current settings for this user
|
||||
m := irc.Message{Prefix: client.Server.Prefix, Command: irc.RPL_UMODEIS, Params: []string{channel.GetMemberModes(client).String()}}
|
||||
client.Encode(&m)
|
||||
return
|
||||
}
|
||||
|
||||
if !channel.MemberHasMode(client, ChannelModeOperator) { // Only channel operators can make these changes
|
||||
m := irc.Message{Prefix: client.Server.Prefix, Command: irc.ERR_CHANOPRIVSNEEDED, Params: []string{channel.Name}, Trailing: "You're not channel operator"}
|
||||
client.Encode(&m)
|
||||
return
|
||||
}
|
||||
|
||||
setLimit := false
|
||||
getUsers := false
|
||||
needMask := false
|
||||
currentPlace := 1
|
||||
for _, modeFlags := range message.Params[1:] {
|
||||
currentPlace++
|
||||
modifier := ModeModifier(modeFlags[0])
|
||||
switch modifier {
|
||||
case ModeModifierAdd:
|
||||
case ModeModifierRemove:
|
||||
default:
|
||||
//modifier := ModeModifierQuery
|
||||
/*
|
||||
m := irc.Message{Prefix: client.Server.Prefix, Command: irc.ERR_UMODEUNKNOWNFLAG, Trailing: "Unknown MODE flag"}
|
||||
client.Encode(&m)
|
||||
return
|
||||
*/
|
||||
}
|
||||
|
||||
for _, modeFlag := range modeFlags[1:] {
|
||||
mode := ChannelMode(modeFlag)
|
||||
_, ok := ChannelModes[mode]
|
||||
|
||||
if !ok {
|
||||
m := irc.Message{Prefix: client.Server.Prefix, Command: irc.ERR_UMODEUNKNOWNFLAG, Trailing: "Unknown MODE flag"}
|
||||
client.Encode(&m)
|
||||
return
|
||||
}
|
||||
|
||||
if modifier == ModeModifierAdd {
|
||||
|
||||
switch mode {
|
||||
case ChannelModeCreator: // Can't make oneself a creator
|
||||
case ChannelModeLimit:
|
||||
setLimit = true
|
||||
case ChannelModeOperator, ChannelModeVoice:
|
||||
getUsers = true
|
||||
|
||||
default:
|
||||
channel.AddMemberMode(client, mode)
|
||||
|
||||
}
|
||||
|
||||
} else if modifier == ModeModifierRemove {
|
||||
switch mode {
|
||||
case ChannelModeCreator: // Can't remove oneself as creator
|
||||
//case ChannelModeBan: // Can't remove oneself from being restricted
|
||||
default:
|
||||
channel.RemoveMemberMode(client, mode)
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if setLimit { // Get the number for setting the member limit cap
|
||||
/*
|
||||
limit, err := strconv.Atoi(message.Params[currentPlace])
|
||||
if err != nil {
|
||||
|
||||
}
|
||||
*/
|
||||
}
|
||||
if getUsers { // get users for either creating operators or adding voice
|
||||
|
||||
}
|
||||
if needMask { // Set the ban mask
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
m := irc.Message{Prefix: client.Server.Prefix, Command: irc.RPL_UMODEIS, Params: []string{client.Nickname, client.UserModeSet.String()}}
|
||||
client.Encode(&m)
|
||||
return
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user