New API methods:
Fixed invalid JSON returning by the method
game.get.leaderboards.checkExistence" in case if the request wasn't completed successfully.
Changed the way API calls different handlers for different versions and checks if the requested version exists and allowed, as well.
Explanation for the new API methods:
game.get.protection.list (temporarily disabled) - gives all HWIDs belongs to the specific user and the specific product. I think that's kinda of security violation to response with the hwids so I disabled this method. However, it may become useful in the future, we may set it admin-only or something.
game.get.protection.validate (temporarily disabled) - returns true if the specified HWID belongs to the specific user and the specific product, false otherwise. It's temporarily disabled because it barely differs from
game.post.protection.init: this method doesn't require user's password and works with GET, HEAD requests only.
game.post.protection.init - the all-in-one solution. If there's no match for the specific user and the specific game, it will generate one using the HWID specified in the request. Otherwise, it will check if the specified HWID matches the HWID exists in the database. If HWIDs are different, returns an error. Requires password of a user. It works with UIDs and emails, hashed and plain passwords. The idea is to send email+plain password on the first sign in, then save the UID and the hashed password in %AppData% and use them in the future. Therefore, the copy protection will not reset if a user will change their email. Currently it saves only 1 HWID but this most probably will be changed in the future.