forked from External/ergo
parent
8c68b9f8d7
commit
30f6e11698
6 changed files with 105 additions and 66 deletions
|
|
@ -143,12 +143,6 @@ var (
|
|||
Halfop Mode = 'h' // arg
|
||||
Voice Mode = 'v' // arg
|
||||
|
||||
// ChannelPrivModes holds the list of modes that are privileged, ie founder/op/halfop, in order.
|
||||
// voice is not in this list because it cannot perform channel operator actions.
|
||||
ChannelPrivModes = Modes{
|
||||
ChannelFounder, ChannelAdmin, ChannelOperator, Halfop,
|
||||
}
|
||||
|
||||
// ChannelUserModes holds the list of all modes that can be applied to a user in a channel,
|
||||
// including Voice, in descending order of precedence
|
||||
ChannelUserModes = Modes{
|
||||
|
|
@ -171,23 +165,24 @@ var (
|
|||
// SplitChannelMembershipPrefixes takes a target and returns the prefixes on it, then the name.
|
||||
func SplitChannelMembershipPrefixes(target string) (prefixes string, name string) {
|
||||
name = target
|
||||
for {
|
||||
if len(name) > 0 && strings.Contains("~&@%+", string(name[0])) {
|
||||
prefixes += string(name[0])
|
||||
name = name[1:]
|
||||
} else {
|
||||
for i := 0; i < len(name); i++ {
|
||||
switch name[i] {
|
||||
case '~', '&', '@', '%', '+':
|
||||
prefixes = target[:i+1]
|
||||
name = target[i+1:]
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
return prefixes, name
|
||||
return
|
||||
}
|
||||
|
||||
// GetLowestChannelModePrefix returns the lowest channel prefix mode out of the given prefixes.
|
||||
func GetLowestChannelModePrefix(prefixes string) (lowest *Mode) {
|
||||
func GetLowestChannelModePrefix(prefixes string) (lowest Mode) {
|
||||
for i, mode := range ChannelUserModes {
|
||||
if strings.Contains(prefixes, ChannelModePrefixes[mode]) {
|
||||
lowest = &ChannelPrivModes[i]
|
||||
lowest = ChannelUserModes[i]
|
||||
}
|
||||
}
|
||||
return
|
||||
|
|
@ -405,3 +400,15 @@ func (set *ModeSet) Prefixes(isMultiPrefix bool) (prefixes string) {
|
|||
|
||||
return prefixes
|
||||
}
|
||||
|
||||
// HighestChannelUserMode returns the most privileged channel-user mode
|
||||
// (e.g., ChannelFounder, Halfop, Voice) present in the ModeSet.
|
||||
// If no such modes are present, or `set` is nil, returns the zero mode.
|
||||
func (set *ModeSet) HighestChannelUserMode() (result Mode) {
|
||||
for _, mode := range ChannelUserModes {
|
||||
if set.HasMode(mode) {
|
||||
return mode
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
|
|
|||
|
|
@ -90,3 +90,26 @@ func TestNilReceivers(t *testing.T) {
|
|||
t.Errorf("nil Modeset should have empty String(), got %v instead", str)
|
||||
}
|
||||
}
|
||||
|
||||
func TestHighestChannelUserMode(t *testing.T) {
|
||||
set := NewModeSet()
|
||||
|
||||
if set.HighestChannelUserMode() != Mode(0) {
|
||||
t.Errorf("no channel user modes should be present yet")
|
||||
}
|
||||
|
||||
set.SetMode(Voice, true)
|
||||
if set.HighestChannelUserMode() != Voice {
|
||||
t.Errorf("should see that user is voiced")
|
||||
}
|
||||
|
||||
set.SetMode(ChannelAdmin, true)
|
||||
if set.HighestChannelUserMode() != ChannelAdmin {
|
||||
t.Errorf("should see that user has channel admin")
|
||||
}
|
||||
|
||||
set = nil
|
||||
if set.HighestChannelUserMode() != Mode(0) {
|
||||
t.Errorf("nil modeset should have the zero mode as highest channel-user mode")
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue