tkashkin / GameHub

All your games in one place
https://tkashkin.github.io/projects/gamehub
GNU General Public License v3.0
2.2k stars 131 forks source link

[Feature] Epic Games Store support #295

Open btegs opened 4 years ago

btegs commented 4 years ago

Lutris has support for bringing in your library from the Epic Games Store, so I was wondering if there were plans of adding support for it in GameHub. Can have it like with GOG where you can use the built in Proton or WINE to run the games.

neuromancer commented 4 years ago

(Somehow) duplicated of #240

treymerkley commented 4 years ago

Would @tkashkin be up to explaining why they dislike Epic and wouldn't accept pull requests? I haven't really been able to quite get why people dislike EGS so much, other than Epic's aggressive EGS-only strategy, which to me would be moot as a talking point if we had a solid launcher on Linux to work with it. This is just my take on it, which is why I'm asking.

tkashkin commented 4 years ago

@treymerkley

Would @tkashkin be up to explaining why they dislike Epic

Sure, it will be a long rant.

I don't like EGS and don't use it for multiple reasons:

And after all of that I don't have any reason to even try EGS. I don't care about their free games, I have large enough libraries on Steam and GOG. I'm sure I probably won't play even half of my games in my lifetime.

In a last few years Steam and GOG did fully convert me from being a pirate into a paying customer. On the other hand EGS doesn't look any more appealing compared to torrent.


wouldn't accept pull requests

Where did I say that? I said I don't want to implement it myself since I don't use EGS, don't like it and wouldn't be able to test integration.

I don't use itch.io either, but @hagabaka has sent an initial implementation and now we are working on itch.io integration in #65. (however I do like itch.io model unlike EGS)


Hopefully I have explained my thoughts on it.

treymerkley commented 4 years ago

Hey, thanks for the write-up! I guess my perspective is different because of how much I use either platform, and how I think of GameHub: I only use EGS for their free games and occasionally playing Fortnite with friends when everyone's bored, and I've liked their larger cut to publishers, if only because indie game development sucks just like the rest of the industry and any way to help another dev out I'm happy with.

Conversely, I really like the look of GameHub and could see it replacing Steam Big Picture for me, so "x feature over y" doesn't mean anything for me because I can import the game into either and be pretty happy.

I completely misunderstood your position in #240. I thought you were saying that you would refuse anything EGS related being added to GameHub, not simply that you won't actively develop for it. I apologize.

OvermindDL1 commented 4 years ago

I don't understand how did Epic release their platform in such state in late 2018. It doesn't look like they want to improve their platform. They have already missed deadlines on their roadmap and fixed that by removing dealines.

You'd understand more if you knew more about Epic-the-company, they've long been slow on development (though that was primarily on engine work in the past, rather than a store).

They don't support Linux at all. That's not a huge dealbreaker for me, I triple-boot anyway and I still mostly game on Windows.

It's a huge dealbreaker for me, I only use linux.

As a consumer I don't really care about developer's publisher's cut. However I care about platform features and I can see where most of 30% Valve gets are spent.

I understand the cut that they want, however Steam has immensely better service and features, everything from server hosting and matchmaking, ban handling, forums, mod distribution (big one here), lots of optional features that devs can put into their application (which do not make it require steam to use unless they program it to do so), in addition the devs are allowed to give away or sell steam keys on other services (as long as they also sell on steam for the same price) at no cost (steam takes no cut, yet the game still supports full features), as well as just so much more that I'm leaving out for brevity sake. The Epic Store supports not even what most would consider the bare minimum.

If devs took advantage of even a fraction of what steam offers it would not only save them money (probably enough to offset than 18% extra cut) from their own hosting and licensing costs, but would add so many more features for their community as well.

And, of course, exclusives.

I'm against the concept of exclusives, period. Steam at no point has ever EVER mandated an exclusive (or even gives any bonuses at all for being exclusive, there is no bonus whatsoever for being exclusive on steam nor has there ever been).

I also wouldn't mind if their own games were EGS exclusives, like Valve own games are Steam exclusives and EA games are Origin exclusives.

Eh, Valve's games needed steam to be installed, but they did not require purchasing on steam, there were other places (mostly brick and morter) that they could be purchased from, but still, that is a dev choice, not steam mandating anything.

But I care when game that was marketed on Steam, that was available for preorders on Steam or that I have wishlisted on Steam suddenly moves to EGS.

This, this right here is one of the big thing that shows the true colors and why I will not even support them now even if they got every steam feature out, similar reasons I don't use Windows, company morals is a big thing for me.

I don't care about their free games, I have large enough libraries on Steam and GOG. I'm sure I probably won't play even half of my games in my lifetime.

