diff options
author | syeyoung <cyong06@naver.com> | 2021-08-08 22:45:20 +0900 |
---|---|---|
committer | syeyoung <cyong06@naver.com> | 2021-08-08 22:45:20 +0900 |
commit | db58612b03889d5911c99f5b3878b31f9b4f9e92 (patch) | |
tree | dc11f6af1fa070baba7eb6351052d4f8d95e76ea /src/main/java/kr/syeyoung/dungeonsguide/RichPresenceManager.java | |
parent | eaaac61857654f7f629fa9ada669f40301009e31 (diff) | |
download | Skyblock-Dungeons-Guide-db58612b03889d5911c99f5b3878b31f9b4f9e92.tar.gz Skyblock-Dungeons-Guide-db58612b03889d5911c99f5b3878b31f9b4f9e92.tar.bz2 Skyblock-Dungeons-Guide-db58612b03889d5911c99f5b3878b31f9b4f9e92.zip |
- Field Orders
Diffstat (limited to 'src/main/java/kr/syeyoung/dungeonsguide/RichPresenceManager.java')
-rw-r--r-- | src/main/java/kr/syeyoung/dungeonsguide/RichPresenceManager.java | 208 |
1 files changed, 130 insertions, 78 deletions
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/RichPresenceManager.java b/src/main/java/kr/syeyoung/dungeonsguide/RichPresenceManager.java index abecd8a7..08d5a898 100644 --- a/src/main/java/kr/syeyoung/dungeonsguide/RichPresenceManager.java +++ b/src/main/java/kr/syeyoung/dungeonsguide/RichPresenceManager.java @@ -18,15 +18,31 @@ package kr.syeyoung.dungeonsguide; +import com.sun.jna.Pointer; +import com.sun.jna.ptr.PointerByReference; import kr.syeyoung.dungeonsguide.dungeon.DungeonContext; import kr.syeyoung.dungeonsguide.events.SkyblockJoinedEvent; import kr.syeyoung.dungeonsguide.events.SkyblockLeftEvent; import kr.syeyoung.dungeonsguide.features.FeatureRegistry; +import kr.syeyoung.dungeonsguide.gamesdk.GameSDK; +import kr.syeyoung.dungeonsguide.gamesdk.jna.NativeGameSDK; +import kr.syeyoung.dungeonsguide.gamesdk.jna.datastruct.*; +import kr.syeyoung.dungeonsguide.gamesdk.jna.enumuration.EDiscordActivityActionType; +import kr.syeyoung.dungeonsguide.gamesdk.jna.enumuration.EDiscordLogLevel; +import kr.syeyoung.dungeonsguide.gamesdk.jna.enumuration.EDiscordResult; +import kr.syeyoung.dungeonsguide.gamesdk.jna.interfacestruct.IDiscordActivityEvents; +import kr.syeyoung.dungeonsguide.gamesdk.jna.interfacestruct.IDiscordActivityManager; +import kr.syeyoung.dungeonsguide.gamesdk.jna.interfacestruct.IDiscordCore; +import kr.syeyoung.dungeonsguide.gamesdk.jna.typedef.DiscordClientID; +import kr.syeyoung.dungeonsguide.gamesdk.jna.typedef.DiscordTimestamp; +import kr.syeyoung.dungeonsguide.gamesdk.jna.typedef.DiscordVersion; +import kr.syeyoung.dungeonsguide.gamesdk.jna.typedef.Int32; import kr.syeyoung.dungeonsguide.party.PartyInviteViewer; import kr.syeyoung.dungeonsguide.party.PartyJoinRequest; import kr.syeyoung.dungeonsguide.party.PartyManager; import kr.syeyoung.dungeonsguide.stomp.StompHeader; import kr.syeyoung.dungeonsguide.stomp.StompPayload; +import lombok.Getter; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; import org.json.JSONObject; @@ -35,99 +51,135 @@ public class RichPresenceManager implements Runnable { public static RichPresenceManager INSTANCE = new RichPresenceManager(); private Thread t = new Thread(this); - public RichPresenceManager() { t.start(); -// Runtime.getRuntime().addShutdownHook(new Thread(DiscordRPC::discordShutdown)); } - public void setup() { -// DiscordRPC.discordInitialize("816298079732498473", new DiscordEventHandlers.Builder() -// .setReadyEventHandler(new ReadyCallback() { -// @Override -// public void apply(DiscordUser user) { -// updatePresence(); -// } -// }).setJoinRequestEventHandler(request -> { -// PartyJoinRequest partyJoinRequest = new PartyJoinRequest(); -// partyJoinRequest.setDiscordUser(request); -// partyJoinRequest.setExpire(System.currentTimeMillis() + 30000); -// -// PartyInviteViewer.INSTANCE.joinRequests.add(partyJoinRequest); -// }).setJoinGameEventHandler(joinSecret -> { -// DungeonsGuide.getDungeonsGuide().getStompConnection().send(new StompPayload().method(StompHeader.SEND) -// .header("destination", "/app/party.askedtojoin") -// .payload(new JSONObject().put("token", joinSecret).toString())); -// }).setErroredEventHandler((errorCode, message) -> { -// System.out.println("ERROR! "+errorCode+ " - "+message); -// t.interrupt(); -// (t = new Thread(this)).start(); -// }).setDisconnectedEventHandler((errorCode, message) -> { -// System.out.println("ERROR! "+errorCode+ " - "+message); -// t.interrupt(); -// (t = new Thread(this)).start(); -// }).build(), true); + @Getter + private NativeGameSDK nativeGameSDK; + @Getter + private IDiscordCore iDiscordCore; + private IDiscordActivityManager activityManager; + private IDiscordActivityEvents.ByReference callbacks; + + @Getter + private boolean setupSuccessful = false; + public boolean setup() { + nativeGameSDK = GameSDK.getNativeGameSDK(); + if (nativeGameSDK == null) return false; + DiscordCreateParams discordCreateParams = new DiscordCreateParams(); + discordCreateParams.client_id = new DiscordClientID(816298079732498473L); + + callbacks = new IDiscordActivityEvents.ByReference(); + callbacks.OnActivityInvite = (eventData, type, user, activity) -> { + + }; + callbacks.OnActivityJoin = (eventData, secret) -> DungeonsGuide.getDungeonsGuide().getStompConnection().send(new StompPayload().method(StompHeader.SEND) + .header("destination", "/app/party.askedtojoin") + .payload(new JSONObject().put("token", secret).toString())); + callbacks.OnActivityJoinRequest = (eventData, user) -> { + PartyJoinRequest partyJoinRequest = new PartyJoinRequest(); + partyJoinRequest.setDiscordUser(user); + partyJoinRequest.setExpire(System.currentTimeMillis() + 30000); + + PartyInviteViewer.INSTANCE.joinRequests.add(partyJoinRequest); + }; + callbacks.OnActivitySpectate = (eventData, secret) -> { + + }; + callbacks.write(); + discordCreateParams.activity_events = callbacks; + + PointerByReference pointerByReference = new PointerByReference(); + nativeGameSDK.DiscordCreate(new DiscordVersion(NativeGameSDK.DISCORD_VERSION), discordCreateParams, pointerByReference); + if (pointerByReference.getValue() == Pointer.NULL) return false; + iDiscordCore = new IDiscordCore(pointerByReference.getValue()); + + iDiscordCore.SetLogHook.setLogHook(iDiscordCore, EDiscordLogLevel.DiscordLogLevel_Debug, Pointer.NULL, new IDiscordCore.LogHook() { + @Override + public void hook(Pointer hookData, EDiscordLogLevel level, String message) { + System.out.println(message+" - "+level+" - "+hookData); + } + }); + + activityManager = iDiscordCore.GetActivityManager.getActivityManager(iDiscordCore); + latestDiscordActivity = new DiscordActivity(); + latestDiscordActivity.assets = new DiscordActivityAssets(); + GameSDK.writeString(latestDiscordActivity.assets.large_image, "mort"); + GameSDK.writeString(latestDiscordActivity.assets.large_text, "mort"); + return true; } private final SkyblockStatus skyblockStatus = DungeonsGuide.getDungeonsGuide().getSkyblockStatus(); + private DiscordActivity latestDiscordActivity; public void updatePresence() { -// if (!skyblockStatus.isOnHypixel() || !FeatureRegistry.ADVANCED_RICHPRESENCE.isEnabled() || (!skyblockStatus.isOnSkyblock() && FeatureRegistry.ADVANCED_RICHPRESENCE.<Boolean>getParameter("disablenotskyblock").getValue())) { -// DiscordRPC.discordClearPresence(); -// } else { -// String name = skyblockStatus.getDungeonName(); -// if (name.trim().equals("Your Island")) name = "Private Island"; -// DiscordRichPresence.Builder richPresenceBuilder = new DiscordRichPresence.Builder(name); -// richPresenceBuilder.setBigImage("mort", "mort") -// .setParty(PartyManager.INSTANCE.getPartyID(), PartyManager.INSTANCE.getMemberCount(), PartyManager.INSTANCE.getMaxParty()); -// -// if (skyblockStatus.getContext() != null) { -// DungeonContext dungeonContext = skyblockStatus.getContext(); -// long init = dungeonContext.getInit(); -// richPresenceBuilder.setStartTimestamps(init); -// -// if (dungeonContext.getBossfightProcessor() != null) { -// richPresenceBuilder.setDetails("Fighting "+dungeonContext.getBossfightProcessor().getBossName()+": "+dungeonContext.getBossfightProcessor().getCurrentPhase()); -// } else { -// richPresenceBuilder.setDetails("Clearing rooms"); -// } -// } -// if (PartyManager.INSTANCE.isAllowAskToJoin()) -// richPresenceBuilder.setSecrets(PartyManager.INSTANCE.getAskToJoinSecret(), null); -// richPresenceBuilder.setDetails("Dungeons Guide"); -// DiscordRPC.discordUpdatePresence(richPresenceBuilder.build()); -// } - } + if (!skyblockStatus.isOnHypixel() || !FeatureRegistry.ADVANCED_RICHPRESENCE.isEnabled() || (!skyblockStatus.isOnSkyblock() && FeatureRegistry.ADVANCED_RICHPRESENCE.<Boolean>getParameter("disablenotskyblock").getValue())) { + activityManager.ClearActivity.clearActivity(activityManager, Pointer.NULL, new NativeGameSDK.DiscordCallback() { + @Override + public void callback(Pointer callbackData, EDiscordResult result) { + System.out.println("Discord Returned "+result+" For Clearing RPC"); + } + }); + } else { + String name = skyblockStatus.getDungeonName(); + if (name.trim().equals("Your Island")) name = "Private Island"; + GameSDK.writeString(latestDiscordActivity.state, name); - @SubscribeEvent - public void joinSkyblock(SkyblockJoinedEvent skyblockJoinedEvent) { - updatePresence(); - } - @SubscribeEvent - public void leaveSkyblock(SkyblockLeftEvent skyblockLeftEvent) { - updatePresence(); - } - private String lastLoc = ""; + if (PartyManager.INSTANCE.getPartyID() != null) { + if (latestDiscordActivity.party == null) latestDiscordActivity.party = new DiscordActivityParty(); + GameSDK.writeString(latestDiscordActivity.party.id, PartyManager.INSTANCE.getPartyID()); + if (latestDiscordActivity.party.discordActivityParty == null) latestDiscordActivity.party.discordActivityParty = new DiscordPartySize(); + latestDiscordActivity.party.discordActivityParty.current_size = new Int32(PartyManager.INSTANCE.getMemberCount()); + latestDiscordActivity.party.discordActivityParty.max_size = new Int32(PartyManager.INSTANCE.getMaxParty()); + } else { + latestDiscordActivity.party = null; + } + GameSDK.writeString(latestDiscordActivity.state, name); + if (skyblockStatus.getContext() != null) { + DungeonContext dungeonContext = skyblockStatus.getContext(); + long init = dungeonContext.getInit(); + if (latestDiscordActivity.timestamps == null) + latestDiscordActivity.timestamps = new DiscordActivityTimestamps(); + latestDiscordActivity.timestamps.start = new DiscordTimestamp(init); - @SubscribeEvent - public void tick(TickEvent.ClientTickEvent clientTickEvent) { + if (dungeonContext.getBossfightProcessor() != null) { + GameSDK.writeString(latestDiscordActivity.details, "Fighting "+dungeonContext.getBossfightProcessor().getBossName()+": "+dungeonContext.getBossfightProcessor().getCurrentPhase()); + } else { + GameSDK.writeString(latestDiscordActivity.details, "Clearing Rooms"); + } + } else { + latestDiscordActivity.timestamps = null; + GameSDK.writeString(latestDiscordActivity.details, "Dungeons Guide"); + } + if (PartyManager.INSTANCE.isAllowAskToJoin()) { + if (latestDiscordActivity.secrets == null) + latestDiscordActivity.secrets = new DiscordActivitySecrets(); + GameSDK.writeString(latestDiscordActivity.secrets.join, PartyManager.INSTANCE.getAskToJoinSecret()); + } else { + latestDiscordActivity.secrets = null; + } + activityManager.UpdateActivity.updateActivity(activityManager, latestDiscordActivity, Pointer.NULL, new NativeGameSDK.DiscordCallback() { + @Override + public void callback(Pointer callbackData, EDiscordResult result) { + System.out.println("Discord Returned "+result+" For Setting new RPC"); + } + }); + } } + @Override public void run() { - -// try { -// Thread.sleep(300L); -// setup(); -// while(!Thread.interrupted()) { -// DiscordRPC.discordRunCallbacks(); -// if (skyblockStatus.isOnSkyblock() && !lastLoc.equalsIgnoreCase(skyblockStatus.getDungeonName())) { -// lastLoc = skyblockStatus.getDungeonName()+""; -// } -// updatePresence(); -// Thread.sleep(300L); -// } -// } catch (Exception e) {e.printStackTrace();} + setupSuccessful = setup(); + if (!setupSuccessful) return; + while(!Thread.interrupted()) { + iDiscordCore.RunCallbacks.runCallbacks(iDiscordCore); + updatePresence(); + try { + Thread.sleep(300L); + } catch (Exception e) {e.printStackTrace();} + } } } |