Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bump to 1.0.5 #18

Merged
merged 29 commits into from
Oct 28, 2022
Merged
Show file tree
Hide file tree
Changes from 27 commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
bd5c1a8
Update build.gradle
Niilyx Oct 18, 2022
5112e66
development -> niilyx
Niilyx Oct 22, 2022
7f9cc97
manip DB + système de cache!
Niilyx Oct 22, 2022
4219253
imports optimisés
Niilyx Oct 22, 2022
51c05b6
Update Slap.java
Niilyx Oct 22, 2022
0223f52
command /chat + optimisation de whois
Niilyx Oct 22, 2022
4de50ae
epic opérateur ternaire fail, rigolez sur moi
Niilyx Oct 23, 2022
d2efaf5
fix finaux
Niilyx Oct 23, 2022
f0b0579
no more debug messages
Niilyx Oct 23, 2022
ec6b144
changements de perms
Niilyx Oct 23, 2022
5601f35
évitons les appels inutiles à la db
Niilyx Oct 23, 2022
1da2f13
avancement
Niilyx Oct 23, 2022
a2f7545
meilleur autocomplete Tab
Niilyx Oct 23, 2022
f571218
fix du stupide copiage et préfixe de canal
Niilyx Oct 23, 2022
53582a4
avancement préparer le pluginMsg vers bungee :trophy: :trollface:
Niilyx Oct 23, 2022
63f4a2c
meilleur complétion Tab
Niilyx Oct 24, 2022
a6c9d74
Merge branch 'development' into niilyx
Niilyx Oct 24, 2022
53328c8
avancement global chat
Niilyx Oct 27, 2022
d8e2696
tab auto complete /skull
Niilyx Oct 27, 2022
fb08efd
améliorer le /slap
Niilyx Oct 27, 2022
111f25e
Merge branch 'niilyx' of https://github.com/efrei-craft/ECATUP into n…
Niilyx Oct 27, 2022
30f4ec9
opti /skull Tab autocomplete
Niilyx Oct 27, 2022
251e0e5
bump to 1.0.4
Niilyx Oct 27, 2022
d576a68
Global chat implémenté
Niilyx Oct 27, 2022
5269b1f
ARRAY OUT OF BOUNDS XD
Niilyx Oct 27, 2022
a88d9c8
Merge branch 'niilyx' into development
Niilyx Oct 27, 2022
310bcb5
after-merge fix
Niilyx Oct 27, 2022
ab8874a
rétablissement de config.yml
Niilyx Oct 28, 2022
f92c79e
Bump version to 1.0.5-dev
DocSystem Oct 28, 2022
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
80 changes: 76 additions & 4 deletions src/main/java/fr/efreicraft/ecatup/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,33 @@
import fr.efreicraft.ecatup.commands.*;
import fr.efreicraft.ecatup.listeners.*;
import fr.efreicraft.ecatup.utils.DiscordWebhook;
import fr.efreicraft.ecatup.listeners.Chat;
import fr.efreicraft.ecatup.listeners.Join;
import fr.efreicraft.ecatup.listeners.LuckPermsListener;
import fr.efreicraft.ecatup.listeners.Quit;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.luckperms.api.LuckPerms;
import net.luckperms.api.LuckPermsProvider;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandExecutor;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.permissions.Permission;
import org.bukkit.plugin.java.JavaPlugin;

import javax.annotation.Nullable;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

