Switch Garmin messaging from IPC Inbound API to MapShare API
This commit is contained in:
92
garmin.go
92
garmin.go
@@ -1,68 +1,61 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
"time"
|
||||
"net/url"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type garminClient struct {
|
||||
c *http.Client
|
||||
apiKey string
|
||||
c *http.Client
|
||||
mapshareID string
|
||||
}
|
||||
|
||||
type garminMessageRequest struct {
|
||||
Messages []garminMessage `json:"messages"`
|
||||
type garminResponse struct {
|
||||
Success bool `json:"success"`
|
||||
Error *struct {
|
||||
Code int `json:"code"`
|
||||
Msg string `json:"msg"`
|
||||
} `json:"error"`
|
||||
}
|
||||
|
||||
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 {
|
||||
func newGarminClient(mapshareID string) *garminClient {
|
||||
return &garminClient{
|
||||
c: &http.Client{},
|
||||
apiKey: apiKey,
|
||||
c: &http.Client{},
|
||||
mapshareID: mapshareID,
|
||||
}
|
||||
}
|
||||
|
||||
func (gc *garminClient) sendMessage(imeis []string, sender, msg string) error {
|
||||
buf := &bytes.Buffer{}
|
||||
err := json.NewEncoder(buf).Encode(garminMessageRequest{
|
||||
Messages: []garminMessage{
|
||||
{
|
||||
Recipients: imeis,
|
||||
Sender: sender,
|
||||
Timestamp: time.Now().UTC().Format("2006-01-02T15:04:05Z"),
|
||||
Message: msg,
|
||||
},
|
||||
},
|
||||
})
|
||||
func (gc *garminClient) sendMessage(deviceIDs []string, sender, msg string) error {
|
||||
for _, deviceID := range deviceIDs {
|
||||
err := gc.sendToDevice(deviceID, sender, msg)
|
||||
if err != nil {
|
||||
return fmt.Errorf("device %s: %w", deviceID, err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (gc *garminClient) sendToDevice(deviceID, sender, msg string) error {
|
||||
data := url.Values{}
|
||||
data.Set("deviceIds", deviceID)
|
||||
data.Set("messageText", msg)
|
||||
data.Set("fromAddr", sender)
|
||||
|
||||
endpoint := fmt.Sprintf("https://share.garmin.com/%s/Map/SendMessageToDevices", gc.mapshareID)
|
||||
|
||||
log.Printf("[->garmin] %s %s", endpoint, data.Encode())
|
||||
|
||||
req, err := http.NewRequest("POST", endpoint, strings.NewReader(data.Encode()))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Printf("[->garmin] %s", buf.String())
|
||||
|
||||
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)
|
||||
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||
|
||||
resp, err := gc.c.Do(req)
|
||||
if err != nil {
|
||||
@@ -72,20 +65,23 @@ func (gc *garminClient) sendMessage(imeis []string, sender, msg string) error {
|
||||
defer resp.Body.Close()
|
||||
body, _ := io.ReadAll(resp.Body)
|
||||
|
||||
log.Printf("[<-garmin] %d %s", resp.StatusCode, string(body))
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
return fmt.Errorf("%s", string(body))
|
||||
return fmt.Errorf("HTTP %d: %s", resp.StatusCode, string(body))
|
||||
}
|
||||
|
||||
grResp := garminMessageResponse{}
|
||||
var grResp garminResponse
|
||||
err = json.Unmarshal(body, &grResp)
|
||||
if err != nil {
|
||||
return err
|
||||
return fmt.Errorf("parse response: %w", err)
|
||||
}
|
||||
|
||||
log.Printf("[<-garmin] %s", string(body))
|
||||
|
||||
if grResp.Count != len(imeis) {
|
||||
return fmt.Errorf("expected %d messages, got %d", len(imeis), grResp.Count)
|
||||
if !grResp.Success {
|
||||
if grResp.Error != nil {
|
||||
return fmt.Errorf("garmin error %d: %s", grResp.Error.Code, grResp.Error.Msg)
|
||||
}
|
||||
return fmt.Errorf("garmin returned success=false")
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
Reference in New Issue
Block a user