Skip to content

Commit 2a9285a

Browse files
authored
Merge pull request #147 from Frederikam/feature/close-events
Release v3.1
2 parents 0b3ca3e + 1b1eb72 commit 2a9285a

21 files changed

+333
-465
lines changed

IMPLEMENTATION.md

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ Server emitted an event. See the client implementation below.
173173
```json
174174
{
175175
"op": "event",
176-
...
176+
"type": "..."
177177
}
178178
```
179179

@@ -185,7 +185,7 @@ Server emitted an event. See the client implementation below.
185185
* 2. TrackExceptionEvent
186186
* 3. TrackStuckEvent
187187
* <p>
188-
* The remaining are caused by the client
188+
* The remaining lavaplayer events are caused by client actions, and are therefore not forwarded via WS.
189189
*/
190190
private void handleEvent(JSONObject json) throws IOException {
191191
LavalinkPlayer player = (LavalinkPlayer) lavalink.getPlayer(json.getString("guildId"));
@@ -221,6 +221,22 @@ private void handleEvent(JSONObject json) throws IOException {
221221

222222
See also: [AudioTrackEndReason.java](https://github.com/sedmelluq/lavaplayer/blob/master/main/src/main/java/com/sedmelluq/discord/lavaplayer/track/AudioTrackEndReason.java)
223223

224+
Additionally there is also the `WebSocketClosedEvent`, which signals when an audio web socket (to Discord) is closed.
225+
This can happen for various reasons (normal and abnormal), e.g when using an expired voice server update.
226+
4xxx codes are usually bad.
227+
See the [Discord docs](https://discordapp.com/developers/docs/topics/opcodes-and-status-codes#voice-voice-close-event-codes).
228+
229+
```json
230+
{
231+
"op": "event",
232+
"type": "WebSocketClosedEvent",
233+
"guildId": "...",
234+
"code": 4006,
235+
"reason": "Your session is no longer valid.",
236+
"byRemote": true
237+
}
238+
```
239+
224240
### REST API
225241
The REST api is used to resolve audio tracks for use with the `play` op.
226242
```

LavalinkServer/application.yml.example

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
server: # REST server
1+
server: # REST and WS server
22
port: 2333
33
address: 0.0.0.0
44
spring:
@@ -7,9 +7,6 @@ spring:
77
lavalink:
88
server:
99
password: "youshallnotpass"
10-
ws:
11-
port: 80
12-
host: 0.0.0.0
1310
sources:
1411
youtube: true
1512
bandcamp: true

LavalinkServer/build.gradle

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,22 @@ test {
3636
}
3737

3838
dependencies {
39+
compile group: 'space.npstr', name: 'Magma', version: magmaVersion
3940
compile group: 'com.sedmelluq', name: 'lavaplayer', version: lavaplayerVersion
40-
compile group: 'com.github.DV8FromTheWorld', name: 'JDA-Audio', version: jdaAudioVersion
41-
compile group: 'com.github.FredBoat.jda-nas', name: 'jda-nas', version: jdaNasVersion
41+
compile group: 'com.sedmelluq', name: 'jda-nas', version: jdaNasVersion
42+
4243
compile group: 'com.github.shredder121', name: 'jda-async-packetprovider', version: jappVersion
43-
compile group: 'org.java-websocket', name: 'Java-WebSocket', version: javaWebSocketVersion
44+
//required by japp
45+
compile group: 'org.apache.commons', name: 'commons-lang3', version: commonsLangVersion
46+
compile group: 'org.springframework', name: 'spring-websocket', version: springWebSocketVersion
4447
compile group: 'ch.qos.logback', name: 'logback-classic', version: logbackVersion
4548
compile group: 'io.sentry', name: 'sentry-logback', version: sentryLogbackVersion
4649
compile group: 'com.github.oshi', name: 'oshi-core', version: oshiVersion
4750
compile group: 'org.json', name: 'json', version: jsonOrgVersion
48-
compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: springBootVersion
51+
compile(group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: springBootVersion) {
52+
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
53+
}
54+
compile group: 'org.springframework.boot', name: 'spring-boot-starter-undertow', version: springBootVersion
4955
compileOnly group: 'com.github.spotbugs', name: 'spotbugs-annotations', version: spotbugsAnnotationsVersion
5056

5157
compile group: 'io.prometheus', name: 'simpleclient', version: prometheusVersion

LavalinkServer/src/main/java/lavalink/server/Launcher.java

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -25,24 +25,19 @@
2525
import com.sedmelluq.discord.lavaplayer.tools.PlayerLibrary;
2626
import lavalink.server.info.AppInfo;
2727
import lavalink.server.info.GitRepoState;
28-
import lavalink.server.io.SocketServer;
29-
import lavalink.server.util.SimpleLogToSLF4JAdapter;
30-
import net.dv8tion.jda.utils.SimpleLog;
3128
import org.slf4j.Logger;
3229
import org.slf4j.LoggerFactory;
3330
import org.springframework.boot.SpringApplication;
3431
import org.springframework.boot.WebApplicationType;
3532
import org.springframework.boot.autoconfigure.SpringBootApplication;
3633
import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
3734
import org.springframework.boot.context.event.ApplicationFailedEvent;
38-
import org.springframework.context.annotation.ComponentScan;
3935

4036
import java.time.Instant;
4137
import java.time.ZoneId;
4238
import java.time.format.DateTimeFormatter;
4339

4440
@SpringBootApplication
45-
@ComponentScan
4641
public class Launcher {
4742

4843
private static final Logger log = LoggerFactory.getLogger(Launcher.class);
@@ -76,20 +71,6 @@ public static void main(String[] args) {
7671
sa.run(args);
7772
}
7873

79-
public Launcher(SocketServer socketServer) {
80-
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
81-
log.info("Shutdown hook triggered");
82-
try {
83-
socketServer.stop(30);
84-
} catch (InterruptedException e) {
85-
log.warn("Interrupted while stopping socket server", e);
86-
}
87-
}, "shutdown hook"));
88-
89-
SimpleLog.LEVEL = SimpleLog.Level.OFF;
90-
SimpleLog.addListener(new SimpleLogToSLF4JAdapter());
91-
}
92-
9374
private static String getVersionInfo() {
9475
AppInfo appInfo = new AppInfo();
9576
GitRepoState gitRepoState = new GitRepoState();
Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,29 @@
11
package lavalink.server.config;
22

3-
import org.springframework.boot.context.properties.ConfigurationProperties;
4-
import org.springframework.stereotype.Component;
3+
import lavalink.server.io.HandshakeInterceptorImpl;
4+
import lavalink.server.io.SocketServer;
5+
import org.springframework.beans.factory.annotation.Autowired;
6+
import org.springframework.context.annotation.Configuration;
7+
import org.springframework.web.socket.config.annotation.EnableWebSocket;
8+
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
9+
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
510

6-
/**
7-
* Created by napster on 05.03.18.
8-
*/
9-
@ConfigurationProperties(prefix = "lavalink.server.ws")
10-
@Component
11-
public class WebsocketConfig {
11+
@Configuration
12+
@EnableWebSocket
13+
public class WebsocketConfig implements WebSocketConfigurer {
1214

13-
private int port = 80;
14-
private String host = "0.0.0.0";
15+
private final SocketServer server;
16+
private final HandshakeInterceptorImpl handshakeInterceptor;
1517

16-
public int getPort() {
17-
return port;
18+
@Autowired
19+
public WebsocketConfig(SocketServer server, HandshakeInterceptorImpl handshakeInterceptor) {
20+
this.server = server;
21+
this.handshakeInterceptor = handshakeInterceptor;
1822
}
1923

20-
public void setPort(int port) {
21-
this.port = port;
22-
}
23-
24-
public String getHost() {
25-
return host;
26-
}
27-
28-
public void setHost(String host) {
29-
this.host = host;
24+
@Override
25+
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
26+
registry.addHandler(server, "/")
27+
.addInterceptors(handshakeInterceptor);
3028
}
3129
}

LavalinkServer/src/main/java/lavalink/server/info/AppInfo.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,11 @@ public AppInfo() {
3636
this.groupId = prop.getProperty("groupId");
3737
this.artifactId = prop.getProperty("artifactId");
3838
this.buildNumber = prop.getProperty("buildNumber");
39-
this.buildTime = Long.parseLong(prop.getProperty("buildTime"));
39+
long bTime = -1L;
40+
try {
41+
bTime = Long.parseLong(prop.getProperty("buildTime"));
42+
} catch (NumberFormatException ignored) { }
43+
this.buildTime = bTime;
4044
}
4145

4246
public String getVersion() {

LavalinkServer/src/main/java/lavalink/server/info/GitRepoState.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public GitRepoState() {
5050
this.commitMessageFull = String.valueOf(properties.getOrDefault("git.commit.message.full", ""));
5151
this.commitMessageShort = String.valueOf(properties.getOrDefault("git.commit.message.short", ""));
5252
final String time = String.valueOf(properties.get("git.commit.time"));
53-
if (time == null) {
53+
if (time == null || time.equals("null")) {
5454
this.commitTime = 0;
5555
} else {
5656
// https://github.com/n0mer/gradle-git-properties/issues/71

LavalinkServer/src/main/java/lavalink/server/io/ConnectionManagerImpl.java

Lines changed: 0 additions & 23 deletions
This file was deleted.

LavalinkServer/src/main/java/lavalink/server/io/CoreClientImpl.java

Lines changed: 0 additions & 61 deletions
This file was deleted.
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package lavalink.server.io;
2+
3+
import lavalink.server.config.ServerConfig;
4+
import org.slf4j.Logger;
5+
import org.slf4j.LoggerFactory;
6+
import org.springframework.beans.factory.annotation.Autowired;
7+
import org.springframework.http.server.ServerHttpRequest;
8+
import org.springframework.http.server.ServerHttpResponse;
9+
import org.springframework.stereotype.Controller;
10+
import org.springframework.web.socket.WebSocketHandler;
11+
import org.springframework.web.socket.server.HandshakeInterceptor;
12+
13+
import java.util.Map;
14+
import java.util.Objects;
15+
16+
@Controller
17+
public class HandshakeInterceptorImpl implements HandshakeInterceptor {
18+
19+
private static final Logger log = LoggerFactory.getLogger(HandshakeInterceptorImpl.class);
20+
private final ServerConfig serverConfig;
21+
22+
@Autowired
23+
public HandshakeInterceptorImpl(ServerConfig serverConfig) {
24+
this.serverConfig = serverConfig;
25+
}
26+
27+
/**
28+
* Checks credentials and sets the Lavalink version header
29+
*
30+
* @return true if authenticated
31+
*/
32+
@Override
33+
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
34+
Map<String, Object> attributes) {
35+
response.getHeaders().add("Lavalink-Major-Version", "3");
36+
37+
String password = request.getHeaders().getFirst("Authorization");
38+
boolean matches = Objects.equals(password, serverConfig.getPassword());
39+
40+
if (matches) {
41+
log.info("Incoming connection from " + request.getRemoteAddress());
42+
} else {
43+
log.error("Authentication failed from " + request.getRemoteAddress());
44+
}
45+
46+
return matches;
47+
}
48+
49+
// No action required
50+
@Override
51+
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
52+
Exception exception) {}
53+
}

0 commit comments

Comments
 (0)