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