Removed PlanPluginBridge

This commit is contained in:
Rsl1122 2019-09-03 11:05:17 +03:00
parent 45a115495f
commit a544b75838
41 changed files with 0 additions and 3667 deletions

View File

@ -1 +0,0 @@
mvn install:install-file -Dfile="AAC-3.5.0-b1.jar" -DgroupId=me.konsolas -DartifactId=AAC -Dversion=3.5.0 -Dpackaging=jar & mvn install:install-file -Dfile="AdvancedBan-2.1.5.jar" -DgroupId=me.leoko -DartifactId=advancedban -Dversion=2.1.5 -Dpackaging=jar & mvn install:install-file -Dfile="ASkyBlock-3.0.9.4.jar" -DgroupId=com.wasteofplastic.askyblock -DartifactId=ASkyBlock -Dversion=3.0.9.4 -Dpackaging=jar & mvn install:install-file -Dfile="BanManager-5.15.0.jar" -DgroupId=me.confuser -DartifactId=banmanager -Dversion=5.15.0 -Dpackaging=jar & mvn install:install-file -Dfile="EssentialsX-2.15.0.1.jar" -DgroupId=net.ess3 -DartifactId=EssentialsX -Dversion=2.15.0.1 -Dpackaging=jar & mvn install:install-file -Dfile="Factions-2.14.0.jar" -DgroupId=com.massivecraft -DartifactId=factions -Dversion=2.14.0 -Dpackaging=jar & mvn install:install-file -Dfile="MassiveCore-2.14.0.jar" -DgroupId=com.massivecraft -DartifactId=mcore -Dversion=2.14.0 -Dpackaging=jar & mvn install:install-file -Dfile="GriefPreventionPlus-13.3.jar" -DgroupId=net.kaikk.mc -DartifactId=GriefPreventionPlus -Dversion=13.3 -Dpackaging=jar & mvn install:install-file -Dfile="Jobs4.7.4.jar" -DgroupId=com.gamingmesh -DartifactId=jobs -Dversion=4.7.4 -Dpackaging=jar & mvn install:install-file -Dfile="Kingdoms-13.3.40.jar" -DgroupId=org.kingdoms -DartifactId=kingdoms_demo -Dversion=13.3.40 -Dpackaging=jar & mvn install:install-file -Dfile="LiteBansAPI-0.3.jar" -DgroupId=litebans -DartifactId=api -Dversion=0.3 -Dpackaging=jar & mvn install:install-file -Dfile="mcMMO-1.6.0-SNAPSHOT.jar" -DgroupId=com.gmail.nossr50 -DartifactId=mcMMO -Dversion=1.6.0 -Dpackaging=jar & mvn install:install-file -Dfile="ProtocolSupport-4.28.jar" -DgroupId=com.github.ProtocolSupport -DartifactId=ProtocolSupport -Dversion=4.28 -Dpackaging=jar & mvn install:install-file -Dfile="React-6.573.jar" -DgroupId=com.volmit -DartifactId=react -Dversion=6.573 -Dpackaging=jar & mvn install:install-file -Dfile="SuperbVote-0.5.3.jar" -DgroupId=io.minimum -DartifactId=minecraft.superbvote -Dversion=0.5.3 -Dpackaging=jar & mvn install:install-file -Dfile="Towny-0.92.0.0.jar" -DgroupId=com.palmergames -DartifactId=towny -Dversion=0.92.0.0 -Dpackaging=jar & mvn install:install-file -Dfile="Vault-1.6.7.jar" -DgroupId=net.milkbowl.vault -DartifactId=VaultAPI -Dversion=1.6 -Dpackaging=jar

View File

@ -1,210 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.djrapitops</groupId>
<artifactId>PlanPluginBridge</artifactId>
<version>4.9.0-R0.3</version>
<packaging>jar</packaging>
<name>${project.groupId}:${project.artifactId}</name>
<description>Artifact for reducing requirements for manually installing artifacts for another project, Plan
</description>
<url>https://github.com/Rsl1122/Plan-PlayerAnalytics/tree/master/PlanPluginBridge</url>
<licenses>
<license>
<name>GNU Lesser General Public License v3 (LGPLv3)</name>
<url>https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/LICENSE</url>
</license>
</licenses>
<developers>
<developer>
<name>Risto Lahtela (Rsl1122)</name>
<email>djrapitops@hotmail.com</email>
<organization>None</organization>
<organizationUrl>https://github.com/Rsl1122</organizationUrl>
</developer>
</developers>
<scm>
<connection>scm:git:git://github.com/Rsl1122/Plan-PlayerAnalytics.git</connection>
<developerConnection>scm:git:ssh://github.com:Rsl1122/Plan-PlayerAnalytics.git</developerConnection>
<url>https://github.com/Rsl1122/Plan-PlayerAnalytics</url>
</scm>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<repositories>
<repository>
<id>bungeecord-repo</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</repository>
<repository>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
<repository>
<id>paper-repo</id>
<url>https://repo.destroystokyo.com/repository/maven-public/</url>
</repository>
<repository>
<id>sponge-repo</id>
<url>https://repo.spongepowered.org/maven</url>
</repository>
<repository>
<id>jitpack.io (GriefPrevention)</id>
<url>https://jitpack.io</url>
</repository>
<repository>
<id>placeholderapi</id>
<url>http://repo.extendedclip.com/content/repositories/placeholderapi/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.djrapitops</groupId>
<artifactId>Plan-plugin</artifactId>
<version>4.8.7</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.8</version>
</dependency>
<!-- Server APIs -->
<dependency>
<groupId>com.destroystokyo.paper</groupId>
<artifactId>paper-api</artifactId>
<version>1.12.2-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.12-R0.1-SNAPSHOT</version>
<type>jar</type>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.md-5</groupId>
<artifactId>bungeecord-api</artifactId>
<version>1.12-SNAPSHOT</version>
<type>jar</type>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.spongepowered</groupId>
<artifactId>spongeapi</artifactId>
<version>7.1.0</version>
<type>jar</type>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.dagger</groupId>
<artifactId>dagger</artifactId>
<version>2.24</version>
</dependency>
<!-- Plugins from repositories -->
<dependency>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
<version>2.10.3</version>
<scope>provided</scope>
</dependency>
<dependency> <!-- Maven Central -->
<groupId>me.lucko.luckperms</groupId>
<artifactId>luckperms-api</artifactId>
<version>4.4</version>
<scope>provided</scope>
</dependency>
<!-- Plugins requiring local install -->
<dependency>
<groupId>com.massivecraft</groupId>
<artifactId>factions</artifactId>
<version>2.14.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.massivecraft</groupId>
<artifactId>mcore</artifactId>
<version>2.14.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.gamingmesh</groupId>
<artifactId>jobs</artifactId>
<version>4.13.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>litebans</groupId>
<artifactId>api</artifactId>
<version>0.3.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.volmit</groupId>
<artifactId>react</artifactId>
<version>6.612</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.palmergames</groupId>
<artifactId>towny</artifactId>
<version>0.92.0.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>com.google.dagger</groupId>
<artifactId>dagger-compiler</artifactId>
<version>2.16</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.4</version>
</plugin>
</plugins>
</build>
<distributionManagement>
<repository>
<id>bintray-rsl1122-Plan-repository</id>
<name>rsl1122-Plan-repository</name>
<url>https://api.bintray.com/maven/rsl1122/Plan-repository/PlanPluginBridge/;publish=1</url>
</repository>
</distributionManagement>
</project>

View File

@ -1,63 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan;
import com.djrapitops.plan.data.plugin.HookHandler;
import com.djrapitops.plan.system.settings.config.PlanConfig;
import com.djrapitops.plan.system.settings.paths.PluginSettings;
import com.djrapitops.plugin.logging.L;
import com.djrapitops.plugin.logging.error.ErrorHandler;
/**
* Manages connection to other plugins.
*
* @author Rsl1122
*/
public abstract class AbstractBridge implements Bridge {
private final PlanConfig config;
private final ErrorHandler errorHandler;
AbstractBridge(
PlanConfig config,
ErrorHandler errorHandler
) {
this.config = config;
this.errorHandler = errorHandler;
}
public void hook(HookHandler handler) {
Hook[] hooks = getHooks();
hookInto(handler, hooks);
}
private void hookInto(HookHandler handler, Hook[] hooks) {
boolean devMode = config.isTrue(PluginSettings.DEV_MODE);
for (Hook hook : hooks) {
try {
hook.hook(handler);
} catch (Exception | NoClassDefFoundError e) {
if (devMode) {
errorHandler.log(L.WARN, this.getClass(), e);
}
}
}
}
abstract Hook[] getHooks();
}

View File

@ -1,12 +0,0 @@
package com.djrapitops.pluginbridge.plan;
import com.djrapitops.plan.data.plugin.HookHandler;
/**
* Interface for Hooking into other plugins.
*
* @author Rsl1122
*/
public interface Bridge {
void hook(HookHandler handler);
}

View File

@ -1,77 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan;
import com.djrapitops.plan.system.settings.config.PlanConfig;
import com.djrapitops.plugin.logging.error.ErrorHandler;
import com.djrapitops.pluginbridge.plan.buycraft.BuyCraftHook;
import com.djrapitops.pluginbridge.plan.factions.FactionsHook;
import com.djrapitops.pluginbridge.plan.jobs.JobsHook;
import com.djrapitops.pluginbridge.plan.litebans.LiteBansBukkitHook;
import com.djrapitops.pluginbridge.plan.luckperms.LuckPermsHook;
import com.djrapitops.pluginbridge.plan.towny.TownyHook;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
* Plugin bridge for Bukkit plugins.
*
* @author Rsl1122
*/
@Singleton
public class BukkitBridge extends AbstractBridge {
private final BuyCraftHook buyCraftHook;
private final FactionsHook factionsHook;
private final JobsHook jobsHook;
private final LiteBansBukkitHook liteBansHook;
private final LuckPermsHook luckPermsHook;
private final TownyHook townyHook;
@Inject
public BukkitBridge(
PlanConfig config,
ErrorHandler errorHandler,
BuyCraftHook buyCraftHook,
FactionsHook factionsHook,
JobsHook jobsHook,
LiteBansBukkitHook liteBansHook,
LuckPermsHook luckPermsHook,
TownyHook townyHook
) {
super(config, errorHandler);
this.buyCraftHook = buyCraftHook;
this.factionsHook = factionsHook;
this.jobsHook = jobsHook;
this.liteBansHook = liteBansHook;
this.luckPermsHook = luckPermsHook;
this.townyHook = townyHook;
}
@Override
Hook[] getHooks() {
return new Hook[]{
buyCraftHook,
factionsHook,
jobsHook,
liteBansHook,
luckPermsHook,
townyHook,
};
}
}

View File

@ -1,62 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan;
import com.djrapitops.plan.system.settings.config.PlanConfig;
import com.djrapitops.plugin.logging.error.ErrorHandler;
import com.djrapitops.pluginbridge.plan.buycraft.BuyCraftHook;
import com.djrapitops.pluginbridge.plan.litebans.LiteBansBungeeHook;
import com.djrapitops.pluginbridge.plan.luckperms.LuckPermsHook;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
* Plugin bridge for BungeeCord plugins.
*
* @author Rsl1122
*/
@Singleton
public class BungeeBridge extends AbstractBridge {
private final BuyCraftHook buyCraftHook;
private final LiteBansBungeeHook liteBansHook;
private final LuckPermsHook luckPermsHook;
@Inject
public BungeeBridge(
PlanConfig config,
ErrorHandler errorHandler,
BuyCraftHook buyCraftHook,
LiteBansBungeeHook liteBansHook,
LuckPermsHook luckPermsHook
) {
super(config, errorHandler);
this.buyCraftHook = buyCraftHook;
this.liteBansHook = liteBansHook;
this.luckPermsHook = luckPermsHook;
}
@Override
Hook[] getHooks() {
return new Hook[]{
buyCraftHook,
liteBansHook,
luckPermsHook,
};
}
}

