github.com/keybase/client/go@v0.0.0-20241007131713-f10651d043c8/chat/unfurl/scrape_map.go (about)

     1  package unfurl
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"net/url"
     7  	"strconv"
     8  	"time"
     9  
    10  	"github.com/keybase/client/go/chat/maps"
    11  	"github.com/keybase/client/go/chat/types"
    12  	"github.com/keybase/client/go/protocol/chat1"
    13  	"github.com/keybase/client/go/protocol/gregor1"
    14  )
    15  
    16  func (s *Scraper) scrapeMap(ctx context.Context, uri string) (res chat1.UnfurlRaw, err error) {
    17  	defer s.Trace(ctx, &err, "scrapeMap")()
    18  	puri, err := url.Parse(uri)
    19  	if err != nil {
    20  		return res, err
    21  	}
    22  	slat := puri.Query().Get("lat")
    23  	slon := puri.Query().Get("lon")
    24  	sacc := puri.Query().Get("acc")
    25  	sdone := puri.Query().Get("done")
    26  	lat, err := strconv.ParseFloat(slat, 64)
    27  	if err != nil {
    28  		return res, err
    29  	}
    30  	lon, err := strconv.ParseFloat(slon, 64)
    31  	if err != nil {
    32  		return res, err
    33  	}
    34  	acc, err := strconv.ParseFloat(sacc, 64)
    35  	if err != nil {
    36  		return res, err
    37  	}
    38  	liveLocationDone, err := strconv.ParseBool(sdone)
    39  	if err != nil {
    40  		return res, err
    41  	}
    42  	skey := puri.Query().Get("livekey")
    43  	var liveMapURL *string
    44  	var timeStr string
    45  	siteName := "Location Share"
    46  	mapURL, err := maps.GetMapURL(ctx, s.G().ExternalAPIKeySource, lat, lon)
    47  	if err != nil {
    48  		return res, err
    49  	}
    50  	linkURL := maps.GetExternalMapURL(ctx, lat, lon)
    51  	now := time.Now()
    52  	var liveLocationEndTime *gregor1.Time
    53  	if len(skey) > 0 {
    54  		siteName = "Live Location Share"
    55  		if liveLocationDone {
    56  			// if we're done sharing location
    57  			linkURL = "https://google.com/maps"
    58  			return chat1.NewUnfurlRawWithMaps(chat1.UnfurlMapsRaw{
    59  				Title:               "Location share ended",
    60  				Url:                 linkURL,
    61  				SiteName:            siteName,
    62  				ImageUrl:            mapURL,
    63  				LiveLocationDone:    true,
    64  				LiveLocationEndTime: liveLocationEndTime,
    65  				Time:                gregor1.ToTime(now),
    66  				Coord: chat1.Coordinate{
    67  					Lat:      lat,
    68  					Lon:      lon,
    69  					Accuracy: acc,
    70  				},
    71  			}), nil
    72  		}
    73  		key := types.LiveLocationKey(skey)
    74  		coords := s.G().LiveLocationTracker.GetCoordinates(ctx, key)
    75  		endTime := s.G().LiveLocationTracker.GetEndTime(ctx, key)
    76  		if endTime != nil {
    77  			liveLocationEndTime = new(gregor1.Time)
    78  			*liveLocationEndTime = gregor1.ToTime(*endTime)
    79  		}
    80  		liveMapURL = new(string)
    81  		if *liveMapURL, err = maps.GetLiveMapURL(ctx, s.G().ExternalAPIKeySource, coords); err != nil {
    82  			return res, err
    83  		}
    84  		timeStr = fmt.Sprintf("Posted %s.", now.Format("15:04:05 MST"))
    85  	}
    86  
    87  	desc := fmt.Sprintf("Accurate to %dm. %s", int(acc), timeStr)
    88  	return chat1.NewUnfurlRawWithMaps(chat1.UnfurlMapsRaw{
    89  		Title:           "Open this location with Google Maps",
    90  		Url:             linkURL,
    91  		SiteName:        siteName,
    92  		ImageUrl:        mapURL,
    93  		Description:     desc,
    94  		HistoryImageUrl: liveMapURL,
    95  		Coord: chat1.Coordinate{
    96  			Lat:      lat,
    97  			Lon:      lon,
    98  			Accuracy: acc,
    99  		},
   100  		LiveLocationDone:    liveLocationDone,
   101  		LiveLocationEndTime: liveLocationEndTime,
   102  		Time:                gregor1.ToTime(now),
   103  	}), nil
   104  }