146 lines
3.5 KiB
Go
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)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|