mirror of
https://github.com/plan-player-analytics/Plan.git
synced 2024-09-12 14:58:26 +02:00
Advanced Anti Cheat (AAC) Data #125
This commit is contained in:
parent
a8ffe64cf3
commit
3f57b77718
@ -141,6 +141,12 @@
|
|||||||
<version>7.3.0</version>
|
<version>7.3.0</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>me.konsolas</groupId>
|
||||||
|
<artifactId>AAC</artifactId>
|
||||||
|
<version>3.3.5</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<build>
|
<build>
|
||||||
<plugins>
|
<plugins>
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.djrapitops.pluginbridge.plan;
|
package com.djrapitops.pluginbridge.plan;
|
||||||
|
|
||||||
import com.djrapitops.plugin.api.utility.log.Log;
|
import com.djrapitops.plugin.api.utility.log.Log;
|
||||||
|
import com.djrapitops.pluginbridge.plan.aac.AdvancedAntiCheatHook;
|
||||||
import com.djrapitops.pluginbridge.plan.advancedachievements.AdvancedAchievementsHook;
|
import com.djrapitops.pluginbridge.plan.advancedachievements.AdvancedAchievementsHook;
|
||||||
import com.djrapitops.pluginbridge.plan.askyblock.ASkyBlockHook;
|
import com.djrapitops.pluginbridge.plan.askyblock.ASkyBlockHook;
|
||||||
import com.djrapitops.pluginbridge.plan.banmanager.BanManagerHook;
|
import com.djrapitops.pluginbridge.plan.banmanager.BanManagerHook;
|
||||||
@ -24,6 +25,7 @@ import main.java.com.djrapitops.plan.data.additional.HookHandler;
|
|||||||
* Manages connection to other plugins.
|
* Manages connection to other plugins.
|
||||||
*
|
*
|
||||||
* @author Rsl1122
|
* @author Rsl1122
|
||||||
|
* @see AdvancedAntiCheatHook
|
||||||
* @see AdvancedAchievementsHook
|
* @see AdvancedAchievementsHook
|
||||||
* @see ASkyBlockHook
|
* @see ASkyBlockHook
|
||||||
* @see BanManagerHook
|
* @see BanManagerHook
|
||||||
@ -50,6 +52,7 @@ public class Bridge {
|
|||||||
|
|
||||||
public static void hook(HookHandler h) {
|
public static void hook(HookHandler h) {
|
||||||
Hook[] hooks = new Hook[]{
|
Hook[] hooks = new Hook[]{
|
||||||
|
new AdvancedAntiCheatHook(h),
|
||||||
new AdvancedAchievementsHook(h),
|
new AdvancedAchievementsHook(h),
|
||||||
new ASkyBlockHook(h),
|
new ASkyBlockHook(h),
|
||||||
new BanManagerHook(h),
|
new BanManagerHook(h),
|
||||||
|
@ -0,0 +1,67 @@
|
|||||||
|
/*
|
||||||
|
* Licence is provided in the jar as license.yml also here:
|
||||||
|
* https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml
|
||||||
|
*/
|
||||||
|
package com.djrapitops.pluginbridge.plan.aac;
|
||||||
|
|
||||||
|
import com.djrapitops.plugin.utilities.Format;
|
||||||
|
import main.java.com.djrapitops.plan.data.additional.*;
|
||||||
|
import main.java.com.djrapitops.plan.utilities.FormatUtils;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PluginData for AAC plugin.
|
||||||
|
*
|
||||||
|
* @author Rsl1122
|
||||||
|
*/
|
||||||
|
public class AdvancedAntiCheatData extends PluginData {
|
||||||
|
|
||||||
|
private final HackerTable table;
|
||||||
|
|
||||||
|
public AdvancedAntiCheatData(HackerTable table) {
|
||||||
|
super(ContainerSize.THIRD, "AdvancedAntiCheat");
|
||||||
|
super.setPluginIcon("heart");
|
||||||
|
super.setIconColor("red");
|
||||||
|
this.table = table;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InspectContainer getPlayerData(UUID uuid, InspectContainer inspectContainer) throws Exception {
|
||||||
|
List<HackObject> hackObjects = table.getHackObjects(uuid);
|
||||||
|
|
||||||
|
inspectContainer.addValue(getWithIcon("Times Kicked for Possible Hacking", "exclamation-triangle", "red"), hackObjects.size());
|
||||||
|
|
||||||
|
TableContainer hackTable = new TableContainer(
|
||||||
|
getWithIcon("Kicked", "calendar"),
|
||||||
|
getWithIcon("Hack", "exclamation-triangle"),
|
||||||
|
getWithIcon("Violation Level", "gavel")
|
||||||
|
);
|
||||||
|
hackTable.setColor("red");
|
||||||
|
|
||||||
|
for (HackObject hackObject : hackObjects) {
|
||||||
|
String date = FormatUtils.formatTimeStampYear(hackObject.getDate());
|
||||||
|
String hack = Format.create(hackObject.getHackType().getName()).capitalize().toString();
|
||||||
|
hackTable.addRow(date, hack, hackObject.getViolationLevel());
|
||||||
|
}
|
||||||
|
inspectContainer.addTable("hackTable", hackTable);
|
||||||
|
|
||||||
|
return inspectContainer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AnalysisContainer getServerData(Collection<UUID> collection, AnalysisContainer analysisContainer) throws Exception {
|
||||||
|
Map<UUID, List<HackObject>> hackObjects = table.getHackObjects();
|
||||||
|
|
||||||
|
Map<UUID, Integer> violations = hackObjects.entrySet().stream()
|
||||||
|
.collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().size()));
|
||||||
|
|
||||||
|
analysisContainer.addPlayerTableValues(getWithIcon("Kicked for Hacking", "exclamation-triangle"), violations);
|
||||||
|
|
||||||
|
return analysisContainer;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
* Licence is provided in the jar as license.yml also here:
|
||||||
|
* https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml
|
||||||
|
*/
|
||||||
|
package com.djrapitops.pluginbridge.plan.aac;
|
||||||
|
|
||||||
|
import com.djrapitops.plugin.api.utility.log.Log;
|
||||||
|
import com.djrapitops.pluginbridge.plan.Hook;
|
||||||
|
import main.java.com.djrapitops.plan.Plan;
|
||||||
|
import main.java.com.djrapitops.plan.api.exceptions.DBCreateTableException;
|
||||||
|
import main.java.com.djrapitops.plan.data.additional.HookHandler;
|
||||||
|
import main.java.com.djrapitops.plan.database.databases.SQLDB;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hook for AAC plugin.
|
||||||
|
*
|
||||||
|
* @author Rsl1122
|
||||||
|
*/
|
||||||
|
public class AdvancedAntiCheatHook extends Hook {
|
||||||
|
|
||||||
|
private static PlayerHackKickListener listener;
|
||||||
|
|
||||||
|
public AdvancedAntiCheatHook(HookHandler hookHandler) {
|
||||||
|
super("me.konsolas.aac.AAC", hookHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void hook() throws NoClassDefFoundError {
|
||||||
|
if (!enabled) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Plan plugin = Plan.getInstance();
|
||||||
|
|
||||||
|
HackerTable table = new HackerTable((SQLDB) plugin.getDB());
|
||||||
|
try {
|
||||||
|
table.createTable();
|
||||||
|
} catch (DBCreateTableException e) {
|
||||||
|
Log.toLog(this.getClass().getName(), e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (listener == null) {
|
||||||
|
listener = new PlayerHackKickListener();
|
||||||
|
plugin.registerListener(listener);
|
||||||
|
}
|
||||||
|
addPluginDataSource(new AdvancedAntiCheatData(table));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* Licence is provided in the jar as license.yml also here:
|
||||||
|
* https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml
|
||||||
|
*/
|
||||||
|
package com.djrapitops.pluginbridge.plan.aac;
|
||||||
|
|
||||||
|
import me.konsolas.aac.api.HackType;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data object for AAC data.
|
||||||
|
*
|
||||||
|
* @author Rsl1122
|
||||||
|
*/
|
||||||
|
public class HackObject {
|
||||||
|
|
||||||
|
private final UUID uuid;
|
||||||
|
private final long date;
|
||||||
|
private final HackType hackType;
|
||||||
|
private final int violationLevel;
|
||||||
|
|
||||||
|
public HackObject(UUID uuid, long date, HackType hackType, int violationLevel) {
|
||||||
|
this.uuid = uuid;
|
||||||
|
this.date = date;
|
||||||
|
this.hackType = hackType;
|
||||||
|
this.violationLevel = violationLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UUID getUuid() {
|
||||||
|
return uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getDate() {
|
||||||
|
return date;
|
||||||
|
}
|
||||||
|
|
||||||
|
public HackType getHackType() {
|
||||||
|
return hackType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getViolationLevel() {
|
||||||
|
return violationLevel;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,115 @@
|
|||||||
|
/*
|
||||||
|
* To change this license header, choose License Headers in Project Properties.
|
||||||
|
* To change this template file, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
package com.djrapitops.pluginbridge.plan.aac;
|
||||||
|
|
||||||
|
import main.java.com.djrapitops.plan.api.exceptions.DBCreateTableException;
|
||||||
|
import main.java.com.djrapitops.plan.database.databases.SQLDB;
|
||||||
|
import main.java.com.djrapitops.plan.database.processing.ExecStatement;
|
||||||
|
import main.java.com.djrapitops.plan.database.processing.QueryAllStatement;
|
||||||
|
import main.java.com.djrapitops.plan.database.processing.QueryStatement;
|
||||||
|
import main.java.com.djrapitops.plan.database.sql.Select;
|
||||||
|
import main.java.com.djrapitops.plan.database.tables.Table;
|
||||||
|
import me.konsolas.aac.api.HackType;
|
||||||
|
|
||||||
|
import java.sql.PreparedStatement;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class responsible for AAC kick information in Plan database.
|
||||||
|
*
|
||||||
|
* @author Rsl1122
|
||||||
|
* @since 3.5.0
|
||||||
|
*/
|
||||||
|
public class HackerTable extends Table {
|
||||||
|
|
||||||
|
private final String columnUUID;
|
||||||
|
private final String columnDate;
|
||||||
|
private final String columnHackType;
|
||||||
|
private final String columnViolations;
|
||||||
|
|
||||||
|
public HackerTable(SQLDB db) {
|
||||||
|
super("plan_viaversion_protocol", db, db.isUsingMySQL());
|
||||||
|
columnUUID = "uuid";
|
||||||
|
columnDate = "date";
|
||||||
|
columnHackType = "hack_type";
|
||||||
|
columnViolations = "violation_level";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void createTable() throws DBCreateTableException {
|
||||||
|
createTable("CREATE TABLE IF NOT EXISTS " + tableName + " ("
|
||||||
|
+ columnUUID + " varchar(36) NOT NULL UNIQUE, "
|
||||||
|
+ columnDate + " bigint NOT NULL, "
|
||||||
|
+ columnHackType + " varchar(100) NOT NULL, "
|
||||||
|
+ columnViolations + " integer NOT NULL"
|
||||||
|
+ ")"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<HackObject> getHackObjects(UUID uuid) throws SQLException {
|
||||||
|
String sql = "SELECT * FROM " + tableName + " WHERE " + columnUUID + "=?";
|
||||||
|
|
||||||
|
return query(new QueryStatement<List<HackObject>>(sql) {
|
||||||
|
@Override
|
||||||
|
public void prepare(PreparedStatement statement) throws SQLException {
|
||||||
|
statement.setString(1, uuid.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<HackObject> processResults(ResultSet set) throws SQLException {
|
||||||
|
List<HackObject> hackObjects = new ArrayList<>();
|
||||||
|
while (set.next()) {
|
||||||
|
UUID uuid = UUID.fromString(set.getString(columnUUID));
|
||||||
|
long date = set.getLong(columnDate);
|
||||||
|
HackType hackType = HackType.valueOf(set.getString(columnHackType));
|
||||||
|
int violationLevel = set.getInt(columnViolations);
|
||||||
|
hackObjects.add(new HackObject(uuid, date, hackType, violationLevel));
|
||||||
|
}
|
||||||
|
return hackObjects;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<UUID, List<HackObject>> getHackObjects() throws SQLException {
|
||||||
|
return query(new QueryAllStatement<Map<UUID, List<HackObject>>>(Select.all(tableName).toString(), 5000) {
|
||||||
|
@Override
|
||||||
|
public Map<UUID, List<HackObject>> processResults(ResultSet set) throws SQLException {
|
||||||
|
Map<UUID, List<HackObject>> hackObjects = new HashMap<>();
|
||||||
|
while (set.next()) {
|
||||||
|
UUID uuid = UUID.fromString(set.getString(columnUUID));
|
||||||
|
long date = set.getLong(columnDate);
|
||||||
|
HackType hackType = HackType.valueOf(set.getString(columnHackType));
|
||||||
|
int violationLevel = set.getInt(columnViolations);
|
||||||
|
List<HackObject> list = hackObjects.getOrDefault(uuid, new ArrayList<>());
|
||||||
|
list.add(new HackObject(uuid, date, hackType, violationLevel));
|
||||||
|
hackObjects.put(uuid, list);
|
||||||
|
}
|
||||||
|
return hackObjects;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void insertHackRow(HackObject hackObject) throws SQLException {
|
||||||
|
String sql = "INSERT INTO " + tableName + " ("
|
||||||
|
+ columnUUID + ", "
|
||||||
|
+ columnDate + ", "
|
||||||
|
+ columnHackType + ", "
|
||||||
|
+ columnViolations
|
||||||
|
+ ") VALUES (?, ?, ?, ?)";
|
||||||
|
|
||||||
|
execute(new ExecStatement(sql) {
|
||||||
|
@Override
|
||||||
|
public void prepare(PreparedStatement statement) throws SQLException {
|
||||||
|
statement.setString(1, hackObject.getUuid().toString());
|
||||||
|
statement.setLong(2, hackObject.getDate());
|
||||||
|
statement.setString(3, hackObject.getHackType().getName());
|
||||||
|
statement.setInt(4, hackObject.getViolationLevel());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* To change this license header, choose License Headers in Project Properties.
|
||||||
|
* To change this template file, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
package com.djrapitops.pluginbridge.plan.aac;
|
||||||
|
|
||||||
|
|
||||||
|
import com.djrapitops.plugin.api.utility.log.Log;
|
||||||
|
import main.java.com.djrapitops.plan.Plan;
|
||||||
|
import main.java.com.djrapitops.plan.database.databases.SQLDB;
|
||||||
|
import main.java.com.djrapitops.plan.systems.processing.Processor;
|
||||||
|
import main.java.com.djrapitops.plan.utilities.MiscUtils;
|
||||||
|
import me.konsolas.aac.api.AACAPIProvider;
|
||||||
|
import me.konsolas.aac.api.HackType;
|
||||||
|
import me.konsolas.aac.api.PlayerViolationCommandEvent;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class responsible for listening kick events made by AAC.
|
||||||
|
*
|
||||||
|
* @author Rsl1122
|
||||||
|
* @since 4.1.0
|
||||||
|
*/
|
||||||
|
public class PlayerHackKickListener implements Listener {
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
|
public void onKick(PlayerViolationCommandEvent event) {
|
||||||
|
if (event.isCancelled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Player player = event.getPlayer();
|
||||||
|
UUID uuid = player.getUniqueId();
|
||||||
|
HackType hackType = event.getHackType();
|
||||||
|
long time = MiscUtils.getTime();
|
||||||
|
int violations = AACAPIProvider.getAPI().getViolationLevel(player, hackType);
|
||||||
|
|
||||||
|
HackObject hackObject = new HackObject(uuid, time, hackType, violations);
|
||||||
|
Plan plan = Plan.getInstance();
|
||||||
|
plan.addToProcessQueue(new Processor<UUID>(uuid) {
|
||||||
|
@Override
|
||||||
|
public void process() {
|
||||||
|
try {
|
||||||
|
new HackerTable((SQLDB) plan.getDB()).insertHackRow(hackObject);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
Log.toLog(this.getClass().getName() + ":PlanViaVersionJoinListener", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user