View File

@ -1,116 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan;
import com.djrapitops.plan.data.store.containers.PlayerContainer;
import com.djrapitops.plan.data.store.keys.PlayerKeys;
import org.bukkit.Location;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
/**
* @author Rsl1122
*/
public class FakeOfflinePlayer implements OfflinePlayer {
private final UUID uuid;
private final String name;
public FakeOfflinePlayer(UUID uuid, String name) {
this.uuid = uuid;
this.name = name;
}
public FakeOfflinePlayer(PlayerContainer player) {
this(player.getValue(PlayerKeys.UUID).orElse(null), player.getValue(PlayerKeys.NAME).orElse("Notch"));
}
@Override
public boolean isOnline() {
return false;
}
@Override
public String getName() {
return name;
}
@Override
public UUID getUniqueId() {
return uuid;
}
@Override
public boolean isBanned() {
return false;
}
@Override
public boolean isWhitelisted() {
return true;
}
@Override
public void setWhitelisted(boolean bln) {
/* Not used */
}
@Override
public Player getPlayer() {
return null;
}
@Override
public long getFirstPlayed() {
return 0L;
}
@Override
public long getLastPlayed() {
return 0L;
}
@Override
public boolean hasPlayedBefore() {
return true;
}
@Override
public Location getBedSpawnLocation() {
return new Location(null, 0, 0, 0);
}
@Override
public boolean isOp() {
return false;
}
@Override
public void setOp(boolean bln) {
/* Not used */
}
@Override
public Map<String, Object> serialize() {
return new HashMap<>();
}
}

View File

@ -1,54 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan;
import com.djrapitops.plan.data.plugin.HookHandler;
import com.djrapitops.plugin.api.Check;
/**
* Abstract class for easy hooking of plugins.
*
* @author Rsl1122
*/
public abstract class Hook {
/**
* Is the plugin being hooked properly enabled?
*/
protected boolean enabled;
/**
* Class constructor.
* <p>
* Checks if the given plugin (class path) is enabled.
*
* @param pluginClass Class path string of the plugin's main JavaPlugin class.
*/
public Hook(String pluginClass) {
enabled = Check.isAvailable(pluginClass);
}
public abstract void hook(HookHandler handler) throws NoClassDefFoundError;
/**
* Constructor to set enabled to false.
*/
public Hook() {
enabled = false;
}
}

View File

@ -1,66 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan;
import dagger.Module;
import dagger.Provides;
import javax.inject.Singleton;
/**
* Dagger modules for different plugin bridges.
*
* @author Rsl1122
*/
public class PluginBridgeModule {
@Module
public static class Bukkit {
@Provides
@Singleton
public Bridge provideBridge(BukkitBridge bridge) {
return bridge;
}
}
@Module
public static class Bungee {
@Provides
@Singleton
public Bridge provideBridge(BungeeBridge bridge) {
return bridge;
}
}
@Module
public static class Sponge {
@Provides
@Singleton
public Bridge provideBridge(SpongeBridge bridge) {
return bridge;
}
}
@Module
public static class Velocity {
@Provides
@Singleton
public Bridge provideBridge(VelocityBridge bridge) {
return bridge;
}
}
}

View File

@ -1,58 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan;
import com.djrapitops.plan.system.settings.config.PlanConfig;
import com.djrapitops.plugin.logging.error.ErrorHandler;
import com.djrapitops.pluginbridge.plan.buycraft.BuyCraftHook;
import com.djrapitops.pluginbridge.plan.luckperms.LuckPermsHook;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
* Plugin bridge for Sponge plugins.
*
* @author Rsl1122
*/
@Singleton
public class SpongeBridge extends AbstractBridge {
private final BuyCraftHook buyCraftHook;
private final LuckPermsHook luckPermsHook;
@Inject
public SpongeBridge(
PlanConfig config,
ErrorHandler errorHandler,
BuyCraftHook buyCraftHook,
LuckPermsHook luckPermsHook
) {
super(config, errorHandler);
this.buyCraftHook = buyCraftHook;
this.luckPermsHook = luckPermsHook;
}
@Override
Hook[] getHooks() {
return new Hook[]{
buyCraftHook,
luckPermsHook
};
}
}

View File

@ -1,53 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan;
import com.djrapitops.plan.system.settings.config.PlanConfig;
import com.djrapitops.plugin.logging.error.ErrorHandler;
import com.djrapitops.pluginbridge.plan.buycraft.BuyCraftHook;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
* Plugin bridge for Velocity plugins.
*
* @author Rsl1122
*/
@Singleton
public class VelocityBridge extends AbstractBridge {
private final BuyCraftHook buyCraftHook;
@Inject
public VelocityBridge(
PlanConfig config,
ErrorHandler errorHandler,
BuyCraftHook buyCraftHook
) {
super(config, errorHandler);
this.buyCraftHook = buyCraftHook;
}
@Override
Hook[] getHooks() {
return new Hook[]{
buyCraftHook
};
}
}

View File

@ -1,126 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan.buycraft;
import com.djrapitops.plan.api.PlanAPI;
import com.djrapitops.plan.api.exceptions.connection.ForbiddenException;
import com.djrapitops.plan.data.element.AnalysisContainer;
import com.djrapitops.plan.data.element.InspectContainer;
import com.djrapitops.plan.data.element.TableContainer;
import com.djrapitops.plan.data.plugin.ContainerSize;
import com.djrapitops.plan.data.plugin.PluginData;
import com.djrapitops.plan.system.settings.config.PlanConfig;
import com.djrapitops.plan.utilities.formatting.Formatter;
import com.djrapitops.plan.utilities.html.Html;
import com.djrapitops.plan.utilities.html.icon.Color;
import com.djrapitops.plan.utilities.html.icon.Family;
import com.djrapitops.plan.utilities.html.icon.Icon;
import java.util.*;
/**
* PluginData for BuyCraft plugin.
*
* @author Rsl1122
*/
class BuyCraftData extends PluginData {
private final String secret;
private final PlanConfig config;
private final Formatter<Long> timestampFormatter;
private final Formatter<Double> decimalFormatter;
BuyCraftData(
String secret,
PlanConfig config, Formatter<Long> timestampFormatter,
Formatter<Double> decimalFormatter
) {
super(ContainerSize.TAB, "BuyCraft");
this.config = config;
this.timestampFormatter = timestampFormatter;
this.decimalFormatter = decimalFormatter;
setPluginIcon(Icon.called("shopping-bag").of(Color.BLUE).build());
this.secret = secret;
}
@Override
public InspectContainer getPlayerData(UUID uuid, InspectContainer inspectContainer) {
return inspectContainer;
}
@Override
public AnalysisContainer getServerData(Collection<UUID> collection, AnalysisContainer analysisContainer) throws Exception {
try {
List<Payment> payments = new ListPaymentRequest(secret).makeRequest();
Collections.sort(payments);
addPaymentTotals(analysisContainer, payments);
addPlayerTable(analysisContainer, payments);
} catch (ForbiddenException e) {
analysisContainer.addValue("Configuration error", e.getMessage());
}
return analysisContainer;
}
private void addPlayerTable(AnalysisContainer analysisContainer, List<Payment> payments) {
TableContainer payTable = new TableContainer(
true,
getWithIcon("Date", Icon.called("calendar").of(Family.REGULAR)),
getWithIcon("Amount", Icon.called("money-bill-wave")),
getWithIcon("Packages", Icon.called("cube"))
);
payTable.setColor("blue");
for (Payment payment : payments) {
String name = payment.getPlayerName();
payTable.addRow(
Html.LINK.parse(PlanAPI.getInstance().getPlayerInspectPageLink(name), name),
timestampFormatter.apply(payment.getDate()),
decimalFormatter.apply(payment.getAmount()) + " " + payment.getCurrency(),
payment.getPackages()
);
}
analysisContainer.addTable("payTable", payTable);
MoneyStackGraph moneyStackGraph = new MoneyStackGraph(payments, config);
String graphHtml = Html.PANEL_BODY.parse("<div id=\"buycraftChart\" class=\"dashboard-flot-chart\"></div>") +
"<script>$(function () {setTimeout(function() {" +
"stackChart('buycraftChart', "
+ moneyStackGraph.toHighChartsLabels() + ", "
+ moneyStackGraph.toHighChartsSeries() + ", '');}, 1000)});</script>";
analysisContainer.addHtml("moneygraph", graphHtml);
}
private void addPaymentTotals(AnalysisContainer analysisContainer, List<Payment> payments) {
Map<String, Double> paymentTotals = new HashMap<>();
for (Payment payment : payments) {
String currency = payment.getCurrency();
double amount = payment.getAmount();
paymentTotals.put(currency, paymentTotals.getOrDefault(currency, 0.0) + amount);
}
for (Map.Entry<String, Double> entry : paymentTotals.entrySet()) {
analysisContainer.addValue(
getWithIcon("Total " + entry.getKey(), Icon.called("money-bill-wave").of(Color.BLUE)),
decimalFormatter.apply(entry.getValue())
);
}
}
}

View File

@ -1,58 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan.buycraft;
import com.djrapitops.plan.data.plugin.HookHandler;
import com.djrapitops.plan.system.settings.config.PlanConfig;
import com.djrapitops.plan.system.settings.paths.PluginDataSettings;
import com.djrapitops.plan.utilities.formatting.Formatters;
import com.djrapitops.pluginbridge.plan.Hook;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
* Hook for BuyCraft plugin.
*
* @author Rsl1122
*/
@Singleton
public class BuyCraftHook extends Hook {
private final PlanConfig config;
private final Formatters formatters;
@Inject
public BuyCraftHook(
PlanConfig config,
Formatters formatters
) {
super();
this.config = config;
this.formatters = formatters;
}
@Override
public void hook(HookHandler handler) throws NoClassDefFoundError {
String secret = config.get(PluginDataSettings.PLUGIN_BUYCRAFT_SECRET);
enabled = !secret.equals("-") && !secret.isEmpty();
if (enabled) {
handler.addPluginDataSource(new BuyCraftData(secret, config, formatters.yearLong(), formatters.decimals()));
}
}
}

View File

@ -1,112 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan.buycraft;
import com.djrapitops.plan.api.exceptions.connection.ForbiddenException;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* Request to Buycraft API for payment listings.
*
* @author Rsl1122
*/
public class ListPaymentRequest {
private final String secret;
public ListPaymentRequest(String secret) {
this.secret = secret;
}
public List<Payment> makeRequest() throws IOException, ForbiddenException {
URL url = new URL("https://plugin.buycraft.net/payments");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setRequestProperty("X-BuyCraft-Secret", secret);
JsonElement json;
try {
InputStreamReader reader = new InputStreamReader(connection.getInputStream());
json = new JsonParser().parse(reader);
} finally {
connection.disconnect();
}
if (json == null || json.isJsonNull()) {
throw new NullPointerException("JSON should not be null");
}
List<Payment> payments = new ArrayList<>();
if (json.isJsonObject()) {
return readError(json);
} else if (json.isJsonArray()) {
readAndAddPayments(json, payments);
}
return payments;
}
private void readAndAddPayments(JsonElement json, List<Payment> payments) {
JsonArray jsonArray = json.getAsJsonArray();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
for (JsonElement element : jsonArray) {
JsonObject payment = element.getAsJsonObject();
double amount = payment.get("amount").getAsDouble();
String dateString = payment.get("date").getAsString();
Date dateObj = dateFormat.parse(dateString, new ParsePosition(0));
long date = dateObj.getTime();
String currency = payment.get("currency").getAsJsonObject().get("iso_4217").getAsString();
JsonObject player = payment.get("player").getAsJsonObject();
String playerName = player.get("name").getAsString();
// UUID uuid = UUID.fromString(player.get("uuid").getAsString().replaceFirst(
// "(\\p{XDigit}{8})(\\p{XDigit}{4})(\\p{XDigit}{4})(\\p{XDigit}{4})(\\p{XDigit}+)", "$1-$2-$3-$4-$5"
// ));
StringBuilder packages = new StringBuilder();
for (JsonElement pack : payment.get("packages").getAsJsonArray()) {
packages.append(pack.getAsJsonObject().get("name")).append("<br>");
}
payments.add(new Payment(amount, currency, null, playerName, date, packages.toString()));
}
}
private List<Payment> readError(JsonElement json) throws ForbiddenException {
JsonObject jsonObject = json.getAsJsonObject();
int errorCode = jsonObject.get("error_code").getAsInt();
String errorMessage = jsonObject.get("error_message").getAsString();
if (errorCode == 403) {
throw new ForbiddenException("Incorrect Server Secret. Check config.");
} else {
throw new IllegalStateException(errorCode + ": " + errorMessage);
}
}
}

