Skip to content

Commit

Permalink
Add Greenworks dependency injection
Browse files Browse the repository at this point in the history
  • Loading branch information
korewaChino committed Sep 8, 2024
1 parent f1bc9b2 commit 92300cd
Show file tree
Hide file tree
Showing 15 changed files with 451 additions and 10 deletions.
6 changes: 5 additions & 1 deletion .github/workflows/binary.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,11 @@ jobs:
with:
toolchain: stable
target: x86_64-unknown-linux-musl


- uses: actions/setup-node@v4
with:
node-version: 20

- name: Build release binaries
run: |
rustup target add x86_64-unknown-linux-musl
Expand Down
6 changes: 5 additions & 1 deletion .github/workflows/release-bin.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,11 @@ jobs:
with:
toolchain: stable
target: x86_64-unknown-linux-musl


- uses: actions/setup-node@v4
with:
node-version: 20

- name: Build release binaries
run: |
rustup target add x86_64-unknown-linux-musl
Expand Down
3 changes: 2 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
[package]
name = "boson"
version = "0.2.1"
version = "0.3.0"
edition = "2021"
license = "MIT"
authors = ["Pornpipat Popum <cappy@fyralabs.com>"]
publish = false
description = "Run Electron Steam games natively"
readme = "README.md"
repository = "https://github.com/FyraLabs/boson"
Expand Down
3 changes: 2 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ DESTDIR=$(PWD)/build
CRATE_DIR=$(PWD)
TARGET_DIR=$(CRATE_DIR)/target
CRATE_NAME=boson
CARGO_ARGS=""
CARGO_ARGS=
CARGO_TARGET="release"

.PHONY: build build-dev
Expand All @@ -20,6 +20,7 @@ pack-release: prep build
cp $(TARGET_DIR)/$(CARGO_TARGET)/$(CRATE_NAME) $(DESTDIR)/$(CRATE_NAME)
@echo "Copying assets"
cp -av $(CRATE_DIR)/assets/. $(DESTDIR)
pushd $(DESTDIR) && npm install && popd

