Open fl4shback opened 2 years ago
Can confirm, fixes #33 - thank you!
This PR needs to merge ASAP, the Ubisoft Connect plugin does not work at all anymore, as of 1/25/2022.
@FriendsOfGalaxy could you prioritize reviewing it?
just used this connect library today, changed lines to
CLUB_APPID = "314d4fef-e568-454a-ae06-43e3bece12a6" CLUB_GENOME_ID = "85c31714-0941-4876-a18d-2c7e9dce8d40"
confirmed fix
Works for me too.
Any reason why this isn't getting merged?
@FriendsOfGalaxy seems inactive since last September, maybe they stopped maintaining the plugins..
Works for me too. Hope someone could fix the problem by merging the fix with the master.
Updated GOG Client to 2.0.46 Beta (Feb 16, 2022), but disconnect remains... just updated Ids like this PR, and started working again
Can we get some attention on this PR, please? We have a known-working fix here. Seems like a quick and safe merge. (assuming maintainer wouldn't want the two commits squashed to one, that is)
Wonder if anybody else in GoG has commit access to this account. It has a email address, so if anybody is willing to ping them with email...
I pinged friendsofgalaxy per email, but am not confident, that he responds, since the github user seems inactive for half a year now.
I have tried to file support request in GoG client, but things don't look good so far:
Although I'd like to hope for situation improving in future, but please also prepare for the worst too -- we players are on our own now.
I have tried to file support request in GoG client
As it is clearly stated in GOG Galaxy, they are not responsible for 3rd party integrations so they can do nothing about this anyway and we shouldn't bug them about it, we have always been on our own regarding this. The GOG client is already understuffed and hanging by a thread, let's please not waste their limited time with things that are out of their control.
Friends of galaxy is a community project, the bad news is that the maintainer has gone dark for the past months.
is it possible to change integration url that is embedded in GOG Galaxy official client?
@muhasturk Nope, that's why I think official intervention is needed. But, well, check the comment above. Not gonna discuss anymore, situation won't change anyway. GoG had possibly pulled the plug on python integration development as a whole, as the main workhorse developer has quitted or at least no longer working on it. Right now manual modification of ID is the way to go.
@milroneth @turbo25 @yessenbayev any chance one of you can approve this PR? i also confirm it fixed the issue.
@milroneth @turbo25 @yessenbayev any chance one of you can approve this PR? i also confirm it fixed the issue.
We already have, and you can too! An approval on GitHub is just the proper way to say "this works as intended and the code looks good, I approve of this, please merge it", instead of commenting without offering anything more. That way the maintainer can easily see that a PR has a certain number of approvals without reading and counting comments, and go ahead and merge it.
None of us has the power to merge, only the (now disappeared) maintainer of the repo.
@milroneth thanks for explaining reviewers don't get merge rights, never realized that.
Is the disappeared maintainer at the repo or the org (FriendsOfGalaxy) level?
I always thought folks at the org level can take control of any repo in the org?
In the worst case scenario, if the maintainer is no longer available, we can collaborate with GOG, by cloning the integrations to a new user/organization and asking GOG to pull integrations from that new cloned repo.
In the worst case scenario, if the maintainer is no longer available, we can collaborate with GOG, by cloning the integrations to a new user/organization and asking GOG to pull integrations from that new cloned repo.
If you would like to discuss further, please, feel free to reach out over email: alan.yessenbayev@gmail.com with subject "GOG Integration".
In the worst case scenario, if the maintainer is no longer available, we can collaborate with GOG, by cloning the integrations to a new user/organization and asking GOG to pull integrations from that new cloned repo.
If we do this, we should set up an organization with more than one person having permissions, to avoid a situation like this in the future.
please merge this asap
@milroneth thanks for explaining reviewers don't get merge rights, never realized that.
Is the disappeared maintainer at the repo or the org (FriendsOfGalaxy) level?
I always thought folks at the org level can take control of any repo in the org?
The maintainer of FriendsOfGalaxy/galaxy-integration-uplay is clearly the user FriendsOfGalaxy, unfortunately. There is no "repo or org level" distinction because FriendsOfGalaxy is not an org account. (You can tell because it shows an email address contact instead of a weblink, and there's no "People" nav where one could see the members of the org.) Since the Galaxy client searches from and pulls that user's repos specifically, it is not useful to make forks of the repos themselves. Only the FriendsOfGalaxy account can approve the PRs, so if that doesn't happen the only other way to get auto-updates showing back up in the Galaxy client is by changing the Galaxy code itself, it would seem. This is not the only integration that is 100% broken due to this issue, either, unfortunately. So hopefully they'll do something.
Has anyone tried to contact GOG and gotten any response?
+1
Has anyone tried to contact GOG and gotten any response?
Jep, i contacted them more than a month ago via Ticket in Gog Galaxy about this situation, mentioning the open PRs and my wish that they either
I think they either are hopelessly overstrained, not interested in plugins anymore or can't decide what would be best. Either way it doesn't seem to be easy to get the changes upstream. (And I doubt, that more users contacting gog about this, will accelerate or change anything)
Maybe we should just create an org, merge it there and contact gog again (hoping that they don't ignore that too).
(Also the war in the neighboring countries too may not help to accelerate any development here, but what do I know)
I have tried to file support request in GoG client
As it is clearly stated in GOG Galaxy, they are not responsible for 3rd party integrations so they can do nothing about this anyway and we shouldn't bug them about it, we have always been on our own regarding this. The GOG client is already understuffed and hanging by a thread, let's please not waste their limited time with things that are out of their control.
Friends of galaxy is a community project, the bad news is that the maintainer has gone dark for the past months.
Two things here: Friends of Galaxy is the officially approved 3rd party integrations project. No fork of these repos will be seen or used by Galaxy. Only this. And I haven't seen even a hint of this being user-configurable. For shame, actually. I often do wonder if it's actually 2022… The other is that CDP does these 3rd party integrations as an actual feature of Galaxy 2.0, "All your games and friends in one place." Note the "all".
(I strongly suspect the person(s) behind it have at least some connections to CDP, if they're not employees who are either doing (or did) this in their off hours or actually on company time but anonymously so the legal ruse works).
I've created an entry on the gog-whishlist over here: https://www.gog.com/wishlist/galaxy/let_integration_updates_happen_again Don't know if it will help, but maybe it will get attention if it has enough votes.
🙏
The ID has once again changed
The ID has once again changed
What are the new ID ?
The ID has once again changed
What are the new ID ?
Credit to JustThat70 CLUB_APPID = "f35adcb5-1911-440c-b1c9-48fdc1701c68" CLUB_GENOME_ID = "5b36b900-65d8-47f3-93c8-86bdaa48ab50"
The ID has once again changed
What are the new ID ?
Credit to JustThat70 CLUB_APPID = "f35adcb5-1911-440c-b1c9-48fdc1701c68" CLUB_GENOME_ID = "5b36b900-65d8-47f3-93c8-86bdaa48ab50"
Thank you
Updated the IDs in the PR in case it ever gets merged...
Well I noticed another pull request that had been merged with a similar id at first and then I canceled this one - since I noticed it was already in the repo history. Thank you! Sorry for the confusion :)
On Sat, Aug 6, 2022 at 6:12 PM Bjarne Krottjé @.***> wrote:
Any idea when this will be merged?
— Reply to this email directly, view it on GitHub https://github.com/FriendsOfGalaxy/galaxy-integration-uplay/pull/34#issuecomment-1207296167, or unsubscribe https://github.com/notifications/unsubscribe-auth/AANG2ZZQREBGMVXCWKA7DUTVX3WMJANCNFSM5MTGPT5A . You are receiving this because you commented.Message ID: @.***>
Here is a one-liner to quickly check/get the IDs:
# short version
curl -s https://ubisoftconnect.com/invalid | grep -Eo 'APP_ID.{0,40}|GENOME_ID.{0,40}'
# long version, readable parameter
curl --silent https://ubisoftconnect.com/invalid | grep --extended-regexp --only-matching 'APP_ID.{0,40}|GENOME_ID.{0,40}'
I'm sure this can be enhanced, but for me it helps. 😄
Let's hope GOG sorts out the Plugin updates / repo access fuu soonish. Has been a year now since the last update in this repo. 😞
Have taken what @drmaxx has suggested above, and written it in python to replace what's currently hardcoded in to the consts.py file for this plugin. So long as they don't go changing the urls/response format, this should keep itself updated rather than needing a code change each time the APP_ID/GENOME_ID changes. EDIT: notice that @KS-HTK suggested this as an option earlier - tested and seems to work on my machine.
import requests
import re
ids_url = 'https://ubisoftconnect.com/invalid'
ids_response = requests.get(ids_url)
regex_ids_response = re.findall('APP_ID.{0,40}|GENOME_ID.{0,40}', ids_response.text)
ids_result = []
for sub in regex_ids_response:
sub = sub.replace('"','')
if ':' in sub:
ids_result.append(map(str.strip, sub.split(':', 1)))
ids_result = dict(ids_result)
CLUB_APPID = ids_result.get('APP_ID','')
CLUB_GENOME_ID = ids_result.get('GENOME_ID','')
import requests ids_url = 'https://ubisoftconnect.com/invalid' ids_response = requests.get(ids_url) regex_ids_response = re.findall('APP_ID.{0,40}|GENOME_ID.{0,40}', ids_response.text) ids_result = [] for sub in regex_ids_response: sub = sub.replace('"','') if ':' in sub: ids_result.append(map(str.strip, sub.split(':', 1))) ids_result = dict(ids_result) CLUB_APPID = ids_result.get('APP_ID','') CLUB_GENOME_ID = ids_result.get('GENOME_ID','')
Thanks for implementing it. That is exactly what I suggested doing, just did not have the time yet. A minor change that i would suggest is wrapping it in a try, in case of connection error:
import requests
ids_url = 'https://ubisoftconnect.com/invalid'
try:
ids_response = requests.get(ids_url)
regex_ids_response = re.findall('APP_ID.{0,40}|GENOME_ID.{0,40}', ids_response.text)
ids_result = []
for sub in regex_ids_response:
sub = sub.replace('"','')
if ':' in sub:
ids_result.append(map(str.strip, sub.split(':', 1)))
ids_result = dict(ids_result)
CLUB_APPID = ids_result.get('APP_ID','')
CLUB_GENOME_ID = ids_result.get('GENOME_ID','')
except requests.exceptions.ConnectionError:
CLUB_APPID = "314d4fef-e568-454a-ae06-43e3bece12a6"
CLUB_GENOME_ID = "85c31714-0941-4876-a18d-2c7e9dce8d40"
but then again, if fetching the url does not work, there should be no connection anyway, so maybe this is unnecessary.
Now lets hope that it will eventually be merged.
EDIT: @wearepariah I suggest you should submit it as a PR to @fl4shback fork of this repo.
thanks @KS-HTK - i have created the pull request to @fl4shback repo. I did think about a try/except for connection errors as you suggested, but if the connection errors out and it falls back to last-hardcoded value, it puts us back where we are now (with needing to update the hardcodes frequently), and like you said - if the connection errors, it's going to fail regardless. i don't see value in it, but something to capture the error might be good?
also this should close #35 and #42
thanks @KS-HTK - i have created the pull request to @fl4shback repo. I did think about a try/except for connection errors as you suggested, but if the connection errors out and it falls back to last-hardcoded value, it puts us back where we are now (with needing to update the hardcodes frequently), and like you said - if the connection errors, it's going to fail regardless. i don't see value in it, but something to capture the error might be good?
import requests ids_url = 'https://ubisoftconnect.com/invalid' old_app_id = CLUB_APPID old_genome_id = CLUB_GENOME_ID try: ids_response = requests.get(ids_url) regex_ids_response = re.findall('APP_ID.{0,40}|GENOME_ID.{0,40}', ids_response.text) ids_result = []
for sub in regex_ids_response: sub = sub.replace('"','') if ':' in sub: ids_result.append(map(str.strip, sub.split(':', 1)))
ids_result = dict(ids_result)
CLUB_APPID = ids_result.get('APP_ID','') CLUB_GENOME_ID = ids_result.get('GENOME_ID','') except requests.exceptions.ConnectionError: CLUB_APPID = old_app_id CLUB_GENOME_ID = old_genome_id
Maybe this can do the trick?
[…]
import requests ids_url = 'https://ubisoftconnect.com/invalid' old_app_id = CLUB_APPID old_genome_id = CLUB_GENOME_ID try: […] CLUB_APPID = ids_result.get('APP_ID','') CLUB_GENOME_ID = ids_result.get('GENOME_ID','') except requests.exceptions.ConnectionError: CLUB_APPID = old_app_id CLUB_GENOME_ID = old_genome_id
Maybe this can do the trick?
No it won't. It would require saving them to a file.
You now assign CLUB_APPID
to old_app_id
before CLUB_APPID
is even initialized.
so you cant store them in a variable between runtimes, as this is not how variables work.
import requests ids_url = 'https://ubisoftconnect.com/invalid' ids_response = requests.get(ids_url) regex_ids_response = re.findall('APP_ID.{0,40}|GENOME_ID.{0,40}', ids_response.text) ids_result = [] for sub in regex_ids_response: sub = sub.replace('"','') if ':' in sub: ids_result.append(map(str.strip, sub.split(':', 1))) ids_result = dict(ids_result) CLUB_APPID = ids_result.get('APP_ID','') CLUB_GENOME_ID = ids_result.get('GENOME_ID','')
I tried this but now the add-on is constantly timing out. What did I do wrong?
I tried this but now the add-on is constantly timing out. What did I do wrong?
Difficult to say without seeing how you modified consts.py
But here is a link to the full file: https://github.com/wearepariah/galaxy-integration-uplay/blob/master/src/consts.py
try replacing yours with that one.
I tried this but now the add-on is constantly timing out. What did I do wrong?
Difficult to say without seeing how you modified
consts.py
But here is a link to the full file: https://github.com/wearepariah/galaxy-integration-uplay/blob/master/src/consts.pytry replacing yours with that one.
That helped Me fix it. Thanks! I believe I was missing a couple of lines at the top.
I tried this but now the add-on is constantly timing out. What did I do wrong?
Difficult to say without seeing how you modified
consts.py
But here is a link to the full file: https://github.com/wearepariah/galaxy-integration-uplay/blob/master/src/consts.pytry replacing yours with that one.
This works much longer for me, but it's not a permanent fix. After a few hours I must reconnect (including pulling out my goddamn phone for the stupid 2 factor authentication). Before it would instantly disconnect in a second after connecting, so this new consts.py is much better, but not a real full solution.
I tried this but now the add-on is constantly timing out. What did I do wrong?
Difficult to say without seeing how you modified
consts.py
But here is a link to the full file: https://github.com/wearepariah/galaxy-integration-uplay/blob/master/src/consts.pytry replacing yours with that one.
This works much longer for me, but it's not a permanent fix. After a few hours I must reconnect (including pulling out my goddamn phone for the stupid 2 factor authentication). Before it would instantly disconnect in a second after connecting, so this new consts.py is much better, but not a real full solution.
I am not sure that's caused by this change, the constant changing of the ID's could indicate that Ubi have changed something else at their end causing this - the Ubisoft Connect app on my machine has forced me to log back in a bunch of times in the past week, correlation in timing rather than causation.
No, this is not a fix for a disconnect every 5-6h this is a fix for not being able to connect at all. I get those spaced out disconnects as well. I guess the reason is because that is when the api key for the account runs out and is not auto renewed by this plugin. (gussing they are using OAUTH2 control flow) I have not had time to look further into it though. I had asked ubisoft support for a developer api as they do have a section in the accounts page for 3rd party apps. But there is currently no public developer api. And trying to capture the instance when ubisoft connect refetches the key is going to be a heck of a job, as this only happens when the key runs out.
I am not sure there is going to be a fix for that any time soon.
I am about to make the most useless of comments but I got fed up that Ubisoft wasn't showing up in my GoG library so I decided to dig a bit. I verified Backend.py and it does support OAUTH2 and it does handle refreshing tokens already, but I've noticed disconnection there.
I have looked through some of my logs and the originator of the issue seems to begin from a call to _do_safe_request which receives a weird answer. Not wanting to wait, I decided to log to file the tokens and expiry dates, and to subtract a good chunk of time from expiry time.... and it just called _refresh_auth properly? And then again and again and again. So using the fix by @wearepariah in combination by just refreshing the token long before it expires, I seem to be doing good. There is no refresh token rotation. Always the same refresh token.
Now, I am not sure what happens if I turn off GoG for a couple of hours, but combing through the code I've found a couple potential issues, the main ones revolving around improper handling of errors on requests.
We have 3 layers of requests.
We have request which handles the actual request. If it fails, it raises an error, it uses an handle_exception function.
We have _do_request which is a wrapper around request, it has zero error handling.
We have _do_safe_request which is a wrapper around _do_request. It has a preemptive ticket refresh (which is what I used) and a try/except situation to refresh auth but only on AccessDenied, AuthenticationRequired errors, as defined by handle_exception, any errors outside of those 2 is a dead end.
My take aways right now are: Gotta refactor requests so that they always fallback to refreshing auth if it fails and if that fails, kill stored credentials. Request and _do_request are called and can cause this situation. There will probably need to be some method of fallback for exceptions. Some errors I've noticed is that a request returns 401 but the handle_exception doesn't know what to do with it, so it returns unknown handle. We do have situations where we get 401 while doing a token refresh.
Oh and for some reasons _do_options_request has an hardcoded appID
Some parts of the Ubisoft API recently started to reject requests made by the legacy "Ubisoft Club" app IDs.
I changed the IDs to the new ones.
Fixes #33, #37