View File

@ -1,142 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan.buycraft;
import com.djrapitops.plan.system.settings.config.PlanConfig;
import com.djrapitops.plan.system.settings.paths.PluginSettings;
import com.djrapitops.plan.system.settings.paths.TimeSettings;
import com.djrapitops.plan.system.settings.theme.ThemeVal;
import com.djrapitops.plan.utilities.html.graphs.stack.StackDataSet;
import com.djrapitops.plan.utilities.html.graphs.stack.StackGraph;
import com.djrapitops.plugin.api.TimeAmount;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.format.TextStyle;
import java.util.*;
/**
* Utility for creating Money Stack Graph.
*
* @author Rsl1122
*/
class MoneyStackGraph {
private final StackGraph stackGraph;
private final ZoneId timeZoneID;
private String locale;
MoneyStackGraph(List<Payment> payments, PlanConfig config) {
timeZoneID = config.get(TimeSettings.USE_SERVER_TIME) ? ZoneId.systemDefault() : ZoneOffset.UTC;
locale = config.get(PluginSettings.LOCALE);
long now = System.currentTimeMillis();
long oldestDate = payments.isEmpty() ? now : payments.get(payments.size() - 1).getDate();
String[] labels = getLabels(now, oldestDate);
Map<String, List<Payment>> stacks = getStacks(payments);
StackDataSet[] dataSets = getDataSets(labels, stacks);
this.stackGraph = new StackGraph(labels, dataSets);
}
private StackDataSet[] getDataSets(String[] labels, Map<String, List<Payment>> stacks) {
String[] colors = ThemeVal.GRAPH_GM_PIE.getDefaultValue().split(", ");
int maxCol = colors.length;
List<StackDataSet> stackDataSets = new ArrayList<>();
int i = 0;
for (Map.Entry<String, List<Payment>> entry : stacks.entrySet()) {
String currency = entry.getKey();
List<Payment> payments = entry.getValue();
List<Double> values = sortValuesByLabels(labels, getValueMap(payments));
String color = colors[(i) % maxCol];
stackDataSets.add(new StackDataSet(values, currency, color));
i++;
}
return stackDataSets.toArray(new StackDataSet[0]);
}
private List<Double> sortValuesByLabels(String[] labels, Map<String, Double> valueMap) {
List<Double> values = new ArrayList<>();
for (String label : labels) {
values.add(valueMap.getOrDefault(label, 0.0));
}
return values;
}
private Map<String, Double> getValueMap(List<Payment> payments) {
Map<String, Double> valueMap = new HashMap<>();
for (Payment payment : payments) {
String label = getLabel(payment.getDate());
Double value = valueMap.getOrDefault(label, 0.0);
valueMap.put(label, value + payment.getAmount());
}
return valueMap;
}
private Map<String, List<Payment>> getStacks(List<Payment> payments) {
Map<String, List<Payment>> stacks = new HashMap<>();
for (Payment payment : payments) {
String currency = payment.getCurrency();
List<Payment> dataSetPayments = stacks.getOrDefault(currency, new ArrayList<>());
dataSetPayments.add(payment);
stacks.put(currency, dataSetPayments);
}
return stacks;
}
private String[] getLabels(long now, long oldestDate) {
long oneYearAgo = now - TimeAmount.YEAR.toMillis(1L);
long leftLimit = Math.max(oldestDate, oneYearAgo);
List<String> labels = new ArrayList<>();
for (long time = leftLimit; time < now; time += TimeAmount.MONTH.toMillis(1L)) {
labels.add(getLabel(time));
}
return labels.toArray(new String[0]);
}
private String getLabel(long time) {
Locale usedLocale = locale.equalsIgnoreCase("default") ? Locale.ENGLISH : Locale.forLanguageTag(locale);
LocalDate date = Instant.ofEpochMilli(time).atZone(timeZoneID).toLocalDate();
String month = date.getMonth().getDisplayName(TextStyle.FULL, usedLocale);
int year = date.getYear();
return month + " " + year;
}
public String toHighChartsLabels() {
return stackGraph.toHighChartsLabels();
}
public String toHighChartsSeries() {
return stackGraph.toHighChartsSeries();
}
}

View File

@ -1,74 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan.buycraft;
import java.util.UUID;
/**
* Represents a BuyCraft payment.
*
* Payments are sorted most recent first by natural ordering.
*
* @author Rsl1122
*/
class Payment implements Comparable<Payment> {
private final double amount;
private final String currency;
private final UUID uuid;
private final String playerName;
private final long date;
private final String packages;
Payment(double amount, String currency, UUID uuid, String playerName, long date, String packages) {
this.amount = amount;
this.currency = currency;
this.uuid = uuid;
this.playerName = playerName;
this.date = date;
this.packages = packages;
}
public double getAmount() {
return amount;
}
public String getCurrency() {
return currency;
}
public String getPlayerName() {
return playerName;
}
public long getDate() {
return date;
}
public UUID getUuid() {
return uuid;
}
public String getPackages() {
return packages;
}
@Override
public int compareTo(Payment o) {
return -Long.compare(this.date, o.date);
}
}

View File

@ -1,40 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan.factions;
import com.massivecraft.factions.entity.Faction;
import java.util.Comparator;
/**
* This class is used to compare factions in terms of Power.
*
* Compare method should only be used if FactionsHook.isEnabled() returns true.
*
* Note: this comparator imposes orderings that are inconsistent with equals.
*
* @author Rsl1122
* @see FactionsHook
*/
public class FactionComparator implements Comparator<Faction> {
@Override
public int compare(Faction fac1, Faction fac2) {
return -Double.compare(fac1.getPower(), fac2.getPower());
}
}

View File

@ -1,125 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan.factions;
import com.djrapitops.plan.data.store.keys.PlayerKeys;
import com.djrapitops.plan.data.store.mutators.PlayersMutator;
import com.djrapitops.plan.data.store.mutators.SessionsMutator;
import com.djrapitops.plan.utilities.formatting.Formatter;
import com.djrapitops.plan.utilities.html.HtmlStructure;
import com.djrapitops.plan.utilities.html.icon.Color;
import com.djrapitops.plan.utilities.html.icon.Family;
import com.djrapitops.plan.utilities.html.icon.Icon;
import com.djrapitops.plan.utilities.html.icon.Icons;
import com.djrapitops.plan.utilities.html.structure.Accordion;
import com.djrapitops.plan.utilities.html.structure.AccordionElement;
import com.djrapitops.plan.utilities.html.structure.AccordionElementContentBuilder;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.MPlayer;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;
/**
* Utility for creating Factions Accordion Html.
*
* @author Rsl1122
*/
class FactionsAccordion extends Accordion {
private final List<Faction> factions;
private final PlayersMutator playersMutator;
private final Formatter<Long> timestampFormatter;
private final Formatter<Double> decimalFormatter;
FactionsAccordion(
List<Faction> factions,
PlayersMutator playersMutator,
Formatter<Long> timestampFormatter,
Formatter<Double> decimalFormatter
) {
super("faction_accordion");
this.factions = factions;
this.playersMutator = playersMutator;
this.timestampFormatter = timestampFormatter;
this.decimalFormatter = decimalFormatter;
addElements();
}
private void addElements() {
for (Faction faction : factions) {
String factionName = faction.getName();
long createdAtMillis = faction.getCreatedAtMillis();
String created = timestampFormatter.apply(createdAtMillis);
double power = faction.getPower();
double maxPower = faction.getPowerMax();
String powerString = decimalFormatter.apply(power) + " / " + decimalFormatter.apply(maxPower);
MPlayer leader = faction.getLeader();
String leaderName = leader != null ? leader.getName() : "No Leader";
int landCount = faction.getLandCount();
Set<UUID> members = new HashSet<>();
List<MPlayer> mPlayers = faction.getMPlayers();
int memberCount = mPlayers.size();
for (MPlayer mPlayer : mPlayers) {
if (mPlayer == null) {
continue;
}
members.add(mPlayer.getUuid());
}
PlayersMutator memberMutator = this.playersMutator.filterBy(
player -> player.getValue(PlayerKeys.UUID)
.map(members::contains).orElse(false)
);
SessionsMutator memberSessionsMutator = new SessionsMutator(memberMutator.getSessions());
long playerKills = memberSessionsMutator.toPlayerKillCount();
long deaths = memberSessionsMutator.toDeathCount();
String separated = HtmlStructure.separateWithDots(("Power: " + powerString), leaderName);
String htmlID = "faction_" + factionName + "_" + createdAtMillis;
String leftSide = new AccordionElementContentBuilder()
.addRowBold(Icon.called("calendar").of(Color.DEEP_PURPLE).of(Family.REGULAR), "Created", created)
.addRowBold(Icon.called("bolt").of(Color.PURPLE), "Power", powerString)
.addRowBold(Icon.called("user").of(Color.PURPLE), "Leader", leaderName)
.addRowBold(Icon.called("users").of(Color.PURPLE), "Members", memberCount)
.addRowBold(Icon.called("map").of(Color.PURPLE), "Land Count", landCount)
.toHtml();
String rightSide = new AccordionElementContentBuilder()
.addRowBold(Icons.PLAYER_KILLS, "Player Kills", playerKills)
.addRowBold(Icons.DEATHS, "Deaths", deaths)
.toHtml();
addElement(
new AccordionElement(htmlID, factionName + "<span class=\"pull-right\">" + separated + "</span>")
.setColor("deep-purple")
.setLeftSide(leftSide)
.setRightSide(rightSide)
);
}
}
}

View File

