ChestShop-3/src/main/java/com/Acrobot/ChestShop/Signs/ChestShopSign.java

153 lines
5.1 KiB
Java

package com.Acrobot.ChestShop.Signs;
import com.Acrobot.Breeze.Utils.BlockUtil;
import com.Acrobot.Breeze.Utils.StringUtil;
import com.Acrobot.ChestShop.Configuration.Properties;
import com.Acrobot.ChestShop.Containers.AdminInventory;
import com.Acrobot.ChestShop.Database.Account;
import com.Acrobot.ChestShop.Events.AccountQueryEvent;
import com.Acrobot.ChestShop.Permission;
import com.Acrobot.ChestShop.UUIDs.NameManager;
import com.Acrobot.ChestShop.Utils.uBlock;
import org.bukkit.Bukkit;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.block.Chest;
import org.bukkit.block.DoubleChest;
import org.bukkit.block.Sign;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import java.util.Locale;
import java.util.regex.Pattern;
/**
* @author Acrobot
*/
public class ChestShopSign {
public static final byte NAME_LINE = 0;
public static final byte QUANTITY_LINE = 1;
public static final byte PRICE_LINE = 2;
public static final byte ITEM_LINE = 3;
public static final Pattern[] SHOP_SIGN_PATTERN = {
Pattern.compile("^?[\\w -.:]*$"),
Pattern.compile("^[1-9][0-9]{0,5}$|^Q [1-9][0-9]{0,4} : C [0-9]{0,5}$"),
Pattern.compile("(?i)^[\\d.bs(free) :]+$"),
Pattern.compile("^[\\w? #:-]+$")
};
public static final String AUTOFILL_CODE = "?";
public static boolean isAdminShop(Inventory ownerInventory) {
return ownerInventory instanceof AdminInventory;
}
public static boolean isAdminShop(String owner) {
return owner.replace(" ", "").equalsIgnoreCase(Properties.ADMIN_SHOP_NAME.replace(" ", ""));
}
public static boolean isAdminShop(Sign sign) {
return isAdminShop(sign.getLine(NAME_LINE));
}
public static boolean isValid(Sign sign) {
return isValid(sign.getLines());
}
public static boolean isValid(String[] line) {
line = StringUtil.stripColourCodes(line);
return isValidPreparedSign(line) && (line[PRICE_LINE].toUpperCase(Locale.ROOT).contains("B") || line[PRICE_LINE].toUpperCase(Locale.ROOT).contains("S")) && !line[NAME_LINE].isEmpty();
}
public static boolean isValid(Block sign) {
return BlockUtil.isSign(sign) && isValid((Sign) sign.getState());
}
/**
* @deprecated Use {@link #isShopBlock(Block}
*/
@Deprecated
public static boolean isShopChest(Block chest) {
if (!BlockUtil.isChest(chest)) {
return false;
}
return uBlock.getConnectedSign((Chest) chest.getState()) != null;
}
public static boolean isShopBlock(Block block) {
if (!uBlock.couldBeShopContainer(block)) {
return false;
}
return uBlock.getConnectedSign(block) != null;
}
/**
* @deprecated Use {@link #isShopBlock(InventoryHolder}
*/
@Deprecated
public static boolean isShopChest(InventoryHolder holder) {
if (!BlockUtil.isChest(holder)) {
return false;
}
if (holder instanceof DoubleChest) {
return isShopChest(((DoubleChest) holder).getLocation().getBlock());
} else if (holder instanceof Chest) {
return isShopChest(((Chest) holder).getBlock());
} else {
return false;
}
}
public static boolean isShopBlock(InventoryHolder holder) {
if (holder instanceof DoubleChest) {
return isShopBlock(((DoubleChest) holder).getLeftSide())
|| isShopBlock(((DoubleChest) holder).getRightSide());
} else if (holder instanceof BlockState) {
return isShopBlock(((BlockState) holder).getBlock());
}
return false;
}
public static boolean canAccess(Player player, Sign sign) {
return hasPermission(player, Permission.OTHER_NAME_ACCESS, sign);
}
public static boolean hasPermission(Player player, Permission base, Sign sign) {
if (player == null) return false;
if (sign == null) return true;
String name = sign.getLine(NAME_LINE);
if (name == null || name.isEmpty()) return true;
return NameManager.canUseName(player, base, name);
}
public static boolean isOwner(Player player, Sign sign) {
if (player == null || sign == null) return false;
String name = sign.getLine(NAME_LINE);
if (name == null || name.isEmpty()) return false;
AccountQueryEvent accountQueryEvent = new AccountQueryEvent(name);
Bukkit.getPluginManager().callEvent(accountQueryEvent);
Account account = accountQueryEvent.getAccount();
if (account == null) {
return player.getName().equalsIgnoreCase(name);
}
return account.getUuid().equals(player.getUniqueId());
}
public static boolean isValidPreparedSign(String[] lines) {
for (int i = 0; i < 4; i++) {
if (!SHOP_SIGN_PATTERN[i].matcher(lines[i]).matches()) {
return false;
}
}
return lines[PRICE_LINE].indexOf(':') == lines[PRICE_LINE].lastIndexOf(':');
}
}