Skip to content
Open

dev #69

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions .github/workflows/publish-modrinth.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
name: Publish to Modrinth

on:
release:
types: [published]

permissions:
contents: read

jobs:
publish:

runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4
with:
persist-credentials: false

- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'

- name: Build with Gradle
run: ./gradlew build

- name: Publish to Modrinth
uses: cloudnode-pro/modrinth-publish@v2
with:
token: ${{ secrets.MODRINTH_TOKEN }}
project: ${{ vars.MODRINTH_PROJECT_ID }}
version: ${{ github.event.release.tag_name }}
changelog: ${{ github.event.release.body }}
loaders: |-
velocity
bungeecord
game-versions: ">=1.8"
files: build/libs/*.jar
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ public void onEnable() {

getProxy()
.getPluginManager()
.registerListener(this, new PlayerListener(core.getCorePlayerListener()));
.registerListener(this, new PlayerListener(core.getCorePlayerListener(), bungeeLogger));

getProxy()
.getPluginManager()
Expand Down Expand Up @@ -124,16 +124,6 @@ public CoreCommandSender getConsole() {
return console;
}

@Override
public Core getCore() {
return core;
}

@Override
public ServerType getServerType() {
return ServerType.BUNGEE;
}

@Override
public CoreLogger getCoreLogger() {
return bungeeLogger;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.event.EventHandler;
import xyz.earthcow.networkjoinmessages.bungee.BungeeMain;
import xyz.earthcow.networkjoinmessages.bungee.abstraction.BungeeLogger;
import xyz.earthcow.networkjoinmessages.bungee.abstraction.BungeePlayer;
import xyz.earthcow.networkjoinmessages.bungee.abstraction.BungeeServer;
import xyz.earthcow.networkjoinmessages.common.abstraction.CorePlayer;
Expand All @@ -16,9 +17,11 @@
public class PlayerListener implements Listener {

private final CorePlayerListener corePlayerListener;
private final BungeeLogger logger;

public PlayerListener(CorePlayerListener corePlayerListener) {
public PlayerListener(CorePlayerListener corePlayerListener, BungeeLogger logger) {
this.corePlayerListener = corePlayerListener;
this.logger = logger;
}

@EventHandler
Expand All @@ -42,8 +45,10 @@ public void onServerConnected(ServerConnectedEvent e) {
@EventHandler
public void onDisconnect(PlayerDisconnectEvent event) {
// Check that the player disconnected is not a duplicate user session (the same account tries to join the server while already joined)
CorePlayer corePlayer = BungeeMain.getInstance().getOrPutPlayer(new BungeePlayer(event.getPlayer()));
if (corePlayer.getConnectionIdentity() != System.identityHashCode(event.getPlayer())) {
CorePlayer corePlayer = BungeeMain.getInstance().getPlayerManager().getPlayer(event.getPlayer().getUniqueId());
if (corePlayer == null || corePlayer.getConnectionIdentity() != System.identityHashCode(event.getPlayer())) {
logger.debug("Ignoring disconnect event for " + (corePlayer == null ? "null" : corePlayer.getName())
+ " (" + event.getPlayer().getName() + ") - null or duplicate player identity");
return;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,23 @@
package xyz.earthcow.networkjoinmessages.common.abstraction;

import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
import net.kyori.adventure.audience.Audience;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.UUID;
import java.util.concurrent.atomic.AtomicBoolean;

@Getter @Setter
public abstract class CorePlayer implements CoreCommandSender {
// Fields
@Getter(AccessLevel.NONE) @Setter(AccessLevel.NONE)
private AtomicBoolean connected = new AtomicBoolean(false);
private CoreBackendServer lastKnownConnectedServer;
private boolean disconnecting = false;
@Getter(AccessLevel.NONE) @Setter(AccessLevel.NONE)
private AtomicBoolean disconnecting = new AtomicBoolean(false);
private String cachedLeaveMessage;
private Audience audience;
private boolean premiumVanishHidden = false;
Expand All @@ -24,6 +29,18 @@ public CorePlayer(CoreBackendServer lastKnownConnectedServer, Audience audience)
this.audience = audience;
}

public boolean isConnected() {
return connected.get();
}

public void setConnected(boolean value) {
connected.set(value);
}

public boolean markDisconnecting() {
return disconnecting.compareAndSet(false, true);
}

// Abstract
@NotNull
public abstract UUID getUniqueId();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,14 @@
package xyz.earthcow.networkjoinmessages.common.abstraction;

import xyz.earthcow.networkjoinmessages.common.Core;
import xyz.earthcow.networkjoinmessages.common.modules.DiscordIntegration;

import java.io.File;
import java.util.List;
import java.util.UUID;

public interface CorePlugin {
Core getCore();

void disable();

ServerType getServerType();
File getDataFolder();
CoreLogger getCoreLogger();

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -87,11 +87,11 @@ public void onPreConnect(@NotNull CorePlayer player, @Nullable String previousSe
public void onServerConnected(@NotNull CorePlayer player, @NotNull CoreBackendServer server,
@Nullable CoreBackendServer previousServer) {
plugin.runTaskAsync(() -> {
if (!stateStore.isConnected(player)) {
handleJoin(player, server);
} else {
if (player.isConnected()) {
boolean fromLimbo = plugin.hasLimbo() && previousServer == null;
handleSwap(player, server, fromLimbo);
} else {
handleJoin(player, server);
}
});
}
Expand All @@ -100,11 +100,10 @@ public void onServerConnected(@NotNull CorePlayer player, @NotNull CoreBackendSe
* Called when a player disconnects from the network.
*/
public void onDisconnect(@NotNull CorePlayer player) {
if (player.isDisconnecting()) {
if (!player.markDisconnecting()) {
plugin.getCoreLogger().debug("Duplicate disconnect ignored for " + player.getName());
return;
}
player.setDisconnecting(true);

if (shouldSkipLeave(player)) {
cleanup(player);
Expand All @@ -119,7 +118,7 @@ public void onDisconnect(@NotNull CorePlayer player) {

private void handleJoin(@NotNull CorePlayer player, @NotNull CoreBackendServer server) {
stateStore.loadData(player.getUniqueId(), player.getName());
stateStore.setConnected(player, true);
player.setConnected(true);
player.setLastKnownConnectedServer(server);

PremiumVanish pv = plugin.getVanishAPI();
Expand Down Expand Up @@ -243,7 +242,7 @@ private boolean shouldSkipSwap(CorePlayer player, String from, String to, boolea

private boolean shouldSkipLeave(CorePlayer player) {
if (player.getCurrentServer() == null) return true;
if (!stateStore.isConnected(player)) {
if (!player.isConnected()) {
plugin.getCoreLogger().debug("Skipping leave for " + player.getName() + " — not marked as connected");
return true;
}
Expand Down Expand Up @@ -306,7 +305,6 @@ private void fireLeaveEvent(CorePlayer player, String serverName, String message

private void cleanup(CorePlayer player) {
plugin.getPlayerManager().removePlayer(player.getUniqueId());
stateStore.setConnected(player, false);
leaveMessageCache.stopFor(player);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ public final class PlayerStateStore {

private final Map<UUID, String> previousServer = new ConcurrentHashMap<>();
private final Map<UUID, Boolean> silentState = new ConcurrentHashMap<>();
private final Set<UUID> onlinePlayers = ConcurrentHashMap.newKeySet();
private final Set<UUID> noJoinMessage = ConcurrentHashMap.newKeySet();
private final Set<UUID> noLeaveMessage = ConcurrentHashMap.newKeySet();
private final Set<UUID> noSwapMessage = ConcurrentHashMap.newKeySet();
Expand Down Expand Up @@ -101,17 +100,6 @@ private Boolean determineSaveState(Set<UUID> set, boolean ignoreByDefault, UUID
return null;
}

// --- Online tracking ---

public boolean isConnected(CorePlayer player) {
return onlinePlayers.contains(player.getUniqueId());
}

public void setConnected(CorePlayer player, boolean connected) {
if (connected) onlinePlayers.add(player.getUniqueId());
else onlinePlayers.remove(player.getUniqueId());
}

// --- Previous server ---

public String getFrom(CorePlayer player) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ public void onProxyInitialization(ProxyInitializeEvent event) {
velocityLogger.info("Successfully hooked into PremiumVanish!");
}

proxy.getEventManager().register(this, new PlayerListener(core.getCorePlayerListener()));
proxy.getEventManager().register(this, new PlayerListener(core.getCorePlayerListener(), velocityLogger));

registerCommands();

Expand Down Expand Up @@ -261,16 +261,6 @@ public PremiumVanish getVanishAPI() {
return premiumVanish;
}

@Override
public ServerType getServerType() {
return ServerType.VELOCITY;
}

@Override
public Core getCore() {
return core;
}

@Override
public CoreCommandSender getConsole() {
return console;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,18 @@
import xyz.earthcow.networkjoinmessages.common.abstraction.CorePlayer;
import xyz.earthcow.networkjoinmessages.common.listeners.CorePlayerListener;
import xyz.earthcow.networkjoinmessages.velocity.VelocityMain;
import xyz.earthcow.networkjoinmessages.velocity.abstraction.VelocityLogger;
import xyz.earthcow.networkjoinmessages.velocity.abstraction.VelocityPlayer;
import xyz.earthcow.networkjoinmessages.velocity.abstraction.VelocityServer;

public class PlayerListener {

private final CorePlayerListener corePlayerListener;
private final VelocityLogger logger;

public PlayerListener(CorePlayerListener corePlayerListener) {
public PlayerListener(CorePlayerListener corePlayerListener, VelocityLogger logger) {
this.corePlayerListener = corePlayerListener;
this.logger = logger;
}

@Subscribe
Expand All @@ -36,11 +39,12 @@ public void onServerConnected(ServerConnectedEvent event) {
@Subscribe
public void onDisconnect(DisconnectEvent event) {
// Check that the player disconnected is not a duplicate user session (the same account tries to join the server while already joined)
CorePlayer corePlayer = VelocityMain.getInstance().getOrPutPlayer(new VelocityPlayer(event.getPlayer()));
if (corePlayer.getConnectionIdentity() != System.identityHashCode(event.getPlayer())) {
CorePlayer corePlayer = VelocityMain.getInstance().getPlayerManager().getPlayer(event.getPlayer().getUniqueId());
if (corePlayer == null || corePlayer.getConnectionIdentity() != System.identityHashCode(event.getPlayer())) {
logger.debug("Ignoring disconnect event for " + (corePlayer == null ? "null" : corePlayer.getName())
+ " (" + event.getPlayer().getUsername() + ") - null or duplicate player identity");
return;
}

corePlayerListener.onDisconnect(corePlayer);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -290,31 +290,6 @@ void getSuppressedPlayers_firstJoinMapsToJoinSet() {
"FIRST_JOIN should return the same set as JOIN");
}

// -----------------------------------------------------------------------
// isConnected / setConnected
// -----------------------------------------------------------------------

@Test
void setConnected_true_marksPlayerOnline() {
PlayerStateStore stateStore = new PlayerStateStore(plugin, config, store);
stateStore.setConnected(player, true);
assertTrue(stateStore.isConnected(player));
}

@Test
void setConnected_false_marksPlayerOffline() {
PlayerStateStore stateStore = new PlayerStateStore(plugin, config, store);
stateStore.setConnected(player, true);
stateStore.setConnected(player, false);
assertFalse(stateStore.isConnected(player));
}

@Test
void isConnected_unknownPlayer_returnsFalse() {
PlayerStateStore stateStore = new PlayerStateStore(plugin, config, store);
assertFalse(stateStore.isConnected(player));
}

// -----------------------------------------------------------------------
// getFrom / setFrom
// -----------------------------------------------------------------------
Expand Down
Loading