@@ -1,5 +1,14 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<module version="4">
 | 
			
		||||
  <component name="FacetManager">
 | 
			
		||||
    <facet type="minecraft" name="Minecraft">
 | 
			
		||||
      <configuration>
 | 
			
		||||
        <autoDetectTypes>
 | 
			
		||||
          <platformType>SPIGOT</platformType>
 | 
			
		||||
        </autoDetectTypes>
 | 
			
		||||
      </configuration>
 | 
			
		||||
    </facet>
 | 
			
		||||
  </component>
 | 
			
		||||
  <component name="NewModuleRootManager">
 | 
			
		||||
    <content url="file://$MODULE_DIR$">
 | 
			
		||||
      <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										19
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								pom.xml
									
									
									
									
									
								
							@@ -48,6 +48,21 @@
 | 
			
		||||
            <artifactId>kotlin-stdlib-jdk8</artifactId>
 | 
			
		||||
            <version>1.7.21</version>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.jetbrains.kotlin</groupId>
 | 
			
		||||
            <artifactId>kotlin-compiler</artifactId>
 | 
			
		||||
            <version>1.7.21</version>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.json</groupId>
 | 
			
		||||
            <artifactId>json</artifactId>
 | 
			
		||||
            <version>20220924</version>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.google.okhttp</groupId>
 | 
			
		||||
            <artifactId>okhttp</artifactId>
 | 
			
		||||
            <version>20120626</version>
 | 
			
		||||
        </dependency>
 | 
			
		||||
    </dependencies>
 | 
			
		||||
 | 
			
		||||
    <build>
 | 
			
		||||
@@ -87,8 +102,8 @@
 | 
			
		||||
                <groupId>org.apache.maven.plugins</groupId>
 | 
			
		||||
                <artifactId>maven-compiler-plugin</artifactId>
 | 
			
		||||
                <configuration>
 | 
			
		||||
                    <source>6</source>
 | 
			
		||||
                    <target>6</target>
 | 
			
		||||
                    <source>11</source>
 | 
			
		||||
                    <target>11</target>
 | 
			
		||||
                </configuration>
 | 
			
		||||
            </plugin>
 | 
			
		||||
            <plugin>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
package de.sh_edraft
 | 
			
		||||
 | 
			
		||||
import de.sh_edraft.config.Config
 | 
			
		||||
import de.sh_edraft.data.DataService
 | 
			
		||||
import de.sh_edraft.events.OnJoinListener
 | 
			
		||||
import de.sh_edraft.events.OnLeaveListener
 | 
			
		||||
import org.bukkit.plugin.java.JavaPlugin
 | 
			
		||||
