diff options
| author | ilotterytea <iltsu@alright.party> | 2024-10-25 20:43:49 +0500 |
|---|---|---|
| committer | ilotterytea <iltsu@alright.party> | 2024-10-25 20:43:49 +0500 |
| commit | 47d07aa915b12df456b62d395b1c1cbd8481bced (patch) | |
| tree | 8c6be0bd924e6aa816a35dd2f388103f7bda5f19 /core | |
| parent | 56f5e02f8fd97187d3794d1c2ccc75bee0033219 (diff) | |
feat: now everyone on discord knows you are petting maxon
Diffstat (limited to 'core')
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()); |