...yeah, I relate..

In a last few years Steam and GOG did fully convert me from being a pirate into a paying customer. On the other hand EGS doesn't look any more appealing compared to torrent.

Also agree there, though for me it was more of ~15 years ago that it 'converted' me. I'm happy to pay, but it must be more useful than getting it other ways, and steam is dead simple with the features I quite like, in addition to GoG, Humble Bundle, and Itch.io, they all support my platform and make it trivial to acquire whatever I want with 2-click payments in most cases.

A big thing for me, I feel absolutely no need to play a game if I don't agree with their morals, I won't pirate it, I won't even think about it ever again in my life and I write off the company. There are more than enough games to play otherwise, not just in my account but others via reputable devs that there is just no need worrying about the latest and prettiest XYZ game. I absolutely at this point in time (without EGS going through a major cleanup, including getting rid of the current CEO) will not support EGS, nor any game dev that chooses to go exclusive with them (not just their game, but the entire dev is blackballed at that point, will not even touch their past games that I might otherwise already own).

neuromancer commented 4 years ago

Just wanted to say that I think all the reasons exposed are quite interesting to read and discuss! Beyond that, if someone is planing to work on this feature in the future, it could be a good idea to take a look to this code which is used to download Fortnite game files using Epic's servers.

treymerkley commented 4 years ago

Hey, it's in C#, neato. That'll make conversion pretty easy. So what would it take, then, to spin it into something more general?

neuromancer commented 4 years ago

To be honest, I have no idea. I think a good first step is to ask the author of that code how likely is to get a more general code to download other games, apart from Fortnite.

treymerkley commented 4 years ago

https://github.com/WorkingRobot/FortniteDownloader/issues/4

treymerkley commented 4 years ago

Okay, so it looks like what would be needed would be to be able to fetch the owned games for the user, and then from there feed the name to a fetching URL. They appear to have a public API, so that's good.

neuromancer commented 4 years ago

A small update on this. I just saw this open-source replacement for the Epic Games Launcher in case anyone is interested in reviving this feature.

dotevo commented 4 years ago

I'm not sure if someone started to investigate that issue. I've started digging into GameHub source code and I was able to use legendary (provided by @neuromancer ) to integrate EGS with GameHub. I'm far far away from ready solution but I have something:

Zrzut ekranu z 2020-04-30 13-34-07

Zrzut ekranu z 2020-04-30 13-34-36

I can install game and run it.

neuromancer commented 4 years ago

OMG, that's amazing! is your branch ready for testing? I can give it a try in that case..

djibux commented 4 years ago

Oh wow! Great job! I can also help test that.

dotevo commented 4 years ago

Like I said it is far away from ready PRQ. But... ok. https://github.com/dotevo/GameHub/pull/1

Steps:

derrod commented 4 years ago

FYI You can also read game metadata from ~/.config/legendary/metadata/<app name>.json that will also include URLs for images etc.

I also added csv/tsv output earlier today so you can use those to avoid regex-ing the game names from list-games/list-installed.

That said there may be breaking changes to the CLI at any point so parsing its output seems less than ideal.

dotevo commented 4 years ago

@derrod Thank you :-) Looks much better.

Zrzut ekranu z 2020-04-30 22-53-10

btegs commented 4 years ago

Great job! I know that are there are some free EGS games in my account and would be nice to be able to run those in GameHub via Proton. If this is merged into GameHub with legendary bundled and not a separate install, that would be a nice bonus!

neuromancer commented 4 years ago

If this is merged into GameHub with legendary bundled and not a separate install, that would be a nice bonus!

Another approach is to re-do all the legendary implementation inside GameHub, but I don't know if that's reasonable or not.

djibux commented 4 years ago

@dotevo Legendary requires Python3.8. I don't have it on my system (Debian Stable). If you need help testing I will need to install a Virtual Machine.

btegs commented 4 years ago

@dotevo Legendary requires Python3.8. I don't have it on my system (Debian Stable). If you need help testing I will need to install a Virtual Machine.

What if you install pyenv from https://github.com/pyenv/pyenv#basic-github-checkout or https://github.com/pyenv/pyenv-installer and then install Python 3.8.2 from there? Can set it globally or on a per directory basis if needed.

dotevo commented 4 years ago

Currently I don't have enough time to finish my PR. It somehow works with a PoC quality. If someone wants to test it is ok. If someone wants to help with PR then help is more than welcome.

djibux commented 4 years ago

@dotevo, your work is awesome, it works out of the box. Thanks.

epic games

jcnils commented 4 years ago

Thanks for it! I forked your work and I will try to help with your PR.

I might have misclicked something but it is working properly now. image

dotevo commented 4 years ago

