Черновой вариант
This commit is contained in:
commit
ad7e50738d
113
.gitignore
vendored
Normal file
113
.gitignore
vendored
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
# User-specific stuff
|
||||||
|
.idea/
|
||||||
|
|
||||||
|
*.iml
|
||||||
|
*.ipr
|
||||||
|
*.iws
|
||||||
|
|
||||||
|
# IntelliJ
|
||||||
|
out/
|
||||||
|
|
||||||
|
# Compiled class file
|
||||||
|
*.class
|
||||||
|
|
||||||
|
# Log file
|
||||||
|
*.log
|
||||||
|
|
||||||
|
# BlueJ files
|
||||||
|
*.ctxt
|
||||||
|
|
||||||
|
# Package Files #
|
||||||
|
*.jar
|
||||||
|
*.war
|
||||||
|
*.nar
|
||||||
|
*.ear
|
||||||
|
*.zip
|
||||||
|
*.tar.gz
|
||||||
|
*.rar
|
||||||
|
|
||||||
|
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||||
|
hs_err_pid*
|
||||||
|
|
||||||
|
*~
|
||||||
|
|
||||||
|
# temporary files which can be created if a process still has a handle open of a deleted file
|
||||||
|
.fuse_hidden*
|
||||||
|
|
||||||
|
# KDE directory preferences
|
||||||
|
.directory
|
||||||
|
|
||||||
|
# Linux trash folder which might appear on any partition or disk
|
||||||
|
.Trash-*
|
||||||
|
|
||||||
|
# .nfs files are created when an open file is removed but is still being accessed
|
||||||
|
.nfs*
|
||||||
|
|
||||||
|
# General
|
||||||
|
.DS_Store
|
||||||
|
.AppleDouble
|
||||||
|
.LSOverride
|
||||||
|
|
||||||
|
# Icon must end with two \r
|
||||||
|
Icon
|
||||||
|
|
||||||
|
# Thumbnails
|
||||||
|
._*
|
||||||
|
|
||||||
|
# Files that might appear in the root of a volume
|
||||||
|
.DocumentRevisions-V100
|
||||||
|
.fseventsd
|
||||||
|
.Spotlight-V100
|
||||||
|
.TemporaryItems
|
||||||
|
.Trashes
|
||||||
|
.VolumeIcon.icns
|
||||||
|
.com.apple.timemachine.donotpresent
|
||||||
|
|
||||||
|
# Directories potentially created on remote AFP share
|
||||||
|
.AppleDB
|
||||||
|
.AppleDesktop
|
||||||
|
Network Trash Folder
|
||||||
|
Temporary Items
|
||||||
|
.apdisk
|
||||||
|
|
||||||
|
# Windows thumbnail cache files
|
||||||
|
Thumbs.db
|
||||||
|
Thumbs.db:encryptable
|
||||||
|
ehthumbs.db
|
||||||
|
ehthumbs_vista.db
|
||||||
|
|
||||||
|
# Dump file
|
||||||
|
*.stackdump
|
||||||
|
|
||||||
|
# Folder config file
|
||||||
|
[Dd]esktop.ini
|
||||||
|
|
||||||
|
# Recycle Bin used on file shares
|
||||||
|
$RECYCLE.BIN/
|
||||||
|
|
||||||
|
# Windows Installer files
|
||||||
|
*.cab
|
||||||
|
*.msi
|
||||||
|
*.msix
|
||||||
|
*.msm
|
||||||
|
*.msp
|
||||||
|
|
||||||
|
# Windows shortcuts
|
||||||
|
*.lnk
|
||||||
|
|
||||||
|
target/
|
||||||
|
|
||||||
|
pom.xml.tag
|
||||||
|
pom.xml.releaseBackup
|
||||||
|
pom.xml.versionsBackup
|
||||||
|
pom.xml.next
|
||||||
|
|
||||||
|
release.properties
|
||||||
|
dependency-reduced-pom.xml
|
||||||
|
buildNumber.properties
|
||||||
|
.mvn/timing.properties
|
||||||
|
.mvn/wrapper/maven-wrapper.jar
|
||||||
|
.flattened-pom.xml
|
||||||
|
|
||||||
|
# Common working directory
|
||||||
|
run/
|
||||||
146
pom.xml
Normal file
146
pom.xml
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<groupId>main</groupId>
|
||||||
|
<artifactId>vp_server_integration</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
|
<name>vp_server_integration</name>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<java.version>17</java.version>
|
||||||
|
<kotlin.version>2.3.0-RC</kotlin.version>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<defaultGoal>clean package</defaultGoal>
|
||||||
|
<sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.jetbrains.kotlin</groupId>
|
||||||
|
<artifactId>kotlin-maven-plugin</artifactId>
|
||||||
|
<version>${kotlin.version}</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>compile</id>
|
||||||
|
<phase>compile</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>compile</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
<configuration>
|
||||||
|
<jvmTarget>${java.version}</jvmTarget>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-shade-plugin</artifactId>
|
||||||
|
<version>3.5.3</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>shade</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
<resources>
|
||||||
|
<resource>
|
||||||
|
<directory>src/main/resources</directory>
|
||||||
|
<filtering>true</filtering>
|
||||||
|
</resource>
|
||||||
|
</resources>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>spigotmc-repo</id>
|
||||||
|
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.spigotmc</groupId>
|
||||||
|
<artifactId>spigot-api</artifactId>
|
||||||
|
<version>1.12.2-R0.1-SNAPSHOT</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jetbrains.kotlin</groupId>
|
||||||
|
<artifactId>kotlin-stdlib-jdk8</artifactId>
|
||||||
|
<version>${kotlin.version}</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<!-- Deployment profile for FTPS and HTTP actions -->
|
||||||
|
<profiles>
|
||||||
|
<profile>
|
||||||
|
<id>myDeploy</id>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-antrun-plugin</artifactId>
|
||||||
|
<version>3.1.0</version>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-net</groupId>
|
||||||
|
<artifactId>commons-net</artifactId>
|
||||||
|
<version>3.9.0</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<executions>
|
||||||
|
<!-- FTPS file transfer execution -->
|
||||||
|
<execution>
|
||||||
|
<id>ftps-upload</id>
|
||||||
|
<phase>install</phase>
|
||||||
|
<configuration>
|
||||||
|
<target>
|
||||||
|
<echo message="UPLOADING file to ${ftps.username}@${ftps.host} ${srv.ftps.remote.directory}"/>
|
||||||
|
<echo message="curl -k --ssl-reqd --ftp-create-dirs -T target/vpSecure-1.0.jar -u ${ftps.username}:${ftps.password} ftp://${ftps.host}:${ftps.port}/${srv.ftps.remote.directory}"/>
|
||||||
|
<exec executable="sh">
|
||||||
|
<arg value="-c"/>
|
||||||
|
<arg value="curl -k --ssl-reqd --ftp-create-dirs -T target/vpSecure-1.0.jar -u ${ftps.username}:${ftps.password} ftp://${ftps.host}:${ftps.port}/${srv.ftps.remote.directory}"/>
|
||||||
|
</exec>
|
||||||
|
</target>
|
||||||
|
</configuration>
|
||||||
|
<goals>
|
||||||
|
<goal>run</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
|
||||||
|
<!-- HTTP POST request execution -->
|
||||||
|
<execution>
|
||||||
|
<id>http-notification</id>
|
||||||
|
<phase>install</phase>
|
||||||
|
<configuration>
|
||||||
|
<target>
|
||||||
|
<echo message="SENDING restart request to ${srv.restart.endpoint}"/>
|
||||||
|
<echo message="curl -k -X POST -H 'Authorization: Bearer ${minihost.token}' ${srv.restart.endpoint}"/>
|
||||||
|
<exec executable="sh">
|
||||||
|
<arg value="-c"/>
|
||||||
|
<arg value="curl -k -X POST -H 'Authorization: Bearer ${minihost.token}' ${srv.restart.endpoint}"/>
|
||||||
|
</exec>
|
||||||
|
</target>
|
||||||
|
</configuration>
|
||||||
|
<goals>
|
||||||
|
<goal>run</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</profile>
|
||||||
|
</profiles>
|
||||||
|
|
||||||
|
</project>
|
||||||
@ -0,0 +1,35 @@
|
|||||||
|
package main.vp_server_integration
|
||||||
|
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin
|
||||||
|
import org.bukkit.Bukkit
|
||||||
|
import java.util.logging.Logger
|
||||||
|
|
||||||
|
class Vp_server_integration : JavaPlugin() {
|
||||||
|
companion object {
|
||||||
|
lateinit var LOGGER: Logger
|
||||||
|
lateinit var SERVER: org.bukkit.Server
|
||||||
|
var PLUGIN_API_PORT: Int = 8010
|
||||||
|
lateinit var USERNAME: String
|
||||||
|
lateinit var TOKEN: String
|
||||||
|
lateinit var USER_API_URL: String
|
||||||
|
const val DEFAULT_USER_API_URL: String = "http://127.0.0.1:8010/api/"
|
||||||
|
const val DEFAULT_TOKEN: String = "test"
|
||||||
|
const val COLOR_CHAR: Char = '&'
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onEnable() {
|
||||||
|
// Initialize logger
|
||||||
|
LOGGER = this.logger
|
||||||
|
|
||||||
|
// Get server instance
|
||||||
|
SERVER = Bukkit.getServer()
|
||||||
|
|
||||||
|
// Plugin startup logic
|
||||||
|
LOGGER.info("VP Server Integration plugin enabled!")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDisable() {
|
||||||
|
// Plugin shutdown logic
|
||||||
|
LOGGER.info("VP Server Integration plugin disabled!")
|
||||||
|
}
|
||||||
|
}
|
||||||
176
src/main/kotlin/main/vp_server_integration/VpcApi.kt
Normal file
176
src/main/kotlin/main/vp_server_integration/VpcApi.kt
Normal file
@ -0,0 +1,176 @@
|
|||||||
|
package main.vp_server_integration
|
||||||
|
|
||||||
|
import com.google.gson.Gson
|
||||||
|
import com.google.gson.JsonElement
|
||||||
|
import com.google.gson.JsonParser
|
||||||
|
import com.google.gson.JsonSyntaxException
|
||||||
|
import org.bukkit.ChatColor
|
||||||
|
import org.bukkit.command.CommandSender
|
||||||
|
import org.bukkit.entity.Player
|
||||||
|
import java.io.BufferedReader
|
||||||
|
import java.io.InputStreamReader
|
||||||
|
import java.io.OutputStream
|
||||||
|
import java.net.HttpURLConnection
|
||||||
|
import java.net.URI
|
||||||
|
import java.net.URISyntaxException
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
class VpcApi {
|
||||||
|
companion object {
|
||||||
|
// Using Gson for JSON serialization - much cleaner than manual string building
|
||||||
|
fun jsonify(args: List<String>): String {
|
||||||
|
val map = mutableMapOf<String, String>()
|
||||||
|
for (i in args.indices step 2) {
|
||||||
|
if (i + 1 < args.size) {
|
||||||
|
map[args[i]] = args[i + 1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Gson().toJson(map)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Response wrapper class that supports both dot notation and bracket access
|
||||||
|
data class ApiResponse(
|
||||||
|
val status: Int,
|
||||||
|
val data: Map<String, Any>?,
|
||||||
|
val rawResponse: String
|
||||||
|
) {
|
||||||
|
operator fun get(key: String): Any? = data?.get(key)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun sendPost(urlPoint: String, json: String, customUrl: Boolean = false, baseurl: String = ""): ApiResponse {
|
||||||
|
var uri: URI
|
||||||
|
try {
|
||||||
|
uri = if (customUrl) {
|
||||||
|
URI.create(baseurl + urlPoint)
|
||||||
|
} else {
|
||||||
|
URI.create(Vp_server_integration.DEFAULT_USER_API_URL + urlPoint)
|
||||||
|
}
|
||||||
|
} catch (e: URISyntaxException) {
|
||||||
|
return ApiResponse(-1, null, "Error: Invalid URL syntax")
|
||||||
|
}
|
||||||
|
|
||||||
|
var connection: HttpURLConnection? = null
|
||||||
|
try {
|
||||||
|
connection = uri.toURL().openConnection() as HttpURLConnection
|
||||||
|
connection.requestMethod = "POST"
|
||||||
|
connection.setRequestProperty("Content-Type", "application/json; utf-8")
|
||||||
|
connection.doOutput = true
|
||||||
|
|
||||||
|
// Using proper OutputStream handling
|
||||||
|
val os: OutputStream = connection.outputStream
|
||||||
|
os.write(json.toByteArray(Charsets.UTF_8))
|
||||||
|
os.close()
|
||||||
|
|
||||||
|
val responseCode = connection.responseCode
|
||||||
|
var rawResponse = ""
|
||||||
|
var responseData: Map<String, Any>? = null
|
||||||
|
|
||||||
|
// Handle both success (2xx) and error (4xx, 5xx) responses
|
||||||
|
val inputStream = if (responseCode in 200..299) {
|
||||||
|
connection.inputStream
|
||||||
|
} else {
|
||||||
|
connection.errorStream
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read response if available
|
||||||
|
if (inputStream != null) {
|
||||||
|
rawResponse = BufferedReader(InputStreamReader(inputStream, "utf-8")).readText()
|
||||||
|
try {
|
||||||
|
// Try to parse response as JSON
|
||||||
|
// For Java 8 / Gson < 2.8.6, use JsonParser() constructor and parse() method
|
||||||
|
val jsonElement: JsonElement = JsonParser().parse(rawResponse)
|
||||||
|
if (jsonElement.isJsonObject) {
|
||||||
|
// If it's a JSON object, parse it as before
|
||||||
|
val jsonObject = jsonElement.asJsonObject
|
||||||
|
responseData = jsonObject.entrySet().associate { it.key to it.value.toString().trim('"') }
|
||||||
|
} else {
|
||||||
|
// If it's not a JSON object (e.g., raw string like "OK"), keep raw response
|
||||||
|
responseData = null
|
||||||
|
}
|
||||||
|
} catch (e: JsonSyntaxException) {
|
||||||
|
// If not valid JSON at all, keep raw response
|
||||||
|
responseData = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rawResponse = rawResponse.replace("\"", "")
|
||||||
|
return ApiResponse(responseCode, responseData, rawResponse)
|
||||||
|
|
||||||
|
} catch (e: Exception) {
|
||||||
|
// Handle network errors and other exceptions
|
||||||
|
return ApiResponse(-1, null, "Error: ${e.message}")
|
||||||
|
} finally {
|
||||||
|
connection?.disconnect()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun send(source: CommandSender, message: String, prefix: String = "&9[&bVPC&9] &3") {
|
||||||
|
// Translate color codes for Spigot
|
||||||
|
val coloredMessage = ChatColor.translateAlternateColorCodes('&', prefix + message)
|
||||||
|
source.sendMessage(coloredMessage)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun get_super_UUID(source: CommandSender): String {
|
||||||
|
if (source is Player) {
|
||||||
|
val uuid = source.uniqueId
|
||||||
|
val username = source.name
|
||||||
|
val address = source.address?.hostString ?: "unknown"
|
||||||
|
// Note: Some properties don't exist in 1.12.2, using available alternatives
|
||||||
|
val merged = "$uuid$username$address"
|
||||||
|
return hash(merged)
|
||||||
|
} else {
|
||||||
|
return "None"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun user_in_db(source: CommandSender? = null, username: String? = null): Map<String, Any>? {
|
||||||
|
var mine_uuid: String? = null
|
||||||
|
// Determine which parameter to use
|
||||||
|
val userParam = when {
|
||||||
|
username != null -> "username" to username
|
||||||
|
source is Player -> "username" to source.name
|
||||||
|
else -> throw IllegalArgumentException("Either source or username must be provided")
|
||||||
|
}
|
||||||
|
|
||||||
|
val response = sendPost(
|
||||||
|
"user_in_db/", jsonify(
|
||||||
|
listOf(
|
||||||
|
"token", Vp_server_integration.DEFAULT_TOKEN,
|
||||||
|
userParam.first, userParam.second
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
// response["someKey"] (map-like access)
|
||||||
|
return if (response.status == 200) {
|
||||||
|
response.data
|
||||||
|
} else {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun transfer_coins(src_username: String, dst_username: String, amount: Float): Any? {
|
||||||
|
val response = sendPost(
|
||||||
|
"transfer_coins/", jsonify(
|
||||||
|
listOf(
|
||||||
|
"token", Vp_server_integration.DEFAULT_TOKEN,
|
||||||
|
"src_username", src_username,
|
||||||
|
"dst_username", dst_username,
|
||||||
|
"amount", amount.toString()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
return if (response.status == 200) {
|
||||||
|
response.rawResponse
|
||||||
|
} else {
|
||||||
|
response.data?.get("detail")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Simple hash function (you might want to replace this with a proper hashing algorithm)
|
||||||
|
private fun hash(input: String): String {
|
||||||
|
return UUID.nameUUIDFromBytes(input.toByteArray()).toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
7
src/main/resources/plugin.yml
Normal file
7
src/main/resources/plugin.yml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
name: vp_server_integration
|
||||||
|
version: '1.0'
|
||||||
|
main: main.vp_server_integration.Vp_server_integration
|
||||||
|
load: STARTUP
|
||||||
|
authors: [ _SAN5_SkeLet0n_ ]
|
||||||
|
description: Integrate VPC into your server
|
||||||
|
website: voidproject.del.pw
|
||||||
Loading…
Reference in New Issue
Block a user