Add AuctionHouse to local repo
Add hook for towny
This commit is contained in:
Heliosares
2022-10-23 20:36:13 -04:00
parent 40e2bf0ee8
commit 429f719959
31 changed files with 977 additions and 233 deletions

View File

@@ -57,7 +57,12 @@ Actions:
Enabled: true
WorldChange: false
Interval: 3600000
Diff-Interval: 1000
# Enables differential logging and searching of inventories down to the second.
# This feature is experimental and will consume more disk space.
Diff-Interval: 0
# Use this if you run into issues with death inventories being empty.
# This is usually due to a plugin like DeathChests clearing the inventory before AuxProtect sees it.
LowestPriority: false
launch:
Enabled: true
grab:
@@ -74,6 +79,64 @@ Actions:
Enabled: true
elytra:
Enabled: true
gamemode:
Enabled: true
explode:
Enabled: true
auctionbuy:
Enabled: true
lightning:
Enabled: true
vein:
Enabled: true
pay:
Enabled: true
auctionlist:
Enabled: true
activity:
Enabled: true
alert:
Enabled: true
totem:
Enabled: true
jobs:
Enabled: true
tame:
Enabled: true
censor:
Enabled: true
breakitem:
Enabled: true
tp:
Enabled: true
towncreate:
Enabled: true
nationdelete:
Enabled: true
townyname:
Enabled: true
townrename:
Enabled: true
townjoin:
Enabled: true
nationrename:
Enabled: true
townmerge:
Enabled: true
nationjoin:
Enabled: true
townclaim:
Enabled: true
townbank:
Enabled: true
nationcreate:
Enabled: true
towndelete:
Enabled: true
townmayor:
Enabled: true
nationbank:
Enabled: true
# Automatically check for updates and display notifications in game.
# It's recommended to leave this enabled, as I'm constantly improving the plugin.
checkforupdates: true

View File

@@ -136,4 +136,28 @@ actions:
p: add itemframe
n: remove itemframe
ahlist: listed on ah
ahbuy: bought from ah
ahbuy: bought from ah
townyname: named
towncreate: created town
townrename: renamed town to
towndelete: deleted town
townjoin:
p: joined town
n: left town
townclaim:
p: claimed
n: unclaimed
townmerge: merged into
townmayor: became the mayor of
townbank:
p: deposited
n: withdrew
nationcreate: created nation
nationrename: renamed nation
nationdelete: deleted nation
nationjoin:
p: joined nation
n: left nation
nationbank:
p: deposited
n: withdrew

Binary file not shown.

View File

@@ -0,0 +1 @@
d35928238d1bde85ab595887981778ab

View File

@@ -0,0 +1 @@
e5f8477f8bd3fc2781ecc5ea4327214a6b9b151f

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>AuctionHouse</groupId>
<artifactId>AuctionHouse</artifactId>
<version>1.19-3.3.1</version>
</project>

View File

@@ -0,0 +1 @@
5462c29004390ec8d562f7391c2ea36f

View File

@@ -0,0 +1 @@
c0379648e4bc86f80cc64f7451516acbc3e02ac5

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>AuctionHouse</groupId>
<artifactId>AuctionHouse</artifactId>
<versioning>
<release>1.19-3.3.1</release>
<versions>
<version>1.19-3.3.1</version>
</versions>
<lastUpdated>20221024002907</lastUpdated>
</versioning>
</metadata>

View File

@@ -0,0 +1 @@
96df14c31a51be743854e8eb96ed8b4f

View File

@@ -0,0 +1 @@
e055ff957032acf6b5025a0c99a377f776801f84

View File

@@ -3,7 +3,7 @@ version: %VERSION%
main: dev.heliosares.auxprotect.spigot.AuxProtectSpigot
description: A plugin designed to supplement CoreProtect in a few ways.
api-version: 1.13
softdepend: [ShopGUIPlus, ChestShop, AuctionHouse, Vault, CoreProtect, EconomyShopGUI, EconomyShopGUI-Premium, DynamicShop, Jobs, Essentials]
softdepend: [ShopGUIPlus, ChestShop, AuctionHouse, Vault, CoreProtect, EconomyShopGUI, EconomyShopGUI-Premium, DynamicShop, Jobs, Essentials, Towny]
loadbefore: [AdvancedPortals]
commands:

28
pom.xml
View File

@@ -2,7 +2,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>AuxProtect</groupId>
<artifactId>AuxProtect</artifactId>
<version>1.2-pre2</version>
<version>1.2-pre4</version>
<name>AuxProtect</name>
<build>
<finalName>${project.artifactId}-${project.version}</finalName>
@@ -95,6 +95,14 @@
<id>essentials-repo</id>
<url>https://repo.essentialsx.net/releases/</url>
</repository>
<repository>
<id>glaremasters repo</id>
<url>https://repo.glaremasters.me/repository/towny/</url>
</repository>
<repository>
<id>local-maven-repo</id>
<url>file:///${project.basedir}/local-maven-repo</url>
</repository>
</repositories>
<dependencies>
<dependency>
@@ -155,13 +163,6 @@
<artifactId>EconomyShopGUI-API</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>com.auctionhouse</groupId>
<artifactId>auctionhouse</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${jars}/AuctionHouse-1.19-3.3.1.jar</systemPath>
</dependency>
<dependency>
<groupId>com.github.7sat</groupId>
<artifactId>SSDynamicShop</artifactId>
@@ -180,6 +181,17 @@
<version>2.19.7</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.palmergames.bukkit.towny</groupId>
<artifactId>towny</artifactId>
<version>0.98.2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>AuctionHouse</groupId>
<artifactId>AuctionHouse</artifactId>
<version>1.19-3.3.1</version>
</dependency>
</dependencies>
<properties>
<jars>${env.USERPROFILE}/eclipse-workspace/jars</jars>

View File