@@ -9,14 +10,18 @@ open class OntimeHandlerPlugin() : JavaPlugin() {
 | 
			
		||||
 | 
			
		||||
    private lateinit var config: Config
 | 
			
		||||
 | 
			
		||||
    private lateinit var dataService: DataService
 | 
			
		||||
 | 
			
		||||
    override fun onEnable() {
 | 
			
		||||
        this.config = Config(logger)
 | 
			
		||||
        this.config.read("/config.properties", false)
 | 
			
		||||
        this.config.read("/config.${this.config.environment}.properties", true)
 | 
			
		||||
        this.config.read("/config.${this.config.hostName}.properties", true)
 | 
			
		||||
 | 
			
		||||
        server.pluginManager.registerEvents(OnJoinListener(logger), this)
 | 
			
		||||
        server.pluginManager.registerEvents(OnLeaveListener(logger), this)
 | 
			
		||||
        this.dataService = DataService(logger, this.config)
 | 
			
		||||
 | 
			
		||||
        server.pluginManager.registerEvents(OnJoinListener(logger, this.dataService), this)
 | 
			
		||||
        server.pluginManager.registerEvents(OnLeaveListener(logger, this.dataService), this)
 | 
			
		||||
 | 
			
		||||
        logger.info("OntimeHandlerPlugin enabled :D")
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										128
									
								
								src/main/kotlin/de/sh_edraft/data/DataService.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								src/main/kotlin/de/sh_edraft/data/DataService.kt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,128 @@
 | 
			
		||||
package de.sh_edraft.data
 | 
			
		||||
 | 
			
		||||
import de.sh_edraft.config.Config
 | 
			
		||||
import java.net.URI
 | 
			
		||||
import java.net.http.HttpClient
 | 
			
		||||
import java.net.http.HttpRequest
 | 
			
		||||
import java.net.http.HttpResponse
 | 
			
		||||
import java.util.logging.Logger
 | 
			
		||||
import org.json.JSONObject
 | 
			
		||||
 | 
			
		||||
class DataService(
 | 
			
		||||
    private val logger: Logger,
 | 
			
		||||
    private val config: Config
 | 
			
		||||
) {
 | 
			
		||||
    private fun getUserIdByPlayerIdQuery(id: String): String {
 | 
			
		||||
        return JSONObject(
 | 
			
		||||
            """
 | 
			
		||||
            {
 | 
			
		||||
                "query": "query { users(filter: { minecraftId: \"$id\" }) { id } }"
 | 
			
		||||
            }
 | 
			
		||||
        """.trimIndent()
 | 
			
		||||
        ).toString()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun getUserJoinedMutation(id: Int): String {
 | 
			
		||||
        return JSONObject(
 | 
			
		||||
            """
 | 
			
		||||
            {
 | 
			
		||||
                "query": "mutation { userJoinedGameServer { userJoined(input: { userId: $id gameServer: \"Minecraft\" }) { id } } }"
 | 
			
		||||
            }
 | 
			
		||||
        """.trimIndent()
 | 
			
		||||
        ).toString()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun getUserLeavedMutation(id: Int): String {
 | 
			
		||||
        return JSONObject(
 | 
			
		||||
            """
 | 
			
		||||
            {
 | 
			
		||||
                "query": "mutation { userJoinedGameServer { userLeaved (input: { userId: $id gameServer: \"Minecraft\" }) { id } } }"
 | 
			
		||||
            }
 | 
			
		||||
        """.trimIndent()
 | 
			
		||||
        ).toString()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun getPlayerGlobalId(name: String): String? {
 | 
			
		||||
        val client = HttpClient.newBuilder().build();
 | 
			
		||||
        val request = HttpRequest.newBuilder()
 | 
			
		||||
            .uri(URI.create("https://api.mojang.com/users/profiles/minecraft/$name"))
 | 
			
		||||
            .build();
 | 
			
		||||
 | 
			
		||||
        val response = client.send(request, HttpResponse.BodyHandlers.ofString()).body() ?: return null;
 | 
			
		||||
        val json = JSONObject(response)
 | 
			
		||||
        return json.getString("id");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    fun getUserIdByPlayerId(id: String): Int? {
 | 
			
		||||
        val client = HttpClient.newBuilder().build();
 | 
			
		||||
 | 
			
		||||
        val request = HttpRequest.newBuilder()
 | 
			
		||||
            .uri(URI.create(this.config.ApiURL))
 | 
			
		||||
            .POST(HttpRequest.BodyPublishers.ofString(this.getUserIdByPlayerIdQuery(id)))
 | 
			
		||||
            .header("Authorization", "API-Key ${this.config.ApiKey}")
 | 
			
		||||
            .header("Content-Type", "application/json")
 | 
			
		||||
            .build();
 | 
			
		||||
 | 
			
		||||
        val response = client.send(request, HttpResponse.BodyHandlers.ofString());
 | 
			
		||||
        try {
 | 
			
		||||
            return JSONObject(response.body())
 | 
			
		||||
                .getJSONObject("data")
 | 
			
		||||
                .getJSONArray("users")
 | 
			
		||||
                .getJSONObject(0)
 | 
			
		||||
                .getString("id")
 | 
			
		||||
                .toIntOrNull();
 | 
			
		||||
        } catch (e: Exception) {
 | 
			
		||||
            logger.severe(e.message);
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun sendJoinedPlayer(id: Int) {
 | 
			
		||||
        val client = HttpClient.newBuilder().build();
 | 
			
		||||
 | 
			
		||||
        val request = HttpRequest.newBuilder()
 | 
			
		||||
            .uri(URI.create(this.config.ApiURL))
 | 
			
		||||
            .POST(HttpRequest.BodyPublishers.ofString(this.getUserJoinedMutation(id)))
 | 
			
		||||
            .header("Authorization", "API-Key ${this.config.ApiKey}")
 | 
			
		||||
            .header("Content-Type", "application/json")
 | 
			
		||||
            .build();
 | 
			
		||||
 | 
			
		||||
        val response = client.send(request, HttpResponse.BodyHandlers.ofString());
 | 
			
		||||
        try {
 | 
			
		||||
            // check if response is valid
 | 
			
		||||
            val joinId = JSONObject(response.body())
 | 
			
		||||
                .getJSONObject("data")
 | 
			
		||||
                .getJSONObject("userJoinedGameServer")
 | 
			
		||||
                .getJSONObject("userJoined")
 | 
			
		||||
                .getString("id")
 | 
			
		||||
                .toIntOrNull();
 | 
			
		||||
        } catch (e: Exception) {
 | 
			
		||||
            logger.severe(e.message);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun sendLeavedPlayer(id: Int) {
 | 
			
		||||
        val client = HttpClient.newBuilder().build();
 | 
			
		||||
 | 
			
		||||
        val request = HttpRequest.newBuilder()
 | 
			
		||||
            .uri(URI.create(this.config.ApiURL))
 | 
			
		||||
            .POST(HttpRequest.BodyPublishers.ofString(this.getUserLeavedMutation(id)))
 | 
			
		||||
            .header("Authorization", "API-Key ${this.config.ApiKey}")
 | 
			
		||||
            .header("Content-Type", "application/json")
 | 
			
		||||
            .build();
 | 
			
		||||
 | 
			
		||||
        val response = client.send(request, HttpResponse.BodyHandlers.ofString());
 | 
			
		||||
        try {
 | 
			
		||||
            // check if response is valid
 | 
			
		||||
            val joinId = JSONObject(response.body())
 | 
			
		||||
                .getJSONObject("data")
 | 
			
		||||
                .getJSONObject("userJoinedGameServer")
 | 
			
		||||
                .getJSONObject("userJoined")
 | 
			
		||||
                .getString("id")
 | 
			
		||||
                .toIntOrNull();
 | 
			
		||||
        } catch (e: Exception) {
 | 
			
		||||
            logger.severe(e.message);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,13 +1,22 @@
 | 
			
		||||
package de.sh_edraft.events
 | 
			
		||||
 | 
			
		||||
import de.sh_edraft.data.DataService
 | 
			
		||||
import org.bukkit.event.EventHandler
 | 
			
		||||
import org.bukkit.event.Listener
 | 
			
		||||
import org.bukkit.event.player.PlayerJoinEvent
 | 
			
		||||
import java.util.logging.Logger
 | 
			
		||||
 | 
			
		||||
class OnJoinListener(private val logger: Logger) : Listener {
 | 
			
		||||
class OnJoinListener(
 | 
			
		||||
    private val logger: Logger,
 | 
			
		||||
    private val dataService: DataService
 | 
			
		||||
) : Listener {
 | 
			
		||||
    @EventHandler
 | 
			
		||||
    fun onPlayerJoin(p: PlayerJoinEvent) {
 | 
			
		||||
        logger.info("Player ${p.player.player?.displayName} joined")
 | 
			
		||||
        if (p.player.player ==  null) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        val playerId = this.dataService.getPlayerGlobalId(p.player.player!!.displayName) ?: return;
 | 
			
		||||
        val userId = this.dataService.getUserIdByPlayerId(playerId) ?: return;
 | 
			
		||||
        this.dataService.sendJoinedPlayer(userId);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
package de.sh_edraft.events
 | 
			
		||||
 | 
			
		||||
import de.sh_edraft.data.DataService
 | 
			
		||||
import org.bukkit.event.EventHandler
 | 
			
		||||
import org.bukkit.event.Listener
 | 
			
		||||
import org.bukkit.event.player.PlayerEvent
 | 
			
		||||
@@ -7,10 +8,18 @@ import org.bukkit.event.player.PlayerKickEvent
 | 
			
		||||
import org.bukkit.event.player.PlayerQuitEvent
 | 
			
		||||
import java.util.logging.Logger
 | 
			
		||||
 | 
			
		||||
class OnLeaveListener(private val logger: Logger) : Listener {
 | 
			
		||||
class OnLeaveListener(
 | 
			
		||||
    private val logger: Logger,
 | 
			
		||||
    private val dataService: DataService
 | 
			
		||||
) : Listener {
 | 
			
		||||
 | 
			
		||||
    private fun handleQuit(p: PlayerEvent) {
 | 
			
		||||
        this.logger.info("Player ${p.player.player?.displayName} leaved")
 | 
			
		||||
        if (p.player.player ==  null) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        val playerId = this.dataService.getPlayerGlobalId(p.player.player!!.displayName) ?: return;
 | 
			
		||||
        val userId = this.dataService.getUserIdByPlayerId(playerId) ?: return;
 | 
			
		||||
        this.dataService.sendLeavedPlayer(userId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @EventHandler
 | 
			
		||||
 
 | 
			
		||||
@@ -1,2 +1,2 @@
 | 
			
		||||
apiURL: http://localhost/api/
 | 
			
		||||
apiKey: abcd
 | 
			
		||||
apiURL: http://localhost:8044/api/graphql
 | 
			
		||||
apiKey: 7b93e3b46bbfbdafc7b1e7a9d3fc05ebf68c0ead3093bda8802fa241081c7173
 | 
			
		||||
		Reference in New Issue
	
	Block a user