WSS !!!
This commit is contained in:
@@ -1,12 +1,46 @@
|
||||
package fr.redsavant;
|
||||
|
||||
import fr.redsavant.commands.MuteCommand;
|
||||
import fr.redsavant.proximity.*;
|
||||
import fr.redsavant.ws.WebSocketClient;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
public class LagoonPlugin extends BootstrapPlugin {
|
||||
|
||||
private WebSocketClient wsClient;
|
||||
private ProximityTask proximityTask;
|
||||
|
||||
@Override
|
||||
protected void onStart() {
|
||||
saveDefaultConfig();
|
||||
|
||||
String roomCode = getConfig().getString("room-code", "CHANGE_ME");
|
||||
URI wsUri = URI.create("wss://lagoon.under-scape.com/ws/rooms/" + roomCode + "/plugins/proximity");
|
||||
|
||||
PlayerCodeManager codeManager = new PlayerCodeManager();
|
||||
Set<UUID> mutedPlayers = new HashSet<>();
|
||||
|
||||
wsClient = new WebSocketClient(wsUri, msg -> {
|
||||
// future reponse de drewen
|
||||
});
|
||||
wsClient.connect();
|
||||
|
||||
getServer().getPluginManager().registerEvents(new ProximityListener(codeManager), this);
|
||||
getCommand("proximity").setExecutor(new MuteCommand(mutedPlayers));
|
||||
|
||||
proximityTask = new ProximityTask(wsClient, codeManager, mutedPlayers);
|
||||
proximityTask.runTaskTimerAsynchronously(this, 20L, 60L);
|
||||
|
||||
getLogger().info("LagoonPlugin enabled — room: " + roomCode);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStop() {
|
||||
if (proximityTask != null) proximityTask.cancel();
|
||||
if (wsClient != null) wsClient.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
43
bukkit/src/main/java/fr/redsavant/commands/MuteCommand.java
Normal file
43
bukkit/src/main/java/fr/redsavant/commands/MuteCommand.java
Normal file
@@ -0,0 +1,43 @@
|
||||
package fr.redsavant.commands;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
public class MuteCommand implements CommandExecutor {
|
||||
|
||||
private final Set<UUID> mutedPlayers;
|
||||
|
||||
public MuteCommand(Set<UUID> mutedPlayers) {
|
||||
this.mutedPlayers = mutedPlayers;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
if (args.length < 1) {
|
||||
sender.sendMessage("§cUsage : /proximity mute <player>");
|
||||
return true;
|
||||
}
|
||||
|
||||
Player target = Bukkit.getPlayerExact(args[0]);
|
||||
if (target == null) {
|
||||
sender.sendMessage("§cUnknow player");
|
||||
return true;
|
||||
}
|
||||
|
||||
UUID uuid = target.getUniqueId();
|
||||
if (mutedPlayers.contains(uuid)) {
|
||||
mutedPlayers.remove(uuid);
|
||||
sender.sendMessage("§a" + target.getName() + " has been unmuted on Lagoon");
|
||||
} else {
|
||||
mutedPlayers.add(uuid);
|
||||
sender.sendMessage("§e" + target.getName() + " has been muted on Lagoon");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
package fr.redsavant.proximity;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.security.SecureRandom;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
public class PlayerCodeManager {
|
||||
|
||||
private static final String CHARS = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"; // ambiguous chars removed
|
||||
private static final int CODE_LENGTH = 6;
|
||||
private static final SecureRandom RANDOM = new SecureRandom();
|
||||
|
||||
private final Map<UUID, String> codes = new HashMap<>();
|
||||
|
||||
public String getOrCreate(Player player) {
|
||||
return codes.computeIfAbsent(player.getUniqueId(), uuid -> generateCode());
|
||||
}
|
||||
|
||||
public String get(UUID uuid) {
|
||||
return codes.get(uuid);
|
||||
}
|
||||
|
||||
public void remove(UUID uuid) {
|
||||
codes.remove(uuid);
|
||||
}
|
||||
|
||||
private String generateCode() {
|
||||
StringBuilder sb = new StringBuilder(CODE_LENGTH);
|
||||
for (int i = 0; i < CODE_LENGTH; i++) {
|
||||
sb.append(CHARS.charAt(RANDOM.nextInt(CHARS.length())));
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package fr.redsavant.proximity;
|
||||
|
||||
import net.md_5.bungee.api.chat.ClickEvent;
|
||||
import net.md_5.bungee.api.chat.ComponentBuilder;
|
||||
import net.md_5.bungee.api.chat.HoverEvent;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
|
||||
public class ProximityListener implements Listener {
|
||||
|
||||
private final PlayerCodeManager codeManager;
|
||||
|
||||
public ProximityListener(PlayerCodeManager codeManager) {
|
||||
this.codeManager = codeManager;
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onJoin(PlayerJoinEvent event) {
|
||||
String code = codeManager.getOrCreate(event.getPlayer());
|
||||
sendCodeMessage(event.getPlayer(), code);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onQuit(PlayerQuitEvent event) {
|
||||
codeManager.remove(event.getPlayer().getUniqueId());
|
||||
}
|
||||
|
||||
private void sendCodeMessage(org.bukkit.entity.Player player, String code) {
|
||||
TextComponent msg = new TextComponent("§a[Lagoon] §fTon code de liaison : §b§l" + code);
|
||||
msg.setClickEvent(new ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, code));
|
||||
msg.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT,
|
||||
new ComponentBuilder("§7Clique pour copier").create()));
|
||||
player.spigot().sendMessage(msg);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
package fr.redsavant.proximity;
|
||||
|
||||
import fr.redsavant.ws.ProximityPayload;
|
||||
import fr.redsavant.ws.WebSocketClient;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
public class ProximityTask extends BukkitRunnable {
|
||||
|
||||
private final WebSocketClient wsClient;
|
||||
private final PlayerCodeManager codeManager;
|
||||
private final Set<UUID> mutedPlayers;
|
||||
|
||||
public ProximityTask(WebSocketClient wsClient, PlayerCodeManager codeManager, Set<UUID> mutedPlayers) {
|
||||
this.wsClient = wsClient;
|
||||
this.codeManager = codeManager;
|
||||
this.mutedPlayers = mutedPlayers;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
if (!wsClient.isConnected()) return;
|
||||
|
||||
List<ProximityPayload.PlayerEntry> entries = new ArrayList<>();
|
||||
|
||||
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||
String code = codeManager.get(player.getUniqueId());
|
||||
if (code == null) continue;
|
||||
|
||||
int layer = switch (player.getWorld().getEnvironment()) {
|
||||
case NETHER -> 1;
|
||||
case THE_END -> 2;
|
||||
default -> 0;
|
||||
};
|
||||
// LE WORLD ZEBI (spigot c'est nul X< )
|
||||
boolean muted = mutedPlayers.contains(player.getUniqueId());
|
||||
|
||||
entries.add(new ProximityPayload.PlayerEntry(
|
||||
player.getLocation().getX(),
|
||||
player.getLocation().getY(),
|
||||
player.getLocation().getZ(),
|
||||
layer,
|
||||
code,
|
||||
muted
|
||||
));
|
||||
}
|
||||
|
||||
wsClient.send(ProximityPayload.buildPositionsJson(entries));
|
||||
}
|
||||
}
|
||||
1
bukkit/src/main/resources/config.yml
Normal file
1
bukkit/src/main/resources/config.yml
Normal file
@@ -0,0 +1 @@
|
||||
room-code: "CHANGE_ME"
|
||||
@@ -6,4 +6,9 @@ authors:
|
||||
- RedSavant
|
||||
- UnderScape (lagoon)
|
||||
api-version: '1.21'
|
||||
main: fr.redsavant.LagoonPlugin
|
||||
main: fr.redsavant.LagoonPlugin
|
||||
commands:
|
||||
proximity:
|
||||
description: Base command
|
||||
usage: /proximity mute <player>
|
||||
permission: lagoon.admin
|
||||
Reference in New Issue
Block a user