forked from External/ergo
review fixes and updates
This commit is contained in:
parent
7122fb180c
commit
d3815fbe61
6 changed files with 140 additions and 75 deletions
|
|
@ -52,8 +52,7 @@ For example, $bAMODE #channel +o dan$b grants the the holder of the "dan"
|
|||
account the +o operator mode every time they join #channel. To list current
|
||||
accounts and modes, use $bAMODE #channel$b. Note that users are always
|
||||
referenced by their registered account names, not their nicknames.`,
|
||||
helpShort: `$bAMODE$b modifies persistent mode settings for channel members.`,
|
||||
authRequired: true,
|
||||
helpShort: `$bAMODE$b modifies persistent mode settings for channel members.`,
|
||||
},
|
||||
}
|
||||
)
|
||||
|
|
@ -70,61 +69,69 @@ func csAmodeHandler(server *Server, client *Client, command, params string, rb *
|
|||
if channel == nil {
|
||||
csNotice(rb, client.t("Channel does not exist"))
|
||||
return
|
||||
}
|
||||
|
||||
clientAccount := client.Account()
|
||||
if clientAccount == "" || clientAccount != channel.Founder() {
|
||||
csNotice(rb, client.t("You must be the channel founder to use AMODE"))
|
||||
} else if channel.Founder() == "" {
|
||||
csNotice(rb, client.t("Channel is not registered"))
|
||||
return
|
||||
}
|
||||
|
||||
modeChanges, unknown := modes.ParseChannelModeChanges(strings.Fields(modeChange)...)
|
||||
|
||||
var change modes.ModeChange
|
||||
if len(modeChanges) > 1 || len(unknown) > 0 {
|
||||
csNotice(rb, client.t("Invalid mode change"))
|
||||
return
|
||||
} else if len(modeChanges) == 1 {
|
||||
change = modeChanges[0]
|
||||
} else {
|
||||
change = modes.ModeChange{Op: modes.List}
|
||||
}
|
||||
|
||||
if len(modeChanges) == 0 || modeChanges[0].Op == modes.List {
|
||||
persistentModes := channel.AccountToUmode()
|
||||
// sort the persistent modes in descending order of priority, i.e.,
|
||||
// ascending order of their index in the ChannelUserModes list
|
||||
sort.Slice(persistentModes, func(i, j int) bool {
|
||||
index := func(modeChange modes.ModeChange) int {
|
||||
for idx, mode := range modes.ChannelUserModes {
|
||||
if modeChange.Mode == mode {
|
||||
return idx
|
||||
}
|
||||
}
|
||||
return len(modes.ChannelUserModes)
|
||||
}
|
||||
return index(persistentModes[i]) < index(persistentModes[j])
|
||||
})
|
||||
csNotice(rb, fmt.Sprintf(client.t("Channel %s has %d persistent modes set"), channelName, len(persistentModes)))
|
||||
for _, modeChange := range persistentModes {
|
||||
csNotice(rb, fmt.Sprintf(client.t("Account %s receives mode +%s"), modeChange.Arg, string(modeChange.Mode)))
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// normalize and validate the account argument
|
||||
accountIsValid := false
|
||||
change := modeChanges[0]
|
||||
// Arg is the account name, casefold it here
|
||||
change.Arg, _ = CasefoldName(change.Arg)
|
||||
if change.Arg != "" {
|
||||
_, err := server.accounts.LoadAccount(change.Arg)
|
||||
accountIsValid = (err == nil)
|
||||
switch change.Op {
|
||||
case modes.List:
|
||||
accountIsValid = true
|
||||
case modes.Add:
|
||||
// if we're adding a mode, the account must exist
|
||||
if change.Arg != "" {
|
||||
_, err := server.accounts.LoadAccount(change.Arg)
|
||||
accountIsValid = (err == nil)
|
||||
}
|
||||
case modes.Remove:
|
||||
// allow removal of accounts that may have been deleted
|
||||
accountIsValid = (change.Arg != "")
|
||||
}
|
||||
if !accountIsValid {
|
||||
csNotice(rb, client.t("Account does not exist"))
|
||||
return
|
||||
}
|
||||
applied := channel.ApplyAccountToUmodeChange(change)
|
||||
if applied {
|
||||
csNotice(rb, fmt.Sprintf(client.t("Successfully set mode %s"), change.String()))
|
||||
go server.channelRegistry.StoreChannel(channel, IncludeLists)
|
||||
} else {
|
||||
csNotice(rb, client.t("Change was a no-op"))
|
||||
|
||||
affectedModes, err := channel.ProcessAccountToUmodeChange(client, change)
|
||||
|
||||
if err == errInsufficientPrivs {
|
||||
csNotice(rb, client.t("Insufficient privileges"))
|
||||
return
|
||||
} else if err != nil {
|
||||
csNotice(rb, client.t("Internal error"))
|
||||
return
|
||||
}
|
||||
|
||||
switch change.Op {
|
||||
case modes.List:
|
||||
// sort the persistent modes in descending order of priority
|
||||
sort.Slice(affectedModes, func(i, j int) bool {
|
||||
return umodeGreaterThan(affectedModes[i].Mode, affectedModes[j].Mode)
|
||||
})
|
||||
csNotice(rb, fmt.Sprintf(client.t("Channel %s has %d persistent modes set"), channelName, len(affectedModes)))
|
||||
for _, modeChange := range affectedModes {
|
||||
csNotice(rb, fmt.Sprintf(client.t("Account %s receives mode +%s"), modeChange.Arg, string(modeChange.Mode)))
|
||||
}
|
||||
case modes.Add, modes.Remove:
|
||||
if len(affectedModes) > 0 {
|
||||
csNotice(rb, fmt.Sprintf(client.t("Successfully set mode %s"), change.String()))
|
||||
} else {
|
||||
csNotice(rb, client.t("Change was a no-op"))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue