197 lines
7.9 KiB
Java
197 lines
7.9 KiB
Java
package de.sebastianvonhelmersen;
|
|
|
|
import de.sebastianvonhelmersen.authentication.Authenticator;
|
|
import de.sebastianvonhelmersen.authentication.FetSite;
|
|
import de.sebastianvonhelmersen.authentication.Ldap;
|
|
import net.kyori.adventure.text.Component;
|
|
import org.bukkit.Bukkit;
|
|
import org.bukkit.GameMode;
|
|
import org.bukkit.entity.Player;
|
|
import org.bukkit.event.EventHandler;
|
|
import org.bukkit.event.Listener;
|
|
import org.bukkit.event.block.BlockPlaceEvent;
|
|
import org.bukkit.event.entity.EntityDamageEvent;
|
|
import org.bukkit.event.entity.EntityTargetLivingEntityEvent;
|
|
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
|
import org.bukkit.event.player.PlayerJoinEvent;
|
|
import org.bukkit.event.player.PlayerMoveEvent;
|
|
import org.bukkit.plugin.java.JavaPlugin;
|
|
|
|
import java.io.File;
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
import java.util.UUID;
|
|
import java.util.logging.Level;
|
|
|
|
public class fetmcplugin extends JavaPlugin implements Listener {
|
|
private Database db;
|
|
private Map<UUID, AuthInfos> allInfos = HashMap.newHashMap(0);
|
|
private Authenticator authenticator;
|
|
|
|
@Override
|
|
public void onEnable() {
|
|
// Make sure the plugin's data folder exists
|
|
File dataFolder = this.getDataFolder();
|
|
this.authenticator = new FetSite("MyokpBxpqxw9Eo8IduwH9IFSnBy4qII6");
|
|
|
|
if (!dataFolder.exists()) {
|
|
dataFolder.mkdirs();
|
|
}
|
|
|
|
// Define the actual SQLite database file
|
|
File dbFile = new File(dataFolder, "auth.db");
|
|
|
|
Bukkit.getPluginManager().registerEvents(this, this);
|
|
this.db = new Database(dbFile);
|
|
}
|
|
|
|
@EventHandler
|
|
public void onPlayerJoin(PlayerJoinEvent event) {
|
|
UUID uuid = event.getPlayer().getUniqueId();
|
|
AuthInfos authInfos = new AuthInfos(db, uuid);
|
|
getLogger().log(Level.INFO,"Detected new Player with Auth State " + authInfos.getState().toString());
|
|
|
|
if( authInfos.getState() == AuthState.AUTHENTICATED ) {
|
|
return;
|
|
}
|
|
|
|
allInfos.put(uuid, authInfos);
|
|
String greeting = "Hallo, " + event.getPlayer().getName() +"! Willkommen auf dem MC Server der FET!\nBitte registriere dich mit deinen Anmeldedaten um zu beginnen!";
|
|
// Set timings: fadeIn = 0, stay = very long, fadeOut = 0
|
|
event.getPlayer().sendTitlePart(net.kyori.adventure.title.TitlePart.TIMES,
|
|
net.kyori.adventure.title.Title.Times.times(
|
|
java.time.Duration.ZERO,
|
|
java.time.Duration.ofSeconds(9999), // basically "forever"
|
|
java.time.Duration.ZERO
|
|
)
|
|
);
|
|
|
|
// Send the title text
|
|
event.getPlayer().sendTitlePart(net.kyori.adventure.title.TitlePart.TITLE,
|
|
Component.text("§cBenutzername"));
|
|
|
|
// Send the subtitle text
|
|
event.getPlayer().sendTitlePart(net.kyori.adventure.title.TitlePart.SUBTITLE,
|
|
Component.text("§eBitte gib den Benutzernamen deines FET Accounts ein!"));
|
|
|
|
event.getPlayer().sendMessage(greeting);
|
|
event.getPlayer().setGameMode(GameMode.ADVENTURE);
|
|
|
|
}
|
|
|
|
@EventHandler
|
|
public void onPlayerMove(PlayerMoveEvent event) {
|
|
UUID uuid = event.getPlayer().getUniqueId();
|
|
event.getPlayer().setAllowFlight(true);
|
|
|
|
if ( allInfos.containsKey(uuid) ) {
|
|
event.setCancelled(true);
|
|
return;
|
|
}
|
|
}
|
|
|
|
@EventHandler
|
|
public void onPlayerDamage(EntityDamageEvent event) {
|
|
if ( event.getEntity() instanceof Player) {
|
|
UUID uuid = event.getEntity().getUniqueId();
|
|
if ( allInfos.containsKey(uuid) ) {
|
|
event.setCancelled(true);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
@EventHandler
|
|
public void onBlockPlace(BlockPlaceEvent event) {
|
|
UUID uuid = event.getPlayer().getUniqueId();
|
|
if ( allInfos.containsKey(uuid) ) {
|
|
event.setCancelled(true);
|
|
return;
|
|
}
|
|
}
|
|
|
|
@EventHandler
|
|
public void onEntityTarget(EntityTargetLivingEntityEvent event) {
|
|
if (event.getTarget() instanceof Player) {
|
|
UUID uuid = event.getTarget().getUniqueId();
|
|
if ( allInfos.containsKey(uuid) ) {
|
|
event.setCancelled(true);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
@EventHandler
|
|
public void onChat(AsyncPlayerChatEvent event) {
|
|
UUID uuid = event.getPlayer().getUniqueId();
|
|
|
|
if (!allInfos.containsKey(uuid)) {
|
|
return;
|
|
}
|
|
|
|
AuthInfos info = allInfos.get(uuid);
|
|
String message = event.getMessage();
|
|
|
|
switch ( info.getState() ) {
|
|
case AUTHENTICATED, AUTH_FAILED:
|
|
break;
|
|
case AUTH_WAITING_USERNAME:
|
|
getLogger().log(Level.INFO, "Auth Waiting for Player " + event.getPlayer().getName());
|
|
allInfos.get(uuid).setUsername(message.trim());
|
|
getLogger().log(Level.INFO, "Got Username '" + message.trim() + "'");
|
|
event.setCancelled(true);
|
|
event.getRecipients().clear();
|
|
// Send the title text
|
|
event.getPlayer().sendTitlePart(net.kyori.adventure.title.TitlePart.TITLE,
|
|
Component.text("§cPasswort"));
|
|
|
|
// Send the subtitle text
|
|
event.getPlayer().sendTitlePart(net.kyori.adventure.title.TitlePart.SUBTITLE,
|
|
Component.text("§eBitte gib das Password deines FET Accounts ein!"));
|
|
break;
|
|
case AUTH_WAITING_PASSWORD:
|
|
boolean valid = validate(info.getUsername(), message.trim());
|
|
event.setCancelled(true);
|
|
event.getRecipients().clear();
|
|
if(valid) {
|
|
allInfos.remove(uuid);
|
|
this.db.addPlayer(uuid.toString(), event.getPlayer().getName(), user);
|
|
Bukkit.getScheduler().runTask(this, () -> {
|
|
event.getPlayer().sendMessage(
|
|
"Der Account " + event.getPlayer().getName() + " wurde erfolgreich mit dem FET Account " + user.ldapName + " verbunden!\r\n" +
|
|
"Danke " + user.firstName + " " + user.lastName + " das du dich für den FET Server angemeldet hast! Ab jetzt kannst du so spielen wie du es gewohnt bist!");
|
|
event.getPlayer().setGameMode(GameMode.SURVIVAL);
|
|
event.getPlayer().setHealth(20);
|
|
event.getPlayer().setFoodLevel(20);
|
|
event.getPlayer().setAllowFlight(false);
|
|
event.getPlayer().resetTitle();
|
|
});
|
|
} else {
|
|
event.getPlayer().sendMessage("That did not work, please try again!\nPlease enter your Username");
|
|
// Send the title text
|
|
event.getPlayer().sendTitlePart(net.kyori.adventure.title.TitlePart.TITLE,
|
|
Component.text("§cBenutzername"));
|
|
|
|
// Send the subtitle text
|
|
event.getPlayer().sendTitlePart(net.kyori.adventure.title.TitlePart.SUBTITLE,
|
|
Component.text("§eBitte gib den Benutzernamen deines FET Accounts ein!"));
|
|
allInfos.get(uuid).reset();
|
|
}
|
|
break;
|
|
}
|
|
return;
|
|
|
|
}
|
|
/*
|
|
* This function uses the defined Authenticator instance to authenticate the User against their
|
|
* provided username - token combination
|
|
* @param username the username used to authenticate the player with the provider
|
|
* @param token some sort of authentication methon. Can be Password, AppPassword or some other form of token the
|
|
* provider takes to authenticate the user
|
|
*/
|
|
private boolean validate(String username, String token) {
|
|
getLogger().log(Level.INFO, "Checking LDAP for user " + username);
|
|
return authenticator.authenticate(username, token);
|
|
}
|
|
|
|
} |