evo/src/main/java/defpackage/ej.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);
}
}
}