mirror of
https://github.com/tobspr/shapez.io.git
synced 2025-06-02 15:44:04 +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