diff --git a/app.go b/app.go index eb14901..3f462aa 100644 --- a/app.go +++ b/app.go @@ -2,8 +2,9 @@ package main import ( "context" + "github.com/marcus-crane/october/backend" - log "github.com/sirupsen/logrus" + "github.com/sirupsen/logrus" ) // App struct @@ -25,11 +26,11 @@ func (a *App) startup(ctx context.Context) { func (a *App) domReady(ctx context.Context) { a.ctx = ctx backend.StartLogger() - log.WithContext(ctx).Info("Logger should be initialised now") - log.WithContext(ctx).Info("Backend is about to start up") + logrus.WithContext(ctx).Info("Logger should be initialised now") + logrus.WithContext(ctx).Info("Backend is about to start up") } func (a *App) shutdown(ctx context.Context) { - log.WithContext(ctx).Info("Shutting down. Goodbye!") + logrus.WithContext(ctx).Info("Shutting down. Goodbye!") backend.CloseLogFile() } diff --git a/backend/db.go b/backend/db.go index 4e92203..4bb10b2 100644 --- a/backend/db.go +++ b/backend/db.go @@ -1,7 +1,7 @@ package backend import ( - log "github.com/sirupsen/logrus" + "github.com/sirupsen/logrus" "gorm.io/driver/sqlite" "gorm.io/gorm" ) @@ -11,7 +11,7 @@ var Conn *gorm.DB func OpenConnection(filepath string) error { conn, err := gorm.Open(sqlite.Open(filepath), &gorm.Config{}) if err != nil { - log.WithError(err).WithField("filepath", filepath).Error("Failed to open DB connection") + logrus.WithError(err).WithField("filepath", filepath).Error("Failed to open DB connection") return err } Conn = conn diff --git a/backend/device.go b/backend/device.go index b728431..acb540c 100644 --- a/backend/device.go +++ b/backend/device.go @@ -2,7 +2,8 @@ package backend import ( "fmt" - log "github.com/sirupsen/logrus" + + "github.com/sirupsen/logrus" "github.com/pgaskin/koboutils/v2/kobo" ) @@ -152,12 +153,12 @@ func GetKoboMetadata(detectedPaths []string) []Kobo { for _, path := range detectedPaths { _, _, deviceId, err := kobo.ParseKoboVersion(path) if err != nil { - log.WithField("kobo_path", path).WithError(err).Error("Failed to parse Kobo version") + logrus.WithField("kobo_path", path).WithError(err).Error("Failed to parse Kobo version") } - log.WithField("device_id", deviceId).Info("Found an attached device") + logrus.WithField("device_id", deviceId).Info("Found an attached device") device, found := kobo.DeviceByID(deviceId) if !found { - log.WithField("device_id", deviceId).Warn("Found a device that isn't officially supported but will likely still operate just fine") + logrus.WithField("device_id", deviceId).Warn("Found a device that isn't officially supported but will likely still operate just fine") // We can handle unsupported Kobos in future but at present, there are none kobos = append(kobos, Kobo{ MntPath: path, @@ -193,7 +194,7 @@ func (k *Kobo) ListBookmarksByID(contentID string) ([]Bookmark, error) { &Bookmark{VolumeID: contentID}, ).Where("VolumeID LIKE '%file:///%'").Find(&bookmark) if result.Error != nil { - log.WithError(result.Error).WithField("content_id", contentID).Error("Encountered an error while trying to list bookmarks by ID") + logrus.WithError(result.Error).WithField("content_id", contentID).Error("Encountered an error while trying to list bookmarks by ID") return nil, result.Error } return bookmark, nil @@ -201,49 +202,49 @@ func (k *Kobo) ListBookmarksByID(contentID string) ([]Bookmark, error) { func (k *Kobo) FindBookOnDevice(bookID string) (Content, error) { var content Content - log.WithField("book_id", bookID).Debug("Retrieving a book that has been uploaded to Readwise previously") + logrus.WithField("book_id", bookID).Debug("Retrieving a book that has been uploaded to Readwise previously") result := Conn.Where(&Content{ContentType: "6", VolumeIndex: -1, ContentID: bookID}).Where("VolumeID LIKE '%file:///%'").Find(&content) if result.Error != nil { - log.WithError(result.Error).WithField("book_id", bookID).Error("Failed to retrieve content from device") + logrus.WithError(result.Error).WithField("book_id", bookID).Error("Failed to retrieve content from device") return content, result.Error } - log.WithField("title", content.Title).Debug("Successfully retrieved content from device DB") + logrus.WithField("title", content.Title).Debug("Successfully retrieved content from device DB") return content, nil } func (k *Kobo) ListDeviceContent() ([]Content, error) { var content []Content - log.Debug("Retrieving content list from device") + logrus.Debug("Retrieving content list from device") result := Conn.Where( &Content{ContentType: "6", VolumeIndex: -1}, ).Where("ContentID LIKE '%file:///%'").Order("___PercentRead desc, title asc").Find(&content) if result.Error != nil { - log.WithError(result.Error).Error("Failed to retrieve content from device") + logrus.WithError(result.Error).Error("Failed to retrieve content from device") return nil, result.Error } - log.WithField("content_count", len(content)).Debug("Successfully retrieved device content") + logrus.WithField("content_count", len(content)).Debug("Successfully retrieved device content") return content, nil } func (k *Kobo) ListDeviceBookmarks() ([]Bookmark, error) { var bookmarks []Bookmark - log.Debug("Retrieving bookmarks from device") + logrus.Debug("Retrieving bookmarks from device") result := Conn.Where("VolumeID LIKE '%file:///%'").Order("VolumeID ASC, ChapterProgress ASC").Find(&bookmarks).Limit(1) if result.Error != nil { - log.WithError(result.Error).Error("Failed to retrieve bookmarks from device") + logrus.WithError(result.Error).Error("Failed to retrieve bookmarks from device") return nil, result.Error } - log.WithField("bookmark_count", len(bookmarks)).Debug("Successfully retrieved device bookmarks") + logrus.WithField("bookmark_count", len(bookmarks)).Debug("Successfully retrieved device bookmarks") return bookmarks, nil } func (k *Kobo) BuildContentIndex(content []Content) map[string]Content { - log.Debug("Building an index out of device content") + logrus.Debug("Building an index out of device content") contentIndex := make(map[string]Content) for _, item := range content { contentIndex[item.ContentID] = item } - log.WithField("index_count", len(contentIndex)).Debug("Built content index") + logrus.WithField("index_count", len(contentIndex)).Debug("Built content index") return contentIndex } @@ -251,7 +252,7 @@ func (k *Kobo) CountDeviceBookmarks() int64 { var count int64 result := Conn.Model(&Bookmark{}).Count(&count) if result.Error != nil { - log.WithError(result.Error).Error("Failed to count bookmarks on device") + logrus.WithError(result.Error).Error("Failed to count bookmarks on device") } return count } diff --git a/backend/device_test.go b/backend/device_test.go index 2949d23..9b39257 100644 --- a/backend/device_test.go +++ b/backend/device_test.go @@ -1,11 +1,11 @@ package backend import ( - "log" "os" "path/filepath" "testing" + "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" ) @@ -20,12 +20,12 @@ func setupTmpKobo(dir string, deviceId string) string { content := []byte(deviceId) err := os.Mkdir(filepath.Join(dir, ".kobo"), 0777) if err != nil { - log.Fatal(err) + logrus.Fatal(err) return "" } tmpfn := filepath.Join(dir, ".kobo", "version") if err := os.WriteFile(tmpfn, content, 0666); err != nil { - log.Fatal(err) + logrus.Fatal(err) return "" } return dir diff --git a/backend/init.go b/backend/init.go index e54cb03..d1e8f63 100644 --- a/backend/init.go +++ b/backend/init.go @@ -13,9 +13,9 @@ import ( "strings" "github.com/adrg/xdg" + "github.com/sirupsen/logrus" "github.com/pgaskin/koboutils/v2/kobo" - log "github.com/sirupsen/logrus" wailsRuntime "github.com/wailsapp/wails/v2/pkg/runtime" ) @@ -35,7 +35,7 @@ type Backend struct { func StartBackend(ctx *context.Context, version string) *Backend { settings, err := LoadSettings() if err != nil { - log.WithContext(*ctx).WithError(err).Error("Failed to load settings") + logrus.WithContext(*ctx).WithError(err).Error("Failed to load settings") } return &Backend{ SelectedKobo: Kobo{}, @@ -83,7 +83,7 @@ func (b *Backend) NavigateExplorerToLogLocation() { } logLocation, err := xdg.DataFile("october/logs") if err != nil { - log.WithError(err).Error("Failed to determine XDG data location for opening log location in explorer") + logrus.WithError(err).Error("Failed to determine XDG data location for opening log location in explorer") } // We will always get an error because the file explorer doesn't exit so it is unable to // return a 0 successful exit code until y'know, the user exits the window @@ -92,7 +92,7 @@ func (b *Backend) NavigateExplorerToLogLocation() { func (b *Backend) DetectKobos() []Kobo { connectedKobos, err := kobo.Find() - log.WithField("kobos_found", len(connectedKobos)).Info("Detected one or more Kobos") + logrus.WithField("kobos_found", len(connectedKobos)).Info("Detected one or more Kobos") if err != nil { panic(err) } @@ -176,7 +176,7 @@ func (b *Backend) ForwardToReadwise() (int, error) { absCoverPath := path.Join(b.SelectedKobo.MntPath, "/", coverPath) coverBytes, err := os.ReadFile(absCoverPath) if err != nil { - log.WithError(err).WithFields(log.Fields{"cover": book.SourceURL, "location": absCoverPath}).Warn("Failed to load cover. Carrying on") + logrus.WithError(err).WithFields(logrus.Fields{"cover": book.SourceURL, "location": absCoverPath}).Warn("Failed to load cover. Carrying on") } var base64Encoding string mimeType := http.DetectContentType(coverBytes) @@ -189,9 +189,9 @@ func (b *Backend) ForwardToReadwise() (int, error) { base64Encoding += base64.StdEncoding.EncodeToString(coverBytes) err = b.Readwise.UploadCover(base64Encoding, book.ID, b.Settings.ReadwiseToken) if err != nil { - log.WithError(err).WithField("cover", book.SourceURL).Error("Failed to upload cover to Readwise") + logrus.WithError(err).WithField("cover", book.SourceURL).Error("Failed to upload cover to Readwise") } - log.WithField("cover", book.SourceURL).Debug("Successfully uploaded cover to Readwise") + logrus.WithField("cover", book.SourceURL).Debug("Successfully uploaded cover to Readwise") } } } diff --git a/backend/log.go b/backend/log.go index 57598ff..5952bd3 100644 --- a/backend/log.go +++ b/backend/log.go @@ -6,7 +6,7 @@ import ( "time" "github.com/adrg/xdg" - log "github.com/sirupsen/logrus" + "github.com/sirupsen/logrus" ) var logFileHandle *os.File @@ -18,14 +18,14 @@ func StartLogger() { if err != nil { panic("Failed to create location to store logfiles") } - log.SetFormatter(&log.JSONFormatter{}) + logrus.SetFormatter(&logrus.JSONFormatter{}) file, err := os.OpenFile(logPath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) if err == nil { logFileHandle = file - log.SetOutput(file) + logrus.SetOutput(file) } else { - log.WithError(err).Error(err) - log.Error("Failed to create log file, using stdout") + logrus.WithError(err).Error(err) + logrus.Error("Failed to create log file, using stdout") } } diff --git a/backend/readwise.go b/backend/readwise.go index bf091d9..9e89d3b 100644 --- a/backend/readwise.go +++ b/backend/readwise.go @@ -1,6 +1,7 @@ package backend import ( + "bytes" "encoding/json" "errors" "fmt" @@ -12,10 +13,7 @@ import ( "strings" "time" - "github.com/go-resty/resty/v2" - "github.com/sirupsen/logrus" - log "github.com/sirupsen/logrus" ) const ( @@ -70,7 +68,7 @@ func (r *Readwise) CheckTokenValidity(token string) error { if resp.StatusCode != 204 { return errors.New(resp.Status) } - log.Info("Successfully validated token against the Readwise API") + logrus.Info("Successfully validated token against the Readwise API") return nil } @@ -78,22 +76,33 @@ func (r *Readwise) SendBookmarks(payloads []Response, token string) (int, error) // TODO: This is dumb, we count stuff that this function doesn't need to know about + we already know the size from earlier submittedHighlights := 0 for _, payload := range payloads { - client := resty.New() - resp, err := client.R(). - SetHeader("Authorization", fmt.Sprintf("Token %s", token)). - SetHeader("User-Agent", UserAgent). - SetBody(payload). - Post(HighlightsEndpoint) + data, err := json.Marshal(payload) + if err != nil { + return 0, fmt.Errorf("failed to marshal bookmark payload: %+v", err) + } + client := &http.Client{} + req, err := http.NewRequest(http.MethodPost, HighlightsEndpoint, bytes.NewBuffer(data)) + if err != nil { + return 0, fmt.Errorf("failed to construct bookmark request: %+v", err) + } + req.Header.Add("Authorization", fmt.Sprintf("Token %s", token)) + req.Header.Add("Content-Type", "application/json") + req.Header.Add("User-Agent", UserAgent) + resp, err := client.Do(req) if err != nil { - return 0, fmt.Errorf("failed to send request to Readwise: code %d", resp.StatusCode()) + return 0, fmt.Errorf("failed to send request to Readwise: code %d", resp.StatusCode) } - if resp.StatusCode() != 200 { - log.WithFields(log.Fields{"status_code": resp.StatusCode(), "response": string(resp.Body())}).Error("Received a non-200 response from Readwise") - return 0, fmt.Errorf("received a non-200 status code from Readwise: code %d", resp.StatusCode()) + if resp.StatusCode != 200 { + defer resp.Body.Close() + body, err := io.ReadAll(resp.Body) + if err == nil { + logrus.WithFields(logrus.Fields{"status_code": resp.StatusCode, "response": string(body)}).Error("Received a non-200 response from Readwise") + } + return 0, fmt.Errorf("received a non-200 status code from Readwise: code %d", resp.StatusCode) } submittedHighlights += len(payload.Highlights) } - log.WithField("batch_count", len(payloads)).Info("Successfully sent bookmarks to Readwise") + logrus.WithField("batch_count", len(payloads)).Info("Successfully sent bookmarks to Readwise") return submittedHighlights, nil } @@ -106,7 +115,7 @@ func (r *Readwise) RetrieveUploadedBooks(token string) (BookListResponse, error) client := http.Client{} remoteURL, err := url.Parse(BooksEndpoint) if err != nil { - log.WithError(err).Error("Failed to parse URL for Readwise book upload endpoint") + logrus.WithError(err).Error("Failed to parse URL for Readwise book upload endpoint") } request := http.Request{ Method: "GET", @@ -115,7 +124,7 @@ func (r *Readwise) RetrieveUploadedBooks(token string) (BookListResponse, error) } res, err := client.Do(&request) if err != nil { - log.WithError(err).WithField("status_code", res.StatusCode).Error("An unexpected error occurred while retrieving uploads from Readwise") + logrus.WithError(err).WithField("status_code", res.StatusCode).Error("An unexpected error occurred while retrieving uploads from Readwise") return bookList, err } defer func(Body io.ReadCloser) { @@ -125,43 +134,53 @@ func (r *Readwise) RetrieveUploadedBooks(token string) (BookListResponse, error) }(res.Body) b, err := httputil.DumpResponse(res, true) if err != nil { - log.WithError(err).Error("Encountered an error while dumping response from Readwise") + logrus.WithError(err).Error("Encountered an error while dumping response from Readwise") return bookList, err } if res.StatusCode != 200 { - log.WithFields(log.Fields{"status": res.StatusCode, "body": string(b)}).Error("Received a non-200 response from Readwise") + logrus.WithFields(logrus.Fields{"status": res.StatusCode, "body": string(b)}).Error("Received a non-200 response from Readwise") return bookList, err } body, err := io.ReadAll(res.Body) if err != nil { - log.WithError(err).Error("Failed to parse response from Readwise") + logrus.WithError(err).Error("Failed to parse response from Readwise") return bookList, err } err = json.Unmarshal(body, &bookList) if err != nil { - log.WithError(err).WithFields(log.Fields{"status": res.StatusCode, "body": string(b)}).Error("Failed to unmarshal response from Readwise") + logrus.WithError(err).WithFields(logrus.Fields{"status": res.StatusCode, "body": string(b)}).Error("Failed to unmarshal response from Readwise") return bookList, err } - log.WithField("book_count", bookList.Count).Info("Successfully retrieved books from Readwise API") + logrus.WithField("book_count", bookList.Count).Info("Successfully retrieved books from Readwise API") return bookList, nil } func (r *Readwise) UploadCover(encodedCover string, bookId int, token string) error { + client := &http.Client{} body := map[string]interface{}{ "cover_image": encodedCover, } - client := resty.New() - resp, err := client.R(). - SetHeader("Authorization", fmt.Sprintf("Token %s", token)). - SetHeader("Content-Type", "application/json"). - SetHeader("User-Agent", UserAgent). - SetBody(body). - Patch(fmt.Sprintf(CoverEndpoint, bookId)) + data, err := json.Marshal(body) if err != nil { - return err + return fmt.Errorf("failed to marshal cover upload payload: %+v", err) } - if resp.StatusCode() != 200 { - log.WithFields(log.Fields{"status_code": resp.StatusCode(), "response": string(resp.Body())}).Error("Received a non-200 response from Readwise") + req, err := http.NewRequest(http.MethodPatch, fmt.Sprintf(CoverEndpoint, bookId), bytes.NewBuffer(data)) + if err != nil { + return fmt.Errorf("failed to construct cover upload request: %+v", err) + } + req.Header.Add("Authorization", fmt.Sprintf("Token %s", token)) + req.Header.Add("Content-Type", "application/json") + req.Header.Add("User-Agent", UserAgent) + resp, err := client.Do(req) + if err != nil { + return fmt.Errorf("failed to upload cover to Readwise: code %d", resp.StatusCode) + } + if resp.StatusCode != 200 { + defer resp.Body.Close() + body, err := io.ReadAll(resp.Body) + if err == nil { + logrus.WithFields(logrus.Fields{"status_code": resp.StatusCode, "response": string(body)}).Error("Received a non-200 response from Readwise") + } return fmt.Errorf("failed to upload cover for book with id %d", bookId) } return nil @@ -178,17 +197,17 @@ func BuildPayload(bookmarks []Bookmark, contentIndex map[string]Content) ([]Resp currentBatch = Response{} } source := contentIndex[entry.VolumeID] - log.WithField("title", source.Title).Debug("Parsing highlight") + logrus.WithField("title", source.Title).Debug("Parsing highlight") var createdAt string if entry.DateCreated == "" { - log.WithFields(log.Fields{"title": source.Title, "volume_id": entry.VolumeID}).Warn("No date created for bookmark. Defaulting to date last modified.") + logrus.WithFields(logrus.Fields{"title": source.Title, "volume_id": entry.VolumeID}).Warn("No date created for bookmark. Defaulting to date last modified.") if entry.DateModified == "" { - log.WithFields(log.Fields{"title": source.Title, "volume_id": entry.VolumeID}).Warn("No date modified for bookmark. Default to current date.") + logrus.WithFields(logrus.Fields{"title": source.Title, "volume_id": entry.VolumeID}).Warn("No date modified for bookmark. Default to current date.") createdAt = time.Now().Format("2006-01-02T15:04:05-07:00") } else { t, err := time.Parse("2006-01-02T15:04:05Z", entry.DateModified) if err != nil { - log.WithError(err).WithFields(log.Fields{"title": source.Title, "volume_id": entry.VolumeID, "date_modified": entry.DateModified}).Error("Failed to parse a valid timestamp from date modified field") + logrus.WithError(err).WithFields(logrus.Fields{"title": source.Title, "volume_id": entry.VolumeID, "date_modified": entry.DateModified}).Error("Failed to parse a valid timestamp from date modified field") return []Response{}, err } createdAt = t.Format("2006-01-02T15:04:05-07:00") @@ -196,7 +215,7 @@ func BuildPayload(bookmarks []Bookmark, contentIndex map[string]Content) ([]Resp } else { t, err := time.Parse("2006-01-02T15:04:05.000", entry.DateCreated) if err != nil { - log.WithError(err).WithFields(log.Fields{"title": source.Title, "volume_id": entry.VolumeID, "date_modified": entry.DateModified}).Error("Failed to parse a valid timestamp from date created field") + logrus.WithError(err).WithFields(logrus.Fields{"title": source.Title, "volume_id": entry.VolumeID, "date_modified": entry.DateModified}).Error("Failed to parse a valid timestamp from date created field") return []Response{}, err } createdAt = t.Format("2006-01-02T15:04:05-07:00") @@ -210,7 +229,7 @@ func BuildPayload(bookmarks []Bookmark, contentIndex map[string]Content) ([]Resp } if entry.Annotation == "" && text == "" { // This state should be impossible but stranger things have happened so worth a sanity check - log.WithFields(log.Fields{"title": source.Title, "volume_id": entry.VolumeID}).Warn("Found an entry with neither highlighted text nor an annotation so skipping entry") + logrus.WithFields(logrus.Fields{"title": source.Title, "volume_id": entry.VolumeID}).Warn("Found an entry with neither highlighted text nor an annotation so skipping entry") continue } if source.Title == "" { @@ -223,11 +242,11 @@ func BuildPayload(bookmarks []Bookmark, contentIndex map[string]Content) ([]Resp // or even just arbitrary strings. Given we don't set a title here, we will use the Readwise fallback which is to add // these highlights to a book called "Quotes" and let the user figure out their metadata situation. That reminds me though: // TODO: Test exports with non-epub files - log.WithError(err).WithFields(log.Fields{"title": source.Title, "volume_id": entry.VolumeID}).Warn("Failed to retrieve epub title. This is not a hard requirement so sending with a dummy title.") + logrus.WithError(err).WithFields(logrus.Fields{"title": source.Title, "volume_id": entry.VolumeID}).Warn("Failed to retrieve epub title. This is not a hard requirement so sending with a dummy title.") goto sendhighlight } filename := path.Base(sourceFile.Path) - log.WithField("filename", filename).Debug("No source title. Constructing title from filename") + logrus.WithField("filename", filename).Debug("No source title. Constructing title from filename") source.Title = strings.TrimSuffix(filename, ".epub") } sendhighlight: @@ -245,10 +264,10 @@ func BuildPayload(bookmarks []Bookmark, contentIndex map[string]Content) ([]Resp } currentBatch.Highlights = append(currentBatch.Highlights, highlight) } - log.WithFields(log.Fields{"title": source.Title, "volume_id": entry.VolumeID, "chunks": len(highlightChunks)}).Debug("Successfully compiled highlights for book") + logrus.WithFields(logrus.Fields{"title": source.Title, "volume_id": entry.VolumeID, "chunks": len(highlightChunks)}).Debug("Successfully compiled highlights for book") } payloads = append(payloads, currentBatch) - log.WithFields(logrus.Fields{"highlight_count": len(currentBatch.Highlights), "batch_count": len(payloads)}).Info("Successfully parsed highlights") + logrus.WithFields(logrus.Fields{"highlight_count": len(currentBatch.Highlights), "batch_count": len(payloads)}).Info("Successfully parsed highlights") return payloads, nil } diff --git a/go.mod b/go.mod index a68196f..e35121e 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,6 @@ go 1.19 require ( github.com/adrg/xdg v0.4.0 - github.com/go-resty/resty/v2 v2.7.0 github.com/pgaskin/koboutils/v2 v2.1.2-0.20220306004009-a07e72ebae42 github.com/pkg/errors v0.9.1 github.com/sirupsen/logrus v1.9.0 diff --git a/go.sum b/go.sum index 36c2e1c..4542a79 100644 --- a/go.sum +++ b/go.sum @@ -7,8 +7,6 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY= -github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e h1:Q3+PugElBCf4PFpxhErSzU3/PY5sFL5Z6rfv4AbGAck= @@ -91,7 +89,6 @@ golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0 golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=