Возможность отключения функциональности.

This commit is contained in:
justuser-31 2025-11-30 19:24:16 +03:00
parent 1dbb100f97
commit 64dae5fdc4
2 changed files with 50 additions and 40 deletions

View File

@ -2,7 +2,7 @@ package main.VpcSpigotIntegration
import main.VpcSpigotIntegration.VpcServerIntegration.Companion.INVOICE_CREATION_TIMES import main.VpcSpigotIntegration.VpcServerIntegration.Companion.INVOICE_CREATION_TIMES
import main.VpcSpigotIntegration.VpcServerIntegration.Companion.LOGGER import main.VpcSpigotIntegration.VpcServerIntegration.Companion.LOGGER
import main.VpcSpigotIntegration.VpcServerIntegration.Companion.PAY_BY_SIGN import main.VpcSpigotIntegration.VpcServerIntegration.Companion.PAY_BY_SIGN_FEATURE
import main.VpcSpigotIntegration.VpcServerIntegration.Companion.PLUGIN import main.VpcSpigotIntegration.VpcServerIntegration.Companion.PLUGIN
import main.VpcSpigotIntegration.VpcServerIntegration.Companion.PREFIX import main.VpcSpigotIntegration.VpcServerIntegration.Companion.PREFIX
import main.VpcSpigotIntegration.VpcServerIntegration.Companion.SIGN_PAYMENT_INFO import main.VpcSpigotIntegration.VpcServerIntegration.Companion.SIGN_PAYMENT_INFO
@ -15,25 +15,17 @@ import net.md_5.bungee.api.chat.TextComponent
import org.bukkit.Bukkit import org.bukkit.Bukkit
import org.bukkit.Bukkit.getWorld import org.bukkit.Bukkit.getWorld
import org.bukkit.ChatColor import org.bukkit.ChatColor
import org.bukkit.Location
import org.bukkit.event.EventHandler import org.bukkit.event.EventHandler
import org.bukkit.event.block.BlockEvent
import org.bukkit.event.player.PlayerInteractEvent import org.bukkit.event.player.PlayerInteractEvent
import org.bukkit.Material import org.bukkit.Material
import org.bukkit.block.Chest
import org.bukkit.block.Container import org.bukkit.block.Container
import org.bukkit.block.Sign import org.bukkit.block.Sign
import org.bukkit.entity.Player import org.bukkit.entity.Player
import org.bukkit.event.Listener import org.bukkit.event.Listener
import org.bukkit.event.block.Action import org.bukkit.event.block.Action
import org.bukkit.event.block.BlockPlaceEvent
import org.bukkit.event.block.SignChangeEvent import org.bukkit.event.block.SignChangeEvent
import org.bukkit.inventory.Inventory
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
import org.bukkit.plugin.java.JavaPlugin
import java.util.Locale
import java.util.Locale.getDefault
class SignPaymentInfo( class SignPaymentInfo(
public val amount: Int, public val amount: Int,
@ -48,7 +40,7 @@ class SignHandler: Listener {
@EventHandler @EventHandler
fun onClick(event: PlayerInteractEvent) { fun onClick(event: PlayerInteractEvent) {
// Check if feature enabled // Check if feature enabled
if (!PAY_BY_SIGN) return if (!PAY_BY_SIGN_FEATURE) return
// Check if clicked block is a sign // Check if clicked block is a sign
val block = event.clickedBlock val block = event.clickedBlock
@ -151,7 +143,7 @@ class SignHandler: Listener {
@EventHandler @EventHandler
fun onSignChange(event: SignChangeEvent) { fun onSignChange(event: SignChangeEvent) {
// Check if feature enabled // Check if feature enabled
if (!PAY_BY_SIGN) return if (!PAY_BY_SIGN_FEATURE) return
if (event.getLine(0).contains("[VPC]")) { if (event.getLine(0).contains("[VPC]")) {
val vpcUsername = event.getLine(1) val vpcUsername = event.getLine(1)
val cost: Double? = event.getLine(2).toDoubleOrNull() val cost: Double? = event.getLine(2).toDoubleOrNull()

View File

@ -4,7 +4,6 @@ package main.VpcSpigotIntegration
// Here you will see the main logic // Here you will see the main logic
// ---------------------------------------------- // ----------------------------------------------
import com.sun.org.apache.xpath.internal.operations.Bool
import org.bukkit.plugin.java.JavaPlugin import org.bukkit.plugin.java.JavaPlugin
import org.bukkit.Bukkit import org.bukkit.Bukkit
import org.bukkit.command.Command import org.bukkit.command.Command
@ -16,7 +15,6 @@ import net.md_5.bungee.api.chat.HoverEvent
import net.md_5.bungee.api.chat.ClickEvent import net.md_5.bungee.api.chat.ClickEvent
import net.md_5.bungee.api.chat.TextComponent import net.md_5.bungee.api.chat.TextComponent
import org.bukkit.ChatColor import org.bukkit.ChatColor
import org.bukkit.Material
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
import org.bukkit.scheduler.BukkitRunnable import org.bukkit.scheduler.BukkitRunnable
import java.io.File import java.io.File
@ -24,7 +22,6 @@ import java.io.FileInputStream
import java.util.Properties import java.util.Properties
import kotlin.collections.mutableMapOf import kotlin.collections.mutableMapOf
import kotlin.math.abs import kotlin.math.abs
import kotlin.text.isEmpty
class VpcServerIntegration() : JavaPlugin(), CommandExecutor { class VpcServerIntegration() : JavaPlugin(), CommandExecutor {
companion object { companion object {
@ -43,7 +40,9 @@ class VpcServerIntegration() : JavaPlugin(), CommandExecutor {
lateinit var COURSE_DYNAMIC_COMMAND: String lateinit var COURSE_DYNAMIC_COMMAND: String
var COURSE_COMMISSION: Float = DEFAULT_COURSE_COMMISSION var COURSE_COMMISSION: Float = DEFAULT_COURSE_COMMISSION
var INVOICE_TIMEOUT_SECONDS: Long = DEFAULT_INVOICE_TIMEOUT_SECONDS var INVOICE_TIMEOUT_SECONDS: Long = DEFAULT_INVOICE_TIMEOUT_SECONDS
var PAY_BY_SIGN: Boolean = true // Features
var CURRENCY_CONVERT_FEATURE: Boolean = true
var PAY_BY_SIGN_FEATURE: Boolean = true
// Default configuration values // Default configuration values
const val DEFAULT_USERNAME: String = "test" const val DEFAULT_USERNAME: String = "test"
@ -59,7 +58,9 @@ class VpcServerIntegration() : JavaPlugin(), CommandExecutor {
const val DEFAULT_COURSE_DYNAMIC_COMMAND: String = "baltop force" const val DEFAULT_COURSE_DYNAMIC_COMMAND: String = "baltop force"
const val DEFAULT_COURSE_COMMISSION: Float = 5.0f const val DEFAULT_COURSE_COMMISSION: Float = 5.0f
const val DEFAULT_INVOICE_TIMEOUT_SECONDS: Long = 300 // 5 minutes const val DEFAULT_INVOICE_TIMEOUT_SECONDS: Long = 300 // 5 minutes
const val DEFAULT_PAY_BY_SIGN: Boolean = true // Features
const val DEFAULT_PAY_BY_SIGN_FEATURE: Boolean = true
const val DEFAULT_CURRENCY_CONVERT_FEATURE: Boolean = true
// Static configurations // Static configurations
const val PREFIX = "&9[&bVPC&7-&6I&9] &3" const val PREFIX = "&9[&bVPC&7-&6I&9] &3"
@ -126,7 +127,9 @@ class VpcServerIntegration() : JavaPlugin(), CommandExecutor {
COURSE_DYNAMIC_COMMAND = properties.getProperty("course_dynamic_command", DEFAULT_COURSE_DYNAMIC_COMMAND).replace("'", "") COURSE_DYNAMIC_COMMAND = properties.getProperty("course_dynamic_command", DEFAULT_COURSE_DYNAMIC_COMMAND).replace("'", "")
COURSE_COMMISSION = properties.getProperty("course_commission", DEFAULT_COURSE_COMMISSION.toString()).replace("'", "").toFloat() COURSE_COMMISSION = properties.getProperty("course_commission", DEFAULT_COURSE_COMMISSION.toString()).replace("'", "").toFloat()
INVOICE_TIMEOUT_SECONDS = properties.getProperty("invoice_timeout_seconds", DEFAULT_INVOICE_TIMEOUT_SECONDS.toString()).replace("'", "").toLong() INVOICE_TIMEOUT_SECONDS = properties.getProperty("invoice_timeout_seconds", DEFAULT_INVOICE_TIMEOUT_SECONDS.toString()).replace("'", "").toLong()
PAY_BY_SIGN = properties.getProperty("pay_by_sign", DEFAULT_PAY_BY_SIGN.toString()).replace("'", "").toBoolean() // Features
CURRENCY_CONVERT_FEATURE = properties.getProperty("currency_convert", DEFAULT_CURRENCY_CONVERT_FEATURE.toString()).replace("'", "").toBoolean()
PAY_BY_SIGN_FEATURE = properties.getProperty("pay_by_sign", DEFAULT_PAY_BY_SIGN_FEATURE.toString()).replace("'", "").toBoolean()
logger.info("Configuration loaded successfully - Username: $USERNAME, API URL: $USER_API_URL") logger.info("Configuration loaded successfully - Username: $USERNAME, API URL: $USER_API_URL")
} catch (e: Exception) { } catch (e: Exception) {
@ -198,8 +201,11 @@ invoice_timeout_seconds=$DEFAULT_INVOICE_TIMEOUT_SECONDS
# -------------------- END ------------------------ # -------------------- END ------------------------
# ------------------ Features --------------------- # ------------------ Features ---------------------
# Should we enable currency convert (VPC -> LC and vice versa)
currency_convert=${DEFAULT_CURRENCY_CONVERT_FEATURE}
# Should we enable pay by signs from containers (chest/etc.)? # Should we enable pay by signs from containers (chest/etc.)?
pay_by_sign=${DEFAULT_PAY_BY_SIGN} pay_by_sign=${DEFAULT_PAY_BY_SIGN_FEATURE}
# -------------------- END ------------------------ # -------------------- END ------------------------
""".trimIndent() """.trimIndent()
) )
@ -246,29 +252,6 @@ pay_by_sign=${DEFAULT_PAY_BY_SIGN}
// Run all logic asynchronously // Run all logic asynchronously
Bukkit.getScheduler().runTaskAsynchronously(PLUGIN, Runnable { Bukkit.getScheduler().runTaskAsynchronously(PLUGIN, Runnable {
when { when {
// Currency conversion
args.size in 3..4 && args[0] == "convert" -> {
handleCurrencyConversion(sender, args)
}
args.isNotEmpty() && args[0] == "convert" -> {
Utils.send(sender, "/vpi convert <vpc/lc> <сумма>")
}
// Course info
args.isNotEmpty() && args[0] == "course" -> {
val course = calculateExchangeRate()
LOGGER.info("Exchange rate calculated: $course")
if (course.isInfinite() || course == 0.0) {
LOGGER.error(if (course.isInfinite()) "Zero global balance?" else "Infinite global balance?")
Utils.send(sender, "&cПроизошла ошибка при расчёте курса. Обратитесь к администратору или повторите позже.")
} else {
val course2VPC = Utils.round(course * (1 - COURSE_COMMISSION / 100), NUM_AFTER_DOT)
val course2LC = Utils.round(course * (1 + COURSE_COMMISSION / 100), NUM_AFTER_DOT)
Utils.send(sender, "VPC->LC = &6$course2VPC&3 | LC->VPC = &6$course2LC")
}
}
// Authentication // Authentication
args.size == 2 && args[0] == "auth" -> { args.size == 2 && args[0] == "auth" -> {
handleAuthentication(sender, args) handleAuthentication(sender, args)
@ -277,6 +260,41 @@ pay_by_sign=${DEFAULT_PAY_BY_SIGN}
Utils.send(sender, "/vpi auth <ник>") Utils.send(sender, "/vpi auth <ник>")
} }
// Currency conversion
args.isNotEmpty() && args[0] == "convert" -> {
if (CURRENCY_CONVERT_FEATURE) {
if (args.size in 3..4 && args[0] == "convert") {
handleCurrencyConversion(sender, args)
} else {
Utils.send(sender, "/vpi convert <vpc/lc> <сумма>")
}
} else {
Utils.send(sender, "&cДанная функциональность отключена.")
}
}
// Course info
args.isNotEmpty() && args[0] == "course" -> {
if (CURRENCY_CONVERT_FEATURE) {
val course = calculateExchangeRate()
LOGGER.info("Exchange rate calculated: $course")
if (course.isInfinite() || course == 0.0) {
LOGGER.error(if (course.isInfinite()) "Zero global balance?" else "Infinite global balance?")
Utils.send(
sender,
"&cПроизошла ошибка при расчёте курса. Обратитесь к администратору или повторите позже."
)
} else {
val course2VPC = Utils.round(course * (1 - COURSE_COMMISSION / 100), NUM_AFTER_DOT)
val course2LC = Utils.round(course * (1 + COURSE_COMMISSION / 100), NUM_AFTER_DOT)
Utils.send(sender, "VPC->LC = &6$course2VPC&3 | LC->VPC = &6$course2LC")
}
} else {
Utils.send(sender, "&cДанная функциональность отключена.")
}
}
// Cancel sign pay // Cancel sign pay
args[0] == "signPay" && args[1] == "cancel" -> { args[0] == "signPay" && args[1] == "cancel" -> {
val invoiceId = TO_PAY_INVOICES[sender.name].toString() val invoiceId = TO_PAY_INVOICES[sender.name].toString()