@ -1,138 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan.factions;
import com.djrapitops.plan.api.PlanAPI;
import com.djrapitops.plan.data.element.AnalysisContainer;
import com.djrapitops.plan.data.element.InspectContainer;
import com.djrapitops.plan.data.plugin.ContainerSize;
import com.djrapitops.plan.data.plugin.PluginData;
import com.djrapitops.plan.data.store.keys.AnalysisKeys;
import com.djrapitops.plan.data.store.mutators.PlayersMutator;
import com.djrapitops.plan.system.settings.config.PlanConfig;
import com.djrapitops.plan.system.settings.paths.PluginDataSettings;
import com.djrapitops.plan.utilities.formatting.Formatter;
import com.djrapitops.plan.utilities.html.Html;
import com.djrapitops.plan.utilities.html.icon.Color;
import com.djrapitops.plan.utilities.html.icon.Icon;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.FactionColl;
import com.massivecraft.factions.entity.MPlayer;
import java.util.*;
import java.util.stream.Collectors;
/**
* PluginData for Factions plugin.
*
* @author Rsl1122
*/
class FactionsData extends PluginData {
private final PlanConfig config;
private final Formatter<Long> timestampFormatter;
private final Formatter<Double> decimalFormatter;
FactionsData(
PlanConfig config,
Formatter<Long> timestampFormatter,
Formatter<Double> decimalFormatter
) {
super(ContainerSize.TAB, "Factions");
this.config = config;
this.timestampFormatter = timestampFormatter;
this.decimalFormatter = decimalFormatter;
setPluginIcon(Icon.called("map").of(Color.DEEP_PURPLE).build());
}
@Override
public InspectContainer getPlayerData(UUID uuid, InspectContainer inspectContainer) {
MPlayer mPlayer = MPlayer.get(uuid);
if (mPlayer == null) {
return inspectContainer;
}
if (mPlayer.hasFaction()) {
Faction faction = mPlayer.getFaction();
if (faction != null) {
String factionName = faction.isNone() ? "-" : faction.getName();
String factionLeader = faction.getLeader().getName();
String factionLeaderLink = Html.LINK.parse(PlanAPI.getInstance().getPlayerInspectPageLink(factionLeader), factionLeader);
inspectContainer.addValue(getWithIcon("Faction", Icon.called("flag").of(Color.DEEP_PURPLE)), factionName);
inspectContainer.addValue(getWithIcon("Leader", Icon.called("user").of(Color.PURPLE)), factionLeaderLink);
}
}
double power = mPlayer.getPower();
double maxPower = mPlayer.getPowerMax();
String powerString = decimalFormatter.apply(power) + " / " + decimalFormatter.apply(maxPower);
inspectContainer.addValue(getWithIcon("Power", Icon.called("bolt").of(Color.PURPLE)), powerString);
return inspectContainer;
}
@Override
public AnalysisContainer getServerData(Collection<UUID> uuids, AnalysisContainer analysisContainer) {
List<Faction> factions = getTopFactions();
analysisContainer.addValue(getWithIcon("Number of Factions", Icon.called("flag").of(Color.DEEP_PURPLE)), factions.size());
if (!factions.isEmpty()) {
FactionsAccordion factionsAccordion = new FactionsAccordion(
factions,
Optional.ofNullable(analysisData).flatMap(c -> c.getValue(AnalysisKeys.PLAYERS_MUTATOR))
.orElse(new PlayersMutator(new ArrayList<>())),
timestampFormatter, decimalFormatter);
analysisContainer.addHtml("factionAccordion", factionsAccordion.toHtml());
Map<UUID, String> userFactions = new HashMap<>();
for (UUID uuid : uuids) {
MPlayer mPlayer = MPlayer.get(uuid);
if (mPlayer.hasFaction()) {
Faction faction = mPlayer.getFaction();
if (faction == null) {
continue;
}
MPlayer leader = faction.getLeader();
String leaderName = leader != null ? leader.getName() : "";
String factionName = faction.isNone() ? "-" : faction.getName();
userFactions.put(uuid, mPlayer.getName().equals(leaderName) ? "<b>" + factionName + "</b>" : factionName);
}
}
analysisContainer.addPlayerTableValues(getWithIcon("Faction", Icon.called("flag")), userFactions);
}
return analysisContainer;
}
private List<Faction> getTopFactions() {
List<Faction> topFactions = new ArrayList<>(FactionColl.get().getAll());
topFactions.remove(FactionColl.get().getWarzone());
topFactions.remove(FactionColl.get().getSafezone());
topFactions.remove(FactionColl.get().getNone());
List<String> hide = config.get(PluginDataSettings.HIDE_FACTIONS);
return topFactions.stream()
.filter(faction -> !hide.contains(faction.getName()))
.sorted(new FactionComparator())
.collect(Collectors.toList());
}
}

View File

@ -1,54 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan.factions;
import com.djrapitops.plan.data.plugin.HookHandler;
import com.djrapitops.plan.system.settings.config.PlanConfig;
import com.djrapitops.plan.utilities.formatting.Formatters;
import com.djrapitops.pluginbridge.plan.Hook;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
* A Class responsible for hooking to Factions and registering 4 data sources.
*
* @author Rsl1122
*/
@Singleton
public class FactionsHook extends Hook {
private final PlanConfig config;
private final Formatters formatters;
@Inject
public FactionsHook(
PlanConfig config,
Formatters formatters
) {
super("com.massivecraft.factions.entity.MPlayer");
this.config = config;
this.formatters = formatters;
}
public void hook(HookHandler handler) throws NoClassDefFoundError {
if (enabled) {
handler.addPluginDataSource(new FactionsData(config, formatters.yearLong(), formatters.decimals()));
}
}
}

View File

@ -1,110 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan.jobs;
import com.djrapitops.plan.data.element.AnalysisContainer;
import com.djrapitops.plan.data.element.InspectContainer;
import com.djrapitops.plan.data.element.TableContainer;
import com.djrapitops.plan.data.plugin.ContainerSize;
import com.djrapitops.plan.data.plugin.PluginData;
import com.djrapitops.plan.utilities.formatting.Formatter;
import com.djrapitops.plan.utilities.html.icon.Color;
import com.djrapitops.plan.utilities.html.icon.Icon;
import com.gamingmesh.jobs.Jobs;
import com.gamingmesh.jobs.dao.JobsDAOData;
import java.util.*;
import java.util.stream.Collectors;
/**
* PluginData for Jobs plugin.
*
* @author Rsl1122
*/
class JobsData extends PluginData {
private final Formatter<Double> decimalFormatter;
JobsData(Formatter<Double> decimalFormatter) {
super(ContainerSize.THIRD, "Jobs");
this.decimalFormatter = decimalFormatter;
setPluginIcon(Icon.called("suitcase").of(Color.BROWN).build());
}
@Override
public InspectContainer getPlayerData(UUID uuid, InspectContainer inspectContainer) {
List<JobsDAOData> playersJobs = Jobs.getDBManager().getDB().getAllJobs(null, uuid);
TableContainer jobTable = new TableContainer(
getWithIcon("Job", Icon.called("suitcase")),
getWithIcon("Level", Icon.called("plus")));
for (JobsDAOData job : playersJobs) {
jobTable.addRow(job.getJobName(), job.getLevel());
}
if (playersJobs.isEmpty()) {
jobTable.addRow("No Jobs");
}
inspectContainer.addTable("jobTable", jobTable);
return inspectContainer;
}
@Override
public AnalysisContainer getServerData(Collection<UUID> collection, AnalysisContainer analysisContainer) {
List<JobsDAOData> allJobs = Jobs.getDBManager().getDB().getAllJobs()
.values().stream()
.flatMap(Collection::stream)
.collect(Collectors.toList());
TableContainer jobTable = new TableContainer(
getWithIcon("Job", Icon.called("suitcase")),
getWithIcon("Workers", Icon.called("users")),
getWithIcon("Total Level", Icon.called("plus")),
getWithIcon("Average Level", Icon.called("plus"))
);
if (allJobs.isEmpty()) {
jobTable.addRow("No Jobs with Workers");
} else {
Map<String, Integer> workers = new HashMap<>();
Map<String, Long> totals = new HashMap<>();
for (JobsDAOData data : allJobs) {
String job = data.getJobName();
int level = data.getLevel();
workers.put(job, workers.getOrDefault(job, 0) + 1);
totals.put(job, totals.getOrDefault(job, 0L) + level);
}
List<String> order = new ArrayList<>(workers.keySet());
Collections.sort(order);
for (String job : order) {
int amountOfWorkers = workers.getOrDefault(job, 0);
long totalLevel = totals.getOrDefault(job, 0L);
jobTable.addRow(
job,
amountOfWorkers,
totalLevel,
amountOfWorkers != 0 ? decimalFormatter.apply(totalLevel * 1.0 / amountOfWorkers) : "-"
);
}
}
analysisContainer.addTable("jobTable", jobTable);
return analysisContainer;
}
}

View File

@ -1,49 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan.jobs;
import com.djrapitops.plan.data.plugin.HookHandler;
import com.djrapitops.plan.utilities.formatting.Formatter;
import com.djrapitops.plan.utilities.formatting.Formatters;
import com.djrapitops.pluginbridge.plan.Hook;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
* A Class responsible for hooking to Jobs and registering data sources.
*
* @author Rsl1122
*/
@Singleton
public class JobsHook extends Hook {
private final Formatter<Double> decimalFormatter;
@Inject
public JobsHook(Formatters formatters) {
super("com.gamingmesh.jobs.Jobs");
decimalFormatter = formatters.decimals();
}
public void hook(HookHandler handler) throws NoClassDefFoundError {
if (enabled) {
handler.addPluginDataSource(new JobsData(decimalFormatter));
}
}
}

View File

@ -1,59 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan.litebans;
import com.djrapitops.plan.data.plugin.HookHandler;
import com.djrapitops.plan.utilities.formatting.Formatter;
import com.djrapitops.plan.utilities.formatting.Formatters;
import com.djrapitops.pluginbridge.plan.Hook;
import litebans.api.Database;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
* A Class responsible for hooking to LiteBans and registering data
* sources.
*
* @author Rsl1122
*/
@Singleton
public class LiteBansBukkitHook extends Hook {
private Formatter<Long> timestampFormatter;
@Inject
public LiteBansBukkitHook(
Formatters formatters
) {
super();
try {
enabled = Database.get() != null;
timestampFormatter = formatters.secondLong();
} catch (NoClassDefFoundError | NoSuchFieldError | NoSuchMethodError | Exception e) {
enabled = false;
}
}
public void hook(HookHandler handler) throws NoClassDefFoundError {
if (enabled) {
LiteBansDatabaseQueries db = new LiteBansDatabaseQueries();
handler.addPluginDataSource(new LiteBansData(db, timestampFormatter));
}
}
}

View File

@ -1,59 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan.litebans;
import com.djrapitops.plan.data.plugin.HookHandler;
import com.djrapitops.plan.utilities.formatting.Formatter;
import com.djrapitops.plan.utilities.formatting.Formatters;
import com.djrapitops.pluginbridge.plan.Hook;
import litebans.api.Database;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
* A Class responsible for hooking to LiteBans and registering data
* sources.
*
* @author Rsl1122
*/
@Singleton
public class LiteBansBungeeHook extends Hook {
private Formatter<Long> timestampFormatter;
@Inject
public LiteBansBungeeHook(
Formatters formatters
) {
super();
try {
enabled = Database.get() != null;
timestampFormatter = formatters.secondLong();
} catch (NoClassDefFoundError | NoSuchFieldError | NoSuchMethodError | Exception e) {
enabled = false;
}
}
public void hook(HookHandler handler) throws NoClassDefFoundError {
if (enabled) {
LiteBansDatabaseQueries db = new LiteBansDatabaseQueries();
handler.addPluginDataSource(new LiteBansData(db, timestampFormatter));
}
}
}

View File

@ -1,66 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan.litebans;
import java.util.UUID;
/**
* Class representing LiteBans database data about a ban.
*
* @author Rsl1122
*/
public class LiteBansDBObj {
private final UUID uuid;
private final String reason;
private final String bannedBy;
private final long expiry;
private final boolean active;
private final long time;
public LiteBansDBObj(UUID uuid, String reason, String bannedBy, long expiry, boolean active, long time) {
this.uuid = uuid;
this.reason = reason;
this.bannedBy = bannedBy;
this.expiry = expiry;
this.active = active;
this.time = time;
}
public UUID getUuid() {
return uuid;
}
public String getReason() {
return reason;
}
public String getBannedBy() {
return bannedBy;
}
public long getExpiry() {
return expiry;
}
public boolean isActive() {
return active;
}
public long getTime() {
return time;
}
}

View File