pack-dev: prep build-dev
ln -fv $(TARGET_DIR)/debug/$(CRATE_NAME) $(DESTDIR)/$(CRATE_NAME)
Expand Down
2 changes: 2 additions & 0 deletions assets/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
node_modules
package-lock.json
1 change: 1 addition & 0 deletions assets/lib/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
napi/*
221 changes: 221 additions & 0 deletions assets/lib/greenworks.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,221 @@
// Copyright (c) 2015 Greenheart Games Pty. Ltd. All rights reserved.
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.

// The source code can be found in https://github.com/greenheartgames/greenworks

// ==============================
// Boson notes
// ==============================
// The following file is vendored from the greenworks project, slightly modified to work with Boson's Greenworks hooks.

var fs = require('fs');

var greenworks;

if (process.platform == 'darwin') {
if (process.arch == 'x64')
greenworks = require(__dirname + '/lib/greenworks-osx64');
} else if (process.platform == 'win32') {
if (process.arch == 'x64')
greenworks = require(__dirname + '/lib/greenworks-win64');
else if (process.arch == 'ia32')
greenworks = require(__dirname + '/lib/greenworks-win32');
} else if (process.platform == 'linux') {
if (process.arch == 'x64')
greenworks = require(__dirname + '/lib/greenworks-linux64');
else if (process.arch == 'ia32')
greenworks = require(__dirname + '/lib/greenworks-linux32');
}

function error_process(err, error_callback) {
if (err && error_callback)
error_callback(err);
}

greenworks.ugcGetItems = function(options, ugc_matching_type, ugc_query_type,
success_callback, error_callback) {
if (typeof options !== 'object') {
error_callback = success_callback;
success_callback = ugc_query_type;
ugc_query_type = ugc_matching_type;
ugc_matching_type = options;
options = {
'app_id': greenworks.getAppId(),
'page_num': 1
}
}
greenworks._ugcGetItems(options, ugc_matching_type, ugc_query_type,
success_callback, error_callback);
}

greenworks.ugcGetUserItems = function(options, ugc_matching_type,
ugc_list_sort_order, ugc_list, success_callback, error_callback) {
if (typeof options !== 'object') {
error_callback = success_callback;
success_callback = ugc_list;
ugc_list = ugc_list_sort_order;
ugc_list_sort_order = ugc_matching_type;
ugc_matching_type = options;
options = {
'app_id': greenworks.getAppId(),
'page_num': 1
}
}
greenworks._ugcGetUserItems(options, ugc_matching_type, ugc_list_sort_order,
ugc_list, success_callback, error_callback);
}

greenworks.ugcSynchronizeItems = function (options, sync_dir, success_callback,
error_callback) {
if (typeof options !== 'object') {
error_callback = success_callback;
success_callback = sync_dir;
sync_dir = options;
options = {
'app_id': greenworks.getAppId(),
'page_num': 1
}
}
greenworks._ugcSynchronizeItems(options, sync_dir, success_callback,
error_callback);
}

greenworks.publishWorkshopFile = function(options, file_path, image_path, title,
description, success_callback, error_callback) {
if (typeof options !== 'object') {
error_callback = success_callback;
success_callback = description;
description = title;
title = image_path;
image_path = file_path;
file_path = options;
options = {
'app_id': greenworks.getAppId(),
'tags': []
}
}
greenworks._publishWorkshopFile(options, file_path, image_path, title,
description, success_callback, error_callback);
}

greenworks.updatePublishedWorkshopFile = function(options,
published_file_handle, file_path, image_path, title, description,
success_callback, error_callback) {
if (typeof options !== 'object') {
error_callback = success_callback;
success_callback = description;
description = title;
title = image_path;
image_path = file_path;
file_path = published_file_handle;
published_file_handle = options;
options = {
'tags': [] // No tags are set
}
}
greenworks._updatePublishedWorkshopFile(options, published_file_handle,
file_path, image_path, title, description, success_callback,
error_callback);
}

// An utility function for publish related APIs.
// It processes remains steps after saving files to Steam Cloud.
function file_share_process(file_name, image_name, next_process_func,
error_callback, progress_callback) {
if (progress_callback)
progress_callback("Completed on saving files on Steam Cloud.");
greenworks.fileShare(file_name, function() {
greenworks.fileShare(image_name, function() {
next_process_func();
}, function(err) { error_process(err, error_callback); });
}, function(err) { error_process(err, error_callback); });
}

// Publishing user generated content(ugc) to Steam contains following steps:
// 1. Save file and image to Steam Cloud.
// 2. Share the file and image.
// 3. publish the file to workshop.
greenworks.ugcPublish = function(file_name, title, description, image_name,
success_callback, error_callback, progress_callback) {
var publish_file_process = function() {
if (progress_callback)
progress_callback("Completed on sharing files.");
greenworks.publishWorkshopFile(file_name, image_name, title, description,
function(publish_file_id) { success_callback(publish_file_id); },
function(err) { error_process(err, error_callback); });
};
greenworks.saveFilesToCloud([file_name, image_name], function() {
file_share_process(file_name, image_name, publish_file_process,
error_callback, progress_callback);
}, function(err) { error_process(err, error_callback); });
}

// Update publish ugc steps:
// 1. Save new file and image to Steam Cloud.
// 2. Share file and images.
// 3. Update published file.
greenworks.ugcPublishUpdate = function(published_file_id, file_name, title,
description, image_name, success_callback, error_callback,
progress_callback) {
var update_published_file_process = function() {
if (progress_callback)
progress_callback("Completed on sharing files.");
greenworks.updatePublishedWorkshopFile(published_file_id,
file_name, image_name, title, description,
function() { success_callback(); },
function(err) { error_process(err, error_callback); });
};

greenworks.saveFilesToCloud([file_name, image_name], function() {
file_share_process(file_name, image_name, update_published_file_process,
error_callback, progress_callback);
}, function(err) { error_process(err, error_callback); });
}

// Greenworks Utils APIs implmentation.
greenworks.Utils.move = function(source_dir, target_dir, success_callback,
error_callback) {
fs.rename(source_dir, target_dir, function(err) {
if (err) {
if (error_callback) error_callback(err);
return;
}
if (success_callback)
success_callback();
});
}

greenworks.init = function() {
if (this.initAPI()) return true;
if (!this.isSteamRunning())
throw new Error("Steam initialization failed. Steam is not running.");
var appId;
try {
appId = fs.readFileSync('steam_appid.txt', 'utf8');
} catch (e) {
throw new Error("Steam initialization failed. Steam is running," +
"but steam_appid.txt is missing. Expected to find it in: " +
require('path').resolve('steam_appid.txt'));
}
if (!/^\d+ *\r?\n?$/.test(appId)) {
throw new Error("Steam initialization failed. " +
"steam_appid.txt appears to be invalid; " +
"it should contain a numeric ID: " + appId);
}
throw new Error("Steam initialization failed, but Steam is running, " +
"and steam_appid.txt is present and valid." +
"Maybe that's not really YOUR app ID? " + appId.trim());
}

var EventEmitter = require('events').EventEmitter;
greenworks.__proto__ = EventEmitter.prototype;
EventEmitter.call(greenworks);

greenworks._steam_events.on = function () {
greenworks.emit.apply(greenworks, arguments);
};

process.versions['greenworks'] = greenworks._version;

module.exports = greenworks;
Binary file added assets/lib/libsdkencryptedappticket.so
Binary file not shown.
Binary file added assets/lib/libsteam_api.so
Binary file not shown.
5 changes: 5 additions & 0 deletions assets/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"dependencies": {
"override-require": "^1.1.1"
}
}
Loading

0 comments on commit 92300cd

Please sign in to comment.