Great :-) Currently, the source code is very low quality. It was more-less copy and paste of existing modules. I've never used VALA and it was my first time when I was digging into GameHub. I've tried to add some TODO stuff to my draft PR. Feel free to take a task or to fix any part of that PR.

jcnils commented 4 years ago

No worries, same here. I found some nice material on VALA and I will try to keep things consistent with the rest of the code as well.

That was a nice TODO list, after work today I will tackle it, starting from checking the "Legendary", and setting it up. I found where most of the code is supposed to be, I just need to figure out how to do it in VALA, like how to check if a package exists and how to get it using the distro package manager.

jcnils commented 4 years ago

I need some help here with the

com.github.tkashkin.gamehub.gschema.xml.in

Wasn't the build process supposed to update it ? (meson and ninja) I am running with ./src/com.github.tkashkin.gamehub --verbose -d

I figured out how to check if legendary package is there, so I was updating the UI to show that and to support the authentication code from Epic.

I get errors for example: [ERROR] [GLib-GIO] Settings schema 'com.github.tkashkin.gamehub.auth.epic' is not installed

My code

        <schema path="@SCHEMA_PATH@/auth/epic/" id="@SCHEMA_ID@.auth.epic">
            <key name="enabled" type="b">
                <default>true</default>
                <summary>Is Epic enabled</summary>
            </key>
            <key name="authenticated" type="b">
                <default>false</default>
                <summary>Did user get authentication code</summary>
            </key>
            <key name="auth-code" type="s">
                <default>'@PREF_AUTH_CODE_EPIC@'</default>
                <summary>Epic AUTH CODE</summary>
            </key>
        </schema>

Another error: [ERROR] [GLib-GIO] Settings schema 'com.github.tkashkin.gamehub.paths' does not contain a key named 'epic-games'

The code

    <!-- Paths -->
        <schema path="@SCHEMA_PATH@/paths/" id="@SCHEMA_ID@.paths">

...
            <key name="epic-games" type="s">
                <default>'~/Games/epic'</default>
                <summary>Epic games directory</summary>
            </key>
        </schema>

Update: It was not updating the file on the glib-2.0 folder, so I removed the the AUR version I had here. It also removed the file. The problem is, even If I build it, the file does not appear. [ERROR] [GLib-GIO] Settings schema 'com.github.tkashkin.gamehub.ui.behavior' is not installed

Fix: After removing the AUR, I just needed to run sudo ninja install again =D

jcnils commented 4 years ago

Just need to update the path to wherever legendary is saving the games, and disable it if there is no legendary/authentication.

Maybe I can add a place to add the authentication code from Epic just like the Itch.

dotevo commented 4 years ago

I didn't see how Itch is done. We can use legendary for that. Maybe you can use ~/.config/legendary/user.json file or run command directly. I'm not sure what is better. I think that the final solution should use legendary if it is possible (and be some kind of UI wrapper) or should never use legendary. Probably the second option is preferred by @tkashkin but I think it's more difficult to do.

$ legendary auth
[cli] INFO: Testing existing login data if present...
[Core] INFO: Logging in...
[cli] INFO: Stored credentials are still valid, if you wish to switch to a differentaccount, delete ~/.config/legendary/user.json and try again.
jcnils commented 4 years ago

Itch implementation is using Butler, it is a command line tool similar to what Legendary is doing for us. So I just took the same approach on Legendary, like how they verify if Butler is there, and later today on how the authentication happens using the UI.

The only difference I am seeing now is that they create 3 wrappers a ButlerDaemon, Client and Connection. Legendary is already running as a service here, so I wonder if this is a requirement to work in a few distros. Maybe later we will figure out that.

I think using Legendary might render us good results faster. I don't think using that could be a problem given that Itch is already using another package that must be running. The difference is that Butler is from Itch.io while Legendary is not from Epic.

Once we get the Epic games working here with Legendary (and I have a better understanding of the code on GameHub) we can start thinking on how to improve it with people's feedback.

My fear on not using Legendary is that it took derrod +2 months to write Legendary. Rewriting it inside game hub will not be an easy task even with the help of Epic API Documentation

jcnils commented 4 years ago

Are there any way to read log messages from the subprocess with DataInputStream ?

[cli] INFO: Testing existing login data if present...
[Core] INFO: Trying to re-use existing login session...
[cli] INFO: Stored credentials are still valid, if you wish to switch to a different account, run "legendary auth --delete" and try again.

I saw that to get the game list you read messages written with "print". Legendary code handling authentication doesn't return anything and doesn't "print" anything when you are authenticated. It is all in the logs.

I will ask him to add some values to the return or to print stuff. But we probably should go with his suggestion of parsing json messages.

