1
0
Fork 0
timelinize/datasources/whatsapp/polls.go
2025-11-04 16:27:09 -07:00

52 lines
1.2 KiB
Go

package whatsapp
import (
"fmt"
"regexp"
"strconv"
"strings"
"github.com/timelinize/timelinize/timeline"
)
// We use `\p{Lu}+` to match the "POLL" and "OPTION" words in any locale (eg. OPCIÓN)
var pollRegex = regexp.MustCompile(`^\p{Lu}+:\r\n(.+)\r\n$`)
var optionRegex = regexp.MustCompile(`^\p{Lu}+: (.+) \((\d+) .+\)\r\n$`)
func extractPoll(content []string) (string, timeline.Metadata, bool) {
if len(content) <= metadataFieldNumber {
return "", nil, false
}
parts := pollRegex.FindStringSubmatch(content[metadataFieldNumber])
if parts == nil {
return "", nil, false
}
meta := make(timeline.Metadata)
meta["Poll question"] = parts[1]
var sb strings.Builder // custom message
sb.WriteString(parts[1])
for i, optLine := range content[2:] {
parts := optionRegex.FindStringSubmatch(optLine)
if parts == nil {
return "", nil, false
}
sb.WriteString("\r\n- ")
sb.WriteString(parts[1])
sb.WriteString(" (☑︎ ")
sb.WriteString(parts[2])
sb.WriteRune(')')
// No need to track error, it's extracted with `\d+`
voteCount, _ := strconv.Atoi(parts[2])
meta[fmt.Sprintf("Poll option %d", i+1)] = parts[1]
meta[fmt.Sprintf("Poll votes %d", i+1)] = voteCount
}
return sb.String(), meta, true
}