Send grammatically correct messages when new orders arrive
This commit is contained in:
parent
cecd903810
commit
79b4435120
|
@ -4,6 +4,8 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"maunium.net/go/mautrix/event"
|
"maunium.net/go/mautrix/event"
|
||||||
|
@ -73,6 +75,7 @@ func (s Server) orderPlaced(w http.ResponseWriter, r *http.Request) {
|
||||||
Positions []struct{
|
Positions []struct{
|
||||||
Price string
|
Price string
|
||||||
}
|
}
|
||||||
|
Total string
|
||||||
}{}
|
}{}
|
||||||
|
|
||||||
err = decoder.Decode(&order)
|
err = decoder.Decode(&order)
|
||||||
|
@ -94,11 +97,89 @@ func (s Server) orderPlaced(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if rowsAffected > 0 && order.Datetime.Add(72 * time.Hour).After(time.Now()) { // pretix retries failed webhooks for up to three days
|
if rowsAffected > 0 && order.Datetime.Add(72 * time.Hour).After(time.Now()) { // pretix retries failed webhooks for up to three days
|
||||||
|
numFree := 0
|
||||||
|
numPaid := 0
|
||||||
|
for _, position := range order.Positions {
|
||||||
|
euros, cents, err := parsePrice(position.Price)
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if euros > 0 || cents > 0 {
|
||||||
|
numPaid++
|
||||||
|
} else {
|
||||||
|
numFree++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var verb, free, conjunction, paid, noun, total string
|
||||||
|
if numFree+numPaid == 1 {
|
||||||
|
verb = "wurde "
|
||||||
|
} else {
|
||||||
|
verb = "wurden "
|
||||||
|
}
|
||||||
|
if numFree == 1 {
|
||||||
|
free = "ein kostenloses "
|
||||||
|
} else if numFree > 1 {
|
||||||
|
free = fmt.Sprint(numFree, " kostenlose ")
|
||||||
|
}
|
||||||
|
if numPaid == 1 {
|
||||||
|
paid = "ein bezahltes "
|
||||||
|
} else if numPaid > 1 {
|
||||||
|
paid = fmt.Sprint(numPaid, " bezahlte ")
|
||||||
|
}
|
||||||
|
if numFree > 0 && numPaid > 0 {
|
||||||
|
conjunction = "und "
|
||||||
|
}
|
||||||
|
if numPaid == 1 || numPaid == 0 && numFree == 1 { // match number of adjective immediately before noun
|
||||||
|
noun = "Ticket "
|
||||||
|
} else {
|
||||||
|
noun = "Tickets "
|
||||||
|
}
|
||||||
|
if totalEuros, totalCents, err := parsePrice(order.Total); err == nil && (totalEuros > 0 || totalCents > 0) {
|
||||||
|
var adverb, fraction string
|
||||||
|
if numPaid > 1 {
|
||||||
|
adverb = "insgesamt "
|
||||||
|
}
|
||||||
|
if totalCents > 0 {
|
||||||
|
fraction = fmt.Sprintf(",%02d", totalCents)
|
||||||
|
}
|
||||||
|
total = fmt.Sprint("für ", adverb, totalEuros, fraction, " Euro ")
|
||||||
|
}
|
||||||
|
|
||||||
message := event.MessageEventContent{
|
message := event.MessageEventContent{
|
||||||
MsgType: event.MsgText,
|
MsgType: event.MsgText,
|
||||||
Body: fmt.Sprintf("%+v", order),
|
Body: fmt.Sprint("Es ", verb, free, conjunction, paid, noun, total, "bestellt."),
|
||||||
}
|
}
|
||||||
|
|
||||||
s.matrix.Broadcast(&message)
|
s.matrix.Broadcast(&message)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func parsePrice(price string) (euros uint64, cents uint64, err error) {
|
||||||
|
parts := strings.Split(price, ".")
|
||||||
|
|
||||||
|
euros, err = strconv.ParseUint(parts[0], 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return 0, 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(parts) > 1 {
|
||||||
|
for len(parts[1]) < 2 {
|
||||||
|
parts[1] += "0"
|
||||||
|
}
|
||||||
|
parts[1] = parts[1][:2]
|
||||||
|
|
||||||
|
parts[1] = strings.TrimLeft(parts[1], "0")
|
||||||
|
if parts[1] == "" {
|
||||||
|
parts[1] = "0"
|
||||||
|
}
|
||||||
|
|
||||||
|
cents, err = strconv.ParseUint(parts[1], 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return 0, 0, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return euros, cents, nil
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue