Skip to content

Commit

Permalink
feat(socket): connect sockets as needed
Browse files Browse the repository at this point in the history
  • Loading branch information
iGoodie committed Nov 10, 2019
1 parent f3f9ffe commit b8c6160
Show file tree
Hide file tree
Showing 6 changed files with 89 additions and 79 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ org.gradle.daemon=false

mod_id=twitchspawn
mod_group=net.programmer.igoodie
mod_version=0.4.7
mod_version=0.4.8

minecraft_version=1.12.2
forge_version=14.23.3.2655
Expand Down
14 changes: 14 additions & 0 deletions src/main/java/net/programmer/igoodie/twitchspawn/TwitchSpawn.java
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,21 @@ public static void onPlayerLoggedIn(PlayerEvent.PlayerLoggedInEvent event) {
NetworkManager.CHANNEL.sendTo(
new StatusChangedPacket.Message(TRACE_MANAGER.isRunning()),
entity);

if(TRACE_MANAGER.isRunning())
TRACE_MANAGER.connectStreamer(entity.getName());

LOGGER.info("onPlayerLoggedIn()");
}

@SubscribeEvent
public static void onPlayerLoggedOut(PlayerEvent.PlayerLoggedOutEvent event) {
EntityPlayerMP entity = (EntityPlayerMP) event.player;

if(TRACE_MANAGER.isRunning())
TRACE_MANAGER.disconnectStreamer(entity.getName());

LOGGER.info("onPlayerLoggedOut()");
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -14,22 +14,16 @@ public abstract class SocketIOTracer {

protected TraceManager manager;
protected Platform api;
protected List<Socket> sockets;

public SocketIOTracer(Platform api, TraceManager manager) {
this.manager = manager;
this.api = api;
this.sockets = new LinkedList<>();
}

protected String liveEventChannelName() {
return "event";
}

public abstract void start();

public abstract void stop();

protected Socket createSocket(CredentialsConfig.Streamer streamer) {
checkCredentials(streamer);

Expand All @@ -41,8 +35,6 @@ protected Socket createSocket(CredentialsConfig.Streamer streamer) {
socket.on(Socket.EVENT_DISCONNECT, args -> onDisconnect(socket, streamer, args));
socket.on(liveEventChannelName(), args -> onLiveEvent(socket, streamer, args));

this.sockets.add(socket);

return socket;

} catch (URISyntaxException e) {
Expand All @@ -55,7 +47,7 @@ protected void checkCredentials(CredentialsConfig.Streamer streamer) {}
protected IO.Options generateOptions(CredentialsConfig.Streamer streamer) {
IO.Options options = new IO.Options();
options.forceNew = true;
options.reconnection = false;
options.reconnection = true;
options.transports = new String[]{"websocket"};

return options;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,32 +18,11 @@

public class StreamElementsSocketTracer extends SocketIOTracer {

public Set<Socket> authorized;
public boolean authorized;

public StreamElementsSocketTracer(TraceManager manager) {
super(Platform.STREAMELEMENTS, manager);
this.authorized = new HashSet<>();
}

@Override
public void start() {
TwitchSpawn.LOGGER.info("Starting StreamElements Tracer...");

// Create socket for every credential with StreamElements platform
ConfigManager.CREDENTIALS.streamers.stream()
.filter(streamer -> streamer.platform.equals(Platform.STREAMELEMENTS))
.forEach(this::createSocket);

this.sockets.forEach(Socket::connect);
}

@Override
public void stop() {
TwitchSpawn.LOGGER.info("Stopping StreamElements Tracer...");

this.sockets.forEach(Socket::disconnect);

this.sockets.clear();
this.authorized = false;
}

@Override
Expand All @@ -58,14 +37,14 @@ protected void onConnect(Socket socket, CredentialsConfig.Streamer streamer, Obj

socket.on("authenticated", foo -> {
TwitchSpawn.LOGGER.info("Connected to StreamElements Socket API with {}'s token successfully!", streamer.twitchNick);
authorized.add(socket);
authorized = true;
});

// TODO: refactor dis, duh :V
new Timer().schedule(new TimerTask() {
@Override
public void run() {
if (manager.isRunning() && !authorized.contains(socket)) {
if (manager.isRunning() && !authorized) {
TwitchSpawn.LOGGER.info("Disconnected from {}'s StreamElements Socket connection. (unauthorized)", streamer.minecraftNick);
manager.stop(null, streamer.twitchNick + " unauthorized by the socket server");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,36 +15,16 @@
import scala.util.parsing.json.JSON;

import java.util.HashSet;
import java.util.Optional;
import java.util.Set;

public class StreamlabsSocketTracer extends SocketIOTracer {

public Set<Socket> authorized;
public boolean authorized;

public StreamlabsSocketTracer(TraceManager manager) {
super(Platform.STREAMLABS, manager);
this.authorized = new HashSet<>();
}

@Override
public void start() {
TwitchSpawn.LOGGER.info("Starting Streamlabs Tracer...");

// Create socket for every credential with Streamlabs platform
ConfigManager.CREDENTIALS.streamers.stream()
.filter(streamer -> streamer.platform.equals(Platform.STREAMLABS))
.forEach(this::createSocket);

this.sockets.forEach(Socket::connect);
}

@Override
public void stop() {
TwitchSpawn.LOGGER.info("Stopping Streamlabs Tracer...");

this.sockets.forEach(Socket::disconnect);

this.sockets.clear();
this.authorized = false;
}

@Override
Expand All @@ -57,17 +37,15 @@ protected IO.Options generateOptions(CredentialsConfig.Streamer streamer) {
@Override
protected void onConnect(Socket socket, CredentialsConfig.Streamer streamer, Object... args) {
TwitchSpawn.LOGGER.info("Connected to Streamlabs Socket API with {}'s token successfully!", streamer.twitchNick);
authorized.add(socket);
authorized = true;
}

@Override
protected void onDisconnect(Socket socket, CredentialsConfig.Streamer streamer, Object... args) {
TwitchSpawn.LOGGER.info("Disconnected from {}'s Streamlabs Socket connection. ({})",
streamer.minecraftNick, authorized.contains(socket) ? "intentional" : "unauthorized");

authorized.remove(socket);
streamer.minecraftNick, authorized ? "intentional" : "unauthorized");

if (manager.isRunning() && !authorized.contains(socket)) {
if (manager.isRunning() && !authorized) { // TODO: concern what to do in this case?
manager.stop(null, streamer.twitchNick + " unauthorized by the socket server");
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
package net.programmer.igoodie.twitchspawn.tracer;

import io.socket.client.Socket;
import net.minecraft.command.ICommandSender;
import net.minecraft.util.text.TextComponentTranslation;
import net.programmer.igoodie.twitchspawn.TwitchSpawn;
import net.programmer.igoodie.twitchspawn.configuration.ConfigManager;
import net.programmer.igoodie.twitchspawn.configuration.CredentialsConfig;
import net.programmer.igoodie.twitchspawn.network.NetworkManager;
import net.programmer.igoodie.twitchspawn.network.packet.StatusChangedPacket;

import java.util.LinkedList;
import java.util.List;
import java.util.*;

public class TraceManager {

private boolean running;
private List<SocketIOTracer> socketIOTracers;
private Map<String, Socket> sockets; // mc_nick.lowercase() -> sio_socket

public TraceManager() {
this.socketIOTracers = new LinkedList<>();
this.socketIOTracers.add(new StreamlabsSocketTracer(this));
this.socketIOTracers.add(new StreamElementsSocketTracer(this));
this.sockets = new HashMap<>();
}

public boolean isRunning() {
Expand All @@ -29,13 +29,15 @@ public boolean isRunning() {
public void start() {
if (isRunning()) throw new IllegalStateException("Tracer is already started");

TwitchSpawn.LOGGER.info("Starting all the tracers...");

// Start tracers
socketIOTracers.forEach(SocketIOTracer::start);

running = true;

// Connect online players from credentials.toml
for (CredentialsConfig.Streamer streamer : ConfigManager.CREDENTIALS.streamers) {
if (TwitchSpawn.SERVER.getPlayerList().getPlayerByUsername(streamer.minecraftNick) != null) {
connectStreamer(streamer.minecraftNick);
}
}

TwitchSpawn.SERVER.getPlayerList().sendMessage(
new TextComponentTranslation("commands.twitchspawn.start.success"), true);
TwitchSpawn.SERVER.getPlayerList().getPlayers().forEach(player -> {
Expand All @@ -49,13 +51,14 @@ public void start() {
public void stop(ICommandSender sender, String reason) {
if (!isRunning()) throw new IllegalStateException("Tracer is already stopped");

TwitchSpawn.LOGGER.info("Stopping all the tracers...");

// Stop tracers
socketIOTracers.forEach(SocketIOTracer::stop);

running = false;

// Disconnect each alive socket and reset the map
for (Socket socket : sockets.values()) {
socket.disconnect();
}
sockets.clear();

if (TwitchSpawn.SERVER != null) {
TwitchSpawn.SERVER.getPlayerList().sendMessage(
new TextComponentTranslation("commands.twitchspawn.stop.success",
Expand All @@ -69,4 +72,48 @@ public void stop(ICommandSender sender, String reason) {
}
}

public void connectStreamer(String nickname) {
if (!isRunning()) throw new IllegalStateException("Cannot connect streamer when TwitchSpawn is stopped.");

CredentialsConfig.Streamer streamerConfig = ConfigManager.CREDENTIALS.streamers.stream()
.filter(streamer -> streamer.minecraftNick.equalsIgnoreCase(nickname))
.findFirst().orElse(null);

if (streamerConfig == null) {
TwitchSpawn.LOGGER.warn("{} is not set as a Streamer in credentials.toml. Skipping connection for them.", nickname);
return;
}

SocketIOTracer tracer;

if (streamerConfig.platform == Platform.STREAMLABS) {
tracer = new StreamlabsSocketTracer(this);

} else if (streamerConfig.platform == Platform.STREAMELEMENTS) {
tracer = new StreamElementsSocketTracer(this);

} else {
// How is this even possible?
throw new InternalError("TODOTODOOOO");
}

Socket socket = tracer.createSocket(streamerConfig);
sockets.put(nickname.toLowerCase(), socket);
socket.connect();
}

public void disconnectStreamer(String nickname) {
if (!isRunning()) throw new IllegalStateException("Cannot disconnect streamer when TwitchSpawn is stopped.");

Socket socket = sockets.get(nickname.toLowerCase());

if (socket == null) {
TwitchSpawn.LOGGER.warn("{} is not set as a Streamer in credentials.toml. Skipping disconnection for them.", nickname);
return;
}

socket.disconnect();
sockets.remove(nickname.toLowerCase());
}

}

0 comments on commit b8c6160

Please sign in to comment.