mirror of
https://github.com/ergochat/ergo.git
synced 2024-12-22 18:52:41 +01:00
refactor WhoFields to use value receivers
This commit is contained in:
parent
bdfee9cb39
commit
97417f4c32
@ -56,3 +56,33 @@ func TestUserMasks(t *testing.T) {
|
|||||||
t.Error("failure to match")
|
t.Error("failure to match")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestWhoFields(t *testing.T) {
|
||||||
|
var w whoxFields
|
||||||
|
|
||||||
|
if w.Has('a') {
|
||||||
|
t.Error("zero value of whoxFields must be empty")
|
||||||
|
}
|
||||||
|
w = w.Add('a')
|
||||||
|
if !w.Has('a') {
|
||||||
|
t.Error("failed to set and get")
|
||||||
|
}
|
||||||
|
if w.Has('A') {
|
||||||
|
t.Error("false positive")
|
||||||
|
}
|
||||||
|
if w.Has('o') {
|
||||||
|
t.Error("false positive")
|
||||||
|
}
|
||||||
|
w = w.Add('🐬')
|
||||||
|
if w.Has('🐬') {
|
||||||
|
t.Error("should not be able to set invalid who field")
|
||||||
|
}
|
||||||
|
w = w.Add('o')
|
||||||
|
if !w.Has('o') {
|
||||||
|
t.Error("failed to set and get")
|
||||||
|
}
|
||||||
|
w = w.Add('z')
|
||||||
|
if !w.Has('z') {
|
||||||
|
t.Error("failed to set and get")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -2794,30 +2794,32 @@ func webircHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *Re
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
const WhoFieldMinimum = int('a') // lowest rune value
|
type whoxFields uint32 // bitset to hold the WHOX field values, 'a' through 'z'
|
||||||
const WhoFieldMaximum = int('z')
|
|
||||||
|
|
||||||
type WhoFields [WhoFieldMaximum - WhoFieldMinimum + 1]bool
|
func (fields whoxFields) Add(field rune) (result whoxFields) {
|
||||||
|
index := int(field) - int('a')
|
||||||
|
if 0 <= index && index < 26 {
|
||||||
|
return fields | (1 << index)
|
||||||
|
} else {
|
||||||
|
return fields
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (fields *WhoFields) Set(field rune) bool {
|
func (fields whoxFields) Has(field rune) bool {
|
||||||
index := int(field)
|
index := int(field) - int('a')
|
||||||
if WhoFieldMinimum <= index && index <= WhoFieldMaximum {
|
if 0 <= index && index < 26 {
|
||||||
fields[int(field)-WhoFieldMinimum] = true
|
return (fields & (1 << index)) != 0
|
||||||
return true
|
|
||||||
} else {
|
} else {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func (fields *WhoFields) Has(field rune) bool {
|
|
||||||
return fields[int(field)-WhoFieldMinimum]
|
|
||||||
}
|
|
||||||
|
|
||||||
// rplWhoReply returns the WHO(X) reply between one user and another channel/user.
|
// rplWhoReply returns the WHO(X) reply between one user and another channel/user.
|
||||||
// who format:
|
// who format:
|
||||||
// <channel> <user> <host> <server> <nick> <H|G>[*][~|&|@|%|+][B] :<hopcount> <real name>
|
// <channel> <user> <host> <server> <nick> <H|G>[*][~|&|@|%|+][B] :<hopcount> <real name>
|
||||||
// whox format:
|
// whox format:
|
||||||
// <type> <channel> <user> <ip> <host> <server> <nick> <H|G>[*][~|&|@|%|+][B] <hops> <idle> <account> <rank> :<real name>
|
// <type> <channel> <user> <ip> <host> <server> <nick> <H|G>[*][~|&|@|%|+][B] <hops> <idle> <account> <rank> :<real name>
|
||||||
func (client *Client) rplWhoReply(channel *Channel, target *Client, rb *ResponseBuffer, isWhox bool, fields WhoFields, whoType string) {
|
func (client *Client) rplWhoReply(channel *Channel, target *Client, rb *ResponseBuffer, isWhox bool, fields whoxFields, whoType string) {
|
||||||
params := []string{client.Nick()}
|
params := []string{client.Nick()}
|
||||||
|
|
||||||
details := target.Details()
|
details := target.Details()
|
||||||
@ -2940,9 +2942,9 @@ func whoHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *Respo
|
|||||||
sFields = strings.ToLower(sFields[:typeIndex])
|
sFields = strings.ToLower(sFields[:typeIndex])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var fields WhoFields
|
var fields whoxFields
|
||||||
for _, field := range sFields {
|
for _, field := range sFields {
|
||||||
fields.Set(field)
|
fields = fields.Add(field)
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO(dan): is this used and would I put this param in the Modern doc?
|
//TODO(dan): is this used and would I put this param in the Modern doc?
|
||||||
|
Loading…
Reference in New Issue
Block a user