diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..20efa43 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.token diff --git a/main.go b/main.go index c96f06a..e023507 100644 --- a/main.go +++ b/main.go @@ -8,52 +8,46 @@ import ( // "fmt" "log" "net/http" - // "net/url" "time" + "encoding/json" "github.com/fatih/color" - //"github.com/skratchdot/open-golang/open" - //"github.com/mxschmitt/playwright-go" "github.com/webview/webview" "golang.org/x/oauth2" + "io/ioutil" ) var ( conf *oauth2.Config ctx context.Context w webview.WebView + client *http.Client ) -// func callbackHandler(w http.ResponseWriter, r *http.Request) { -// queryParts, _ := url.ParseQuery(r.URL.RawQuery) -// // Use the authorization code that is pushed to the redirect -// // URL. -// code := queryParts["code"][0] -// log.Printf("code: %s\n", code) +func saveToken(tok *oauth2.Token, filename string) { + j, err := json.MarshalIndent(tok, "", "\t") + if err != nil { + log.Fatalf("Failed to save token: %v", err) + } + ioutil.WriteFile(filename, j, 0777) +} -// // Exchange will do the handshake to retrieve the initial access token. -// tok, err := conf.Exchange(ctx, code) -// if err != nil { -// log.Fatal(err) -// } -// log.Printf("Token: %s", tok) -// // The HTTP Client returned by conf.Client will refresh the token as necessary. -// client := conf.Client(ctx, tok) +func loadToken(filename string) *oauth2.Token { + data, err := ioutil.ReadFile(filename) + if err != nil { + return nil + } -// resp, err := client.Get("https://embed.gog.com/user/data/games") -// if err != nil { -// log.Fatal(err) -// } else { -// log.Println(color.CyanString("Authentication successful")) -// } -// defer resp.Body.Close() + var v = new(oauth2.Token) + err = json.Unmarshal(data, &v) -// // show succes page -// msg := "
Success!
" -// msg = msg + "You are authenticated and can now return to the CLI.
" -// fmt.Fprintf(w, msg) -// } + if err != nil { + log.Fatalf("Failed to unmarshal data: %v", err) + } + + return v +} func giveCode(code string) { log.Printf("Code: %s", code) @@ -63,8 +57,9 @@ func giveCode(code string) { log.Fatal(err) } log.Printf("Token: %s", tok) + saveToken(tok, "./.token") // The HTTP Client returned by conf.Client will refresh the token as necessary. - client := conf.Client(ctx, tok) + client = conf.Client(ctx, tok) _, err = client.Get("https://embed.gog.com/user/data/games") if err != nil { @@ -84,7 +79,7 @@ func giveCode(code string) { `) time.Sleep(1 * time.Second) - w.Destroy() + w.Terminate() } func openBrowser(url string) { @@ -105,33 +100,41 @@ func openBrowser(url string) { w.Run() } -// func plOpenBrowser(url string) { -// pw, err := playwright.Run() -// if err != nil { -// log.Fatalf("Could not start playwright: %v", err) -// } +type GameList struct { + owned []int64 `json:"owned"` +} -// browser, err := pw.Firefox.Launch() -// if err != nil { -// log.Fatalf("Could not launch browser: %v", err) -// } +func getGameList() *GameList { + res, err := client.Get("https://embed.gog.com/user/data/games") + if err != nil { + log.Fatalf("Failed to get game list: %v", err) + } + body, err := ioutil.ReadAll(res.Body) + if err != nil { + log.Fatalf("Failed to parse game body: %v", err) + } -// page, err := browser.NewPage() -// if err != nil { -// log.Fatalf("Could not create page: %v", err) -// } -// _, err = page.Goto(url) -// if err != nil { -// log.Fatalf("Could not go to %s: %v", url, err) -// } -// log.Println("Opened the url") -// } + log.Println(string(body)) + var gl = new(GameList) + err = json.Unmarshal(body, &gl) + if err != nil { + log.Fatalf("Failed to parse game list response: %v", err) + } + + return gl +} + +func login(url string) { + log.Println(color.CyanString("You will now be taken to your browser for authentication")) + time.Sleep(1 * time.Second) + openBrowser(url) +} func main() { ctx = context.Background() conf = &oauth2.Config{ ClientID: "46899977096215655", - ClientSecret: "", + ClientSecret: "9d85c43b1482497dbbce61f6e4aa173a433796eeae2ca8c5f6129f2dc4de46d9", Scopes: []string{}, Endpoint: oauth2.Endpoint{ AuthURL: "https://auth.gog.com/auth", @@ -153,15 +156,21 @@ func main() { // for the scopes specified above. url := conf.AuthCodeURL("state", oauth2.AccessTypeOffline) - log.Println(color.CyanString("You will now be taken to your browser for authentication")) - time.Sleep(1 * time.Second) - //open.Run(url) - openBrowser(url) - time.Sleep(1 * time.Second) - log.Printf("Authentication URL: %s\n", url) - - //http.HandleFunc("/oauth/callback", callbackHandler) - //log.Fatal(http.ListenAndServe(":9999", nil)) + tok := loadToken("./.token") + if tok != nil { + client = conf.Client(ctx, tok) + _, err := client.Get("https://embed.gog.com/user/data/games") + if err != nil { + login(url) + } else { + log.Println(color.CyanString("Authentication successful")) + } + } else { + login(url) + } + + gl := getGameList() + log.Println(gl.owned) }