diff --git a/.classpath b/.classpath
new file mode 100644
index 0000000..149cb3c
--- /dev/null
+++ b/.classpath
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..2941331
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+bin/
+target/
\ No newline at end of file
diff --git a/.project b/.project
new file mode 100644
index 0000000..4651bff
--- /dev/null
+++ b/.project
@@ -0,0 +1,23 @@
+
+
+ AnimeRPC
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+
+
+ org.eclipse.m2e.core.maven2Nature
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..ab43c2c
--- /dev/null
+++ b/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding//src/me/despawningbone/selfbot/DiscordBot.java=UTF-8
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..db24ee7
--- /dev/null
+++ b/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,15 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore
+org.eclipse.jdt.core.compiler.release=disabled
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..15175f3
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,61 @@
+
+ 4.0.0
+ AnimeRPC
+ AnimeRPC
+ 0.0.1-SNAPSHOT
+
+ src
+
+
+ maven-compiler-plugin
+ 3.5.1
+
+
+ 1.8
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ 2.4.3
+
+
+
+
+
+ package
+
+ shade
+
+
+
+
+
+
+
+
+ club.minnced
+ java-discord-rpc
+ 2.0.2
+
+
+
+ net.java.dev.jna
+ jna
+ 5.6.0
+
+
+
+ net.java.dev.jna
+ jna-platform
+ 5.6.0
+
+
+
+
+ jcenter
+ jcenter-bintray
+ http://jcenter.bintray.com
+
+
+
\ No newline at end of file
diff --git a/src/me/despawningbone/selfbot/DiscordBot.java b/src/me/despawningbone/selfbot/DiscordBot.java
new file mode 100644
index 0000000..e156923
--- /dev/null
+++ b/src/me/despawningbone/selfbot/DiscordBot.java
@@ -0,0 +1,126 @@
+package me.despawningbone.selfbot;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+import com.sun.jna.Native;
+import com.sun.jna.Platform;
+import com.sun.jna.platform.win32.WinDef.HWND;
+
+import club.minnced.discord.rpc.DiscordEventHandlers;
+import club.minnced.discord.rpc.DiscordRPC;
+import club.minnced.discord.rpc.DiscordRichPresence;
+
+import com.sun.jna.platform.win32.User32;
+
+public class DiscordBot {
+
+ public static String prevTitle = "";
+ public static DiscordRichPresence prevPresence = new DiscordRichPresence();
+ public static boolean cleared = false;
+
+ public static void main(String[] args) {
+
+ DiscordRPC lib = DiscordRPC.INSTANCE;
+ String applicationId = "542685911607934986";
+ String steamId = "";
+ DiscordEventHandlers handlers = new DiscordEventHandlers();
+ handlers.ready = (user) -> System.out.println("Ready!");
+ lib.Discord_Initialize(applicationId, handlers, true, steamId);
+ new Thread(() -> {
+ while(true) {
+ lib.Discord_RunCallbacks();
+ String temp = "";
+ if(Platform.isWindows()) {
+ char[] buffer = new char[2048];
+ HWND hwnd = User32.INSTANCE.GetForegroundWindow();
+ User32.INSTANCE.GetWindowText(hwnd, buffer, 1024);
+ temp = Native.toString(buffer);
+ } else if(Platform.isMac()) {
+ final String[] script = {"osascript", "-e", "tell application \"System Events\"", "-e", "tell (first process whose frontmost is true) to return name of window 1", "-e", "end tell"};
+ try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec(script).getInputStream()))) {
+ String buffer = null;
+ while ((buffer = bufferedReader.readLine()) != null) {
+ temp = buffer;
+ System.out.println(temp);
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ try {
+ Thread.sleep(2000);
+ } catch (InterruptedException e) {e.printStackTrace();}
+ if(temp.contains("- Watch Anime") || temp.contains("Online Sub - AnimeKisa")) {
+ if(temp.contains("AnimeKisa")) {
+ String title = temp.substring(6).split(" Online Sub - AnimeKisa")[0];
+ if(!prevTitle.equals(title)) {
+ System.out.println(title);
+ String[] split = title.split("Episode");
+ String epi = "Episode" + split[1]; //animekisa puts everything with episode
+ String name = split[0];
+ DiscordRichPresence presence = new DiscordRichPresence();
+ presence.details = name;
+ if(!epi.isEmpty()) presence.state = epi;
+ presence.largeImageKey = "animekisa";
+ presence.largeImageText = "animekisa";
+ //presence.startTimestamp = System.currentTimeMillis() / 1000; // epoch second
+ System.out.println(presence.details);
+ System.out.println(presence.state);
+ //presence.details = "";
+ lib.Discord_UpdatePresence(presence);
+ prevTitle = title;
+ prevPresence = presence;
+ cleared = false;
+ }
+ } else {
+ String title = temp.split("- Watch Anime")[0];
+ if(!prevTitle.equals(title)) {
+ System.out.println(title);
+ String[] split = title.split("Episode");
+ String epi = "";
+ String name = split[0];
+ if(!temp.contains("- Watch Anime Movie Online English Subbed")) {
+ if(split.length < 2) continue; //theres no reason for it to not have episodes if its not movie
+ epi = "Episode" + split[1];
+ } else {
+ epi = "Anime Movie";
+ }
+ DiscordRichPresence presence = new DiscordRichPresence();
+ presence.details = name;
+ if(!epi.isEmpty()) presence.state = epi;
+ presence.largeImageKey = "otakustream";
+ presence.largeImageText = "OtakuStream";
+ //presence.startTimestamp = System.currentTimeMillis() / 1000; // epoch second
+ System.out.println(presence.details);
+ System.out.println(presence.state);
+ //presence.details = "";
+ lib.Discord_UpdatePresence(presence);
+ prevTitle = title;
+ prevPresence = presence;
+ cleared = false;
+ }
+ }
+
+ } else {
+ if(!cleared && !temp.contains(" - Discord") && !temp.contains("工作切換") && !temp.contains("Picture-in-Picture")) {
+ lib.Discord_ClearPresence();
+ cleared = true;
+ prevTitle = "";
+ }
+ /*if(prevPresence.details != null && !prevPresence.details.equals("Idle")) {
+ DiscordRichPresence presence = new DiscordRichPresence();
+ presence.details = "Idle";
+ presence.largeImageKey = "otakustream";
+ presence.largeImageText = "OtakuStream";
+ lib.Discord_UpdatePresence(presence);
+ prevPresence = presence;
+ }*/
+ }
+ }
+ }, "RPC-Callback-Handler").start();
+
+
+ }
+}