mirror of
				https://github.com/tobspr/shapez.io.git
				synced 2025-06-13 13:04:03 +00:00 
			
		
		
		
	Authorize via steam for the puzzle api
This commit is contained in:
		
							parent
							
								
									ec4d198df3
								
							
						
					
					
						commit
						329cefb3c9
					
				| @ -49,6 +49,30 @@ function listen() { | ||||
| 
 | ||||
|     ipcMain.handle("steam:get-achievement-names", getAchievementNames); | ||||
|     ipcMain.handle("steam:activate-achievement", activateAchievement); | ||||
| 
 | ||||
|     function bufferToHex(buffer) { | ||||
|         return Array.from(new Uint8Array(buffer)) | ||||
|             .map(b => b.toString(16).padStart(2, "0")) | ||||
|             .join(""); | ||||
|     } | ||||
| 
 | ||||
|     ipcMain.on("steam:get-ticket", (event, arg) => { | ||||
|         console.log("Requested steam ticket ..."); | ||||
|         greenworks.getAuthSessionTicket( | ||||
|             success => { | ||||
|                 const ticketHex = bufferToHex(success.ticket); | ||||
|                 event.reply("steam:ticket-success", ticketHex); | ||||
|             }, | ||||
|             error => { | ||||
|                 console.error("Failed to get steam ticket:", error); | ||||
|                 event.reply("steam:ticket-error", "" + error); | ||||
|             } | ||||
|         ); | ||||
|     }); | ||||
| 
 | ||||
|     ipcMain.on("steam:check-app-ownership", (event, appId) => { | ||||
|         event.reply(greenworks.isSubscribedApp(appId)); | ||||
|     }); | ||||
| } | ||||
| 
 | ||||
| function isInitialized(event) { | ||||
|  | ||||
| @ -18,6 +18,7 @@ export const THIRDPARTY_URLS = { | ||||
|     shapeViewer: "https://viewer.shapez.io", | ||||
| 
 | ||||
|     standaloneStorePage: "https://store.steampowered.com/app/1318690/shapezio/", | ||||
|     puzzleDlcStorePage: "https://store.steampowered.com/app/1625400/shapezio__Puzzle_DLC", | ||||
| 
 | ||||
|     levelTutorialVideos: { | ||||
|         21: "https://www.youtube.com/watch?v=0nUfRLMCcgo&", | ||||
|  | ||||
| @ -3,6 +3,7 @@ import { Application } from "../application"; | ||||
| /* typehints:end */ | ||||
| import { createLogger } from "../core/logging"; | ||||
| import { compressX64 } from "../core/lzstring"; | ||||
| import { getIPCRenderer } from "../core/utils"; | ||||
| import { T } from "../translations"; | ||||
| 
 | ||||
| const logger = createLogger("puzzle-api"); | ||||
| @ -109,12 +110,27 @@ export class ClientAPI { | ||||
|      * @returns {Promise<{token: string}>} | ||||
|      */ | ||||
|     apiTryLogin() { | ||||
|         return this._request("/v1/public/login", { | ||||
|             method: "POST", | ||||
|             body: { | ||||
|                 token: this.syncToken, | ||||
|         if (!G_IS_STANDALONE) { | ||||
|             return Promise.reject("Not possible outside of standalone."); | ||||
|         } | ||||
| 
 | ||||
|         const renderer = getIPCRenderer(); | ||||
| 
 | ||||
|         return renderer.invoke("steam:get-ticket").then( | ||||
|             ticket => { | ||||
|                 logger.log("Got auth ticket:", ticket); | ||||
|                 return this._request("/v1/public/login", { | ||||
|                     method: "POST", | ||||
|                     body: { | ||||
|                         token: ticket, | ||||
|                     }, | ||||
|                 }); | ||||
|             }, | ||||
|         }); | ||||
|             err => { | ||||
|                 logger.error("Failed to get auth ticket from steam: ", err); | ||||
|                 throw err; | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  | ||||
| @ -10,6 +10,10 @@ const logger = createLogger("electron-wrapper"); | ||||
| 
 | ||||
| export class PlatformWrapperImplElectron extends PlatformWrapperImplBrowser { | ||||
|     initialize() { | ||||
|         this.dlcs = { | ||||
|             puzzle: false, | ||||
|         }; | ||||
| 
 | ||||
|         this.steamOverlayCanvasFix = document.createElement("canvas"); | ||||
|         this.steamOverlayCanvasFix.width = 1; | ||||
|         this.steamOverlayCanvasFix.height = 1; | ||||
| @ -23,9 +27,9 @@ export class PlatformWrapperImplElectron extends PlatformWrapperImplBrowser { | ||||
|         this.app.storage = new StorageImplElectron(this); | ||||
|         this.app.achievementProvider = new SteamAchievementProvider(this.app); | ||||
| 
 | ||||
|         return this.initializeAchievementProvider().then(() => | ||||
|             PlatformWrapperInterface.prototype.initialize.call(this) | ||||
|         ); | ||||
|         return this.initializeAchievementProvider() | ||||
|             .then(() => this.initializeDlcStatus()) | ||||
|             .then(() => PlatformWrapperInterface.prototype.initialize.call(this)); | ||||
|     } | ||||
| 
 | ||||
|     steamOverlayFixRedrawCanvas() { | ||||
| @ -66,6 +70,22 @@ export class PlatformWrapperImplElectron extends PlatformWrapperImplBrowser { | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     initializeDlcStatus() { | ||||
|         const renderer = getIPCRenderer(); | ||||
| 
 | ||||
|         logger.log("Checking DLC ownership ..."); | ||||
|         // @todo: Don't hardcode the app id
 | ||||
|         return renderer.invoke("steam:check-app-ownership", 1625400).then( | ||||
|             res => { | ||||
|                 logger.log("Got DLC ownership:", res); | ||||
|                 this.dlcs.puzzle = Boolean(res); | ||||
|             }, | ||||
|             err => { | ||||
|                 logger.error("Failed to get DLC ownership:", err); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     getSupportsFullscreen() { | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
| @ -16,6 +16,7 @@ import { | ||||
|     waitNextFrame, | ||||
| } from "../core/utils"; | ||||
| import { HUDModalDialogs } from "../game/hud/parts/modal_dialogs"; | ||||
| import { PlatformWrapperImplElectron } from "../platform/electron/wrapper"; | ||||
| import { getApplicationSettingById } from "../profile/application_settings"; | ||||
| import { T } from "../translations"; | ||||
| 
 | ||||
| @ -40,6 +41,11 @@ export class MainMenuState extends GameState { | ||||
| 
 | ||||
|         const showDemoBadges = this.app.restrictionMgr.getIsStandaloneMarketingActive(); | ||||
| 
 | ||||
|         const puzzleDlc = | ||||
|             G_IS_STANDALONE && | ||||
|             /** @type { PlatformWrapperImplElectron | ||||
|         }*/ (this.app.platformWrapper).dlcs.puzzle; | ||||
| 
 | ||||
|         return ` | ||||
|             <div class="topButtons"> | ||||
|                 ${ | ||||
| @ -86,8 +92,7 @@ export class MainMenuState extends GameState { | ||||
|                 </div> | ||||
| 
 | ||||
|                 ${ | ||||
|                     // @TODO: Only display if DLC is owned, otherwise show ad for store page
 | ||||
|                     G_IS_STANDALONE && false | ||||
|                     G_IS_STANDALONE && puzzleDlc | ||||
|                         ? ` | ||||
|                     <div class="puzzleContainer"> | ||||
|                         <img class="dlcLogo" src="${cachebust( | ||||
| @ -99,8 +104,7 @@ export class MainMenuState extends GameState { | ||||
|                 } | ||||
| 
 | ||||
|                 ${ | ||||
|                     // @TODO: Only display if DLC is owned, otherwise show ad for store page
 | ||||
|                     G_IS_STANDALONE && true | ||||
|                     G_IS_STANDALONE && !puzzleDlc | ||||
|                         ? ` | ||||
|                     <div class="puzzleContainer notOwned"> | ||||
|                         <img class="dlcLogo" src="${cachebust( | ||||
| @ -304,6 +308,16 @@ export class MainMenuState extends GameState { | ||||
|         this.trackClicks(producerLink, () => this.app.platformWrapper.openExternalLink("https://tobspr.io"), { | ||||
|             preventClick: true, | ||||
|         }); | ||||
| 
 | ||||
|         const puzzleModeButton = qs(".puzzleDlcPlayButton"); | ||||
|         if (puzzleModeButton) { | ||||
|             this.trackClicks(puzzleModeButton, () => this.onPuzzleModeButtonClicked()); | ||||
|         } | ||||
| 
 | ||||
|         const puzzleWishlistButton = qs(".puzzleDlcGetButton"); | ||||
|         if (puzzleWishlistButton) { | ||||
|             this.trackClicks(puzzleWishlistButton, () => this.onPuzzleWishlistButtonClicked()); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     renderMainMenu() { | ||||
| @ -340,11 +354,6 @@ export class MainMenuState extends GameState { | ||||
|             this.trackClicks(playBtn, this.onPlayButtonClicked); | ||||
|             buttonContainer.appendChild(importButtonElement); | ||||
|         } | ||||
| 
 | ||||
|         const puzzleModeButton = this.htmlElement.querySelector(".puzzleDlcPlayButton"); | ||||
|         if (puzzleModeButton) { | ||||
|             this.trackClicks(puzzleModeButton, () => this.onPuzzleModeButtonClicked()); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     onPuzzleModeButtonClicked(force = false) { | ||||
| @ -365,6 +374,12 @@ export class MainMenuState extends GameState { | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     onPuzzleWishlistButtonClicked() { | ||||
|         this.app.platformWrapper.openExternalLink( | ||||
|             THIRDPARTY_URLS.puzzleDlcStorePage + "?ref=mmsl2&prc=" + A_B_TESTING_LINK_TYPE | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     onBackButtonClicked() { | ||||
|         this.renderMainMenu(); | ||||
|         this.renderSavegames(); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user