uber-tracker/main.go
2021-03-25 13:03:08 +01:00

146 lines
3.5 KiB
Go

package main
import (
"bytes"
"encoding/json"
"fmt"
"git.ddd.rip/ptrcnull/telegram"
"io/ioutil"
"log"
"net/http"
"os"
"strconv"
"strings"
"time"
)
func GetUberData(uuid string) (*UberDataOrder, error) {
requestBody := []byte(fmt.Sprintf("{\"orderUuid\":\"%s\"}", uuid))
req, err := http.NewRequest("POST", "https://www.ubereats.com/api/getActiveOrdersV1", bytes.NewBuffer(requestBody))
if err != nil {
return nil, err
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("x-csrf-token", "x")
res, err := http.DefaultClient.Do(req)
if err != nil {
return nil, err
}
if res.StatusCode != 200 {
body, err := ioutil.ReadAll(res.Body)
log.Println(string(body), err)
return nil, fmt.Errorf("unexpected status code: %d", res.StatusCode)
}
var data UberResponse
err = json.NewDecoder(res.Body).Decode(&data)
if err != nil {
return nil, err
}
for _, order := range data.Data.Orders {
if order.UUID == uuid {
return &order, nil
}
}
return nil, fmt.Errorf("order not found: %s", uuid)
}
type Order struct {
ChatID string
UberData *UberDataOrder
MessageID string
}
func main() {
c := telegram.Client{
Token: os.Getenv("TELEGRAM_TOKEN"),
}
sendMessage := func(chatId, body string) *telegram.SendMessageResponse {
res, err := c.SendMessage(chatId, body)
if err != nil {
log.Println("error sending message:", err)
return nil
}
return res
}
var orders []*Order
go func() {
for {
time.Sleep(1 * time.Second)
for i, order := range orders {
log.Println("Getting data for order", order.UberData.UUID)
newData, err := GetUberData(order.UberData.UUID)
if err != nil {
log.Println(err)
sendMessage(order.ChatID, "order completed: "+order.UberData.UUID)
orders = append(orders[:i], orders[i+1:]...)
continue
}
oldStatus := order.UberData.Status()
newStatus := newData.Status()
if oldStatus != newStatus {
_, err := c.EditMessageText(order.ChatID, order.MessageID, newStatus)
if err != nil {
log.Println(err)
}
}
order.UberData = newData
}
}
}()
for {
time.Sleep(5 * time.Second)
log.Println("Getting updates...")
upd, err := c.GetUpdates()
if err != nil {
log.Println(err)
continue
}
log.Println("updates:", len(upd.Result))
for _, update := range upd.Result {
if update.Message != nil && strings.HasPrefix(update.Message.Text, "/add") {
chatId := strconv.FormatInt(update.Message.Chat.ID, 10)
orderId := strings.Split(update.Message.Text, " ")[1]
data, err := GetUberData(orderId)
if err != nil {
log.Println(err)
sendMessage(chatId, "error: "+err.Error())
continue
}
log.Printf("%#v\n", data)
sendMessage(chatId, "added new order: "+data.OrderInfo.StoreInfo.Name)
status := data.Status()
res := sendMessage(chatId, status)
if res != nil {
orders = append(orders, &Order{
ChatID: chatId,
UberData: data,
MessageID: strconv.FormatInt(res.Result.MessageID, 10),
})
}
}
if update.Message != nil && strings.HasPrefix(update.Message.Text, "/contact") {
chatId := strconv.FormatInt(update.Message.Chat.ID, 10)
orderId := strings.Split(update.Message.Text, " ")[1]
data, err := GetUberData(orderId)
if err != nil {
log.Println(err)
sendMessage(chatId, "error: "+err.Error())
continue
}
for _, contact := range data.Contacts {
sendMessage(chatId, contact.Title + ": " + contact.FormattedPhoneNumber)
}
}
}
}
}