diff --git a/api/src/main/java/eu/authme/api/AuthMeAPI.java b/api/src/main/java/eu/authme/api/AuthMeAPI.java index ee9e049bb..354da9548 100644 --- a/api/src/main/java/eu/authme/api/AuthMeAPI.java +++ b/api/src/main/java/eu/authme/api/AuthMeAPI.java @@ -2,6 +2,7 @@ package eu.authme.api; import java.util.Optional; import java.util.UUID; +import java.util.concurrent.CompletableFuture; // todo: find a way to get this api for platforms with no service manager (singleton????) /** Represents the base AuthMe API */ @@ -11,19 +12,14 @@ public interface AuthMeAPI { * Returns the user with the specified name. If the user has not been found in AuthMe's cache, it * will create a one. * - *

WARNING: This may or may not be a thread blocking method. Call - * asynchronously!!!!!!1!!11!!!! - * * @param name name of the user you want to get * @return non-null user object */ - User getUser(String name); + CompletableFuture getUser(String name); /** * Returns the user with the specified name. * - *

WARNING: This is a thread blocking method. Call asynchronously!!!!!!1!!11!!!! - * * @param name name of the user you want to get * @return user if present in AuthMe's cache, empty optional otherwise */ @@ -32,8 +28,6 @@ public interface AuthMeAPI { /** * Returns the user with the specified unique id. * - *

WARNING: This is a thread blocking method. Call asynchronously!!!!!!1!!11!!!! - * * @param uuid uuid of the user you want to get * @return user if present in AuthMe's cache, empty optional otherwise */ diff --git a/common/src/main/java/eu/authme/common/AuthMePlugin.java b/common/src/main/java/eu/authme/common/AuthMePlugin.java deleted file mode 100644 index 3f1d8a499..000000000 --- a/common/src/main/java/eu/authme/common/AuthMePlugin.java +++ /dev/null @@ -1,8 +0,0 @@ -package eu.authme.common; - -import eu.authme.api.AuthMeAPI; - -public interface AuthMePlugin { - - void registerInServiceManager(AuthMeAPI api); -} diff --git a/common/src/main/java/eu/authme/common/AbstractAuthMeAPI.java b/common/src/main/java/eu/authme/common/api/AbstractAuthMeAPI.java similarity index 93% rename from common/src/main/java/eu/authme/common/AbstractAuthMeAPI.java rename to common/src/main/java/eu/authme/common/api/AbstractAuthMeAPI.java index ddab3fcae..e8f2b7923 100644 --- a/common/src/main/java/eu/authme/common/AbstractAuthMeAPI.java +++ b/common/src/main/java/eu/authme/common/api/AbstractAuthMeAPI.java @@ -1,4 +1,4 @@ -package eu.authme.common; +package eu.authme.common.api; import eu.authme.api.AuthEventListener; import eu.authme.api.AuthMeAPI; diff --git a/velocity/pom.xml b/velocity/pom.xml index b2522aa0a..8796965d9 100644 --- a/velocity/pom.xml +++ b/velocity/pom.xml @@ -50,6 +50,20 @@ ${velocity.version} provided + + + + ch.jalu + configme + ${configme.version} + provided + + + snakeyaml + org.yaml + + + diff --git a/velocity/src/main/java/eu/authme/velocity/AuthMeVelocity.java b/velocity/src/main/java/eu/authme/velocity/AuthMeVelocity.java index 40f3880eb..9de2cad2f 100644 --- a/velocity/src/main/java/eu/authme/velocity/AuthMeVelocity.java +++ b/velocity/src/main/java/eu/authme/velocity/AuthMeVelocity.java @@ -6,11 +6,15 @@ import com.velocitypowered.api.event.proxy.ProxyInitializeEvent; import com.velocitypowered.api.event.proxy.ProxyShutdownEvent; import com.velocitypowered.api.plugin.annotation.DataDirectory; import com.velocitypowered.api.proxy.ProxyServer; +import com.velocitypowered.api.proxy.messages.ChannelIdentifier; +import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier; import java.nio.file.Path; import org.slf4j.Logger; public final class AuthMeVelocity { + public static ChannelIdentifier MESSAGING = MinecraftChannelIdentifier.create("authme", "main"); + private final Logger logger; private final ProxyServer proxy; private final Path dataDirectory; @@ -20,11 +24,25 @@ public final class AuthMeVelocity { this.logger = logger; this.proxy = proxy; this.dataDirectory = dataDirectory; + logger.info("Initialized"); } @Subscribe - public void onInitialize(ProxyInitializeEvent event) {} + public void onInitialize(ProxyInitializeEvent event) { + proxy.getChannelRegistrar().register(MESSAGING); + logger.info("Enabled"); + } @Subscribe - public void onShutdown(ProxyShutdownEvent event) {} + public void onShutdown(ProxyShutdownEvent event) { + logger.info("Disabled"); + } + + public ProxyServer getProxy() { + return proxy; + } + + public Path getDataDirectory() { + return dataDirectory; + } } diff --git a/velocity/src/main/java/eu/authme/velocity/VelocityAuthMeAPI.java b/velocity/src/main/java/eu/authme/velocity/VelocityAuthMeAPI.java new file mode 100644 index 000000000..5e8d3071e --- /dev/null +++ b/velocity/src/main/java/eu/authme/velocity/VelocityAuthMeAPI.java @@ -0,0 +1,62 @@ +package eu.authme.velocity; + +import com.google.common.io.ByteArrayDataOutput; +import com.google.common.io.ByteStreams; +import eu.authme.api.User; +import eu.authme.common.api.AbstractAuthMeAPI; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; + +public class VelocityAuthMeAPI extends AbstractAuthMeAPI { + + private final AuthMeVelocity plugin; + private Map userCache = new ConcurrentHashMap<>(); + private Map> pendingFutures = new ConcurrentHashMap<>(); + + public VelocityAuthMeAPI(AuthMeVelocity plugin) { + this.plugin = plugin; + } + + @Override + public CompletableFuture getUser(String name) { + for (VelocityUser user : userCache.values()) { + if (user.getName().equalsIgnoreCase(name)) { + return CompletableFuture.completedFuture(user); + } + } + CompletableFuture future = new CompletableFuture<>(); + ByteArrayDataOutput out = ByteStreams.newDataOutput(); + out.writeUTF("GetUser"); + out.writeUTF(name); + // todo + try { + return future; + } finally { + pendingFutures.put(name, future); + } + } + + @Override + public Optional getUserIfPresent(String name) { + for (VelocityUser user : userCache.values()) { + if (user.getName().equalsIgnoreCase(name)) { + return Optional.of(user); + } + } + return Optional.empty(); + } + + @Override + public Optional getUserIfPresent(UUID uuid) { + return Optional.ofNullable(userCache.get(uuid)); + } + + public void putToUserCache(VelocityUser user) { + userCache.put(user.getUniqueId(), user); + } + + public void modify(VelocityUser user) {} +} diff --git a/velocity/src/main/java/eu/authme/velocity/VelocityUser.java b/velocity/src/main/java/eu/authme/velocity/VelocityUser.java new file mode 100644 index 000000000..f10112d42 --- /dev/null +++ b/velocity/src/main/java/eu/authme/velocity/VelocityUser.java @@ -0,0 +1,137 @@ +package eu.authme.velocity; + +import com.google.common.io.ByteArrayDataOutput; +import com.google.common.io.ByteStreams; +import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.proxy.ProxyServer; +import eu.authme.api.User; +import java.time.Instant; +import java.util.Optional; +import java.util.UUID; + +public class VelocityUser implements User { + + private final VelocityAuthMeAPI api; + private final ProxyServer proxy; + private final String name; + private String email; + private final UUID uuid; + private boolean loggedIn, registered; + private Instant registrationDate; + private Instant lastLoginDate; + + public VelocityUser( + VelocityAuthMeAPI api, + ProxyServer proxy, + String name, + String email, + UUID uuid, + boolean loggedIn, + boolean registered, + Instant registrationDate, + Instant lastLoginDate) { + this.name = name; + this.email = email; + this.uuid = uuid; + this.loggedIn = loggedIn; + this.registered = registered; + this.registrationDate = registrationDate; + this.lastLoginDate = lastLoginDate; + this.api = api; + this.proxy = proxy; + } + + @Override + public String getName() { + return name; + } + + @Override + public UUID getUniqueId() { + return uuid; + } + + @Override + public boolean hasLoggedIn() { + return loggedIn; + } + + public void setLoggedIn(boolean loggedIn) { + this.loggedIn = loggedIn; + if (loggedIn) { + api.callUserLogin(this); + } + } + + @Override + public boolean isRegistered() { + return registered; + } + + public void setRegistered(boolean registered) { + this.registered = registered; + if (registered) { + api.callUserRegister(this); + } else { + api.callUserUnregister(this); + } + } + + @Override + public void forceLogin() { + Optional playerOpt = proxy.getPlayer(name); + if (playerOpt.isPresent()) { + Player player = playerOpt.get(); + if (!loggedIn && player.getCurrentServer().isPresent()) { + ByteArrayDataOutput out = ByteStreams.newDataOutput(); + out.writeUTF("ForceLogin"); + out.writeUTF(player.getUniqueId().toString()); + // todo: make sure is in auth server + player.getCurrentServer().get().sendPluginMessage(AuthMeVelocity.MESSAGING, out.toByteArray()); + } + } + } + + @Override + public void forceRegister(String password) { + Optional playerOpt = proxy.getPlayer(name); + if (playerOpt.isPresent()) { + Player player = playerOpt.get(); + if (!registered && player.getCurrentServer().isPresent()) { + ByteArrayDataOutput out = ByteStreams.newDataOutput(); + out.writeUTF("ForceRegister"); + out.writeUTF(player.getUniqueId().toString()); + out.writeUTF(password); + // todo: make sure is in auth server + player.getCurrentServer().get().sendPluginMessage(AuthMeVelocity.MESSAGING, out.toByteArray()); + } + } + } + + @Override + public Optional getRegistrationDate() { + return Optional.ofNullable(registrationDate); + } + + public void setRegistrationDate(Instant date) { + this.registrationDate = date; + } + + @Override + public Optional getLastLoginDate() { + return Optional.ofNullable(lastLoginDate); + } + + public void setLastLoginDate(Instant date) { + this.lastLoginDate = date; + } + + @Override + public Optional getEmail() { + return Optional.ofNullable(email); + } + + public void setEmail(String email) { + this.email = email; + } +} diff --git a/velocity/src/main/java/eu/authme/velocity/listeners/PluginMessageListener.java b/velocity/src/main/java/eu/authme/velocity/listeners/PluginMessageListener.java new file mode 100644 index 000000000..6e461ed71 --- /dev/null +++ b/velocity/src/main/java/eu/authme/velocity/listeners/PluginMessageListener.java @@ -0,0 +1,5 @@ +package eu.authme.velocity.listeners; + +public class PluginMessageListener { + +} diff --git a/velocity/src/main/java/eu/authme/velocity/util/Constants.java b/velocity/src/main/java/eu/authme/velocity/util/Constants.java new file mode 100644 index 000000000..19868ea95 --- /dev/null +++ b/velocity/src/main/java/eu/authme/velocity/util/Constants.java @@ -0,0 +1,8 @@ +package eu.authme.velocity.util; + +import com.google.gson.Gson; + +public final class Constants { + + public static final Gson GSON = new Gson(); +}