Skip to content

Instantly share code, notes, and snippets.

@itsfolf
Last active June 23, 2018 15:38
Show Gist options
  • Save itsfolf/cbb6b03314f4ecf0959490d77a5ee312 to your computer and use it in GitHub Desktop.
Save itsfolf/cbb6b03314f4ecf0959490d77a5ee312 to your computer and use it in GitHub Desktop.
package me.checkium.bgservices.discord.rpc;
import club.minnced.discord.rpc.DiscordEventHandlers;
import club.minnced.discord.rpc.DiscordRPC;
import club.minnced.discord.rpc.DiscordRichPresence;
import com.sun.jna.Native;
import com.sun.jna.platform.win32.*;
import com.sun.jna.ptr.IntByReference;
import java.io.File;
import java.util.Calendar;
public class ProccessSeeker {
int MAX_TITLE_LENGTH = 1024;
DiscordRPC lib = DiscordRPC.INSTANCE;
DiscordRichPresence presence = new DiscordRichPresence();
int updatedTimes = 0;
long lastUpdate = System.currentTimeMillis();
public ProccessSeeker() {
String applicationId = "458388780068503562";
DiscordEventHandlers handlers = new DiscordEventHandlers();
handlers.ready = (user) -> System.out.println("Ready!");
lib.Discord_Initialize(applicationId, handlers, true, null);
new Thread(() -> {
while (true) {
try {
run();
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "ProcessUpdater").start();
new Thread(() -> {
while (!Thread.currentThread().isInterrupted()) {
lib.Discord_RunCallbacks();
try {
Thread.sleep(2000);
} catch (InterruptedException ignored) {
}
}
}, "RPC-Callback-Handler").start();
}
public void run() throws InterruptedException {
String firstLine = null;
String secondLine = null;
String largeImageKey = null;
String largeImageText = null;
String smallImageKey = null;
String smallImageText = null;
char[] buffer = new char[MAX_TITLE_LENGTH];
char[] processBuffer = new char[MAX_TITLE_LENGTH];
WinDef.HWND hwnd = User32.INSTANCE.GetForegroundWindow();
User32.INSTANCE.GetWindowText(hwnd, buffer, MAX_TITLE_LENGTH);
String title = Native.toString(buffer);
IntByReference pointer = new IntByReference();
User32.INSTANCE.GetWindowThreadProcessId(User32.INSTANCE.GetForegroundWindow(), pointer);
WinNT.HANDLE process = Kernel32.INSTANCE.OpenProcess(0x0400 | 0x0010, false, pointer.getValue());
Psapi.INSTANCE.GetModuleFileNameExW(process, null, processBuffer, MAX_TITLE_LENGTH);
String processName = Native.toString(processBuffer);
System.out.println("Active window process: " + processName);
String processFile = new File(processName).getName().split("\\.")[0];
switch (processFile) {
case "idea64":
String projectName = null;
String fileName = null;
try {
projectName = title.split("\\[")[0].substring(0, title.split("\\[")[0].length() - 1);
fileName = title.split("\\\\")[title.split("\\\\").length - 1].split(" ")[0];
} catch (ArrayIndexOutOfBoundsException e) {
}
firstLine = "\uD83D\uDCBB IntelliJ IDEA ";
if (projectName != null && fileName != null) {
firstLine += "\uD83D\uDCDD " + fileName + " @ " + projectName;
} else if (projectName != null) {
firstLine += "\uD83D\uDC40 " + projectName;
} else if (fileName != null) {
firstLine += "\uD83D\uDCDD " + fileName;
} else {
firstLine = "";
}
largeImageKey = "intellij-logo-large";
largeImageText = "IntelliJ IDEA";
break;
case "notepad++":
fileName = title.split(" - ")[0];
if (fileName.contains("\\Checkium\\")) {
fileName = fileName.split("\\\\Checkium\\\\")[1];
}
firstLine = "\uD83D\uDCBB Notepad++ \uD83D\uDCDD " + fileName;
break;
case "MinecraftLauncher":
firstLine = "\uD83C\uDFAE Minecraft Launcher";
largeImageText = "Minecraft";
largeImageKey = "minecraft-logo";
break;
case "javaw":
if (title.contains("Minecraft")) {
firstLine = "\uD83C\uDFAE " + title;
largeImageText = "Minecraft";
largeImageKey = "minecraft-logo";
}
break;
case "chrome":
firstLine = "\uD83C\uDF10 Google Chrome";
largeImageText = "Google Chrome";
largeImageKey = "chrome-logo";
}
if (processFile == "DiscordCanary" && presence.largeImageKey != null) {
largeImageKey = presence.smallImageKey;
largeImageText = presence.smallImageText;
}
if (Youtube.author != null && Youtube.title != null && Youtube.last > System.currentTimeMillis() - 20000) {
secondLine = "\uD83C\uDFA7 " + Youtube.author + " - " + Youtube.title;
smallImageKey = "youtube";
smallImageText = "Youtube: " + Youtube.status;
}
if ((firstLine != null && firstLine != presence.details) || (secondLine != null && secondLine != presence.state)) {
if (System.currentTimeMillis() - lastUpdate > 60000) {
updatedTimes = 0;
}
presence.details = firstLine != null ? firstLine : presence.details;
presence.largeImageKey = largeImageKey != null ? largeImageKey : presence.largeImageKey;
presence.smallImageKey = smallImageKey != null ? smallImageKey : presence.smallImageKey;
presence.smallImageText = smallImageText != null ? smallImageText : presence.smallImageText;
presence.largeImageText = largeImageText!= null ? largeImageText : presence.largeImageText;
presence.state = secondLine != null ? secondLine : "https://checkium.me/";
lib.Discord_RunCallbacks();
lib.Discord_UpdatePresence(presence);
updatedTimes++;
lastUpdate = System.currentTimeMillis();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment