1.2-pre4
Add AuctionHouse to local repo Add hook for towny
This commit is contained in:
65
config.yml
65
config.yml
@@ -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
|
||||
26
en-us.yml
26
en-us.yml
@@ -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
|
||||
BIN
jars/AuctionHouse-1.19-3.3.1.jar
Normal file
BIN
jars/AuctionHouse-1.19-3.3.1.jar
Normal file
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
|
||||
d35928238d1bde85ab595887981778ab
|
||||
@@ -0,0 +1 @@
|
||||
e5f8477f8bd3fc2781ecc5ea4327214a6b9b151f
|
||||
@@ -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>
|
||||
@@ -0,0 +1 @@
|
||||
5462c29004390ec8d562f7391c2ea36f
|
||||
@@ -0,0 +1 @@
|
||||
c0379648e4bc86f80cc64f7451516acbc3e02ac5
|
||||
@@ -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>
|
||||
@@ -0,0 +1 @@
|
||||
96df14c31a51be743854e8eb96ed8b4f
|
||||
@@ -0,0 +1 @@
|
||||
e055ff957032acf6b5025a0c99a377f776801f84
|
||||
@@ -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
28
pom.xml
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,4 +49,6 @@ public interface IAuxProtect {
|
||||
public MySender getConsoleSender();
|
||||
|
||||
public boolean isShuttingDown();
|
||||
|
||||
public boolean isHooked(String name);
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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";
|
||||
|
||||
62
src/dev/heliosares/auxprotect/towny/TownyEntry.java
Normal file
62
src/dev/heliosares/auxprotect/towny/TownyEntry.java
Normal 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;
|
||||
}
|
||||
}
|
||||
200
src/dev/heliosares/auxprotect/towny/TownyListener.java
Normal file
200
src/dev/heliosares/auxprotect/towny/TownyListener.java
Normal 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();
|
||||
}
|
||||
}
|
||||
161
src/dev/heliosares/auxprotect/towny/TownyManager.java
Normal file
161
src/dev/heliosares/auxprotect/towny/TownyManager.java
Normal 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();
|
||||
}
|
||||
}
|
||||
104
src/dev/heliosares/auxprotect/utils/KeyUtil.java
Normal file
104
src/dev/heliosares/auxprotect/utils/KeyUtil.java
Normal 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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user