summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/src/kz/ilotterytea/maxon/DiscordActivityClient.java114
-rw-r--r--core/src/kz/ilotterytea/maxon/MaxonConstants.java2
-rw-r--r--core/src/kz/ilotterytea/maxon/MaxonGame.java10
-rw-r--r--core/src/kz/ilotterytea/maxon/screens/MenuScreen.java1
4 files changed, 126 insertions, 1 deletions
diff --git a/core/src/kz/ilotterytea/maxon/DiscordActivityClient.java b/core/src/kz/ilotterytea/maxon/DiscordActivityClient.java
new file mode 100644
index 0000000..79f0151
--- /dev/null
+++ b/core/src/kz/ilotterytea/maxon/DiscordActivityClient.java
@@ -0,0 +1,114 @@
+package kz.ilotterytea.maxon;
+
+import com.badlogic.gdx.Screen;
+import com.badlogic.gdx.utils.Disposable;
+import com.badlogic.gdx.utils.Timer;
+import de.jcm.discordgamesdk.Core;
+import de.jcm.discordgamesdk.CreateParams;
+import de.jcm.discordgamesdk.LogLevel;
+import de.jcm.discordgamesdk.activity.Activity;
+import kz.ilotterytea.maxon.player.Savegame;
+import kz.ilotterytea.maxon.screens.SlotsMinigameScreen;
+import kz.ilotterytea.maxon.screens.game.GameScreen;
+import kz.ilotterytea.maxon.utils.OsUtils;
+import kz.ilotterytea.maxon.utils.formatters.NumberFormatter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.time.Instant;
+
+public class DiscordActivityClient implements Disposable {
+ private final Logger logger = LoggerFactory.getLogger(DiscordActivityClient.class.getName());
+
+ private Core core;
+ private final Instant startTime = Instant.now();
+ private Timer.Task task;
+
+ public DiscordActivityClient() {
+ if (!OsUtils.isPC) {
+ logger.info("Discord Game SDK is only supported for PC devices");
+ return;
+ }
+
+ init();
+
+ task = new Timer.Task() {
+ @Override
+ public void run() {
+ updateActivity();
+ core.runCallbacks();
+ }
+ };
+ }
+
+ private void init() {
+ try (CreateParams params = new CreateParams()) {
+ params.setClientID(MaxonConstants.DISCORD_APPLICATION_ID);
+ params.setFlags(CreateParams.Flags.DEFAULT);
+
+ this.core = new Core(params);
+ core.setLogHook(LogLevel.ERROR, (level, message) -> System.out.printf("[DISCORD %s] %s\n", level, message));
+ logger.info("Initialized the Discord RPC");
+ } catch (Exception e) {
+ logger.error("Failed to initialize the Discord RPC: {}", e.toString());
+ }
+ }
+
+ private void updateActivity() {
+ if (!core.isDiscordRunning()) return;
+
+ try (Activity activity = new Activity()) {
+ MaxonGame game = MaxonGame.getInstance();
+ activity.timestamps().setStart(startTime);
+
+ Screen screen = game.getScreen();
+
+ Savegame savegame = Savegame.getInstance();
+ String savegameInfo = String.format(
+ "%s💵 | %sⅹ | %s 🐱",
+ NumberFormatter.format((long) savegame.getMoney()),
+ NumberFormatter.format((long) savegame.getMultiplier()),
+ NumberFormatter.format(savegame.getAllPetAmount())
+ );
+
+ String details, largeImage;
+ String smallImage = null, smallText = null, largeText = null;
+
+ if (screen instanceof GameScreen) {
+ details = "Petting Maxon";
+ largeImage = "maxon";
+ largeText = savegameInfo;
+ } else if (screen instanceof SlotsMinigameScreen) {
+ details = "Spinning the slots";
+ largeImage = "slots";
+ largeText = String.format("Total spins: %s | Total wins: %s", savegame.getSlotsTotalSpins(), savegame.getSlotsWins());
+ smallImage = "maxon";
+ smallText = savegameInfo;
+ } else {
+ details = "Sitting in Main Menu";
+ largeImage = "maxon";
+ }
+
+ activity.setDetails(details);
+ activity.assets().setLargeImage(largeImage);
+
+ if (smallImage != null) activity.assets().setSmallImage(smallImage);
+ if (smallText != null) activity.assets().setSmallText(smallText);
+ if (largeText != null) activity.assets().setLargeText(largeText);
+
+ core.activityManager().updateActivity(activity);
+ } catch (Exception e) {
+ logger.error("Failed to set the activity: {}", e.toString());
+ }
+ }
+
+ public void runThread() {
+ if (task != null && !task.isScheduled()) Timer.schedule(task, 0.25f, 0.25f);
+ }
+
+ @Override
+ public void dispose() {
+ if (task != null) task.cancel();
+ if (core != null) core.close();
+ }
+}
diff --git a/core/src/kz/ilotterytea/maxon/MaxonConstants.java b/core/src/kz/ilotterytea/maxon/MaxonConstants.java
index 82e8143..fc07f27 100644
--- a/core/src/kz/ilotterytea/maxon/MaxonConstants.java
+++ b/core/src/kz/ilotterytea/maxon/MaxonConstants.java
@@ -42,6 +42,8 @@ public class MaxonConstants {
public static final String GAME_VERSIONS_FILE_URL = "https://assets.ilotterytea.kz/maxon/versions.json";
+ public static final long DISCORD_APPLICATION_ID = 1051092609659052062L;
+
public static final Texture MISSING_TEXTURE;
static {
diff --git a/core/src/kz/ilotterytea/maxon/MaxonGame.java b/core/src/kz/ilotterytea/maxon/MaxonGame.java
index 2dbe324..675d7d6 100644
--- a/core/src/kz/ilotterytea/maxon/MaxonGame.java
+++ b/core/src/kz/ilotterytea/maxon/MaxonGame.java
@@ -20,6 +20,8 @@ public class MaxonGame extends Game {
private LocalizationManager locale;
private PetManager petManager;
+ private DiscordActivityClient discordActivityClient;
+
private static MaxonGame instance;
public static MaxonGame getInstance() {
@@ -33,6 +35,10 @@ public class MaxonGame extends Game {
return petManager;
}
+ public DiscordActivityClient getDiscordActivityClient() {
+ return discordActivityClient;
+ }
+
public LocalizationManager getLocale() {
return locale;
}
@@ -80,6 +86,8 @@ public class MaxonGame extends Game {
assetManager = new AssetManager();
petManager = new PetManager(assetManager);
+ discordActivityClient = new DiscordActivityClient();
+
this.setScreen(new SplashScreen());
}
@@ -95,6 +103,6 @@ public class MaxonGame extends Game {
assetManager.unload(name);
}
assetManager.dispose();
- instance.dispose();
+ discordActivityClient.dispose();
}
}
diff --git a/core/src/kz/ilotterytea/maxon/screens/MenuScreen.java b/core/src/kz/ilotterytea/maxon/screens/MenuScreen.java
index 14dabf8..abc14d9 100644
--- a/core/src/kz/ilotterytea/maxon/screens/MenuScreen.java
+++ b/core/src/kz/ilotterytea/maxon/screens/MenuScreen.java
@@ -55,6 +55,7 @@ public class MenuScreen implements Screen {
public MenuScreen() {
this.game = MaxonGame.getInstance();
+ game.getDiscordActivityClient().runThread();
// Stage and skin:
this.stage = new Stage(new ScreenViewport());