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 }