Files
p/garmin.go

93 lines
1.7 KiB
Go
Raw Normal View History

2025-08-20 22:42:21 -07:00
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
2025-08-20 22:51:25 -07:00
"log"
2025-08-20 22:42:21 -07:00
"net/http"
"time"
)
type garminClient struct {
c *http.Client
apiKey string
}
type garminMessageRequest struct {
Messages []garminMessage `json:"messages"`
}
type garminMessage struct {
Recipients []string `json:"recipients"`
Sender string `json:"sender"`
Timestamp string `json:"timestamp"`
Message string `json:"message"`
}
type garminMessageResponse struct {
Count int `json:"count"`
}
func newGarminClient(apiKey string) *garminClient {
return &garminClient{
c: &http.Client{},
apiKey: apiKey,
}
}
func (gc *garminClient) sendMessage(imei, sender, msg string) error {
buf := &bytes.Buffer{}
err := json.NewEncoder(buf).Encode(garminMessageRequest{
Messages: []garminMessage{
{
Recipients: []string{imei},
Sender: sender,
2025-08-20 22:53:15 -07:00
Timestamp: time.Now().UTC().Format("2006-01-02T15:04:05Z"),
2025-08-20 22:42:21 -07:00
Message: msg,
},
},
})
if err != nil {
return err
}
2025-08-20 23:00:10 -07:00
log.Printf("[->garmin] %s", buf.String())
2025-08-20 22:51:25 -07:00
2025-08-20 22:42:21 -07:00
req, err := http.NewRequest("POST", "https://ipcinbound.inreachapp.com/IPC/IPCInboundApi/api/Messaging/Message", buf)
if err != nil {
return err
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("x-api-key", gc.apiKey)
resp, err := gc.c.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
if resp.StatusCode != 200 {
return fmt.Errorf("%s", string(body))
}
grResp := garminMessageResponse{}
2025-08-20 23:00:10 -07:00
err = json.Unmarshal(body, &grResp)
2025-08-20 22:42:21 -07:00
if err != nil {
return err
}
2025-08-20 23:00:10 -07:00
log.Printf("[<-garmin] %s", string(body))
2025-08-20 22:42:21 -07:00
if grResp.Count != 1 {
return fmt.Errorf("expected 1 message, got %d", grResp.Count)
}
return nil
}