Playnite Forums
SuccessStory - Printable Version

+- Playnite Forums (https://playnite.link/forum)
+-- Forum: Extension Database (https://playnite.link/forum/forum-3.html)
+--- Forum: Generic Extensions (https://playnite.link/forum/forum-6.html)
+--- Thread: SuccessStory (/thread-275.html)

Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23


SuccessStory - Lacro59 - 05-15-2020

Informations
The plugin gets localised (if exist) achievements or add manualy achievements.

With this plugin you can:
  • add store's achievements or add manualy achievements
  • works for GOG, Steam, Origin, Xbox, RPCS3 and RetroAchievements
  • add tag with time to unlock all achievements
  • many user stats 
 
If the theme support function, you can:
  • add plugin data in game list in "Details View" & "Grid View"
  • add plugin data in game details
[Image: main_01.jpg]  [Image: main_02.jpg]  [Image: settings_01.jpg]  [Image: control_01.jpg]


Localization
The plugin is localized.
It's possible to translate the extension on crowdin


Custom theme integration
Addition in a custom theme


Warnings
  • Playnite 9 only.


More information on Wiki
Lastest release


Changelog
v2.2
  • Playnite 9 beta version (not compatible with Playnite 8)
  • UI tweaks
  • Fixed many bugs
  • Improve performances and code optimizations (thanks to Jeshibu)
  • Added tag with time to full unlock
v2.1
  • Playnite 9 beta version (not compatible with Playnite 8)
  • Added new variables for custom theme (see wiki)
  • Added new menu options for manual achievements
  • UI tweaks
  • Fixed many bugs
  • Improve performances
v2.0
  • Playnite 9 beta version (not compatible with Playnite 8)
  • Custom UI Elements for custom theme integration (see wiki on GitHub)
  • Fixed many bugs
  • Added a source selector for manual achievements
  • Added PSN achievements
  • Added Overwatch achievements
  • Added basic Starcraft II achievements
  • UI tweaks
  • Added estimate time to unlock all achievements



RE: SuccessStory - Kingsmob - 05-15-2020

(05-15-2020, 02:19 PM)Hi there. I hope I don\t come across as foolish but how do I install this?  I assumed I just drop it in the Extensions folder but when I restarted Playnite it wasn't in the extension list. Should I be doing something else? Any help you can give would me much appreciated.Lacro59 Wrote: hi,

This is a alpha release from a generic plugin: "SuccessStory".
It shows the game achievements.



Informations
Only works for GOG and Steam.
For Steam, it's necessary to passe "games details" to "public" and wait may long minutes: https://steamcommunity.com/my/edit/settings
The plugin probably has bugs.
The plugin uses other plugin and parameters from Playnite.


Changelog
v0.1a :
Initial release



RE: SuccessStory - darklinkpower - 05-16-2020

Great extension!
Some issues I found:

1. When sorting by last session, it uses the day instead of year>month>date>time
[Image: WaDdKhQ.png]

2. This error happens when checking a game that doesn't have achievements. Also "infomations" is a typo, it should be written as "Information". And I was wondering if the "GameIcon" column could be changed to just "Icon" since it cuts because it's too long.
[Image: qG1FDmc.png]

3. The "Total Achievements" term is wrong, since it currently counts the Locked Achievements, not total.

And an idea: I think it would be great if there was a search box to quickly find the game you want since it can be difficult searching manually if the list is long. I also don't know if it would be possible in the future to sort by percentage of achievements unlocked and by number of achievements unlocked.


RE: SuccessStory - Lacro59 - 05-16-2020

(05-15-2020, 09:58 PM)Kingsmob Wrote: Hi there. I hope I don\'t come across as foolish but how do I install this?  I assumed I just drop it in the Extensions folder but when I restarted Playnite it wasn

The next release is a Playnite package.
A drag on Playnite for install it.


(05-16-2020, 02:26 AM)darklinkpower Wrote: Great extension!
Some issues I found:

1. When sorting by last session, it uses the day instead of year>month>date>time

2. This error happens when checking a game that doesn't have achievements. Also "infomations" is a typo, it should be written as "Information". And I was wondering if the "GameIcon" column could be changed to just "Icon" since it cuts because it's too long.

3. The "Total Achievements" term is wrong, since it currently counts the Locked Achievements, not total.

And an idea: I think it would be great if there was a search box to quickly find the game you want since it can be difficult searching manually if the list is long. I also don't know if it would be possible in the future to sort by percentage of achievements unlocked and by number of achievements unlocked.

I work to resolve bugs and optimize user experience with the new release.
There is still work.

Thanks for the come-back and suggestion.


RE: SuccessStory - Lacro59 - 05-20-2020

A new version is available.


RE: SuccessStory - darklinkpower - 05-20-2020

Nice update, it's working great. Some issues I found:

1. Info and description text overlap unlocked date text when text is too long

[Image: mTLM3iE.png]

2. Typo. Should be "Information"

[Image: dgYd3DN.png]

3. Sorting by "Source" doesn't sort properly.

[Image: zfWVK4C.png]

4. Bar is not totally filled even when game has 100% achievements for some reason

[Image: zEZXtys.png]


5. Origin games: locked achievements are not greyed out

[Image: w3thUmq.png]


Some recommendations:

1. I think the UI would look better if the elements were aligned like this

[Image: HNIUxVv.png]

2. I think having percentages would be great, either as shown here or as a column

[Image: 4Re0iq2.png]

3. I think having a counter for "Locked achievements" would be useful

[Image: oEtVuYM.png]


RE: SuccessStory - sheepbeep - 05-21-2020

My take on this (really excellent (on paper)) plugin:

provide a loading bar, display what game the extension is processing.

It just crashed (after 476 games, I have about 8000 in the library) and there were several duplicate lines on:

The error pops up about three times in quick sucession, but then continues.

2020-05-21 20:52:05.6776|ERROR:Failed to parse.System.NullReferenceException: Object reference not set to an instance of an object.
at SuccessStory.Models.AchievementsDatabase.Add(Game GameAdded) in J:\Lacro59\playnite-successstory-plugin\Database\AchivementsDatabase.cs:line 246
2020-05-21 20:52:20.7958|ERROR:Failed to parse.System.NullReferenceException: Object reference not set to an instance of an object.
at SuccessStory.Models.AchievementsDatabase.Add(Game GameAdded) in J:\Lacro59\playnite-successstory-plugin\Database\AchivementsDatabase.cs:line 260
2020-05-21 20:52:22.1795|ERROR:Failed to parse.System.NullReferenceException: Object reference not set to an instance of an object.
at SuccessStory.Models.AchievementsDatabase.Add(Game GameAdded) in J:\Lacro59\playnite-successstory-plugin\Database\AchivementsDatabase.cs:line 336
2020-05-21 20:52:35.5029|ERROR:Failed to parse.System.NullReferenceException: Object reference not set to an instance of an object.
at SuccessStory.Models.AchievementsDatabase.Add(Game GameAdded) in J:\Lacro59\playnite-successstory-plugin\Database\AchivementsDatabase.cs:line 246
2020-05-21 20:52:39.9949|ERROR:Failed to parse.System.NullReferenceException: Object reference not set to an instance of an object.
at SuccessStory.Models.AchievementsDatabase.Add(Game GameAdded) in J:\Lacro59\playnite-successstory-plugin\Database\AchivementsDatabase.cs:line 260
2020-05-21 20:52:41.0296|ERROR:Failed to parse.System.NullReferenceException: Object reference not set to an instance of an object.
at SuccessStory.Models.AchievementsDatabase.Add(Game GameAdded) in J:\Lacro59\playnite-successstory-plugin\Database\AchivementsDatabase.cs:line 336
2020-05-21 20:53:55.6471|ERROR:Failed to parse.System.NullReferenceException: Object reference not set to an instance of an object.
at SuccessStory.Models.AchievementsDatabase.Add(Game GameAdded) in J:\Lacro59\playnite-successstory-plugin\Database\AchivementsDatabase.cs:line 246

I am using the most current build of Playnite.

Edit: it seems that this extensions crashes after about every 450 games or so, was the second crash at game 890 (first on about 450).

Oh, and do I have to expect the whole loading time to read my 8000 games on every start of Playnite, how does this extension detect changes?

Another suggestion: You should not write any achievement data if the game does not support one.

Example is Diner Mania
{"Name":"Diner Mania","HaveAchivements":false,"Total":0,"Unlocked":0,"Locked":0,"Progression":0,"Achievements":[]}

Although this seems to be miniscule, if you use one file for each game, this will become really annoying if you wanna backup the installation and it wastes directory entries and at least one allocation unit on the disk.

As suspected, your extension eats up the all the system memory it can get.

2020-05-21 21:13:57.7732|ERROR:Unhandled exception occured.System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
at CefSharp.OffScreen.BitmapBuffer.ResizeBuffer(Int32 width, Int32 height) in C:\projects\cefsharp\CefSharp.OffScreen\BitmapBuffer.cs:line 69
at CefSharp.OffScreen.BitmapBuffer.UpdateBuffer(Int32 width, Int32 height, IntPtr buffer, Rect dirtyRect) in C:\projects\cefsharp\CefSharp.OffScreen\BitmapBuffer.cs:line 91
at CefSharp.OffScreen.DefaultRenderHandler.OnPaint(PaintElementType type, Rect dirtyRect, IntPtr buffer, Int32 width, Int32 height) in C:\projects\cefsharp\CefSharp.OffScreen\DefaultRenderHandler.cs:line 161
at CefSharp.OffScreen.ChromiumWebBrowser.CefSharp.Internals.IRenderWebBrowser.OnPaint(PaintElementType type, Rect dirtyRect, IntPtr buffer, Int32 width, Int32 height) in C:\projects\cefsharp\CefSharp.OffScreen\ChromiumWebBrowser.cs:line 694
at CefSharp.Internals.RenderClientAdapter.OnPaint(RenderClientAdapter* , scoped_refptr<CefBrowser>* browser, cef_paint_element_type_t type, vector<CefRect\,std::allocator<CefRect> >* dirtyRects, Void* buffer, Int32 width, Int32 height) in c:\projects\cefsharp\cefsharp.core\internals\renderclientadapter.h:line 161


You shouldn't just stick all achievements all into memory, Playnite crashed after the process has taken about 1 GB of RAM.

I'd suggest to use a sqlite database or something similar to store the data and query then the needed stuff. Just reading everything into variables may work if you have up to a couple hundred games (~ 450, when the first errors cropped up), but after that it is prudent to store it somewhere else, like in a sqlite or similar. Bonus points is that you won't need the whole pile of JSON files and there is much less I/O then too.


RE: SuccessStory - Lacro59 - 05-22-2020

sheepbeep Wrote:provide a loading bar, display what game the extension is processing.
Added in my tasklist.

sheepbeep Wrote:It just crashed (after 476 games, I have about 8000 in the library)
I analysed this.
The problem comes to the web component who always  isn't disposed.

sheepbeep Wrote:Oh, and do I have to expect the whole loading time to read my 8000 games on every start of Playnite, how does this extension detect changes?
The plugin loads data from the web one time.
Even if the application crashes many time, the database builds.

sheepbeep Wrote:Another suggestion: You should not write any achievement data if the game does not support one. 
The plugin loads only supported store.
But, some games hasn't achievements.

sheepbeep Wrote:You shouldn't just stick all achievements all into memory, Playnite crashed after the process has taken about 1 GB of RAM.
The plugin's database is only load for view data.
The out of memory error comes to too web component no disposed.

For informations the component load is : "CefSharp.BrowserSubprocess.exe".


RE: SuccessStory - darklinkpower - 05-22-2020

It seems that Playnite memory usage keeps increasing everytime you reopen the extension. It was originally using 80mb and it increased to 317mb after opening it 4 times
[Image: hZGnrvf.png]


RE: SuccessStory - LuigiVs - 05-24-2020

My Steam games aren't showing and I keep getting this error message:
[attachment=159]


RE: SuccessStory - ErikDestler - 05-25-2020

I am also getting that error. I can't do anything in Playnite...


RE: SuccessStory - De Mask - 05-25-2020

Hey, how can i delete the plugin?


RE: SuccessStory - Lacro59 - 05-25-2020

(05-25-2020, 09:15 AM)De Mask Wrote: Hey, how can i delete the plugin?

Depending to your installation type, delete "SuccessStory" folder.


RE: SuccessStory - Lacro59 - 05-26-2020

A new version is published.
Some big problems are solved but some persist.


RE: SuccessStory - sheepbeep - 05-29-2020

Hello,

there are still several problems:

Update of achievements still dumbly walks through ALL games
Solution: should ask if only walk through most recent games (eg played last day / week / year / all [current])

Error discussion

[Image: wqduwBv.png]

Problem source point: https://github.com/Lacro59/playnite-successstory-plugin/blob/df61ed0cedc5716c5fe6f121bf7a35df64fc1b7c/Clients/SteamAchievements.cs#L60

On this position onwards you make a SteamAPI request and assume that the response is always a JSON object with the data if it is not empty (""). This assumption is simply NOT true (see below).

The try() .. catch() block only catches server errors, but in this case you should just retry after a short while.

Another thing is that you do not process HTTP 429, where in that case you have to wait for 5 Minutes for the next request, because you have made too many requests in a certain period. This automatically resolves itself after these 5 minutes. You should factor this in your code.

So, now to the API request itself:
http://api.steampowered.com/ISteamUserStats/GetPlayerAchievements/v0001/?appid=716050&key=xxx&steamid=yyy

This yields
{"playerstats":{"error":"Requested app has no stats","success":false}}

First, make SURE that you only do https requests, not http; the latter are unsafe and can be modified in-transit.

Second, you have an invalid response if the response is either empty (this is covered) OR (this is important) the JSON variable playerstats.success == false. In this case you should parse the "player.stats" message and act accordingly. In this case, this game has no stats and achievements and the extensions should be aware of that (and not dumping this into the database blindly). THIS IS ALSO THE REASON FOR THIS POPUP ;D

Now, a valid request (Shadow Warrior 2, abbreviated):
http://api.steampowered.com/ISteamUserStats/GetPlayerAchievements/v0001/?appid=324800&key=xxx&steamid=yyy
{"playerstats":{"steamID":"xxxxx","gameName":"Shadow Warrior 2","achievements":[{"apiname":"ALL","achieved":0,"unlocktime":0},{"apiname":"GAME_FINISHED_0","achieved":1,"unlocktime":1589667921}, .... {"apiname":"COUNT_orb_found_2","achieved":0,"unlocktime":0}],"success":true}}
First, "playerstats.success" == true. This is the ONLY event you can be sure that the keys of the JSON are present.

Currently, your code just assumes if the response is non-empty, it is ok to jump into the JSON data. Don't do that (and fix it).



After that, opening PLAYNITE -> Extensions -> Success Story yields this error message (likely a continuation of the first error).
[Image: fEjWAa3.png]

2020-05-29 14:26:02.5389|ERROR:Failed to execute extension function.System.IO.FileFormatException: The image decoder cannot decode the image. The image might be corrupted. ---> System.Runtime.InteropServices.COMException: The image is unrecognized. (Exception from HRESULT: 0x88982F60)
   --- End of inner exception stack trace ---
   at System.Windows.Media.Imaging.BitmapDecoder.SetupDecoderFromUriOrStream(Uri uri, Stream stream, BitmapCacheOption cacheOption, Guid& clsId, Boolean& isOriginalWritable, Stream& uriStream, UnmanagedMemoryStream& unmanagedMemoryStream, SafeFileHandle& safeFilehandle)
   at System.Windows.Media.Imaging.BitmapDecoder.CreateFromUriOrStream(Uri baseUri, Uri uri, Stream stream, BitmapCreateOptions createOptions, BitmapCacheOption cacheOption, RequestCachePolicy uriCachePolicy, Boolean insertInDecoderCache)
   at System.Windows.Media.Imaging.BitmapImage.FinalizeCreation()
   at System.Windows.Media.Imaging.BitmapImage.EndInit()
   at SuccessStory.SuccessView.GetListGame(String SearchGameName) in J:\Lacro59\playnite-successstory-plugin\Views\SuccessStoryView.xaml.cs:line 108
   at SuccessStory.SuccessView..ctor(SuccessStorySettings settings, IPlayniteAPI PlayniteApi, String PluginUserDataPath) in J:\Lacro59\playnite-successstory-plugin\Views\SuccessStoryView.xaml.cs:line 60
   at SuccessStory.SuccessStory.<GetFunctions>b__9_0() in J:\Lacro59\playnite-successstory-plugin\SuccessStory.cs:line 45
   at Playnite.SDK.ExtensionFunction.Invoke()
   at Playnite.Plugins.ExtensionFactory.InvokeExtension(ExtensionFunction function, Exception& error) in E:\Devel\Playnite\source\Playnite\Plugins\ExtensionFactory.cs:line 415

As I am not really versed with C#, but I guess this is caused by invalid / nonexisting URL data where the extension tries to access a key not present (likely an URL).


Feature request
Automatically scan games played last day / week / year / all (configurable)


Suggestion: Use https://github.com/SteamRE/SteamKit for Steam API requests, not only for this extension but for your other extensions if you access the Steam API.


RE: SuccessStory - Lacro59 - 05-30-2020

Thanks for the long feedback.
My english is too bad for answer correctly.

I will work to improve this.


RE: SuccessStory - Alowen - 06-04-2020

Heya, just a stupid question perhaps.

I am pretty new to playnite, realy like the direction it is going. This extension looks like something essential for what i want in my launcher.. but I seem to be overlooking the basics in how to access it. I have installed the folder, in my settings it is enables.. but what now? How do i actually open it? It's pretty confusing for me still.


RE: SuccessStory - sheepbeep - 06-04-2020

If it is installed (and does not bug out), you can access it in the playnite menu (the controller icon). select "extensions" and "success story" there.

Yes, I agree, that should be integrated into Playnite directly Wink


RE: SuccessStory - Lacro59 - 06-09-2020

A new version is available.


RE: SuccessStory - Kaede Monthmore - 06-10-2020

Any plans for Retroarchievements? Because i think if put RA system is very complex and how is possible recognize every single game entry and know if it is "archievementable" or not.

About extension: is possible to use the integration directly, without button presses? If not, is possible change the button appearance, like the others?