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); } } }