42 lines
1.2 KiB
Go
42 lines
1.2 KiB
Go
package main
|
|
|
|
import (
|
|
"strings"
|
|
"unicode"
|
|
)
|
|
|
|
// responsive kinds: how an addressed crow may answer a request (must-respond).
|
|
var responsiveKind = map[string]bool{"claim": true, "deliver": true, "decline": true}
|
|
|
|
// parseAddressing finds the first @handle in text that names one of members.
|
|
// An unknown handle stays literal text and yields "" (no address).
|
|
func parseAddressing(text string, members []string) string {
|
|
for _, tok := range strings.Fields(text) {
|
|
if !strings.HasPrefix(tok, "@") {
|
|
continue
|
|
}
|
|
name := strings.TrimFunc(tok[1:], func(r rune) bool { return !unicode.IsLetter(r) && !unicode.IsDigit(r) })
|
|
for _, m := range members {
|
|
if strings.EqualFold(name, m) {
|
|
return m
|
|
}
|
|
}
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// splitKind pulls a leading "KIND: x" line off a crow's raw reply and returns
|
|
// the lowercased kind word ("" if absent) and the remaining body.
|
|
func splitKind(text string) (kind, body string) {
|
|
trimmed := strings.TrimLeft(text, " \t\n")
|
|
i := strings.IndexByte(trimmed, '\n')
|
|
first, rest := trimmed, ""
|
|
if i >= 0 {
|
|
first, rest = trimmed[:i], strings.TrimSpace(trimmed[i+1:])
|
|
}
|
|
if len(first) >= 5 && strings.EqualFold(first[:5], "KIND:") {
|
|
return strings.ToLower(strings.TrimSpace(first[5:])), rest
|
|
}
|
|
return "", text
|
|
}
|