@ -1,242 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan.litebans;
import com.djrapitops.plan.api.PlanAPI;
import com.djrapitops.plan.api.exceptions.database.DBOpException;
import com.djrapitops.plan.data.element.AnalysisContainer;
import com.djrapitops.plan.data.element.InspectContainer;
import com.djrapitops.plan.data.element.TableContainer;
import com.djrapitops.plan.data.plugin.BanData;
import com.djrapitops.plan.data.plugin.ContainerSize;
import com.djrapitops.plan.data.plugin.PluginData;
import com.djrapitops.plan.data.store.keys.AnalysisKeys;
import com.djrapitops.plan.utilities.formatting.Formatter;
import com.djrapitops.plan.utilities.html.Html;
import com.djrapitops.plan.utilities.html.icon.Color;
import com.djrapitops.plan.utilities.html.icon.Family;
import com.djrapitops.plan.utilities.html.icon.Icon;
import com.djrapitops.plan.utilities.html.icon.Icons;
import com.djrapitops.plan.utilities.html.structure.TabsElement;
import java.util.*;
import java.util.stream.Collectors;
/**
* PluginData for LiteBans plugin.
*
* @author Rsl1122
*/
class LiteBansData extends PluginData implements BanData {
private final LiteBansDatabaseQueries db;
private final Formatter<Long> timestampFormatter;
LiteBansData(
LiteBansDatabaseQueries db,
Formatter<Long> timestampFormatter
) {
super(ContainerSize.TAB, "LiteBans");
this.timestampFormatter = timestampFormatter;
setPluginIcon(Icon.called("ban").of(Color.RED).build());
this.db = db;
}
@Override
public InspectContainer getPlayerData(UUID uuid, InspectContainer inspectContainer) {
inspectContainer.addValue(Icon.called("balance-scale").of(Color.RED) +
" Hover over 'What' column entry for offence reasons", "");
String what = getWithIcon("Effect", Icon.called("times-circle").of(Family.REGULAR));
String by = getWithIcon("By", Icon.called("gavel"));
String date = getWithIcon("Expires", Icon.called("calendar-times").of(Family.REGULAR));
TableContainer table = new TableContainer(what, by, date);
table.setColor("red");
try {
List<LiteBansDBObj> bans = db.getBans(uuid);
List<LiteBansDBObj> mutes = db.getMutes(uuid);
List<LiteBansDBObj> warns = db.getWarnings(uuid);
List<LiteBansDBObj> kicks = db.getKicks(uuid);
if (bans.isEmpty() && mutes.isEmpty() && warns.isEmpty() && kicks.isEmpty()) {
table.addRow("None");
} else {
for (LiteBansDBObj ban : bans) {
long expiry = ban.getExpiry();
String expires = expiry <= 0 ? "Never" : timestampFormatter.apply(expiry);
table.addRow(
"<span title=\"" + ban.getReason() + "\">Ban</span>",
Html.LINK.parse(PlanAPI.getInstance().getPlayerInspectPageLink(ban.getBannedBy()), ban.getBannedBy()),
expires
);
}
for (LiteBansDBObj mute : mutes) {
long expiry = mute.getExpiry();
String expires = expiry <= 0 ? "Never" : timestampFormatter.apply(expiry);
table.addRow(
"<span title=\"" + mute.getReason() + "\">Mute</span>",
Html.LINK.parse(PlanAPI.getInstance().getPlayerInspectPageLink(mute.getBannedBy()), mute.getBannedBy()),
expires
);
}
for (LiteBansDBObj warn : warns) {
long expiry = warn.getExpiry();
String expires = expiry <= 0 ? "Never" : timestampFormatter.apply(expiry);
table.addRow(
"<span title=\"" + warn.getReason() + "\">Warning</span>",
Html.LINK.parse(PlanAPI.getInstance().getPlayerInspectPageLink(warn.getBannedBy()), warn.getBannedBy()),
expires
);
}
for (LiteBansDBObj kick : kicks) {
long expiry = kick.getExpiry();
String expires = expiry <= 0 ? "Never" : timestampFormatter.apply(expiry);
table.addRow(
"<span title=\"" + kick.getReason() + "\">Kick</span>",
Html.LINK.parse(PlanAPI.getInstance().getPlayerInspectPageLink(kick.getBannedBy()), kick.getBannedBy()),
expires
);
}
}
} catch (DBOpException ex) {
table.addRow("Error: " + ex);
} catch (IllegalStateException e) {
inspectContainer.addValue(getWithIcon("Error", Icons.RED_WARN), "Database connection is not available");
return inspectContainer;
}
inspectContainer.addTable("table", table);
return inspectContainer;
}
@Override
public AnalysisContainer getServerData(Collection<UUID> collection, AnalysisContainer analysisContainer) {
try {
TableContainer banTable = getBanTable();
TableContainer muteTable = getMuteTable();
TableContainer warningTable = getWarningTable();
TableContainer kickTable = getKickTable();
Html spacing = Html.PANEL_BODY;
String[] navAndHtml = new TabsElement(
new TabsElement.Tab(getWithIcon("Bans", Icon.called("ban")), spacing.parse(banTable.parseHtml())),
new TabsElement.Tab(getWithIcon("Mutes", Icon.called("bell-slash").of(Family.REGULAR)), spacing.parse(muteTable.parseHtml())),
new TabsElement.Tab(getWithIcon("Warnings", Icon.called("exclamation-triangle")), spacing.parse(warningTable.parseHtml())),
new TabsElement.Tab(getWithIcon("Kicks", Icon.called("user-times")), spacing.parse(kickTable.parseHtml()))
).toHtml();
analysisContainer.addHtml("Tables", navAndHtml[0] + navAndHtml[1]);
} catch (IllegalStateException e) {
analysisContainer.addValue(getWithIcon("Error", Icons.RED_WARN), "Database connection is not available");
}
return analysisContainer;
}
private TableContainer getBanTable() {
String banned = getWithIcon("Banned", Icon.called("ban"));
String by = getWithIcon("Banned By", Icon.called("gavel"));
TableContainer banTable = createTableContainer(banned, by);
banTable.useJqueryDataTables();
addRows(banTable, db.getBans());
return banTable;
}
private TableContainer getMuteTable() {
String muted = getWithIcon("Muted", Icon.called("bell-slash").of(Family.REGULAR));
String by = getWithIcon("Muted By", Icon.called("gavel"));
TableContainer muteTable = createTableContainer(muted, by);
muteTable.useJqueryDataTables();
addRows(muteTable, db.getMutes());
return muteTable;
}
private TableContainer getWarningTable() {
String warned = getWithIcon("Warned", Icon.called("exclamation-triangle"));
String by = getWithIcon("Warned By", Icon.called("gavel"));
TableContainer warnTable = createTableContainer(warned, by);
warnTable.useJqueryDataTables();
addRows(warnTable, db.getWarnings());
return warnTable;
}
private TableContainer getKickTable() {
String kicked = getWithIcon("Kicked", Icon.called("user-times"));
String by = getWithIcon("Kicked By", Icon.called("gavel"));
TableContainer kickTable = createTableContainer(kicked, by);
kickTable.useJqueryDataTables();
addRows(kickTable, db.getKicks());
return kickTable;
}
private TableContainer createTableContainer(String who, String by) {
String reason = getWithIcon("Reason", Icon.called("balance-scale"));
String given = getWithIcon("Given", Icon.called("clock").of(Family.REGULAR));
String expiry = getWithIcon("Expires", Icon.called("calendar-times").of(Family.REGULAR));
String active = getWithIcon("Active", Icon.called("hourglass"));
return new TableContainer(who, by, reason, given, expiry, active);
}
private void addRows(TableContainer table, List<LiteBansDBObj> objects) {
if (objects.isEmpty()) {
table.addRow("No Data");
} else {
Map<UUID, String> playerNames = Optional.ofNullable(analysisData)
.flatMap(c -> c.getValue(AnalysisKeys.PLAYER_NAMES)).orElse(new HashMap<>());
for (LiteBansDBObj object : objects) {
UUID uuid = object.getUuid();
String name = playerNames.getOrDefault(uuid, uuid.toString());
long expiry = object.getExpiry();
String expires = expiry <= 0 ? "Never" : timestampFormatter.apply(expiry);
long time = object.getTime();
String given = time <= 0 ? "Unknown" : timestampFormatter.apply(time);
table.addRow(
Html.LINK.parse(PlanAPI.getInstance().getPlayerInspectPageLink(name), name),
Html.LINK.parse(PlanAPI.getInstance().getPlayerInspectPageLink(object.getBannedBy()), object.getBannedBy()),
object.getReason(),
given,
expires,
object.isActive() ? "Yes" : "No"
);
}
}
}
@Override
public boolean isBanned(UUID uuid) {
try {
return db.getBans(uuid).stream().anyMatch(LiteBansDBObj::isActive);
} catch (DBOpException e) {
return false;
}
}
@Override
public Collection<UUID> filterBanned(Collection<UUID> collection) {
try {
Set<UUID> banned = db.getBans().stream()
.filter(LiteBansDBObj::isActive)
.map(LiteBansDBObj::getUuid)
.collect(Collectors.toSet());
return collection.stream().filter(banned::contains).collect(Collectors.toSet());
} catch (DBOpException e) {
return new HashSet<>();
}
}
}

View File

@ -1,144 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan.litebans;
import com.djrapitops.plan.api.exceptions.database.DBOpException;
import com.djrapitops.plan.db.access.QueryAllStatement;
import com.djrapitops.plan.db.access.QueryStatement;
import litebans.api.Database;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/**
* Class responsible for making queries to LiteBans database.
*
* @author Rsl1122
*/
public class LiteBansDatabaseQueries {
private final Database database;
private final String banTable;
private final String mutesTable;
private final String warningsTable;
private final String kicksTable;
private final String selectSQL;
public LiteBansDatabaseQueries() {
database = Database.get();
banTable = "{bans}";
mutesTable = "{mutes}";
warningsTable = "{warnings}";
kicksTable = "{kicks}";
selectSQL = "SELECT uuid, reason, banned_by_name, until, active, time FROM ";
}
protected <T> T query(QueryStatement<T> statement) {
try (PreparedStatement preparedStatement = database.prepareStatement(statement.getSql())) {
return statement.executeQuery(preparedStatement);
} catch (SQLException e) {
throw DBOpException.forCause(statement.getSql(), e);
}
}
private List<LiteBansDBObj> getObjs(String table) {
String sql = selectSQL + table + " LIMIT 5000";
return query(new QueryAllStatement<List<LiteBansDBObj>>(sql, 2000) {
@Override
public List<LiteBansDBObj> processResults(ResultSet resultSet) throws SQLException {
return processIntoObjects(resultSet);
}
});
}
public List<LiteBansDBObj> getBans() {
return getObjs(banTable);
}
public List<LiteBansDBObj> getMutes() {
return getObjs(mutesTable);
}
public List<LiteBansDBObj> getWarnings() {
return getObjs(warningsTable);
}
public List<LiteBansDBObj> getKicks() {
return getObjs(kicksTable);
}
private List<LiteBansDBObj> processIntoObjects(ResultSet set) throws SQLException {
List<LiteBansDBObj> objs = new ArrayList<>();
while (set.next()) {
String uuidS = set.getString("uuid");
if (uuidS == null) {
continue;
}
UUID uuid;
try {
uuid = UUID.fromString(uuidS);
} catch (IllegalArgumentException e) {
continue;
}
String reason = set.getString("reason");
String bannedBy = set.getString("banned_by_name");
long until = set.getLong("until");
long time = set.getLong("time");
boolean active = set.getBoolean("active");
objs.add(new LiteBansDBObj(uuid, reason, bannedBy, until, active, time));
}
return objs;
}
public List<LiteBansDBObj> getBans(UUID playerUUID) {
return getObjs(playerUUID, banTable);
}
public List<LiteBansDBObj> getMutes(UUID playerUUID) {
return getObjs(playerUUID, mutesTable);
}
public List<LiteBansDBObj> getWarnings(UUID playerUUID) {
return getObjs(playerUUID, warningsTable);
}
public List<LiteBansDBObj> getKicks(UUID playerUUID) {
return getObjs(playerUUID, kicksTable);
}
private List<LiteBansDBObj> getObjs(UUID playerUUID, String table) {
String sql = selectSQL + table + " WHERE uuid=?";
return query(new QueryStatement<List<LiteBansDBObj>>(sql, 2000) {
@Override
public void prepare(PreparedStatement statement) throws SQLException {
statement.setString(1, playerUUID.toString());
}
@Override
public List<LiteBansDBObj> processResults(ResultSet resultSet) throws SQLException {
return processIntoObjects(resultSet);
}
});
}
}

View File

@ -1,139 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan.luckperms;
import com.djrapitops.plan.data.element.AnalysisContainer;
import com.djrapitops.plan.data.element.InspectContainer;
import com.djrapitops.plan.data.element.TableContainer;
import com.djrapitops.plan.data.plugin.ContainerSize;
import com.djrapitops.plan.data.plugin.PluginData;
import com.djrapitops.plan.utilities.html.icon.Color;
import com.djrapitops.plan.utilities.html.icon.Family;
import com.djrapitops.plan.utilities.html.icon.Icon;
import me.lucko.luckperms.api.*;
import me.lucko.luckperms.api.caching.MetaData;
import org.apache.commons.text.TextStringBuilder;
import java.util.*;
import java.util.stream.Collectors;
/**
* PluginData for LuckPerms plugin.
*
* @author Vankka
*/
class LuckPermsData extends PluginData {
private final LuckPermsApi api;
LuckPermsData(LuckPermsApi api) {
super(ContainerSize.THIRD, "LuckPerms");
setPluginIcon(Icon.called("exclamation-triangle").of(Color.LIGHT_GREEN).build());
this.api = api;
}
@Override
public InspectContainer getPlayerData(UUID uuid, InspectContainer inspectContainer) {
User user = api.getUser(uuid);
if (user == null) {
inspectContainer.addValue("Data unavailable", "Could not get user data");
return inspectContainer;
}
MetaData metaData = user.getCachedData().getMetaData(Contexts.allowAll());
String prefix = metaData.getPrefix();
String suffix = metaData.getSuffix();
inspectContainer.addValue(getWithIcon("Primary group", Icon.called("user-friends").of(Family.SOLID)), user.getPrimaryGroup());
inspectContainer.addValue(getWithIcon("Prefix", Icon.called("file-signature").of(Family.SOLID).of(Color.GREEN)), prefix != null ? prefix : "None");
inspectContainer.addValue(getWithIcon("Suffix", Icon.called("file-signature").of(Family.SOLID).of(Color.BLUE)),suffix != null ? suffix : "None");
if (!metaData.getMeta().isEmpty()) {
TableContainer metaTable = new TableContainer(
getWithIcon("Meta", Icon.called("info-circle").of(Family.SOLID)),
getWithIcon("Value", Icon.called("file-alt").of(Family.SOLID))
);
metaData.getMeta().forEach((key, value) -> metaTable.addRow(key, value));
inspectContainer.addTable("Meta", metaTable);
}
List<String> groups = user.getPermissions().stream()
.filter(Node::isGroupNode)
.map(Node::getGroupName)
.sorted()
.collect(Collectors.toList());
inspectContainer.addValue(
getWithIcon("Groups", Icon.called("user-friends").of(Family.SOLID)),
new TextStringBuilder().appendWithSeparators(groups, ", ").build()
);
Set<Track> tracks = api.getTracks();
if (!tracks.isEmpty()) {
TableContainer trackTable = new TableContainer(
getWithIcon("Track", Icon.called("ellipsis-h").of(Family.SOLID)),
getWithIcon("Group", Icon.called("user-friends").of(Family.SOLID))
);
for (Track track : tracks) {
// reduce is used to get the last element
String currentGroup = api.getGroups().stream()
.map(this::getGroupDisplayName).filter(groups::contains)
.reduce((first, second) -> second).orElse("None");
trackTable.addRow(track.getName(), currentGroup);
}
inspectContainer.addTable("Tracks", trackTable);
}
return inspectContainer;
}
@Override
public AnalysisContainer getServerData(Collection<UUID> uuids, AnalysisContainer analysisContainer) {
// There will *always* be atleast 1 group
TableContainer groupTable = new TableContainer(
getWithIcon("Group", Icon.called("user-friends").of(Family.SOLID)),
getWithIcon("Weight", Icon.called("weight-hanging").of(Family.SOLID)),
getWithIcon("Permissions", Icon.called("list").of(Family.SOLID))
);
api.getGroups().stream().sorted(Comparator.comparing(Group::getName)).forEach(group -> {
OptionalInt weight = group.getWeight();
groupTable.addRow(getGroupDisplayName(group), weight.isPresent() ? weight.getAsInt() : "None", group.getPermissions().size());
});
analysisContainer.addTable("Groups", groupTable);
Set<Track> tracks = api.getTracks();
if (!tracks.isEmpty()) {
TableContainer trackTable = new TableContainer(
getWithIcon("Track", Icon.called("ellipsis-h").of(Family.SOLID)),
getWithIcon("Size", Icon.called("list").of(Family.SOLID))
);
tracks.forEach(track -> trackTable.addRow(track.getName(), track.getSize()));
analysisContainer.addTable("Tracks", trackTable);
}
return analysisContainer;
}
private String getGroupDisplayName(Group group) {
String displayName = group.getDisplayName();
return displayName != null ? displayName : group.getName();
}
}

View File

@ -1,45 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan.luckperms;
import com.djrapitops.plan.data.plugin.HookHandler;
import com.djrapitops.pluginbridge.plan.Hook;
import me.lucko.luckperms.LuckPerms;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
* Hook for LuckPerms plugin.
*
* @author Vankka
*/
@Singleton
public class LuckPermsHook extends Hook {
@Inject
public LuckPermsHook() {
super("me.lucko.luckperms.LuckPerms");
}
@Override
public void hook(HookHandler handler) throws IllegalStateException {
if (enabled) {
handler.addPluginDataSource(new LuckPermsData(LuckPerms.getApi()));
}
}
}

View File

@ -1,78 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan.placeholderapi;
import com.djrapitops.plan.PlanPlugin;
import com.djrapitops.plan.data.plugin.HookHandler;
import com.djrapitops.plan.system.database.DBSystem;
import com.djrapitops.plan.system.info.server.ServerInfo;
import com.djrapitops.plan.system.settings.config.PlanConfig;
import com.djrapitops.plan.system.webserver.WebServer;
import com.djrapitops.plan.utilities.formatting.Formatters;
import com.djrapitops.plugin.logging.error.ErrorHandler;
import com.djrapitops.pluginbridge.plan.Hook;
import me.clip.placeholderapi.PlaceholderAPI;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
* A Class responsible for hooking to PlaceholderAPI.
*
* @author Rsl1122
*/
@Singleton
public class PlaceholderAPIHook extends Hook {
private final PlanPlugin plugin;
private final PlanConfig config;
private final DBSystem dbSystem;
private final ServerInfo serverInfo;
private final WebServer webServer;
private final Formatters formatters;
private final ErrorHandler errorHandler;
@Inject
public PlaceholderAPIHook(
PlanPlugin plugin,
PlanConfig config,
DBSystem dbSystem,
ServerInfo serverInfo,
WebServer webServer,
Formatters formatters,
ErrorHandler errorHandler
) {
super("me.clip.placeholderapi.PlaceholderAPI");
this.plugin = plugin;
this.config = config;
this.dbSystem = dbSystem;
this.serverInfo = serverInfo;
this.webServer = webServer;
this.formatters = formatters;
this.errorHandler = errorHandler;
}
public void hook(HookHandler handler) throws NoClassDefFoundError {
if (enabled) {
PlaceholderAPI.unregisterPlaceholderHook("plan");
PlaceholderAPI.registerPlaceholderHook("plan",
new PlanPlaceholders(plugin, config, serverInfo, webServer, formatters, errorHandler)
);
}
}
}

View File

