diff --git a/src/main/kotlin/main/VpcSpigotIntegration/SignHandler.kt b/src/main/kotlin/main/VpcSpigotIntegration/SignHandler.kt index cc56e89..89bebee 100644 --- a/src/main/kotlin/main/VpcSpigotIntegration/SignHandler.kt +++ b/src/main/kotlin/main/VpcSpigotIntegration/SignHandler.kt @@ -38,7 +38,7 @@ import java.util.Locale.getDefault class SignPaymentInfo( public val amount: Int, public val type: Material, - public val container: Chest, + public val container: Container, public val player: Player, public val cost: Double, public val dst_username: String @@ -51,7 +51,7 @@ class SignHandler: Listener { if (!PAY_BY_SIGN) return // Check if clicked block is a sign - val block = event.clickedBlock!! + val block = event.clickedBlock if (block.type != Material.SIGN_POST && block.type != Material.WALL_SIGN) return // Verify it's actually a sign state val state = block.state @@ -66,7 +66,11 @@ class SignHandler: Listener { // Check if player already have open invoices if (TO_PAY_SIGN_INVOICES.contains(event.player.name)) { - Utils.send(event.player, "&cУ вас уже есть открытый счёт, сначала оплатите его.") + val message = TextComponent(ChatColor.translateAlternateColorCodes('&',"&cУ вас уже есть открытый счёт, сначала оплатите его или &6отмените.")) + message.clickEvent = ClickEvent(ClickEvent.Action.RUN_COMMAND, "/vpi signPay cancel") + message.hoverEvent = HoverEvent(HoverEvent.Action.SHOW_TEXT, + ComponentBuilder("/vpi signPay cancel").create()) + event.player.spigot().sendMessage(message) return } @@ -93,9 +97,9 @@ class SignHandler: Listener { val containerBlock = getWorld(event.clickedBlock.world.uid).getBlockAt(cordX, cordY, cordZ) LOGGER.info("Container block: $cordX $cordY $cordZ") - val container: Chest = containerBlock.state as Chest - LOGGER.info("Content: ${container.blockInventory.contents}") - var firstItem = container.blockInventory.contents.filterNotNull().firstOrNull() + val container: Container = containerBlock.state as Container + LOGGER.info("Content: ${container.inventory.contents}") + var firstItem = container.inventory.contents.filterNotNull().firstOrNull() if (firstItem == null) { Utils.send(event.player,"&cВ контейнере нет предметов для покупки.") } @@ -155,7 +159,7 @@ class SignHandler: Listener { var coloredLine: String // Check if some data is missing - if (vpcUsername.isEmpty() || cost == null || amount == null || amount < 0 || cost < 0) { + if (vpcUsername.isEmpty() || cost == null || amount == null || amount < 0 || cost < 0 || cost < 0.0001) { coloredLine = ChatColor.translateAlternateColorCodes('&', "$PREFIX&cError") event.setLine(0, coloredLine) return diff --git a/src/main/kotlin/main/VpcSpigotIntegration/VpcServerIntegration.kt b/src/main/kotlin/main/VpcSpigotIntegration/VpcServerIntegration.kt index 2368b0c..2620e73 100644 --- a/src/main/kotlin/main/VpcSpigotIntegration/VpcServerIntegration.kt +++ b/src/main/kotlin/main/VpcSpigotIntegration/VpcServerIntegration.kt @@ -277,6 +277,18 @@ pay_by_sign=${DEFAULT_PAY_BY_SIGN} Utils.send(sender, "/vpi auth <ник>") } + // Cancel sign pay + args[0] == "signPay" && args[1] == "cancel" -> { + val invoiceId = TO_PAY_INVOICES[sender.name].toString() + VpcApi.delete_invoice(invoiceId) + synchronized(TO_PAY_SIGN_INVOICES) { + TO_PAY_SIGN_INVOICES.remove(sender.name) + INVOICE_CREATION_TIMES.remove(invoiceId) + SIGN_PAYMENT_INFO.remove(invoiceId) + } + Utils.send(sender, "Счёт успешно отменён.") + } + // Default help menu else -> { showHelpMenu(sender) @@ -720,14 +732,22 @@ pay_by_sign=${DEFAULT_PAY_BY_SIGN} Utils.send(paymentInfo.player, "&cНевозможно вернуть VPC, обратитесь к администратору: $transferResult") } } else { - // If we have needed items - paymentInfo.player.inventory.addItem(itemStack) - paymentInfo.container.inventory.removeItem(itemStack) - - val transferResult = VpcApi.transfer_coins(paymentInfo.dst_username, paymentInfo.cost).toString() - if (transferResult != "OK") { - LOGGER.error("Can't transfer VPC, result: $transferResult") - } + // If we have needed items + val transferResult = VpcApi.transfer_coins(paymentInfo.dst_username, paymentInfo.cost).toString() + if (transferResult != "OK") { + LOGGER.error("Can't transfer VPC, result: $transferResult") + Utils.send(paymentInfo.player, "&cПеревод адресату невозможен, отмена покупки.") + // Return VPC + val vpcUsername = DataManager.getPlayerVPCUsername(paymentInfo.player.name).toString() + val transferResult = VpcApi.transfer_coins(vpcUsername, paymentInfo.cost).toString() + if (transferResult != "OK") { + LOGGER.error("Can't return VPC, result: $transferResult") + Utils.send(paymentInfo.player, "&cНевозможно вернуть VPC, обратитесь к администратору: $transferResult") + } + } else { + paymentInfo.player.inventory.addItem(itemStack) + paymentInfo.container.inventory.removeItem(itemStack) + } } // Clean up tracking maps