package model import ( "errors" "fmt" "strconv" "strings" "time" ) var ErrInvalidMessage = errors.New("invalid message") func MessageFromBundleLine(bundle string) (*Message, error) { var uid, text string if _, err := fmt.Sscanf(bundle, "%s:%s", &uid, &text); err != nil { return nil, err } return MessageFromBundle(uid, text) } func MessageFromBundle(uid, text string) (*Message, error) { lines := strings.SplitN(text, "\n", 9) if len(lines) < 9 { return nil, ErrInvalidMessage } repto := "" tag := lines[0] tags := strings.SplitN(tag, "/", 4) if len(tags) == 4 { if tags[2] == "repto" { repto = tags[3] } } timestamp, err := strconv.Atoi(lines[2]) if err != nil { return nil, err } date := time.Unix(int64(timestamp), 0) return &Message{ ID: uid, RepTo: repto, EchoArea: lines[1], Date: date, From: lines[3], Addr: lines[4], MsgTo: lines[5], Subject: lines[6], Message: lines[8], }, nil } func MessageFromPointMessage(node string, point string, pointMessage string) (*Message, error) { lines := strings.SplitN(pointMessage, "\n", 5) if len(lines) < 4 { return nil, ErrInvalidMessage } repto := "" message := lines[4] if strings.HasPrefix(message, "@repto:") { strings.TrimPrefix(message, "@repto:") messageParts := strings.SplitN(message, "\n", 2) repto, message = messageParts[0], messageParts[1] } return &Message{ ID: UIDFromText(pointMessage), RepTo: repto, EchoArea: lines[0], Date: time.Now(), From: point, Addr: node, MsgTo: lines[1], Subject: lines[2], Message: message, }, nil } func EchoFromText(text string) *Echo { e := new(Echo) lines := strings.Split(text, "\n") e.Name = lines[0] e.Messages = make([]string, 0, len(lines)) for _, line := range lines[1:] { if len(line) == 20 { e.Messages = append(e.Messages, line) } } return e }