@ -1,228 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan.placeholderapi;
import com.djrapitops.plan.PlanPlugin;
import com.djrapitops.plan.api.PlanAPI;
import com.djrapitops.plan.api.data.PlayerContainer;
import com.djrapitops.plan.api.data.ServerContainer;
import com.djrapitops.plan.data.container.GeoInfo;
import com.djrapitops.plan.data.store.keys.PlayerKeys;
import com.djrapitops.plan.data.store.keys.ServerKeys;
import com.djrapitops.plan.data.store.mutators.GeoInfoMutator;
import com.djrapitops.plan.data.store.mutators.PlayersMutator;
import com.djrapitops.plan.data.store.mutators.SessionsMutator;
import com.djrapitops.plan.data.store.mutators.TPSMutator;
import com.djrapitops.plan.system.info.server.ServerInfo;
import com.djrapitops.plan.system.settings.config.PlanConfig;
import com.djrapitops.plan.system.settings.paths.DisplaySettings;
import com.djrapitops.plan.system.settings.paths.TimeSettings;
import com.djrapitops.plan.system.webserver.WebServer;
import com.djrapitops.plan.utilities.formatting.Formatters;
import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.logging.L;
import com.djrapitops.plugin.logging.error.ErrorHandler;
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
import org.bukkit.entity.Player;
import javax.inject.Singleton;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
/**
* Placeholders of Plan.
*
* @author Rsl1122
*/
@Singleton
public class PlanPlaceholders extends PlaceholderExpansion {
private final PlanPlugin plugin;
private final PlanConfig config;
private final ServerInfo serverInfo;
private final WebServer webServer;
private final Formatters formatters;
private final ErrorHandler errorHandler;
public PlanPlaceholders(
PlanPlugin plugin,
PlanConfig config,
ServerInfo serverInfo,
WebServer webServer,
Formatters formatters,
ErrorHandler errorHandler
) {
this.plugin = plugin;
this.config = config;
this.serverInfo = serverInfo;
this.webServer = webServer;
this.formatters = formatters;
this.errorHandler = errorHandler;
}
@Override
public String getIdentifier() {
return "plan";
}
@Override
public String getPlugin() {
return "Plan";
}
@Override
public String getAuthor() {
return "Rsl1122";
}
@Override
public String getVersion() {
return plugin.getVersion();
}
@Override
public String onPlaceholderRequest(Player player, String identifier) {
Serializable planValue = getPlanValue(identifier);
if (planValue != null) {
return planValue.toString();
}
Serializable serverValue = getServerValue(identifier);
if (serverValue != null) {
return serverValue.toString();
}
if (player != null) {
Serializable playerValue = getPlayerValue(player, identifier);
if (playerValue != null) {
return playerValue.toString();
}
}
return null;
}
private Serializable getPlanValue(String identifier) {
switch (identifier.toLowerCase()) {
case "address":
return webServer.getAccessAddress();
default:
return null;
}
}
private Serializable getServerValue(String identifier) {
ServerContainer serverContainer = PlanAPI.getInstance().fetchServerContainer(serverInfo.getServerUUID());
long now = System.currentTimeMillis();
long dayAgo = now - TimeUnit.DAYS.toMillis(1L);
long weekAgo = now - TimeAmount.WEEK.toMillis(1L);
long monthAgo = now - TimeAmount.MONTH.toMillis(1L);
try {
PlayersMutator playersMutator = new PlayersMutator(serverContainer.getValue(ServerKeys.PLAYERS).orElse(new ArrayList<>()));
switch (identifier.toLowerCase()) {
case "players_total":
return playersMutator.count();
case "players_new_day":
return playersMutator.filterRegisteredBetween(dayAgo, now).count();
case "players_new_week":
return playersMutator.filterRegisteredBetween(weekAgo, now).count();
case "players_new_month":
return playersMutator.filterRegisteredBetween(monthAgo, now).count();
case "players_unique_day":
return playersMutator.filterPlayedBetween(dayAgo, now).count();
case "players_unique_week":
return playersMutator.filterPlayedBetween(weekAgo, now).count();
case "players_unique_month":
return playersMutator.filterPlayedBetween(monthAgo, now).count();
case "playtime_total":
return formatters.timeAmount().apply(new SessionsMutator(playersMutator.getSessions()).toPlaytime());
case "session_avg":
return formatters.timeAmount().apply(new SessionsMutator(playersMutator.getSessions()).toAverageSessionLength());
case "session_count":
return playersMutator.getSessions().size();
case "kills_players":
return new SessionsMutator(playersMutator.getSessions()).toPlayerKillCount();
case "kills_mobs":
return new SessionsMutator(playersMutator.getSessions()).toMobKillCount();
case "deaths_total":
return new SessionsMutator(playersMutator.getSessions()).toDeathCount();
case "tps_day":
return new TPSMutator(serverContainer.getValue(ServerKeys.TPS).orElse(new ArrayList<>())).filterDataBetween(dayAgo, now).averageTPS();
case "tps_drops_week":
return new TPSMutator(serverContainer.getValue(ServerKeys.TPS).orElse(new ArrayList<>())).filterDataBetween(weekAgo, now)
.lowTpsSpikeCount(config.get(DisplaySettings.GRAPH_TPS_THRESHOLD_MED));
default:
break;
}
} catch (Exception e) {
errorHandler.log(L.WARN, this.getClass(), e);
}
return null;
}
private Serializable getPlayerValue(Player player, String identifier) {
UUID uuid = player.getUniqueId();
PlayerContainer playerContainer = PlanAPI.getInstance().fetchPlayerContainer(uuid);
long now = System.currentTimeMillis();
long dayAgo = now - TimeUnit.DAYS.toMillis(1L);
long weekAgo = now - TimeAmount.WEEK.toMillis(1L);
long monthAgo = now - TimeAmount.MONTH.toMillis(1L);
try {
SessionsMutator sessionsMutator = new SessionsMutator(playerContainer.getValue(PlayerKeys.SESSIONS).orElse(new ArrayList<>()));
switch (identifier.toLowerCase()) {
case "playtime":
return formatters.timeAmount().apply(sessionsMutator.toPlaytime());
case "playtime_day":
return formatters.timeAmount().apply(sessionsMutator.filterSessionsBetween(dayAgo, now).toPlaytime());
case "playtime_week":
return formatters.timeAmount().apply(sessionsMutator.filterSessionsBetween(weekAgo, now).toPlaytime());
case "playtime_month":
return formatters.timeAmount().apply(sessionsMutator.filterSessionsBetween(monthAgo, now).toPlaytime());
case "geolocation":
return new GeoInfoMutator(playerContainer.getValue(PlayerKeys.GEO_INFO).orElse(new ArrayList<>())).mostRecent().map(GeoInfo::getGeolocation).orElse("Unknown");
case "activity_index":
double activityIndex = playerContainer.getActivityIndex(
now,
config.get(TimeSettings.ACTIVE_PLAY_THRESHOLD),
config.get(TimeSettings.ACTIVE_LOGIN_THRESHOLD)
);
return activityIndex;
case "registered":
return formatters.yearLong().apply(playerContainer.getValue(PlayerKeys.REGISTERED).orElse(0L));
case "last_seen":
return formatters.yearLong().apply(playerContainer.getValue(PlayerKeys.LAST_SEEN).orElse(0L));
case "player_kills":
return sessionsMutator.toPlayerKillCount();
case "mob_kills":
return sessionsMutator.toMobKillCount();
case "deaths":
return sessionsMutator.toDeathCount();
default:
break;
}
} catch (Exception e) {
errorHandler.log(L.WARN, this.getClass(), e);
}
return null;
}
}

View File

@ -1,131 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan.react;
import com.djrapitops.plan.api.exceptions.database.DBInitException;
import com.djrapitops.plan.db.access.ExecStatement;
import com.djrapitops.plan.db.access.Executable;
import com.djrapitops.plan.db.access.Query;
import com.djrapitops.plan.db.access.QueryAllStatement;
import com.djrapitops.plan.db.sql.parsing.Select;
import com.djrapitops.plugin.api.TimeAmount;
import com.volmit.react.api.SampledType;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;
/**
* Database Table in charge of storing data from React.
*
* @author Rsl1122
*/
public class ReactDataTable {
private static final String TABLE_NAME = "plan_react_data";
public void createTable() throws DBInitException {
// createTable(TableSqlParser.createTable(TABLE_NAME)
// .primaryKey(supportsMySQLQueries, Col.ID)
// .column(Col.DATE, Sql.LONG)
// .column(Col.SAMPLED_TYPE, Sql.varchar(30))
// .column(Col.MINUTE_AVERAGE, Sql.DOUBLE)
// .primaryKeyIDColumn(supportsMySQLQueries, Col.ID)
// .toString());
}
public Executable clean() {
String sql = "DELETE FROM " + TABLE_NAME + " WHERE " + Col.DATE + "<?";
return new ExecStatement(sql) {
@Override
public void prepare(PreparedStatement statement) throws SQLException {
statement.setLong(1, System.currentTimeMillis() - TimeAmount.MONTH.toMillis(1L));
}
};
}
public Executable addData(ReactValue value) {
String sql = "INSERT INTO " + TABLE_NAME + " (" +
Col.SAMPLED_TYPE + ", " +
Col.DATE + ", " +
Col.MINUTE_AVERAGE +
") VALUES (?, ?, ?)";
return new ExecStatement(sql) {
@Override
public void prepare(PreparedStatement statement) throws SQLException {
statement.setString(1, value.getType().name());
statement.setLong(2, value.getDate());
statement.setDouble(3, value.getDataValue());
}
};
}
public Query<Map<SampledType, List<ReactValue>>> getAllData() {
String sql = Select.all(TABLE_NAME).toString();
return new QueryAllStatement<Map<SampledType, List<ReactValue>>>(sql, 50000) {
@Override
public Map<SampledType, List<ReactValue>> processResults(ResultSet set) throws SQLException {
Map<SampledType, List<ReactValue>> results = new EnumMap<>(SampledType.class);
while (set.next()) {
try {
SampledType type = SampledType.valueOf(set.getString(Col.SAMPLED_TYPE.get()));
long date = set.getLong(Col.DATE.get());
double average = set.getDouble(Col.MINUTE_AVERAGE.get());
ReactValue value = new ReactValue(type, date, average);
List<ReactValue> values = results.getOrDefault(type, new ArrayList<>());
values.add(value);
results.put(type, values);
} catch (NoSuchFieldError ignore) {
/* Ignored, field has been removed and is no longer supported */
}
}
return results;
}
};
}
public enum Col {
ID("id"),
SAMPLED_TYPE("sampled_type"),
DATE("date"),
MINUTE_AVERAGE("minute_average");
private final String columnName;
Col(String columnName) {
this.columnName = columnName;
}
public String get() {
return columnName;
}
@Override
public String toString() {
return columnName;
}
}
}

View File

@ -1,101 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan.react;
import com.djrapitops.plan.system.processing.Processing;
import com.djrapitops.plugin.task.AbsRunnable;
import com.volmit.react.React;
import com.volmit.react.api.GraphSampleLine;
import com.volmit.react.api.SampledType;
import com.volmit.react.util.M;
import primal.lang.collection.GMap;
import java.util.ArrayList;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* Task in charge of collecting data from React.
*
* @author Rsl1122
*/
class ReactDataTask extends AbsRunnable {
private static final SampledType[] STORED_TYPES = new SampledType[]{
SampledType.ENT,
SampledType.ENTLIV,
SampledType.ENTDROP,
SampledType.ENTTILE,
SampledType.TIU,
SampledType.HOPPER_TICK_USAGE,
SampledType.FLUID_TICK_USAGE,
SampledType.REDSTONE_TICK_USAGE,
SampledType.TICK,
SampledType.TILE_DROPTICK,
SampledType.FLUID_TICK,
SampledType.HOPPER_TICK,
SampledType.ENTITY_DROPTICK,
SampledType.REDSTONE_TICK,
SampledType.REACT_TASK_TIME
};
private final ReactDataTable table;
private final Processing processing;
private final Map<SampledType, List<ReactValue>> history;
public ReactDataTask(ReactDataTable table, Processing processing) {
this.table = table;
this.processing = processing;
history = new EnumMap<>(SampledType.class);
}
@Override
public void run() {
try {
GMap<SampledType, GraphSampleLine> samplers = React.instance.graphController.getG();
for (SampledType type : STORED_TYPES) {
processType(samplers, type);
}
} catch (Exception e) {
cancel();
}
}
private void processType(GMap<SampledType, GraphSampleLine> samplers, SampledType type) {
GMap<Long, Double> values = samplers.get(type).getPlotBoard().getBetween(M.ms() - 10000, M.ms());
if (values.isEmpty()) {
return;
}
List<ReactValue> storedValues = history.getOrDefault(type, new ArrayList<>());
values.entrySet().stream()
.map(entry -> new ReactValue(type, entry.getKey(), entry.getValue()))
.sorted()
.forEachOrdered(storedValues::add);
if (storedValues.get(0).getDate() < System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(1L)) {
processing.submitNonCritical(new ValueStoringProcessor(table, type, storedValues));
history.remove(type);
} else {
history.put(type, storedValues);
}
}
}

View File

@ -1,82 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan.react;
import com.djrapitops.plan.data.plugin.HookHandler;
import com.djrapitops.plan.system.database.DBSystem;
import com.djrapitops.plan.system.processing.Processing;
import com.djrapitops.plugin.task.PluginTask;
import com.djrapitops.plugin.task.RunnableFactory;
import com.djrapitops.pluginbridge.plan.Hook;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
* Hook in charge for hooking into React.
*
* @author Rsl1122
*/
@Singleton
public class ReactHook extends Hook {
private static PluginTask TASK;
private final Processing processing;
private final DBSystem dbSystem;
private final RunnableFactory runnableFactory;
@Inject
public ReactHook(
Processing processing,
DBSystem dbSystem,
RunnableFactory runnableFactory
) {
super("com.volmit.react.ReactPlugin");
this.processing = processing;
this.dbSystem = dbSystem;
this.runnableFactory = runnableFactory;
}
private static void setTask(PluginTask task) {
if (TASK != null) {
try {
TASK.cancel();
} catch (Exception ignored) {
/* Possible "Task not registered" exception is ignored. */
}
}
ReactHook.TASK = task;
}
@Override
public void hook(HookHandler handler) throws NoClassDefFoundError {
if (enabled) {
// ReactDataTable table = new ReactDataTable((SQLDB) dbSystem.getDatabase());
//// try {
//// table.createTable();
//// } catch (DBInitException e) {
//// throw new DBOpException("Failed to create React data table", e);
//// }
//// table.clean();
// PluginTask task = runnableFactory.create("React Data Task", new ReactDataTask(table, processing))
// .runTaskTimerAsynchronously(TimeAmount.toTicks(10L, TimeUnit.SECONDS), TimeAmount.toTicks(10L, TimeUnit.SECONDS));
// setTask(task);
}
}
}

View File