In the meanwhile I will assume that if it doesn't print it is a success.

dotevo commented 4 years ago

@jcnils I think that we need something like legendary status and there should be an information about auth.

neuromancer commented 3 years ago

is #377 still in progress? There is this project to look for inspiration, if needed: https://github.com/flavioislima/HeroicGamesLauncher

jcnils commented 3 years ago

It is cool! I saw him on reddit asking suggestions for names a while ago, and someone mentioned Heroic.

On my part it is more about time than inspiration. I only have a couple hours per week to work on side projects.

Dotevo code is working fine, but some features required things that where not implemented on Legendary at the time. So I was trying to implement something on top of Epic API.

Protektor-Desura commented 3 years ago

Any idea when this will be rolled in the master branch and released for everyone to use?

Lucki commented 3 years ago

Any idea when this will be rolled in the master branch and released for everyone to use?

This will probably happen after the current refactoring is done.

So I was trying to implement something on top of Epic API.

@jcnils Did you accomplish something already with the direct implementation? I took a look into this and got it working through calling legendary similar the PR from detevo is doing but I'm building against the current refactoring branch and being more feature complete while integrating better into gamehub itself internally.

Sneak peek

dotevo commented 3 years ago

@Lucki It looks great.

jcnils commented 3 years ago

Did you accomplish something already with the direct implementation?

@Lucki I haven't touched this since June last year(login/auth was my last commit). But it seems you have that working already.

There is a recent PR on dotevo's with more features implemented that might be useful https://github.com/dotevo/GameHub/pull/3

Lucki commented 3 years ago

But it seems you have that working already.

No, that's still handled by legendary by getting the sid exchange code automatically.

There is a recent PR on dotevo's with more features implemented that might be useful dotevo#3

Thanks, I'll have a look if I can include some of that.

Lucki commented 3 years ago

I've looked into legendary a bit more and it seems doable to just do the same in GameHub. I'm able to log in and I'm able to fetch all the game information without legendary.

@tkashkin Legendary probably breaks EGS ToS. Same would be for any internal implementation - would a rewrite of legendary get merged with that conflict? If not: Would a wrapping around legendary get merged even with knowledge of that conflict?

tkashkin commented 3 years ago

@Lucki

Legendary probably breaks EGS ToS.

This link is broken or I need to join some server to see it, can you replace it by a screenshot or summarize it?

Maybe the best solution for cases like this and for easier extension would be to move game sources and data providers into separate plugins, this shouldn't be too hard to do.

I have already planned to somewhat separate game sources, right now I am rewriting them and they can be toggled with meson build options in my local branch.

Lucki commented 3 years ago

This link is broken or I need to join some server to see it

Stupid discord…

can you replace it by a screenshot or summarize it?

There's nothing explained, just a random? guy claiming it would break ToS - I asked for further details but there was no answer.

CommandMC#7964: Yes, Legendary is against the Epic ToS. However, the requests Legendary sends to Epics servers are (at least as far as I know) indistinguishable from requests coming from the Epic Games Launcher. Of course, the chance to get banned is never 0%, but it really isn't high

would be to move game sources and data providers into separate plugins

Guess I'll keep trying to rewrite the functionality into GameHub then. I'm assuming an already working solution isn't too hard to make a plugin of?

tkashkin commented 3 years ago

I'm assuming an already working solution isn't too hard to make a plugin of?

Shouldn't be too hard, but there will be some changes.

derrod commented 3 years ago

There doesn't seem to be anything in actual terms of service that legendary violates: https://www.epicgames.com/site/en-US/tos

Though I don't know if there are any other ToS related to the store, but at least in those ones there's nothing really that would make a project such as legendary violate them. Though IANAL.

dotevo commented 2 years ago

@Lucki Great that your branch is still alive! I will check your new version. It think this branch should be merged. It is opened so long and Epic Games support is long-awaited feature.

redromnon commented 2 years ago

Hey guys, even though the idea of integration of Epic Games into GameHub has been a low priority, I've noticed that quite a lot has been discussed here. Moreover, I've found out that this implementation is also being worked on but there haven't been any major developments or updates recently. I'm not sure whether the testing branch has been paused or abandoned.

I was wondering if anyone's thought of just importing games like Steam via unofficial Epic Games clients. I know that the branch being worked on uses Legendary to login and install games but Heroic is getting popular and you can maybe consider importing from it. My project Heroic Bash Launcher may help in some way for launching games. What do you think about this?

Lucki commented 2 years ago

uses Legendary to login and install games

That's not true. It basically does the same legendary does but it's doing it on it's own. Feel free to improve things (there's a probably incomplete list at the PR top) or squash any bugs you're encountering.