Authorize via steam for the puzzle api

pull/1185/head
tobspr 3 years ago
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…
Cancel
Save