public final class Main extends JavaPlugin {

Expand All @@ -26,29 +40,42 @@ public final class Main extends JavaPlugin {
public static Connection connection;
public static LuckPerms LP;


@Override
public void onEnable() {

INSTANCE = this;
LP = LuckPermsProvider.get();

// Load config
saveDefaultConfig();
config = INSTANCE.getConfig();
INSTANCE.saveConfig();
config.addDefault("server_name", "lobby");
config.addDefault("database.host", "127.0.0.1");
config.addDefault("database.port", 3306);
config.addDefault("database.database", "db");
config.addDefault("database.user", "user");
config.addDefault("database.password", "pwd");

config.options().copyDefaults(true);
saveConfig();
Niilyx marked this conversation as resolved.
Show resolved Hide resolved

// Connect to MariaDB database

try {
Class.forName("org.mariadb.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mariadb://" + config.getString("database.host") + ":" + config.getInt("database.port") + "/" + config.getString("database.database") + "?user=" + config.getString("database.user") + "&password=" + config.getString("database.password"));
connection = DriverManager.getConnection("jdbc:mariadb://"
+ config.getString("database.host")
+ ":" + config.getInt("database.port") + "/" + config.getString("database.database")
+ "?user=" + config.getString("database.user")
+ "&password=" + config.getString("database.password")
+ "&autoReconnect=true");
} catch (Exception e) {
e.printStackTrace();
}

// Register BungeeCord channel
getServer().getMessenger().registerOutgoingPluginChannel(INSTANCE, "BungeeCord");
getServer().getMessenger().registerOutgoingPluginChannel(INSTANCE, "ecatup:globalchat");
getServer().getMessenger().registerIncomingPluginChannel(INSTANCE, "BungeeCord", new Chat());

// Register events
Bukkit.getPluginManager().registerEvents(new Chat(), INSTANCE);
Expand All @@ -60,6 +87,12 @@ public void onEnable() {
if (Bukkit.getPluginManager().getPlugin("ECLobby") == null) {
registerCommand("lobby", new Lobby()); // Only register /lobby if ECLobby is not installed
}

registerCommand("chat", new fr.efreicraft.ecatup.commands.Chat());
for (PreferenceCache.ChatChannel channel : PreferenceCache.ChatChannel.values()) {
Bukkit.getPluginManager().addPermission(new Permission("ecatup.channel." + channel.toString().toLowerCase()));
}

registerCommand("gm", new Gm());
registerCommand("gms", new Gms());
registerCommand("gma", new Gma());
Expand Down Expand Up @@ -88,6 +121,7 @@ public void onDisable() {

// Unregister BungeeCord channel
getServer().getMessenger().unregisterOutgoingPluginChannel(INSTANCE);
getServer().getMessenger().unregisterIncomingPluginChannel(INSTANCE);

// Close database connection
try {
Expand All @@ -113,10 +147,48 @@ void registerCommand(String command, CommandExecutor executor) {
Objects.requireNonNull(Bukkit.getPluginCommand(command)).setExecutor(executor);
}

public static List<String> getPlayersForTabList(String[] args, int argPos) {
List<Player> players = Bukkit.getOnlinePlayers().stream().filter(player -> player.getName().toLowerCase().startsWith(args[argPos].toLowerCase())).collect(Collectors.toList());
List<String> results = new ArrayList<>();
players.forEach(player -> results.add(player.getName()));
players.clear(); // get rid of some space & memory
return results.isEmpty() ? null : results;
}

public static void sendPlayerToServer(Player player, String server) {
ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.writeUTF("Connect");
out.writeUTF(server);
player.sendPluginMessage(INSTANCE, "BungeeCord", out.toByteArray());
}

public static void sendGlobalChat(String msg, @Nullable Player player) {
ByteArrayDataOutput out = ByteStreams.newDataOutput();

out.writeUTF("Forward");
out.writeUTF("ONLINE");
out.writeUTF("ecatup:globalchat");

ByteArrayOutputStream msgbytes = new ByteArrayOutputStream();
DataOutputStream msgout = new DataOutputStream(msgbytes);

try {
msgout.writeUTF(msg);
} catch (IOException e) {
e.printStackTrace();

INSTANCE.getLogger().severe("Couldn't send " +
(player == null ? "a player's" : (player.getName() + "'s")) +
" global message: " + msg);
if (player != null) {
Component failed = Component.text("Votre dernier message n'a pas été envoyé aux autres serveur.").color(NamedTextColor.DARK_RED);
player.sendMessage(failed);
}
}

out.writeShort(msgbytes.toByteArray().length);
out.write(msgbytes.toByteArray());

Bukkit.getServer().sendPluginMessage(INSTANCE, "BungeeCord", out.toByteArray());
}
}
92 changes: 92 additions & 0 deletions src/main/java/fr/efreicraft/ecatup/PreferenceCache.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package fr.efreicraft.ecatup;

import com.google.common.collect.Lists;
import org.bukkit.entity.Player;

import java.util.*;


/**
* ======= Important ! ======= <br>
* Quand vous ajoutez une préférence, pensez à:
* <li>ajouter un {@link PreferenceCache#DEFAULTS}</li>
* <li>modifier la fonction {@link PreferenceCache#cache(Player, int)} comme dû</li>
* <li>modifier la fonction {@link PreferenceCache#getPrefs(UUID)} comme dû</li>
* <li>modifier le Javadoc de {@link PreferenceCache#getCache()} comme dû</li>
* <li>modifier {@link PreferenceCache#NUMBER_OF_PREFS} comme dû</li>
*/
@SuppressWarnings("ALL") // ça ça s'appelle un fuck off.
public class PreferenceCache {

private static Map<UUID, List<?>> cache = new HashMap<>();
public static final List DEFAULTS = Lists.newArrayList(ChatChannel.SERVER);
private static final int NUMBER_OF_PREFS = DEFAULTS.size();


public static void cache(Player player, int channelID) {
List entry = new ArrayList<>();

// Channel
ChatChannel channel;
switch (channelID) {
case 0 -> channel = ChatChannel.GLOBAL;
case 1 -> channel = ChatChannel.SERVER;
case 2 -> channel = ChatChannel.TEAM;
default -> channel = (ChatChannel) DEFAULTS.get(0);
}

entry.add(channel);

// Fin
cache.put(player.getUniqueId(), entry);
}

public static void unCache(Player player) {
cache.remove(player.getUniqueId());
}

/** Voici l'ordre des préférences utilisateur dans la List<?> du cache <br>
* UUID -> <br>
* <ol>
* <li>ChatChannel</li>
* </ol>
*/
public static Map<UUID, List<?>> getCache() {
return cache;
}

public static List<?> getPrefs(Player player) {
return getPrefs(player.getUniqueId());
}

public static List<?> getPrefs(UUID player) {
if (cache.get(player) == null || cache.get(player).size() < NUMBER_OF_PREFS) cache.put(player, DEFAULTS);
return cache.get(player);
}

public static ChatChannel getChannel(UUID player) {
return (ChatChannel) getPrefs(player).get(0);
}

public static void setPref(Player player, List<?> prefs) {
cache.put(player.getUniqueId(), prefs);
}

public static <T> void setPref(Player player, int index, T element) {
List newEntry = cache.getOrDefault(player.getUniqueId(), DEFAULTS);
newEntry.set(index, element);

cache.put(player.getUniqueId(), newEntry);
}

public enum ChatChannel {
GLOBAL(0),
SERVER(1),
TEAM(2);

public final int ID;
ChatChannel(int i) {
ID = i;
}
}
}
112 changes: 112 additions & 0 deletions src/main/java/fr/efreicraft/ecatup/commands/Chat.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
package fr.efreicraft.ecatup.commands;

import com.google.common.collect.Lists;
import fr.efreicraft.ecatup.Main;
import fr.efreicraft.ecatup.PreferenceCache;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import static fr.efreicraft.ecatup.utils.Msg.colorize;

public class Chat implements CommandExecutor, TabExecutor {

@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (!(sender instanceof Player self)) {
sender.sendMessage(colorize("&cVous devez être un joueur pour exécuter cette commande !"));
return true;
}

PreferenceCache.ChatChannel channelActuel = (PreferenceCache.ChatChannel) PreferenceCache.getPrefs(self).get(0);
if (args.length == 0) {
sender.sendMessage(colorize("&bVotre canal actuel est: &r&l" + channelActuel));
return true;
}

if (channelActuel.toString().equals(args[0].toUpperCase())) {
sender.sendMessage(colorize("&cVous êtes déjà sur le canal &r&l" + channelActuel));
return true;
}

boolean canUseGlobal = self.hasPermission("ecatup.channel.global");

if (args[0].equalsIgnoreCase("help") || args.length > 1) {
sender.sendMessage(colorize("&c&lUsage: &r&c/chat [" + (canUseGlobal ? "g|global OR " : "") + "s|server|normal OR t|team]"));
return true;
}

switch (args[0].toLowerCase()) {
case "g","global" -> {
if (canUseGlobal) {
sendChannelPrefToDB(self, PreferenceCache.ChatChannel.GLOBAL);
PreferenceCache.setPref(self, 0, PreferenceCache.ChatChannel.GLOBAL);
sender.sendMessage(colorize("&aVous basculez sur le canal &e[GLOBAL]"));
} else sender.sendMessage(colorize("&c&lUsage: &r&c/chat [s|server|normal OR t|team]"));
}
case "s","server","normal" -> {
sendChannelPrefToDB(self, PreferenceCache.ChatChannel.SERVER);
PreferenceCache.setPref(self, 0, PreferenceCache.ChatChannel.SERVER);
sender.sendMessage(colorize("&aVous basculez sur le canal &e[SERVER]"));
}
case "t","team" -> {
sendChannelPrefToDB(self, PreferenceCache.ChatChannel.TEAM);
PreferenceCache.setPref(self, 0, PreferenceCache.ChatChannel.TEAM);

sender.sendMessage(colorize("&aVous basculez sur le canal &e[TEAM]"));
}
default -> sender.sendMessage(colorize("&c&lUsage: &r&c/chat [" + (canUseGlobal ? "g|global OR " : "") + "s|server|normal OR t|team]"));
}

return true;
}

public void sendChannelPrefToDB(Player player, PreferenceCache.ChatChannel channel) {
try {
PreparedStatement verifyIfHasEntry = Main.connection.prepareStatement("SELECT * FROM `usersPrefs` WHERE mcUUID=?");
verifyIfHasEntry.setString(1, player.getUniqueId().toString());
ResultSet result1 = verifyIfHasEntry.executeQuery();
boolean hasEntryInDB = result1.next();

verifyIfHasEntry.close();
result1.close();

PreparedStatement applyChanges = Main.connection.prepareStatement(hasEntryInDB ? "UPDATE `usersPrefs` SET channel=? WHERE mcUUID=?"
: "INSERT INTO `usersPrefs` (channel, mcUUID) VALUES(?,?)");

applyChanges.setInt(1, channel.ID);
applyChanges.setString(2, player.getUniqueId().toString());
applyChanges.executeQuery();

applyChanges.close();
} catch (SQLException e) {
e.printStackTrace();
Bukkit.getLogger().severe("Couldn't save " + player.getName() + "'s new preference! Is the database okay?");
}
}

@Override
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (args.length != 1) return Collections.emptyList();

List<String> result = new ArrayList<>();
Arrays.stream(PreferenceCache.ChatChannel.values())
.filter(channel -> channel.toString().startsWith(args[0].toUpperCase()))
.forEach(channel -> result.add(channel.toString()));

return result;
}
}
15 changes: 14 additions & 1 deletion src/main/java/fr/efreicraft/ecatup/commands/Skull.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,25 @@
package fr.efreicraft.ecatup.commands;

import fr.efreicraft.ecatup.Main;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.SkullMeta;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

public class Skull implements CommandExecutor {
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

public class Skull implements CommandExecutor, TabExecutor {
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (sender instanceof Player player) {
Expand All @@ -31,4 +39,9 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command
}
return true;
}

@Override
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
return args.length == 1 ? Main.getPlayersForTabList(args, 1) : null;
}
}
Loading