532 lines
17 KiB
Java
532 lines
17 KiB
Java
package defpackage;
|
|
|
|
import com.google.gson.JsonObject;
|
|
import com.google.gson.JsonParser;
|
|
import com.google.gson.JsonSyntaxException;
|
|
import java.io.EOFException;
|
|
import java.io.IOException;
|
|
import java.nio.ByteBuffer;
|
|
import java.nio.ByteOrder;
|
|
import java.nio.charset.StandardCharsets;
|
|
import java.util.UUID;
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
|
|
public final class ej {
|
|
private static final String APPLICATION_ID = "1545379399451549787";
|
|
private static final String WORKER_THREAD = "evo-discord-rpc";
|
|
private static final String READER_THREAD = "evo-discord-rpc-reader";
|
|
private static final String CLOSER_THREAD = "evo-discord-rpc-closer";
|
|
private static final int OP_HANDSHAKE = 0;
|
|
private static final int OP_FRAME = 1;
|
|
private static final int OP_CLOSE = 2;
|
|
private static final int OP_PING = 3;
|
|
private static final int OP_PONG = 4;
|
|
private static final int PROTOCOL_VERSION = 1;
|
|
private static final int HEADER_BYTES = 8;
|
|
private static final int MAX_FRAME_BYTES = 65536;
|
|
private static final long POLL_INTERVAL_MILLIS = 250L;
|
|
private static final long RECONNECT_DELAY_MILLIS = 15000L;
|
|
private static final long HANDSHAKE_TIMEOUT_MILLIS = 5000L;
|
|
private static final long UPDATE_INTERVAL_MILLIS = 4000L;
|
|
private static final String KEY_VERSION = "v";
|
|
private static final String KEY_CLIENT_ID = "client_id";
|
|
private static final String KEY_COMMAND = "cmd";
|
|
private static final String KEY_NONCE = "nonce";
|
|
private static final String KEY_ARGUMENTS = "args";
|
|
private static final String KEY_PROCESS_ID = "pid";
|
|
private static final String KEY_ACTIVITY = "activity";
|
|
private static final String KEY_EVENT = "evt";
|
|
private static final String COMMAND_SET_ACTIVITY = "SET_ACTIVITY";
|
|
private static final String EVENT_READY = "READY";
|
|
private static final String EVENT_ERROR = "ERROR";
|
|
private static final String WRITE_FAILURE = "discord rpc write failed";
|
|
private static final String READ_FAILURE = "discord rpc read failed";
|
|
private static final String FRAME_OVERSIZE = "discord rpc frame exceeds the accepted size";
|
|
private static final String STREAM_CLOSED = "discord rpc stream closed";
|
|
private static final String REJECTED = "discord rpc rejected the presence: {}";
|
|
private static final ej INSTANCE = new ej();
|
|
private final Object writeLock = new Object();
|
|
private final AtomicBoolean running = new AtomicBoolean();
|
|
private volatile eg channel;
|
|
private volatile Thread worker;
|
|
private volatile ee desired;
|
|
private volatile boolean ready;
|
|
private volatile long connectedAt;
|
|
private ee published;
|
|
private long publishedAt;
|
|
|
|
private ej() {
|
|
}
|
|
|
|
public static ej getInstance() {
|
|
return INSTANCE;
|
|
}
|
|
|
|
public void start() {
|
|
Thread var1 = null;
|
|
int var2 = 1068593499;
|
|
|
|
while (true) {
|
|
switch (var2) {
|
|
case -962560403:
|
|
var1 = new Thread(this::run, "evo-discord-rpc");
|
|
var1.setDaemon((boolean)((((1158314859 | -1158314858) + (1158314859 & -1158314858))) != 0));
|
|
this.worker = var1;
|
|
var1.start();
|
|
return;
|
|
case -661779035:
|
|
return;
|
|
case 1068593499:
|
|
}
|
|
|
|
if (!this.running
|
|
.compareAndSet(
|
|
(boolean)((((0)) != 0)), (boolean)((((981407847 ^ -981407846) + ((981407847 & -981407846) << 1))
|
|
) != 0))) {
|
|
var2 = -661779035;
|
|
} else {
|
|
var2 = -962560403;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void stop() {
|
|
Thread var1 = null;
|
|
int var2 = -1551271449;
|
|
|
|
while (true) {
|
|
switch (var2) {
|
|
case -1561681330:
|
|
this.desired = null;
|
|
this.disconnect();
|
|
var1 = this.worker;
|
|
this.worker = null;
|
|
if (var1 != null) {
|
|
var2 = -834720273;
|
|
} else {
|
|
var2 = -678120021;
|
|
}
|
|
break;
|
|
case -1551271449:
|
|
default:
|
|
if (!this.running
|
|
.compareAndSet((boolean)((((1)) != 0)), (boolean)((((-984041706 | 984041706) + (-984041706 & 984041706))) != 0))
|
|
)
|
|
{
|
|
var2 = -1293544215;
|
|
} else {
|
|
var2 = -1561681330;
|
|
}
|
|
break;
|
|
case -1293544215:
|
|
return;
|
|
case -834720273:
|
|
var1.interrupt();
|
|
var2 = -678120021;
|
|
break;
|
|
case -678120021:
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void publish(ee var1) {
|
|
this.desired = var1;
|
|
}
|
|
|
|
private void run() {
|
|
int var1 = 1760255528;
|
|
|
|
while (true) {
|
|
switch (var1) {
|
|
case -2097683235:
|
|
var1 = 918897648;
|
|
break;
|
|
case -235325628:
|
|
if (!sleepQuietly(this.step())) {
|
|
var1 = -2097683235;
|
|
} else {
|
|
var1 = 1760255528;
|
|
}
|
|
break;
|
|
case 918897648:
|
|
this.disconnect();
|
|
return;
|
|
case 1760255528:
|
|
default:
|
|
if (this.running.get()) {
|
|
var1 = 2044166286;
|
|
} else {
|
|
var1 = 918897648;
|
|
}
|
|
break;
|
|
case 2044166286:
|
|
if (!Thread.currentThread().isInterrupted()) {
|
|
var1 = -235325628;
|
|
} else {
|
|
var1 = 918897648;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private long step() {
|
|
long var1 = (3552345364763123938L | -3552345364763123938L) + (3552345364763123938L & -3552345364763123938L);
|
|
ee var3 = null;
|
|
int var4 = 0;
|
|
long var6 = (-7845690816623487297L | 7845690816623487297L) + (-7845690816623487297L & 7845690816623487297L);
|
|
int var8 = 0;
|
|
int var5 = -950393529;
|
|
|
|
while (true) {
|
|
switch (var5) {
|
|
case -2074418871:
|
|
this.published = var3;
|
|
this.publishedAt = var1;
|
|
var5 = -1682522485;
|
|
break;
|
|
case -1995409929:
|
|
this.disconnect();
|
|
return (-4673272022140018221L ^ 4673272022140033221L) + ((-4673272022140018221L & 4673272022140033221L) << 1);
|
|
case -1737260724:
|
|
if (this.send(var3)) {
|
|
var5 = -2074418871;
|
|
} else {
|
|
var5 = -1682522485;
|
|
}
|
|
break;
|
|
case -1699395559:
|
|
var8 = 0;
|
|
var5 = 54943915;
|
|
break;
|
|
case -1682522485:
|
|
return (2173151793410658894L ^ -2173151793410658644L) + ((2173151793410658894L & -2173151793410658644L) << 1);
|
|
case -1618248632:
|
|
if (var4 != 0) {
|
|
var5 = -243765206;
|
|
} else {
|
|
var5 = -1682522485;
|
|
}
|
|
break;
|
|
case -1536276016:
|
|
var6 = (-4009422882166496314L | 4009422882166496564L) + (-4009422882166496314L & 4009422882166496564L);
|
|
var5 = 168135503;
|
|
break;
|
|
case -1095367043:
|
|
var3 = this.desired;
|
|
if (var1 - this.publishedAt >= (1523396058115690918L | -1523396058115686918L) + (1523396058115690918L & -1523396058115686918L)) {
|
|
var5 = 1613159490;
|
|
} else {
|
|
var5 = -1699395559;
|
|
}
|
|
break;
|
|
case -950393529:
|
|
default:
|
|
if (this.channel == null) {
|
|
var5 = 1563977083;
|
|
} else {
|
|
var5 = -554027521;
|
|
}
|
|
break;
|
|
case -745434838:
|
|
var6 = (-1342567990837805936L | 1342567990837820936L) + (-1342567990837805936L & 1342567990837820936L);
|
|
var5 = 168135503;
|
|
break;
|
|
case -554027521:
|
|
var1 = System.currentTimeMillis();
|
|
if (!this.ready) {
|
|
var5 = 126521102;
|
|
} else {
|
|
var5 = -1095367043;
|
|
}
|
|
break;
|
|
case -243765206:
|
|
if (!var3.equals(this.published)) {
|
|
var5 = -1737260724;
|
|
} else {
|
|
var5 = -1682522485;
|
|
}
|
|
break;
|
|
case 54943915:
|
|
var4 = var8;
|
|
if (var3 != null) {
|
|
var5 = -1618248632;
|
|
} else {
|
|
var5 = -1682522485;
|
|
}
|
|
break;
|
|
case 126521102:
|
|
if (var1 - this.connectedAt < (-4503330131584102211L ^ 4503330131584107211L) + ((-4503330131584102211L & 4503330131584107211L) << 1)) {
|
|
var5 = 1318703395;
|
|
} else {
|
|
var5 = -1995409929;
|
|
}
|
|
break;
|
|
case 168135503:
|
|
return var6;
|
|
case 1318703395:
|
|
return (-6408688868538313359L ^ 6408688868538313609L) + ((-6408688868538313359L & 6408688868538313609L) << 1);
|
|
case 1563977083:
|
|
if (this.connect()) {
|
|
var5 = -1536276016;
|
|
} else {
|
|
var5 = -745434838;
|
|
}
|
|
break;
|
|
case 1613159490:
|
|
var8 = 1;
|
|
var5 = 54943915;
|
|
}
|
|
}
|
|
}
|
|
|
|
private boolean connect() {
|
|
eg var1 = null;
|
|
JsonObject var2 = null;
|
|
Thread var3 = null;
|
|
int var4 = 199874470;
|
|
|
|
while (true) {
|
|
switch (var4) {
|
|
case -1560035544:
|
|
return (boolean)(((0)) != 0);
|
|
case -799431880:
|
|
var3 = new Thread(
|
|
() -> this.read(var1),
|
|
"evo-discord-rpc-reader"
|
|
);
|
|
var3.setDaemon((boolean)((((2067258406 | -2067258405) + (2067258406 & -2067258405))) != 0));
|
|
var3.start();
|
|
return (boolean)(((1)) != 0);
|
|
case 199874470:
|
|
default:
|
|
var1 = el.open();
|
|
if (var1 == null) {
|
|
var4 = 891534302;
|
|
} else {
|
|
var4 = 1931776594;
|
|
}
|
|
break;
|
|
case 891534302:
|
|
return (boolean)(((0)) != 0);
|
|
case 1931776594:
|
|
this.channel = var1;
|
|
this.connectedAt = System.currentTimeMillis();
|
|
var2 = new JsonObject();
|
|
var2.addProperty(
|
|
"v", (1960855922 ^ -1960855921) + ((1960855922 & -1960855921) << 1)
|
|
);
|
|
var2.addProperty(
|
|
"client_id",
|
|
"1545379399451549787"
|
|
);
|
|
if (!this.writeJson(var1, 0, var2)) {
|
|
var4 = -1560035544;
|
|
} else {
|
|
var4 = -799431880;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private boolean send(ee var1) {
|
|
JsonObject var2 = new JsonObject();
|
|
var2.addProperty("pid", ProcessHandle.current().pid());
|
|
var2.add("activity", var1.toJson());
|
|
JsonObject var3 = new JsonObject();
|
|
var3.addProperty(
|
|
"cmd",
|
|
"SET_ACTIVITY"
|
|
);
|
|
var3.addProperty("nonce", UUID.randomUUID().toString());
|
|
var3.add("args", var2);
|
|
return this.writeJson(this.channel, 1, var3);
|
|
}
|
|
|
|
private boolean writeJson(eg var1, int var2, JsonObject var3) {
|
|
return this.writeFrame(var1, var2, var3.toString().getBytes(StandardCharsets.UTF_8));
|
|
}
|
|
|
|
private boolean writeFrame(eg var1, int var2, byte[] var3) {
|
|
if (var1 == null) {
|
|
return (boolean)(((0)) != 0);
|
|
}
|
|
|
|
ByteBuffer var4 = ByteBuffer.allocate((1490364701 ^ -1490364693) + ((1490364701 & -1490364693) << 1) + var3.length).order(ByteOrder.LITTLE_ENDIAN);
|
|
var4.putInt(var2);
|
|
var4.putInt(var3.length);
|
|
var4.put(var3);
|
|
|
|
try {
|
|
synchronized (this.writeLock) {
|
|
var1.write(var4.array());
|
|
}
|
|
|
|
return (boolean)(((1)) != 0);
|
|
} catch (IOException var8) {
|
|
id.warn(Cif.SOCIAL, "discord rpc write failed", var8);
|
|
this.disconnect();
|
|
return (boolean)(((0)) != 0);
|
|
}
|
|
}
|
|
|
|
private void read(eg var1) {
|
|
byte[] var2 = new byte[8];
|
|
|
|
try {
|
|
while (this.running.get() && this.channel == var1) {
|
|
readFully(var1, var2, (-337783278 ^ 337783286) + ((-337783278 & 337783286) << 1));
|
|
ByteBuffer var3 = ByteBuffer.wrap(var2).order(ByteOrder.LITTLE_ENDIAN);
|
|
int var4 = var3.getInt();
|
|
int var5 = var3.getInt();
|
|
if (var5 < 0 || var5 > (1844279940 | -1844214404) + (1844279940 & -1844214404)) {
|
|
throw new IOException(
|
|
"discord rpc frame exceeds the accepted size"
|
|
);
|
|
}
|
|
|
|
byte[] var6 = new byte[var5];
|
|
readFully(var1, var6, var5);
|
|
this.handle(var1, var4, var6);
|
|
}
|
|
} catch (IOException var7) {
|
|
if (this.running.get() && this.channel == var1) {
|
|
id.warn(
|
|
Cif.SOCIAL, "discord rpc read failed", var7
|
|
);
|
|
this.disconnect();
|
|
}
|
|
}
|
|
}
|
|
|
|
private void handle(eg var1, int var2, byte[] var3) {
|
|
switch (var2) {
|
|
case 1:
|
|
this.inspect(var3);
|
|
break;
|
|
case 2:
|
|
this.disconnect();
|
|
break;
|
|
case 3:
|
|
this.writeFrame(var1, 4, var3);
|
|
}
|
|
}
|
|
|
|
private void inspect(byte[] var1) {
|
|
String var2 = new String(var1, StandardCharsets.UTF_8);
|
|
|
|
JsonObject var3;
|
|
try {
|
|
var3 = JsonParser.parseString(var2).getAsJsonObject();
|
|
} catch (JsonSyntaxException | IllegalStateException var5) {
|
|
return;
|
|
}
|
|
|
|
if (var3.has("evt")
|
|
&& !var3.get("evt").isJsonNull()) {
|
|
String var4 = var3.get("evt").getAsString();
|
|
if ("READY".equals(var4)) {
|
|
this.ready = (boolean)(((1)) != 0);
|
|
} else if ("ERROR".equals(var4)) {
|
|
id.warn(
|
|
Cif.SOCIAL, "discord rpc rejected the presence: {}", var2
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void disconnect() {
|
|
eg var1;
|
|
synchronized (this) {
|
|
var1 = this.channel;
|
|
this.channel = null;
|
|
this.ready = (boolean)(((0)) != 0);
|
|
this.published = null;
|
|
this.publishedAt = (1006604842457957131L | -1006604842457957131L) + (1006604842457957131L & -1006604842457957131L);
|
|
}
|
|
|
|
detach(var1);
|
|
}
|
|
|
|
private static void detach(eg var0) {
|
|
Thread var1 = null;
|
|
int var2 = 2062884787;
|
|
|
|
while (true) {
|
|
switch (var2) {
|
|
case -1344120312:
|
|
var1 = new Thread(
|
|
() -> release(var0), "evo-discord-rpc-closer"
|
|
);
|
|
var1.setDaemon((boolean)((((1138461147 | -1138461146) + (1138461147 & -1138461146))) != 0));
|
|
var1.start();
|
|
return;
|
|
case -307130357:
|
|
return;
|
|
case 2062884787:
|
|
}
|
|
|
|
if (var0 == null) {
|
|
var2 = -307130357;
|
|
} else {
|
|
var2 = -1344120312;
|
|
}
|
|
}
|
|
}
|
|
|
|
private static void release(eg var0) {
|
|
try {
|
|
var0.close();
|
|
} catch (IOException var2) {
|
|
id.debug(Cif.SOCIAL, "discord rpc stream closed");
|
|
}
|
|
}
|
|
|
|
private static void readFully(eg var0, byte[] var1, int var2) throws IOException {
|
|
int var3 = 0;
|
|
int var4 = 0;
|
|
int var5 = 1722846908;
|
|
|
|
while (true) {
|
|
switch (var5) {
|
|
case -871863889:
|
|
throw new EOFException("discord rpc stream closed");
|
|
case 56894932:
|
|
var4 = var0.read(var1, var3, var2 - var3);
|
|
if (var4 < 0) {
|
|
var5 = -871863889;
|
|
} else {
|
|
var5 = 498017331;
|
|
}
|
|
break;
|
|
case 498017331:
|
|
var3 += var4;
|
|
var5 = 794711015;
|
|
break;
|
|
case 794711015:
|
|
if (var3 < var2) {
|
|
var5 = 56894932;
|
|
} else {
|
|
var5 = 1207010735;
|
|
}
|
|
break;
|
|
case 1207010735:
|
|
return;
|
|
case 1722846908:
|
|
default:
|
|
var3 = 0;
|
|
var5 = 794711015;
|
|
}
|
|
}
|
|
}
|
|
|
|
private static boolean sleepQuietly(long var0) {
|
|
try {
|
|
Thread.sleep(var0);
|
|
return (boolean)(((1)) != 0);
|
|
} catch (InterruptedException var3) {
|
|
Thread.currentThread().interrupt();
|
|
return (boolean)(((0)) != 0);
|
|
}
|
|
}
|
|
}
|