@ -1,54 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan.react;
import com.volmit.react.api.SampledType;
/**
* Data container for React data points.
*
* @author Rsl1122
*/
public class ReactValue implements Comparable<ReactValue> {
private final SampledType type;
private final long date;
private final double dataValue;
public ReactValue(SampledType type, long date, double dataValue) {
this.type = type;
this.date = date;
this.dataValue = dataValue;
}
public SampledType getType() {
return type;
}
public long getDate() {
return date;
}
public double getDataValue() {
return dataValue;
}
@Override
public int compareTo(ReactValue o) {
return Long.compare(this.date, o.date);
}
}

View File

@ -1,61 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan.react;
import com.volmit.react.api.SampledType;
import java.util.List;
/**
* Processor in charge of turning values into single numbers.
*
* @author Rsl1122
*/
class ValueStoringProcessor implements Runnable {
private final ReactDataTable table;
private final SampledType type;
private final List<ReactValue> values;
ValueStoringProcessor(ReactDataTable table, SampledType type, List<ReactValue> values) {
this.table = table;
this.type = type;
this.values = values;
}
@Override
public void run() {
ReactValue average = avgValue(values);
if (average == null) {
return;
}
table.addData(average);
}
private ReactValue avgValue(List<ReactValue> values) {
if (values.isEmpty()) {
return null;
}
long date = values.get(0).getDate();
double average = values.stream().mapToDouble(ReactValue::getDataValue).average().orElse(0.0);
return new ReactValue(type, date, average);
}
}

View File

@ -1,60 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan.towny;
import com.palmergames.bukkit.towny.object.Town;
import java.util.Comparator;
/**
* This class is used to compare towns in terms of Amount of residents.
*
* Compare method should only be used if TownyHook.isEnabled() returns true.
*
* Note: this comparator imposes orderings that are inconsistent with equals.
*
* @author Rsl1122
* @see TownyHook
*/
public class TownComparator implements Comparator<Town> {
/**
* Used to compare two Town objects.
*
* This method should only be used if TownyHook.isEnabled() returns true.
*
* Note: this comparator imposes orderings that are inconsistent with
* equals.
* @param tow1 Town 1
* @param tow2 Town 2
*/
@Override
public int compare(Town tow1, Town tow2) {
if (tow1.equals(tow2)) {
return 0;
}
int tow1res = tow1.getNumResidents();
int tow2res = tow2.getNumResidents();
if (tow1res == tow2res) {
return 0;
} else if (tow1res > tow2res) {
return 1;
}
return -1;
}
}

View File

@ -1,115 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan.towny;
import com.djrapitops.plan.data.store.keys.PlayerKeys;
import com.djrapitops.plan.data.store.mutators.PlayersMutator;
import com.djrapitops.plan.data.store.mutators.SessionsMutator;
import com.djrapitops.plan.utilities.html.HtmlStructure;
import com.djrapitops.plan.utilities.html.icon.Color;
import com.djrapitops.plan.utilities.html.icon.Icon;
import com.djrapitops.plan.utilities.html.icon.Icons;
import com.djrapitops.plan.utilities.html.structure.Accordion;
import com.djrapitops.plan.utilities.html.structure.AccordionElement;
import com.djrapitops.plan.utilities.html.structure.AccordionElementContentBuilder;
import com.palmergames.bukkit.towny.exceptions.TownyException;
import com.palmergames.bukkit.towny.object.Coord;
import com.palmergames.bukkit.towny.object.Resident;
import com.palmergames.bukkit.towny.object.Town;
import com.palmergames.bukkit.towny.object.TownBlock;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Utility for creating Towny Accordion Html.
*
* @author Rsl1122
*/
class TownsAccordion extends Accordion {
private final List<Town> towns;
private final PlayersMutator playersMutator;
TownsAccordion(List<Town> towns, PlayersMutator playersMutator) {
super("towny_accordion");
this.towns = towns;
this.playersMutator = playersMutator;
addElements();
}
private void addElements() {
for (Town town : towns) {
String townName = town.getName();
Resident mayor = town.getMayor();
String mayorName = mayor != null ? mayor.getName() : "NPC";
String coordinates = "";
try {
Coord homeBlock = town.getHomeBlock().getCoord();
coordinates = "x: " + homeBlock.getX() + " z: " + homeBlock.getZ();
} catch (TownyException ignore) {
/* Town has no home block */
}
List<Resident> residents = town.getResidents();
int residentCount = residents.size();
long claimedBlocks = town.getTownBlocks().stream().filter(TownBlock::hasTown).count();
String landCount = claimedBlocks + " / " + town.getTotalBlocks();
Set<String> members = new HashSet<>();
for (Resident resident : residents) {
members.add(resident.getName());
}
PlayersMutator memberMutator = this.playersMutator.filterBy(
player -> player.getValue(PlayerKeys.NAME)
.map(members::contains).orElse(false)
);
SessionsMutator memberSessionsMutator = new SessionsMutator(memberMutator.getSessions());
long playerKills = memberSessionsMutator.toPlayerKillCount();
long mobKills = memberSessionsMutator.toMobKillCount();
long deaths = memberSessionsMutator.toDeathCount();
String separated = HtmlStructure.separateWithDots(("Residents: " + residentCount), mayorName);
String htmlID = "town_" + townName.replace(" ", "-");
String leftSide = new AccordionElementContentBuilder()
.addRowBold(Icon.called("user").of(Color.BROWN), "Major", mayorName)
.addRowBold(Icon.called("users").of(Color.BROWN), "Residents", residentCount)
.addRowBold(Icon.called("map").of(Color.BROWN), "Town Blocks", landCount)
.addRowBold(Icon.called("map-pin").of(Color.RED), "Location", coordinates)
.toHtml();
String rightSide = new AccordionElementContentBuilder()
.addRowBold(Icons.PLAYER_KILLS, "Player Kills", playerKills)
.addRowBold(Icons.MOB_KILLS, "Mob Kills", mobKills)
.addRowBold(Icons.DEATHS, "Deaths", deaths)
.toHtml();
addElement(new AccordionElement(htmlID, townName + "<span class=\"pull-right\">" + separated + "</span>")
.setColor("brown")
.setLeftSide(leftSide)
.setRightSide(rightSide));
}
}
}

View File

@ -1,134 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan.towny;
import com.djrapitops.plan.api.PlanAPI;
import com.djrapitops.plan.data.element.AnalysisContainer;
import com.djrapitops.plan.data.element.InspectContainer;
import com.djrapitops.plan.data.plugin.ContainerSize;
import com.djrapitops.plan.data.plugin.PluginData;
import com.djrapitops.plan.data.store.keys.AnalysisKeys;
import com.djrapitops.plan.data.store.mutators.PlayersMutator;
import com.djrapitops.plan.system.settings.config.PlanConfig;
import com.djrapitops.plan.system.settings.paths.PluginDataSettings;
import com.djrapitops.plan.utilities.html.Html;
import com.djrapitops.plan.utilities.html.icon.Color;
import com.djrapitops.plan.utilities.html.icon.Icon;
import com.djrapitops.plugin.utilities.Verify;
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.Resident;
import com.palmergames.bukkit.towny.object.Town;
import com.palmergames.bukkit.towny.object.TownyUniverse;
import java.util.*;
import java.util.stream.Collectors;
/**
* PluginData for Towny plugin.
*
* @author Rsl1122
*/
class TownyData extends PluginData {
private final PlanConfig config;
TownyData(PlanConfig config) {
super(ContainerSize.TAB, "Towny");
this.config = config;
setPluginIcon(Icon.called("university").of(Color.BROWN).build());
}
@Override
public InspectContainer getPlayerData(UUID uuid, InspectContainer inspectContainer) {
String playerName = PlanAPI.getInstance().getPlayerName(uuid);
try {
Resident resident = TownyUniverse.getDataSource().getResident(playerName);
if (resident.hasTown()) {
Town town = resident.getTown();
String townName = town.getName();
String mayorName = town.getMayor().getName();
String townMayor = Html.LINK.parse(PlanAPI.getInstance().getPlayerInspectPageLink(mayorName), mayorName);
inspectContainer.addValue(getWithIcon("Town", Icon.called("university").of(Color.BROWN)), townName);
inspectContainer.addValue(getWithIcon("Town Mayor", Icon.called("user").of(Color.BROWN)), townMayor);
try {
Coord homeBlock = town.getHomeBlock().getCoord();
String coordinates = "x: " + homeBlock.getX() + " z: " + homeBlock.getZ();
inspectContainer.addValue(getWithIcon("Town Coordinates", Icon.called("map-pin").of(Color.RED)), coordinates);
} catch (TownyException ignore) {
/* Town has no home block */
}
int residents = town.getResidents().size();
inspectContainer.addValue(getWithIcon("Town Residents", Icon.called("users").of(Color.BROWN)), residents);
return inspectContainer;
}
} catch (NotRegisteredException ignore) {
/* No Towny Resident. */
}
inspectContainer.addValue(getWithIcon("Town", Icon.called("bank").of(Color.BROWN)), "No Town");
return inspectContainer;
}
@Override
public AnalysisContainer getServerData(Collection<UUID> collection, AnalysisContainer analysisContainer) {
List<Town> towns = getTopTowns();
analysisContainer.addValue(getWithIcon("Number of Towns", Icon.called("university").of(Color.BROWN)), towns.size());
if (!towns.isEmpty()) {
Map<UUID, String> userTowns = new HashMap<>();
for (Town town : towns) {
String townName = town.getName();
String mayor = town.getMayor().getName();
PlanAPI planAPI = PlanAPI.getInstance();
UUID mayorUUID = planAPI.playerNameToUUID(mayor);
town.getResidents().stream()
.map(Resident::getName)
.map(planAPI::playerNameToUUID)
.filter(Verify::notNull)
.forEach(uuid -> userTowns.put(uuid, uuid.equals(mayorUUID) ? "<b>" + townName + "</b>" : townName));
}
analysisContainer.addPlayerTableValues(getWithIcon("Town", Icon.called("university")), userTowns);
TownsAccordion townsAccordion = new TownsAccordion(
towns,
Optional.ofNullable(analysisData).flatMap(c -> c.getValue(AnalysisKeys.PLAYERS_MUTATOR))
.orElse(new PlayersMutator(new ArrayList<>()))
);
analysisContainer.addHtml("townAccordion", townsAccordion.toHtml());
}
return analysisContainer;
}
private List<Town> getTopTowns() {
List<Town> topTowns = TownyUniverse.getDataSource().getTowns();
topTowns.sort(new TownComparator());
List<String> hide = config.get(PluginDataSettings.HIDE_TOWNS);
return topTowns.stream()
.filter(town -> !hide.contains(town.getName()))
.collect(Collectors.toList());
}
}

View File

@ -1,50 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.pluginbridge.plan.towny;
import com.djrapitops.plan.data.plugin.HookHandler;
import com.djrapitops.plan.system.settings.config.PlanConfig;
import com.djrapitops.pluginbridge.plan.Hook;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
* A Class responsible for hooking to Towny and registering 2 data sources.
*
* @author Rsl1122
*/
@Singleton
public class TownyHook extends Hook {
private final PlanConfig config;
@Inject
public TownyHook(
PlanConfig config
) {
super("com.palmergames.bukkit.towny.Towny");
this.config = config;
}
public void hook(HookHandler handler) throws NoClassDefFoundError {
if (enabled) {
handler.addPluginDataSource(new TownyData(config));
}
}
}

View File

@ -1,19 +0,0 @@
package com.djrapitops.pluginbridge.plan.buycraft;
import com.djrapitops.plan.api.exceptions.connection.ForbiddenException;
import org.junit.Test;
import java.io.IOException;
/**
* Test for ListPaymentRequest.
*
* @author Rsl1122
*/
public class ListPaymentRequestTest {
@Test
public void testSuccess() throws IOException, ForbiddenException {
new ListPaymentRequest("166473e780b59e84d6a19f1975c9282bfcc7a2a7").makeRequest();
}
}