Ich bin gerade dabei, zu Testzwecken einen eigenen kleinen Discord-Client zu schreiben, der einfach alle eingehenden Nachrichten in der Konsole ausgibt. Zu diesem Zweck habe ich einen Websocket-Client eingerichtet:
[CODE lang="java" title="WebSocket Setup"]final WebSocketClientEndpoint clientEndPoint = new WebSocketClientEndpoint(new URI("wss://gateway.discord.gg/?v=9&encoding=json"), channel, dash);[/CODE]
Die Klasse WebScoketClientEndpoint sieht wie folgt aus:
[CODE lang="java" title="WebSocketClientEndpoint"]@ClientEndpoint
public class WebSocketClientEndpoint {
Session userSession = null;
private String dash;
private String channel;
public WebSocketClientEndpoint(URI endpointURI, String getChannel, String getDash) {
this.dash = getDash;
this.channel = getChannel;
try {
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
container.connectToServer(this, endpointURI);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}[/CODE]
Sobald der Websocket eingerichtet ist, sende ich eine entsprechende Authentifizierungsnachricht an Discord, die den Discord-Token enthält. Danach erhalte ich alle eingehenden Nachrichten.
Allerdings funktioniert das nur bei einem meiner Discord-Konten. Bei dem anderen bekomme ich nur
[CODE lang="java" title="Neue URL"]wss://gateway.discord.gg/?v=9&encoding=json&compress=zlib-stream[/CODE]
Damit erhalte ich auch Daten mit dem anderen Token. Allerdings ist dies ein
[CODE lang="java" title="ZLib Decoder"]@OnMessage
public void onMessage(byte[] message) {
String result = "";
try {
ByteArrayInputStream bais = new ByteArrayInputStream(message);
InflaterInputStream iis = new InflaterInputStream(bais);
byte[] buf = new byte[5];
int rlen = -1;
while ((rlen = iis.read(buf)) != -1) {
result += new String(Arrays.copyOf(buf, rlen));
}
} catch (IOException ignored) {
System.out.println(ignored);
}
System.out.println(result);
}[/CODE]
Dies funktioniert jedoch nur bei der ersten Nachricht. Bei allen weiteren tritt der Fehler auf:[CODE lang="java" title="ZLib Error"]java.util.zip.ZipException: incorrect header check[/CODE]
Hat jemand eine Idee, wie man die eingehende Nachricht in einen String umwandeln kann?
[CODE lang="java" title="WebSocket Setup"]final WebSocketClientEndpoint clientEndPoint = new WebSocketClientEndpoint(new URI("wss://gateway.discord.gg/?v=9&encoding=json"), channel, dash);[/CODE]
Die Klasse WebScoketClientEndpoint sieht wie folgt aus:
[CODE lang="java" title="WebSocketClientEndpoint"]@ClientEndpoint
public class WebSocketClientEndpoint {
Session userSession = null;
private String dash;
private String channel;
public WebSocketClientEndpoint(URI endpointURI, String getChannel, String getDash) {
this.dash = getDash;
this.channel = getChannel;
try {
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
container.connectToServer(this, endpointURI);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}[/CODE]
Sobald der Websocket eingerichtet ist, sende ich eine entsprechende Authentifizierungsnachricht an Discord, die den Discord-Token enthält. Danach erhalte ich alle eingehenden Nachrichten.
Allerdings funktioniert das nur bei einem meiner Discord-Konten. Bei dem anderen bekomme ich nur
CloseReason[1011,Buffer overflow.]
zurück. Um dies zu verhindern, habe ich etwas an das Ende der URL angehängt, genau wie bei den Anfragen von der Discord-Website an den Server:[CODE lang="java" title="Neue URL"]wss://gateway.discord.gg/?v=9&encoding=json&compress=zlib-stream[/CODE]
Damit erhalte ich auch Daten mit dem anderen Token. Allerdings ist dies ein
Byte[]
Nun habe ich alles wie folgt decodiert:[CODE lang="java" title="ZLib Decoder"]@OnMessage
public void onMessage(byte[] message) {
String result = "";
try {
ByteArrayInputStream bais = new ByteArrayInputStream(message);
InflaterInputStream iis = new InflaterInputStream(bais);
byte[] buf = new byte[5];
int rlen = -1;
while ((rlen = iis.read(buf)) != -1) {
result += new String(Arrays.copyOf(buf, rlen));
}
} catch (IOException ignored) {
System.out.println(ignored);
}
System.out.println(result);
}[/CODE]
Dies funktioniert jedoch nur bei der ersten Nachricht. Bei allen weiteren tritt der Fehler auf:[CODE lang="java" title="ZLib Error"]java.util.zip.ZipException: incorrect header check[/CODE]
Hat jemand eine Idee, wie man die eingehende Nachricht in einen String umwandeln kann?