5 namespace GameHub
.Data
.Sources
.GOG
7 public class GOG
: GameSource
9 private const string CLIENT_ID
= "46899977096215655";
10 private const string CLIENT_SECRET
= "9d85c43b1482497dbbce61f6e4aa173a433796eeae2ca8c5f6129f2dc4de46d9";
11 private const string REDIRECT
= "https%3A%2F%2Fembed.gog.com%2Fon_login_success%3Forigin%3Dclient";
13 public override string name
{ get { return "GOG"; } }
14 public override string icon
{ get { return "gog"; } }
16 public string? user_id
{ get; protected set; }
17 public string? user_name
{ get; protected set; }
19 private string? user_auth_code
= null;
20 public string? user_token
= null;
21 private string? user_refresh_token
= null;
22 private bool token_needs_refresh
= false;
24 private Settings
.Auth
.GOG settings
;
28 settings
= Settings
.Auth
.GOG
.get_instance();
29 var access_token
= settings
.access_token
;
30 var refresh_token
= settings
.refresh_token
;
31 if(access_token
.length
> 0 && refresh_token
.length
> 0)
33 user_token
= access_token
;
34 user_refresh_token
= refresh_token
;
35 token_needs_refresh
= true;
39 public override bool is_installed(bool refresh
)
44 public override async
bool install()
49 public override async
bool authenticate()
51 settings
.authenticated
= true;
53 if(token_needs_refresh
&& user_refresh_token
!= null)
55 return (yield
refresh_token());
58 return (yield
get_auth_code()) && (yield
get_token());
61 public override bool is_authenticated()
63 return !token_needs_refresh
&& user_token
!= null;
66 public override bool can_authenticate_automatically()
68 return user_refresh_token
!= null && settings
.authenticated
;
71 private async
bool get_auth_code()
73 if(user_auth_code
!= null)
78 var wnd
= new GameHub
.UI
.Windows
.WebAuthWindow(this
.name
, @
"https://auth.gog.com/auth?client_id=$(CLIENT_ID)&redirect_uri=$(REDIRECT)&response_type=code&layout=client2", "https://embed.gog.com/on_login_success?origin=client&code=");
80 wnd
.finished
.connect(code
=>
82 user_auth_code
= code
;
83 Idle
.add(get_auth_code
.callback);
86 wnd
.canceled
.connect(() => Idle
.add(get_auth_code
.callback));
88 wnd
.set_size_request(550, 680);
94 return user_auth_code
!= null;
97 private async
bool get_token()
99 if(user_token
!= null)
104 var url
= @
"https://auth.gog.com/token?client_id=$(CLIENT_ID)&client_secret=$(CLIENT_SECRET)&grant_type=authorization_code&redirect_uri=$(REDIRECT)&code=$(user_auth_code)";
105 var root
= (yield Parser
.parse_remote_json_file_async(url
)).get_object();
106 user_token
= root
.get_string_member("access_token");
107 user_refresh_token
= root
.get_string_member("refresh_token");
108 user_id
= root
.get_string_member("user_id");
110 settings
.access_token
= user_token ??
"";
111 settings
.refresh_token
= user_refresh_token ??
"";
113 return user_token
!= null;
116 private async
bool refresh_token()
118 if(user_refresh_token
== null)
123 var url
= @
"https://auth.gog.com/token?client_id=$(CLIENT_ID)&client_secret=$(CLIENT_SECRET)&grant_type=refresh_token&refresh_token=$(user_refresh_token)";
124 var root
= (yield Parser
.parse_remote_json_file_async(url
)).get_object();
125 user_token
= root
.get_string_member("access_token");
126 user_refresh_token
= root
.get_string_member("refresh_token");
127 user_id
= root
.get_string_member("user_id");
129 settings
.access_token
= user_token ??
"";
130 settings
.refresh_token
= user_refresh_token ??
"";
132 token_needs_refresh
= false;
134 return user_token
!= null;
137 private ArrayList
<Game
> games
= new ArrayList
<Game
>(Game
.is_equal
);
138 public override async ArrayList
<Game
> load_games(FutureResult
<Game
>? game_loaded
= null)
140 if(user_id
== null || user_token
== null || games
.size
> 0)
147 var cached
= GamesDB
.get_instance().get_games(this
);
151 if(game_loaded
!= null)
153 foreach(var g
in cached
)
159 games_count
= games
.size
;
161 var url
= @
"https://embed.gog.com/account/getFilteredProducts?mediaType=1";
162 var root
= (yield Parser
.parse_remote_json_file_async(url
, "GET", user_token
)).get_object();
164 var products
= root
.get_array_member("products");
166 foreach(var g
in products
.get_elements())
168 var game
= new
GOGGame(this
, g
.get_object());
169 if(!games
.contains(game
) && yield game
.is_for_linux())
172 if(game_loaded
!= null) game_loaded(game
);
173 GamesDB
.get_instance().add_game(game
);
175 games_count
= games
.size
;