@@ -161,7 +161,7 @@ public class AuxProtectBungee extends Plugin implements Listener, IAuxProtect {
print(e);
}
config = new APConfig(configurationFile);
config = new APConfig(this, configurationFile);
}
@Override
@@ -272,7 +272,7 @@ public class AuxProtectBungee extends Plugin implements Listener, IAuxProtect {
@Override
public void reloadConfig() {
config = new APConfig(configurationFile);
config = new APConfig(this, configurationFile);
}
@Override
@@ -289,4 +289,10 @@ public class AuxProtectBungee extends Plugin implements Listener, IAuxProtect {
public void setDebug(int debug) {
this.debug = debug;
}
@Override
public boolean isHooked(String name) {
// TODO Future implementation
return false;
}
}

View File

@@ -171,7 +171,7 @@ public class APBCommand extends Command implements TabExecutor {
if (currentArg.startsWith("action:") || currentArg.startsWith("a:")) {
String action = currentArg.split(":")[0] + ":";
for (EntryAction eaction : EntryAction.values()) {
if (eaction.isBungee() && eaction.isEnabled()) {
if (eaction.exists(plugin) && eaction.isEnabled()) {
String actString = eaction.toString().toLowerCase();
if (eaction.hasDual) {
possible.add(action + "+" + actString);

View File

@@ -3,11 +3,11 @@ package dev.heliosares.auxprotect.core;
import org.bukkit.configuration.file.FileConfiguration;
import dev.heliosares.auxprotect.database.EntryAction;
import dev.heliosares.auxprotect.utils.KeyUtil;
import net.md_5.bungee.config.Configuration;
public class APConfig {
private boolean privateRelease = false;
private boolean inventoryOnWorldChange;
private boolean checkforupdates;
private long posInterval;
@@ -16,6 +16,7 @@ public class APConfig {
private long moneyInterval;
private boolean overrideCommands;
private boolean skipV6Migration;
private KeyUtil key;
public boolean isInventoryOnWorldChange() {
return inventoryOnWorldChange;
@@ -42,15 +43,26 @@ public class APConfig {
}
public boolean isPrivate() {
return privateRelease;
if (key == null)
return false;
return key.isPrivate();
}
public boolean isDonor() {
if (key == null)
return false;
return key.isValid();
}
public boolean isOverrideCommands() {
return overrideCommands;
}
public APConfig(FileConfiguration config) {
privateRelease = config.getBoolean("private");
public APConfig(IAuxProtect plugin, FileConfiguration config) {
String keystr = config.getString("donorkey");
if (keystr != null) {
key = new KeyUtil(keystr);
}
checkforupdates = config.getBoolean("checkforupdates", true);
inventoryOnWorldChange = config.getBoolean("Actions.inventory.WorldChange", false);
posInterval = config.getLong("Actions.pos.Interval", 10000);
@@ -59,23 +71,41 @@ public class APConfig {
moneyInterval = config.getLong("Actions.money.Interval", 600000);
skipV6Migration = config.getBoolean("skipv6migration");
for (EntryAction action : EntryAction.values()) {
if (!action.exists(plugin)) {
action.setEnabled(false);
continue;
}
if (action == EntryAction.USERNAME) {
action.setEnabled(true);
continue;
}
boolean enabled = config.getBoolean("Actions." + action.toString().toLowerCase() + ".Enabled", true);
boolean priority = config.getBoolean("Actions." + action.toString().toLowerCase() + ".LowestPriority",
false);
action.setEnabled(enabled);
action.setLowestpriority(priority);
config.set("Actions." + action.toString().toLowerCase() + ".Enabled", enabled);
}
overrideCommands = config.getBoolean("OverrideCommands");
}
public APConfig(Configuration config) {
privateRelease = config.getBoolean("private");
public APConfig(IAuxProtect plugin, Configuration config) {
String keystr = config.getString("donorkey");
if (keystr != null) {
key = new KeyUtil(keystr);
}
checkforupdates = config.getBoolean("checkforupdates", true);
for (EntryAction action : EntryAction.values()) {
if (!action.isBungee()) {
if (!action.exists(plugin)) {
action.setEnabled(false);
continue;
}
if (action == EntryAction.USERNAME) {
action.setEnabled(true);
continue;
}
boolean enabled = config.getBoolean("Actions." + action.toString().toLowerCase() + ".Enabled", true);
config.set("Actions." + action.toString().toLowerCase() + ".Enabled", enabled);
action.setEnabled(enabled);
}
}

View File

@@ -49,4 +49,6 @@ public interface IAuxProtect {
public MySender getConsoleSender();
public boolean isShuttingDown();
public boolean isHooked(String name);
}

View File

@@ -15,9 +15,8 @@ public class DatabaseRunnable implements Runnable {
private final SQLManager sqlManager;
private final IAuxProtect plugin;
private static HashMap<Table, Long> lastTimes = new HashMap<>();
// private long running = 0;
// private long lastWarn = 0;
private long lastPolled = 0;
private long running = 0;
private long lastWarn = 0;
private ConcurrentLinkedQueue<PickupEntry> pickups = new ConcurrentLinkedQueue<>();
private static final long pickupCacheTime = 1500;
private ConcurrentLinkedQueue<JobsEntry> jobsentries = new ConcurrentLinkedQueue<>();
@@ -66,78 +65,80 @@ public class DatabaseRunnable implements Runnable {
return;
}
// TODO was this necessary?
// if (running > 0) {
// if (System.currentTimeMillis() - running > 20000) {
// if (System.currentTimeMillis() - lastWarn > 60000) {
// lastWarn = System.currentTimeMillis();
// plugin.warning("Overlapping logging windows > 20 seconds by "
// + (System.currentTimeMillis() - running) + " ms.");
// }
// }
// plugin.debug("Overlapping logging windows by " + (System.currentTimeMillis() - running) + " ms.", 1);
// return;
// }
// running = System.currentTimeMillis();
if (running > 0) {
if (System.currentTimeMillis() - running > 20000) {
if (System.currentTimeMillis() - lastWarn > 60000) {
lastWarn = System.currentTimeMillis();
plugin.warning("Overlapping logging windows > 20 seconds by "
+ (System.currentTimeMillis() - running) + " ms.");
}
}
plugin.debug("Overlapping logging windows by " + (System.currentTimeMillis() - running) + " ms.", 1);
if (System.currentTimeMillis() - running < 300000) {
return;
} else {
plugin.warning("Overlapping logging windows by 5 minutes, continuing.");
}
}
running = System.currentTimeMillis();
checkCache();
if (System.currentTimeMillis() - lastPolled > 3000 || queue.size() > 50) {
DbEntry entry;
long start = System.nanoTime();
DbEntry entry;
long start = System.nanoTime();
HashMap<Table, ArrayList<DbEntry>> entriesHash = new HashMap<>();
lastPolled = System.currentTimeMillis();
while ((entry = queue.poll()) != null) {
if (plugin.getDebug() >= 2) {
String debug = String.format("§9%s §f%s§7(%d) §9%s §7", entry.getUser(),
entry.getAction().getText(plugin, entry.getState()),
entry.getAction().getId(entry.getState()), entry.getTarget());
if (entry.getData() != null && entry.getData().length() > 0) {
String data = entry.getData();
if (data.length() > 64) {
data = data.substring(0, 64) + "...";
}
debug += "(" + data + ")";
HashMap<Table, ArrayList<DbEntry>> entriesHash = new HashMap<>();
while ((entry = queue.poll()) != null) {
if (plugin.getDebug() >= 2) {
String debug = String.format("§9%s §f%s§7(%d) §9%s §7", entry.getUser(),
entry.getAction().getText(plugin, entry.getState()),
entry.getAction().getId(entry.getState()), entry.getTarget());
if (entry.getData() != null && entry.getData().length() > 0) {
String data = entry.getData();
if (data.length() > 64) {
data = data.substring(0, 64) + "...";
}
plugin.debug(debug, 2);
debug += "(" + data + ")";
}
plugin.debug(debug, 2);
}
Table table = entry.getAction().getTable();
Table table = entry.getAction().getTable();
if (table == null) {
if (table == null) {
continue;
}
ArrayList<DbEntry> entriesList = entriesHash.get(table);
if (entriesList == null) {
entriesList = new ArrayList<>();
}
entriesList.add(entry);
entriesHash.put(table, entriesList);
}
for (Entry<Table, ArrayList<DbEntry>> entryPair : entriesHash.entrySet()) {
try {
int size = entryPair.getValue().size();
if (size == 0) {
continue;
}
ArrayList<DbEntry> entriesList = entriesHash.get(table);
if (entriesList == null) {
entriesList = new ArrayList<>();
}
entriesList.add(entry);
entriesHash.put(table, entriesList);
}
for (Entry<Table, ArrayList<DbEntry>> entryPair : entriesHash.entrySet()) {
try {
int size = entryPair.getValue().size();
if (size == 0) {
continue;
}
sqlManager.put(entryPair.getKey(), entryPair.getValue());
plugin.debug(debugLogStatement(start, size, entryPair.getKey()), 1);
start = System.nanoTime();
} catch (Exception e) {
plugin.print(e);
}
sqlManager.put(entryPair.getKey(), entryPair.getValue());
plugin.debug(debugLogStatement(start, size, entryPair.getKey()), 1);
start = System.nanoTime();
} catch (Exception e) {
plugin.print(e);
}
}
} catch (Exception e) {
plugin.print(e);
}
sqlManager.cleanup();
// running = 0;
sqlManager.cleanup();
} catch (Throwable e) {
plugin.print(e);
} finally {
running = 0;
}
}
private String debugLogStatement(long start, int count, Table table) {

View File

@@ -1,6 +1,6 @@
package dev.heliosares.auxprotect.database;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import org.bukkit.Location;
@@ -8,9 +8,9 @@ public class DbEntry {
private final long time;
private final EntryAction action;
private final boolean state;
private String data;
protected final EntryAction action;
protected final boolean state;
protected String data;
public final String world;
public final int x;
@@ -21,12 +21,12 @@ public class DbEntry {
public final int yaw;
protected String userLabel;
private String user;
private int uid;
protected String user;
protected int uid;
private String targetLabel;
private String target;
private int target_id;
protected String targetLabel;
protected String target;
protected int target_id;
private boolean hasBlob;
private byte[] blob;
@@ -68,7 +68,7 @@ public class DbEntry {
* @param state Specifies the state of EntryAction (i.e +mount vs -mount),
* if applicable, otherwise false.
*
* @param location Should not be null. Will throw NullPointerException
* @param location May be null
*
* @param targetLabel The label of the target, see userLabel for details.
*
@@ -77,11 +77,13 @@ public class DbEntry {
*
* @throws NullPointerException
*/
public DbEntry(String userLabel, EntryAction action, boolean state, @Nonnull Location location, String targetLabel,
public DbEntry(String userLabel, EntryAction action, boolean state, @Nullable Location location, String targetLabel,
String data) throws NullPointerException {
this(userLabel, action, state, location.getWorld().getName(), location.getBlockX(), location.getBlockY(),
location.getBlockZ(), (int) Math.round(location.getPitch()), (int) Math.round(location.getYaw()),
targetLabel, data);
this(userLabel, action, state, location == null ? null : location.getWorld().getName(),
location == null ? 0 : location.getBlockX(), location == null ? 0 : location.getBlockY(),
location == null ? 0 : location.getBlockZ(),
location == null ? 0 : (int) Math.round(location.getPitch()),
location == null ? 0 : (int) Math.round(location.getYaw()), targetLabel, data);
}
protected DbEntry(long time, int uid, EntryAction action, boolean state, String world, int x, int y, int z,

View File

@@ -1,34 +1,19 @@
package dev.heliosares.auxprotect.database;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import dev.heliosares.auxprotect.bungee.AuxProtectBungee;
import dev.heliosares.auxprotect.core.IAuxProtect;
import dev.heliosares.auxprotect.spigot.AuxProtectSpigot;
public class EntryAction {
private static final HashMap<String, EntryAction> values = new HashMap<>();
private static final Set<Integer> usedids = new HashSet<>();
public static EntryAction[] values() {
return values.values().toArray(new EntryAction[0]);
}
public static EntryAction getAction(String key) {
return values.get(key);
}
public static EntryAction getAction(int id) {
if (id == 0)
return null;
for (EntryAction action : values.values()) {
if (action.id == id || action.idPos == id) {
return action;
}
}
return null;
}
// START MAIN (0)
public static final EntryAction LEASH = new EntryAction("leash", 2, 3);
public static final EntryAction SESSION = new EntryAction("session", 4, 5);
@@ -73,6 +58,7 @@ public class EntryAction {
// START LONGTERM (768)
public static final EntryAction IP = new EntryAction("ip", 768);
public static final EntryAction USERNAME = new EntryAction("username", 769);
public static final EntryAction TOWNYNAME = new EntryAction("townyname", 770);
// END LONGTERM (1023)
// START INVENTORY (1024)
@@ -102,6 +88,23 @@ public class EntryAction {
public static final EntryAction VEIN = new EntryAction("vein", 1300);
// END XRAY(1309)
// START TOWNY (1310)
public static final EntryAction TOWNCREATE = new EntryAction("towncreate", 1310);
public static final EntryAction TOWNRENAME = new EntryAction("townrename", 1311);
public static final EntryAction TOWNDELETE = new EntryAction("towndelete", 1312);
public static final EntryAction TOWNJOIN = new EntryAction("townjoin", 1313, 1314);
public static final EntryAction TOWNCLAIM = new EntryAction("townclaim", 1315, 1316);
public static final EntryAction TOWNMERGE = new EntryAction("townmerge", 1317);
public static final EntryAction TOWNMAYOR = new EntryAction("townmayor", 1318);
public static final EntryAction TOWNBANK = new EntryAction("townbank", 1319, 1320);
public static final EntryAction NATIONCREATE = new EntryAction("nationcreate", 1400);
public static final EntryAction NATIONRENAME = new EntryAction("nationrename", 1401);
public static final EntryAction NATIONDELETE = new EntryAction("nationdelete", 1402);
public static final EntryAction NATIONJOIN = new EntryAction("nationjoin", 1403, 1404);
public static final EntryAction NATIONBANK = new EntryAction("nationbank", 1405, 1406);
// END TOWNY (1499)
public final boolean hasDual;
public final int id;
public final int idPos;
@@ -180,18 +183,24 @@ public class EntryAction {
return "actions." + toString().toLowerCase();
}
public boolean isBungee() {
if (id == MSG.id || id == COMMAND.id || id == IP.id || id == USERNAME.id || id == SESSION.id) {
return true;
public boolean exists(IAuxProtect plugin) {
if (!plugin.getAPConfig().isPrivate()) {
if (equals(IGNOREABANDONED) || equals(VEIN)) {
return false;
}
}
return false;
}
public boolean isSpigot() {
if (id == MSG.id) {
if (plugin instanceof AuxProtectSpigot) {
if (id == MSG.id) {
return false;
}
return true;
} else if (plugin instanceof AuxProtectBungee) {
if (equals(MSG) || equals(COMMAND) || equals(IP) || equals(USERNAME) || equals(SESSION)) {
return true;
}
return false;
}
return true;
return false;
}
public Table getTable() {
@@ -219,10 +228,13 @@ public class EntryAction {
if (id < 1310) {
return Table.AUXPROTECT_XRAY;
}
if (id > 10000) {
if (id < 1500) {
return Table.AUXPROTECT_TOWNY;
}
if (id > 1000000) {
return Table.AUXPROTECT_API;
}
return null;
throw new IllegalArgumentException("Action with unknown table: " + toString() + ", id=" + id);
}
public int getId(boolean state) {
@@ -237,7 +249,7 @@ public class EntryAction {
}
public void setEnabled(boolean state) {
if (this.equals(USERNAME)) { // Don't allow this to be disabled.
if (equals(USERNAME)) { // Don't allow this to be disabled.
enabled = true;
return;
}
@@ -250,12 +262,11 @@ public class EntryAction {
}
@Override
public boolean equals(Object other_) {
if (!(other_ instanceof EntryAction)) {
return false;
public boolean equals(Object other) {
if (other instanceof EntryAction otherEntry) {
return this.id == otherEntry.id && this.idPos == otherEntry.idPos;
}
EntryAction other = (EntryAction) other_;
return this.id == other.id && this.idPos == other.idPos;
return false;
}
public boolean isLowestpriority() {
@@ -266,4 +277,23 @@ public class EntryAction {
this.lowestpriority = lowestpriority;
}
public static Collection<EntryAction> values() {
return Collections.unmodifiableCollection(values.values());
}
public static EntryAction getAction(String key) {
return values.get(key);
}
public static EntryAction getAction(int id) {
if (id == 0)
return null;
for (EntryAction action : values.values()) {
if (action.id == id || action.idPos == id) {
return action;
}
}
return null;
}
}

View File

@@ -8,6 +8,7 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
@@ -44,23 +45,13 @@ public class InvDiffManager {
long lastused;
final long blobid;
final byte[] ablob;
final int hash;
BlobCache(long blobid, byte[] ablob) {
this.blobid = blobid;
this.ablob = ablob;
this.lastused = System.currentTimeMillis();
}
boolean matches(byte[] other) {
if (ablob.length != other.length) {
return false;
}
for (int i = 0; i < ablob.length; i++) {
if (ablob[i] != other[i]) {
return false;
}
}
return true;
hash = Arrays.hashCode(ablob);
}
}
@@ -72,7 +63,7 @@ public class InvDiffManager {
final long time = System.currentTimeMillis();
Integer damage = null;
if (qty != 0 && item != null) {
if (item.getItemMeta() != null && item.getItemMeta() instanceof Damageable meta) {
if (item.getItemMeta() != null && item.getItemMeta()instanceof Damageable meta) {
damage = meta.getDamage();
meta.setDamage(0);
item.setItemMeta(meta);
@@ -116,9 +107,16 @@ public class InvDiffManager {
long cachedid = -1;
boolean purge = System.currentTimeMillis() - lastpurged > 10 * 60 * 1000L;
Iterator<BlobCache> it = cache.iterator();
int hash = Arrays.hashCode(blob);
for (BlobCache other = null; it.hasNext();) {
other = it.next();
if (other.matches(blob)) {
// TODO needs tested, should be fine
out: if (other.hash == hash && blob.length == other.ablob.length) {
for (int i = 0; i < blob.length; i++) {
if (blob[i] != other.ablob[i]) {
break out; // This iteration isn't really necessary, just a check
}
}
cachedid = other.blobid;
if (!purge)
break;
@@ -266,7 +264,7 @@ public class InvDiffManager {
item.setAmount(qty);
plugin.debug("setting slot " + slot + " to " + qty);
}
if (item.getItemMeta() != null && item.getItemMeta() instanceof Damageable meta) {
if (item.getItemMeta() != null && item.getItemMeta()instanceof Damageable meta) {
int damage = rs.getInt("damage");
if (!rs.wasNull()) {
meta.setDamage(damage);

View File

@@ -32,6 +32,8 @@ import com.google.common.io.Files;
import dev.heliosares.auxprotect.core.IAuxProtect;
import dev.heliosares.auxprotect.core.MySender;
import dev.heliosares.auxprotect.towny.TownyEntry;
import dev.heliosares.auxprotect.towny.TownyManager;
import dev.heliosares.auxprotect.utils.BidiMapCache;
import dev.heliosares.auxprotect.utils.InvSerialization;
import dev.heliosares.auxprotect.utils.MovingAverage;
@@ -62,6 +64,7 @@ public class SQLManager {
private final LookupManager lookupmanager;
private MigrationManager migrationmanager;
private final InvDiffManager invdiffmanager;
private final TownyManager townymanager;
public LookupManager getLookupManager() {
return lookupmanager;
@@ -71,6 +74,10 @@ public class SQLManager {
return invdiffmanager;
}
public TownyManager getTownyManager() {
return townymanager;
}
public static SQLManager getInstance() {
return instance;
}
@@ -114,6 +121,14 @@ public class SQLManager {
}
tablePrefix = prefix;
}
{
TownyManager tm = null;
try {
tm = new TownyManager((dev.heliosares.auxprotect.spigot.AuxProtectSpigot) plugin, this);
} catch (Throwable ignored) {
}
this.townymanager = tm;
}
this.sqliteFile = sqliteFile;
}
@@ -135,7 +150,11 @@ public class SQLManager {
plugin.info("Connected!");
count();
plugin.info("There are currently " + rowcount + " rows");
if (townymanager != null) {
townymanager.init();
}
}
public void close() {
@@ -1041,6 +1060,9 @@ public class SQLManager {
if (table == Table.AUXPROTECT_XRAY) {
short rating = rs.getShort("rating");
entry = new XrayEntry(time, uid, world, x, y, z, target_id, rating, data);
} else if (table == Table.AUXPROTECT_TOWNY || entryAction.equals(EntryAction.TOWNYNAME)) {
entry = new TownyEntry(time, uid, entryAction, state, world, x, y, z, pitch, yaw, target,
target_id, data);
} else {
entry = new DbEntry(time, uid, entryAction, state, world, x, y, z, pitch, yaw, target,
target_id, data);
@@ -1359,7 +1381,7 @@ public class SQLManager {
if (worlds.containsKey(world)) {
return worlds.get(world);
}
if (Bukkit.getWorld(world) == null) {
if (world == null || Bukkit.getWorld(world) == null) {
return -1;
}
@@ -1433,8 +1455,6 @@ public class SQLManager {
uuids.put(uid, uuid);
return uid;
}
} catch (SQLException e) {
plugin.print(e);
}
} catch (SQLException e) {
plugin.print(e);
@@ -1452,7 +1472,7 @@ public class SQLManager {
if (result.next()) {
int uid = result.getInt(1);
uuids.put(uid, uuid);
plugin.debug("New UUID: " + uuid + ":" + uid, 3);
plugin.debug("New UUID: " + uuid + ":" + uid, 1);
rowcount++;
return uid;
}
@@ -1692,6 +1712,8 @@ public class SQLManager {
public void cleanup() {
usernames.cleanup();
uuids.cleanup();
if (townymanager != null)
townymanager.cleanup();
}
public Collection<String> getCachedUsernames() {

View File

@@ -7,7 +7,9 @@ public enum Table {
AUXPROTECT_COMMANDS, AUXPROTECT_POSITION,
AUXPROTECT_API, AUXPROTECT_UIDS, AUXPROTECT_WORLDS, AUXPROTECT_API_ACTIONS, AUXPROTECT_VERSION, AUXPROTECT_INVBLOB,
AUXPROTECT_INVDIFF, AUXPROTECT_INVDIFFBLOB;
AUXPROTECT_INVDIFF, AUXPROTECT_INVDIFFBLOB,
AUXPROTECT_TOWNY;
@Override
public String toString() {
@@ -35,6 +37,7 @@ public enum Table {
case AUXPROTECT_COMMANDS:
case AUXPROTECT_POSITION:
case AUXPROTECT_API:
case AUXPROTECT_TOWNY:
return true;
default:
return false;
@@ -48,6 +51,7 @@ public enum Table {
case AUXPROTECT_SPAM:
case AUXPROTECT_API:
case AUXPROTECT_XRAY:
case AUXPROTECT_TOWNY:
return true;
default:
return false;
@@ -79,6 +83,7 @@ public enum Table {
case AUXPROTECT_COMMANDS:
case AUXPROTECT_POSITION:
case AUXPROTECT_API:
case AUXPROTECT_TOWNY:
return true;
default:
return false;
@@ -124,7 +129,8 @@ public enum Table {
return "(time, uid, world_id, x, y, z, target)";
} else if (bungee) {
return "(time, uid, action_id, target_id, data)";
} else if (this == Table.AUXPROTECT_MAIN || this == Table.AUXPROTECT_SPAM || this == Table.AUXPROTECT_API) {
} else if (this == Table.AUXPROTECT_MAIN || this == Table.AUXPROTECT_SPAM || this == Table.AUXPROTECT_API
|| this == Table.AUXPROTECT_TOWNY) {
return "(time, uid, action_id, world_id, x, y, z, target_id, data)";
} else if (this == Table.AUXPROTECT_INVENTORY) {
return "(time, uid, action_id, world_id, x, y, z, target_id, data, hasblob)";
@@ -174,6 +180,7 @@ public enum Table {
case AUXPROTECT_SPAM:
case AUXPROTECT_API:
case AUXPROTECT_XRAY:
case AUXPROTECT_TOWNY:
return 9;
case AUXPROTECT_POSITION:
case AUXPROTECT_INVENTORY:

View File

@@ -4,7 +4,10 @@ import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import java.util.function.Supplier;
import java.util.logging.Level;
import org.bukkit.Bukkit;
@@ -15,6 +18,7 @@ import org.bukkit.command.CommandSender;
import org.bukkit.command.PluginCommand;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.plugin.java.JavaPlugin;
@@ -30,12 +34,14 @@ import dev.heliosares.auxprotect.database.DatabaseRunnable;
import dev.heliosares.auxprotect.database.DbEntry;
import dev.heliosares.auxprotect.database.EntryAction;
import dev.heliosares.auxprotect.database.SQLManager;
import dev.heliosares.auxprotect.database.Table;
import dev.heliosares.auxprotect.database.XrayEntry;
import dev.heliosares.auxprotect.spigot.command.APCommand;
import dev.heliosares.auxprotect.spigot.command.APCommandTab;
import dev.heliosares.auxprotect.spigot.command.ClaimInvCommand;
import dev.heliosares.auxprotect.spigot.command.WatchCommand;
import dev.heliosares.auxprotect.spigot.listeners.*;
import dev.heliosares.auxprotect.towny.TownyListener;
import dev.heliosares.auxprotect.utils.Language;
import dev.heliosares.auxprotect.utils.Telemetry;
import dev.heliosares.auxprotect.utils.UpdateChecker;
@@ -93,7 +99,8 @@ public class AuxProtectSpigot extends JavaPlugin implements IAuxProtect {
debug = getConfig().getInt("debug", 0);
config = new APConfig(this.getConfig());
config = new APConfig(this, this.getConfig());
this.saveConfig();
YMLManager langManager = new YMLManager("en-us", this);
langManager.load(true);
@@ -210,81 +217,38 @@ public class AuxProtectSpigot extends JavaPlugin implements IAuxProtect {
getServer().getPluginManager().registerEvents(new CommandListener(this), this);
getServer().getPluginManager().registerEvents(new XrayListener(this), this);
if (setupEconomy()) {
Telemetry.reportHook(this, "Vault", true);
} else {
Telemetry.reportHook(this, "Vault", false);
}
// this feels cursed to run setupEconomy() like this...
Telemetry.reportHook(this, "Vault", setupEconomy());
try {
String name = "ShopGuiPlus";
Plugin plugin = getPlugin(name);
if (plugin != null && plugin.isEnabled()) {
getServer().getPluginManager().registerEvents(new ShopGUIPlusListener(this), this);
Telemetry.reportHook(this, name, true);
} else {
Telemetry.reportHook(this, name, false);
hook(() -> {
return new ShopGUIPlusListener(this);
}, "ShopGuiPlus");
hook(() -> {
return new EconomyShopGUIListener(this);
}, "EconomyShopGUI", "EconomyShopGUI-Premium");
hook(() -> {
return new DynamicShopListener(this);
}, "DynamicShop");
hook(() -> {
return new ChestShopListener(this);
}, "ChestShop");
hook(() -> {
return new AuctionHouseListener(this);
}, "AuctionHouse");
hook(() -> {
return new JobsListener(this);
}, "Jobs");
hook(() -> {
return new EssentialsListener(this);
}, "Essentials");
if (!hook(() -> {
return new TownyListener(this);
}, "Towny")) {
for (EntryAction action : EntryAction.values()) {
if (action.getTable() == Table.AUXPROTECT_TOWNY) {
action.setEnabled(false);
}
}
name = "EconomyShopGUI";
plugin = getPlugin(name);
if (plugin == null) {
plugin = getServer().getPluginManager().getPlugin("EconomyShopGUI-Premium");
}
if (plugin != null && plugin.isEnabled()) {
getServer().getPluginManager().registerEvents(new EconomyShopGUIListener(this), this);
Telemetry.reportHook(this, name, true);
} else {
Telemetry.reportHook(this, name, false);
}
name = "DynamicShop";
plugin = getPlugin(name);
if (plugin != null && plugin.isEnabled()) {
getServer().getPluginManager().registerEvents(new DynamicShopListener(this), this);
Telemetry.reportHook(this, name, true);
} else {
Telemetry.reportHook(this, name, false);
}
name = "ChestShop";
plugin = getPlugin(name);
if (plugin != null && plugin.isEnabled()) {
getServer().getPluginManager().registerEvents(new ChestShopListener(this), this);
Telemetry.reportHook(this, name, true);
} else {
Telemetry.reportHook(this, name, false);
}
name = "AuctionHouse";
plugin = getPlugin(name);
if (plugin != null && plugin.isEnabled()) {
getServer().getPluginManager().registerEvents(new AuctionHouseListener(this), this);
Telemetry.reportHook(this, name, true);
} else {
Telemetry.reportHook(this, name, false);
}
name = "Jobs";
plugin = getPlugin(name);
if (plugin != null && plugin.isEnabled()) {
getServer().getPluginManager().registerEvents(new JobsListener(this), this);
Telemetry.reportHook(this, name, true);
} else {
Telemetry.reportHook(this, name, false);
}
name = "Essentials";
plugin = getPlugin(name);
if (plugin != null && plugin.isEnabled()) {
getServer().getPluginManager().registerEvents(new EssentialsListener(this), this);
Telemetry.reportHook(this, name, true);
} else {
Telemetry.reportHook(this, name, false);
}
} catch (Exception e) {
warning("Exception while hooking other plugins");
print(e);
}
this.getCommand("claiminv").setExecutor(claiminvcommand = new ClaimInvCommand(this));
@@ -507,6 +471,36 @@ public class AuxProtectSpigot extends JavaPlugin implements IAuxProtect {
}
}
private boolean hook(Supplier<Listener> listener, String... names) {
boolean hook = false;
try {
Plugin plugin = null;
for (String name : names) {
plugin = getPlugin(name);
if (plugin != null) {
break;
}
}
hook = plugin != null && plugin.isEnabled();
if (hook) {
getServer().getPluginManager().registerEvents(listener.get(), this);
hooks.add(plugin.getName());
}
} catch (Exception e) {
warning("Exception while hooking " + names[0]);
print(e);
hook = false;
}
Telemetry.reportHook(this, names[0], hook);
return hook;
}
private final Set<String> hooks = new HashSet<>();
public boolean isHooked(String name) {
return hooks.contains(name);
}
private Plugin getPlugin(String name) {
for (Plugin plugin : Bukkit.getPluginManager().getPlugins()) {
if (plugin.getName().equalsIgnoreCase(name)) {
@@ -694,7 +688,7 @@ public class AuxProtectSpigot extends JavaPlugin implements IAuxProtect {
@Override
public void reloadConfig() {
super.reloadConfig();
config = new APConfig(this.getConfig());
config = new APConfig(this, this.getConfig());
}
@Override

View File

@@ -64,7 +64,7 @@ public class LookupCommandTab implements TabCompleter {
if (currentArg.startsWith("action:") || currentArg.startsWith("a:")) {
String action = currentArg.split(":")[0] + ":";
for (EntryAction eaction : EntryAction.values()) {
if (eaction.isSpigot() && eaction.isEnabled()) {
if (eaction.exists(plugin) && eaction.isEnabled()) {
String actString = eaction.toString().toLowerCase();
if (eaction.hasDual) {
possible.add(action + "+" + actString);

View File

@@ -74,19 +74,19 @@ public class EntityListener implements Listener {
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onEntityExplodeEvent(EntityExplodeEvent e) {
String cause;
if (e.getEntity() instanceof TNTPrimed tnt && tnt.getSource() != null) {
if (tnt.getSource() instanceof Projectile proj && proj.getShooter() != null) {
if (e.getEntity()instanceof TNTPrimed tnt && tnt.getSource() != null) {
if (tnt.getSource()instanceof Projectile proj && proj.getShooter() != null) {
cause = AuxProtectSpigot.getLabel(proj.getShooter());
} else {
cause = AuxProtectSpigot.getLabel(tnt.getSource());
}
} else if (e.getEntity() instanceof LivingEntity) {
if (e.getEntity() instanceof Monster monster && monster.getTarget() != null) {
if (e.getEntity()instanceof Monster monster && monster.getTarget() != null) {
cause = AuxProtectSpigot.getLabel(monster.getTarget());
} else {
cause = AuxProtectSpigot.getLabel(e.getEntity());
}
} else if (e.getEntity() instanceof Projectile proj && proj.getShooter() != null) {
} else if (e.getEntity()instanceof Projectile proj && proj.getShooter() != null) {
cause = AuxProtectSpigot.getLabel(proj.getShooter());
} else {
cause = "#env";

View File

@@ -0,0 +1,62 @@
package dev.heliosares.auxprotect.towny;
import org.bukkit.Location;
import dev.heliosares.auxprotect.database.DbEntry;
import dev.heliosares.auxprotect.database.EntryAction;
import dev.heliosares.auxprotect.database.SQLManager;
public class TownyEntry extends DbEntry {
public TownyEntry(String userLabel, EntryAction action, boolean state, Location location, String targetLabel,
String data) throws NullPointerException {
super(userLabel, action, state, location, targetLabel, data);
}
public TownyEntry(String userLabel, EntryAction action, boolean state, String targetLabel, String data) {
super(userLabel, action, state, targetLabel, data);
}
public TownyEntry(long time, int uid, EntryAction action, boolean state, String world, int x, int y, int z,
int pitch, int yaw, String target, int target_id, String data) {
super(time, uid, action, state, world, x, y, z, pitch, yaw, target, target_id, data);
}
public String getUser() {
if (user != null) {
return user;
}
if (!getUserUUID().startsWith("$t") || getUserUUID().length() != 38) {
return super.getUser();
}
user = SQLManager.getInstance().getTownyManager().getNameFromID(getUid());
if (user == null) {
user = getUserUUID();
}
return user;
}
public int getTargetId() {
if (action.getTable().hasStringTarget()) {
return -1;
}
if (target_id > 0) {
return target_id;
}
return target_id = SQLManager.getInstance().getUIDFromUUID(getTargetUUID(), true);
}
public String getTarget() {
if (target != null) {
return target;
}
if (!getTargetUUID().startsWith("$t") || getTargetUUID().length() != 38) {
return super.getTarget();
}
target = SQLManager.getInstance().getTownyManager().getNameFromID(getTargetId());
if (target == null) {
target = getTargetUUID();
}
return target;
}
}

View File

@@ -0,0 +1,200 @@
package dev.heliosares.auxprotect.towny;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import com.palmergames.bukkit.towny.event.BankTransactionEvent;
import com.palmergames.bukkit.towny.event.DeleteNationEvent;
import com.palmergames.bukkit.towny.event.DeleteTownEvent;
import com.palmergames.bukkit.towny.event.NationAddTownEvent;
import com.palmergames.bukkit.towny.event.NationRemoveTownEvent;
import com.palmergames.bukkit.towny.event.NationTransactionEvent;
import com.palmergames.bukkit.towny.event.NewDayEvent;
import com.palmergames.bukkit.towny.event.NewNationEvent;
import com.palmergames.bukkit.towny.event.NewTownEvent;
import com.palmergames.bukkit.towny.event.RenameNationEvent;
import com.palmergames.bukkit.towny.event.RenameTownEvent;
import com.palmergames.bukkit.towny.event.TownAddResidentEvent;
import com.palmergames.bukkit.towny.event.TownClaimEvent;
import com.palmergames.bukkit.towny.event.TownRemoveResidentEvent;
import com.palmergames.bukkit.towny.event.TownTransactionEvent;
import com.palmergames.bukkit.towny.event.town.TownMayorChangeEvent;
import com.palmergames.bukkit.towny.event.town.TownMergeEvent;
import com.palmergames.bukkit.towny.event.town.TownUnclaimEvent;
import com.palmergames.bukkit.towny.exceptions.NotRegisteredException;
import com.palmergames.bukkit.towny.exceptions.TownyException;
import com.palmergames.bukkit.towny.object.Coord;
import com.palmergames.bukkit.towny.object.Government;
import com.palmergames.bukkit.towny.object.Nation;
import com.palmergames.bukkit.towny.object.WorldCoord;
import dev.heliosares.auxprotect.database.EntryAction;
import dev.heliosares.auxprotect.spigot.AuxProtectSpigot;
public class TownyListener implements Listener {
private final AuxProtectSpigot plugin;
public TownyListener(AuxProtectSpigot plugin) {
this.plugin = plugin;
}
// General
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void on(NewDayEvent e) {
e.getBankruptedTowns();
e.getFallenNations();
e.getFallenTowns();
// TODO does delete town handle this?
}
// Towns
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void on(NewTownEvent e) {
plugin.getSqlManager().getTownyManager().updateName(e.getTown());
try {
plugin.add(new TownyEntry(AuxProtectSpigot.getLabel(e.getTown().getMayor().getPlayer()),
EntryAction.TOWNCREATE, false, toLoc(e.getTown().getHomeBlock().getWorldCoord()),
TownyManager.getLabel(e.getTown()), null));
} catch (NullPointerException | TownyException e1) {
plugin.print(e1);
}
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void on(RenameTownEvent e) {
plugin.getSqlManager().getTownyManager().updateName(e.getTown());
Player mayor = e.getTown().getMayor().getPlayer();
plugin.add(new TownyEntry(AuxProtectSpigot.getLabel(mayor), EntryAction.TOWNRENAME, false, mayor.getLocation(),
TownyManager.getLabel(e.getTown()), e.getOldName() + " -> " + e.getTown().getName()));
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void on(DeleteTownEvent e) {
plugin.getSqlManager().getTownyManager().updateName(e.getTownUUID(), e.getTownName());
plugin.add(new TownyEntry("$" + e.getMayorUUID().toString(), EntryAction.TOWNDELETE, false,
e.getMayor().getPlayer().getLocation(), "$t" + e.getTownUUID(), ""));
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void on(TownAddResidentEvent e) {
plugin.add(new TownyEntry("$" + e.getResident().getUUID().toString(), EntryAction.TOWNJOIN, true,
e.getResident().getPlayer().getLocation(), TownyManager.getLabel(e.getTown()), ""));
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void on(TownRemoveResidentEvent e) {
plugin.add(new TownyEntry("$" + e.getResident().getUUID().toString(), EntryAction.TOWNJOIN, false,
e.getResident().getPlayer().getLocation(), TownyManager.getLabel(e.getTown()), ""));
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void on(TownClaimEvent e) {
try {
plugin.add(new TownyEntry("$" + e.getResident().getUUID().toString(), EntryAction.TOWNCLAIM, true,
toLoc(e.getTownBlock().getWorldCoord()), TownyManager.getLabel(e.getTownBlock().getTown()), ""));
} catch (NullPointerException | NotRegisteredException e1) {
plugin.print(e1);
}
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void on(TownUnclaimEvent e) {
plugin.add(new TownyEntry(TownyManager.getLabel(e.getTown()), EntryAction.TOWNCLAIM, false,
toLoc(e.getWorldCoord()), "", ""));
}
private static Location toLoc(Coord coord) {
if (coord instanceof WorldCoord c) {
return new Location(c.getBukkitWorld(), c.getX() * 16, 128, c.getZ() * 16);
}
return null;
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void on(TownMergeEvent e) {
plugin.add(new TownyEntry("$t" + e.getSuccumbingTownUUID(), EntryAction.TOWNCLAIM, false,
TownyManager.getLabel(e.getRemainingTown()), ""));
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void on(TownMayorChangeEvent e) {
plugin.add(new TownyEntry(AuxProtectSpigot.getLabel(e.getNewMayor().getPlayer()), EntryAction.TOWNMAYOR, false,
e.getNewMayor().getPlayer().getLocation(), getLabel(e.getTown()),
"Prior: " + e.getOldMayor().getName()));
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void on(TownTransactionEvent e) {
handleBank(e, e.getTown(), EntryAction.TOWNBANK);
}
private void handleBank(BankTransactionEvent e, Government g, EntryAction action) {
String user = "#server";
Location loc = null;
if (e.getTransaction().getPlayer() != null) {
user = AuxProtectSpigot.getLabel(e.getTransaction().getPlayer());
loc = e.getTransaction().getPlayer().getLocation();
}
boolean state;
switch (e.getTransaction().getType()) {
case ADD:
case DEPOSIT:
state = true;
break;
default:
state = false;
}
String data = plugin.formatMoney(e.getTransaction().getAmount()) + ", Bal: "
+ plugin.formatMoney(e.getAccount().getHoldingBalance());
plugin.add(new TownyEntry(user, action, state, loc, TownyManager.getLabel(g), data));
}
// Nations
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void on(NewNationEvent e) {
Player king = e.getNation().getKing().getPlayer();
plugin.getSqlManager().getTownyManager().updateName(e.getNation());
plugin.add(new TownyEntry(AuxProtectSpigot.getLabel(king), EntryAction.TOWNCREATE, false, king.getLocation(),
TownyManager.getLabel(e.getNation()), null));
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void on(RenameNationEvent e) {
plugin.getSqlManager().getTownyManager().updateName(e.getNation());
Player mayor = e.getNation().getKing().getPlayer();
plugin.add(new TownyEntry(AuxProtectSpigot.getLabel(mayor), EntryAction.TOWNRENAME, false, mayor.getLocation(),
TownyManager.getLabel(e.getNation()), e.getOldName() + " -> " + e.getNation().getName()));
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void on(DeleteNationEvent e) {
plugin.getSqlManager().getTownyManager().updateName(e.getNationUUID(), e.getNationName());
plugin.add(
new TownyEntry("$" + e.getNationKing(), EntryAction.TOWNDELETE, false, "$t" + e.getNationUUID(), ""));
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void on(NationAddTownEvent e) {
plugin.add(new TownyEntry(getLabel(e.getTown()), EntryAction.NATIONJOIN, true, getLabel(e.getNation()), ""));
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void on(NationRemoveTownEvent e) {
plugin.add(new TownyEntry(getLabel(e.getTown()), EntryAction.NATIONJOIN, false, getLabel(e.getNation()), ""));
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void on(NationTransactionEvent e) {
handleBank(e, e.getNation(), EntryAction.NATIONBANK);
}
public static String getLabel(Government gov) {
return "#" + (gov instanceof Nation ? "N" : "T") + gov.getUUID().toString();
}
}

View File

@@ -0,0 +1,161 @@
package dev.heliosares.auxprotect.towny;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.UUID;
import org.bukkit.scheduler.BukkitRunnable;
import com.palmergames.bukkit.towny.TownyUniverse;
import com.palmergames.bukkit.towny.object.Government;
import dev.heliosares.auxprotect.database.EntryAction;
import dev.heliosares.auxprotect.database.SQLManager;
import dev.heliosares.auxprotect.database.Table;
import dev.heliosares.auxprotect.spigot.AuxProtectSpigot;
import dev.heliosares.auxprotect.utils.BidiMapCache;
public class TownyManager {
private final AuxProtectSpigot plugin;
private final SQLManager sql;
private BidiMapCache<Integer, String> names = new BidiMapCache<>(300000L, 300000L, true);
public TownyManager(AuxProtectSpigot plugin, SQLManager sql) {
this.plugin = plugin;
this.sql = sql;
}
public void init() {
plugin.info("Checking for new towns/nations...");
TownyUniverse.getInstance().getTowns().forEach((town) -> {
sql.getTownyManager().updateName(town);
});
TownyUniverse.getInstance().getNations().forEach((nation) -> {
sql.getTownyManager().updateName(nation);
});
}
public String getNameFromID(int uid) {
if (uid < 0) {
return null;
}
if (uid == 0) {
return "";
}
if (names.containsKey(uid)) {
return names.get(uid);
}
/*
* if (plugin.isBungee()) { return uuid; } else { OfflinePlayer player =
* Bukkit.getOfflinePlayer(UUID.fromString(uuid.substring(1))); if (player !=
* null) { usernames.put(uuid, player.getName()); return player.getName
*/
String stmt = "SELECT * FROM " + Table.AUXPROTECT_LONGTERM.toString()
+ " WHERE action_id=? AND uid=?\nORDER BY time DESC\nLIMIT 1;";
plugin.debug(stmt, 3);
Connection connection;
try {
connection = sql.getConnection();
} catch (SQLException e1) {
plugin.print(e1);
return null;
}
try (PreparedStatement pstmt = connection.prepareStatement(stmt)) {
pstmt.setInt(1, EntryAction.TOWNYNAME.id);
pstmt.setInt(2, uid);
try (ResultSet results = pstmt.executeQuery()) {
if (results.next()) {
String username = results.getString("target");
plugin.debug("Resolved UID " + uid + " to " + username);
if (username != null) {
names.put(uid, username);
return username;
}
}
}
} catch (SQLException e) {
plugin.print(e);
} finally {
sql.returnConnection(connection);
}
return null;
}
// public int getIDFromName(String name, boolean insert) {
// if (name == null) {
// return -1;
// }
// if (names.containsValue(name)) {
// return names.getKey(name);
// }
// String stmt = "SELECT * FROM " + Table.AUXPROTECT_LONGTERM.toString()
// + " WHERE action_id=? AND lower(target)=?\nORDER BY time DESC\nLIMIT 1;";
// plugin.debug(stmt, 3);
//
// Connection connection;
// try {
// connection = sql.getConnection();
// } catch (SQLException e1) {
// plugin.print(e1);
// return -1;
// }
// try (PreparedStatement pstmt = connection.prepareStatement(stmt)) {
// pstmt.setInt(1, EntryAction.TOWNYNAME.id);
// pstmt.setString(2, name.toLowerCase());
// try (ResultSet results = pstmt.executeQuery()) {
// if (results.next()) {
// int uid = results.getInt("uid");
// String username_ = results.getString("target");
// plugin.debug("Resolved username " + username_ + " to UID " + uid, 5);
// if (username_ != null && uid > 0) {
// names.put(uid, username_);
// return uid;
// }
// }
// }
// } catch (SQLException e) {
// plugin.print(e);
// } finally {
// sql.returnConnection(connection);
// }
// return -1;
// }
public void updateName(Government gov) {
this.updateName(gov.getUUID(), gov.getName());
}
public void updateName(UUID uuid, String name) {
new BukkitRunnable() {
@Override
public void run() {
final int uid = sql.getUIDFromUUID("$t" + uuid, true);
if (uid <= 0) {
plugin.warning("Failed to insert new town/nation name: " + name);
return;
}
plugin.debug("Handling " + name);
String newestusername = getNameFromID(uid);
if (!name.equalsIgnoreCase(newestusername)) {
plugin.debug("New town name: " + name + " for " + newestusername);
plugin.add(new TownyEntry("$t" + uuid, EntryAction.TOWNYNAME, false, name, ""));
}
names.put(uid, name);
}
}.runTaskAsynchronously(plugin);
}
public static String getLabel(Government gov) {
return "$t" + gov.getUUID().toString();
}
public void cleanup() {
names.cleanup();
}
}

View File

@@ -0,0 +1,104 @@
package dev.heliosares.auxprotect.utils;
import java.util.Base64;
import java.security.Key;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;
public class KeyUtil {
private static final String RSA = "RSA";
public static String do_RSADecryption(byte[] cipherText, Key key) throws Exception {
Cipher cipher = Cipher.getInstance(RSA);
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] result = cipher.doFinal(cipherText);
return new String(result);
}
private static final long[] BLACKLIST = new long[] {};
private static final PublicKey PUBLIC_KEY;
static {
PublicKey key = null;
try {
key = KeyFactory.getInstance(RSA).generatePublic(new X509EncodedKeySpec(Base64.getDecoder().decode(
"MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAILcEjoZ4U1e3YIBTcgbSdPjowBlXTUe23eB9rcf4DUS3WY5AZGCoYOaGsXJGgVduNf8Bk8VfbsN/gcYd2HwCzsCAwEAAQ==")));
} catch (InvalidKeySpecException | NoSuchAlgorithmException e) {
e.printStackTrace();
}
PUBLIC_KEY = key;
}
private final boolean isValid;
private final boolean isBlacklisted;
private final boolean isMalformed;
private final boolean isPrivate;
public KeyUtil(String key) {
boolean isValid = false;
boolean isBlacklisted = false;
boolean isPrivate = false;
boolean isMalformed = false;
long gen = -1;
out: try {
String[] parts = key.split("\\.");
String name = parts[0];
key = parts[1];
key = do_RSADecryption(decode(key), PUBLIC_KEY);
if (!key.endsWith("." + name)) {
isValid = false;
isMalformed = true;
break out;
}
gen = Long.parseLong(key.substring(0, key.indexOf(".")));
for (long other : BLACKLIST) {
if (other == gen) {
isBlacklisted = true;
isValid = false;
break out;
}
}
isValid = gen <= System.currentTimeMillis() && gen > 1577854800000L;
isPrivate = name.matches("private(_.*)?");
} catch (Exception e) {
e.printStackTrace();
isMalformed = true;
isValid = false;
}
this.isBlacklisted = isBlacklisted;
this.isPrivate = isPrivate;
this.isValid = isValid;
this.isMalformed = isMalformed;
}
public boolean isValid() {
if (isBlacklisted || isMalformed) {
return false;
}
return isValid;
}
public boolean isBlacklisted() {
return isBlacklisted;
}
public boolean isPrivate() {
if (!isValid()) {
return false;
}
return isPrivate;
}
public boolean isMalformed() {
return isMalformed;
}
private static byte[] decode(String str) {
return Base64.getDecoder().decode(str);
}
}