Added Jobs & McMMO support

This commit is contained in:
Rsl1122 2017-05-28 13:46:09 +03:00
parent 35c75daf9e
commit fe57e7b1fc
14 changed files with 380 additions and 5 deletions

View File

@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.djrapitops</groupId>
<artifactId>Plan</artifactId>
<version>3.2.0</version>
<version>3.2.1</version>
<packaging>jar</packaging>
<repositories>
<!-- <repository>
@ -47,12 +47,24 @@
<version>2.10.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.gamingmesh</groupId>
<artifactId>jobs</artifactId>
<version>3.9.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.massivecraft</groupId>
<artifactId>mcore</artifactId>
<version>2.10.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.gmail.nossr50</groupId>
<artifactId>mcmmo</artifactId>
<version>1.5.07</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.palmergames</groupId>
<artifactId>towny</artifactId>

View File

@ -11,6 +11,8 @@ import java.util.UUID;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.data.additional.factions.FactionsHook;
import main.java.com.djrapitops.plan.data.additional.jobs.JobsHook;
import main.java.com.djrapitops.plan.data.additional.mcmmo.McmmoHook;
import main.java.com.djrapitops.plan.data.additional.ontime.OnTimeHook;
import main.java.com.djrapitops.plan.data.additional.towny.TownyHook;
import main.java.com.djrapitops.plan.data.additional.vault.VaultHook;
@ -72,6 +74,14 @@ public class HookHandler {
FactionsHook factionsHook = new FactionsHook(this);
} catch (NoClassDefFoundError e) {
}
try {
McmmoHook mcMmoHook = new McmmoHook(this);
} catch (NoClassDefFoundError e) {
}
try {
JobsHook jobsHook = new JobsHook(this);
} catch (NoClassDefFoundError e) {
}
try {
OnTimeHook onTimeHook = new OnTimeHook(this);
} catch (NoClassDefFoundError e) {
@ -177,7 +187,14 @@ public class HookHandler {
if (source.analysisOnly()) {
continue;
}
addReplace.put(source.getPlaceholder(""), source.getHtmlReplaceValue("", uuid));
try {
addReplace.put(source.getPlaceholder(""), source.getHtmlReplaceValue("", uuid));
} catch (Exception e) {
addReplace.put(source.getPlaceholder(""), "Error occurred: " + e);
Log.error("PluginDataSource caused an exception: " + source.getSourcePlugin());
Log.toLog("PluginDataSource caused an exception: " + source.getSourcePlugin());
Log.toLog(this.getClass().getName(), e);
}
}
return addReplace;
}

View File

@ -0,0 +1,90 @@
package main.java.com.djrapitops.plan.data.additional.jobs;
import com.gamingmesh.jobs.Jobs;
import com.gamingmesh.jobs.PlayerManager;
import com.gamingmesh.jobs.container.Job;
import com.gamingmesh.jobs.container.JobProgression;
import java.io.Serializable;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.data.additional.AnalysisType;
import main.java.com.djrapitops.plan.data.additional.PluginData;
import main.java.com.djrapitops.plan.ui.Html;
import main.java.com.djrapitops.plan.utilities.FormatUtils;
import main.java.com.djrapitops.plan.utilities.MathUtils;
import static org.bukkit.Bukkit.getOfflinePlayers;
/**
* PluginData class for Jobs-plugin.
*
* Registered to the plugin by JobsHook
*
* @author Rsl1122
* @since 3.2.1
* @see JobsHook
*/
public class JobsAnalysisJobTable extends PluginData {
public JobsAnalysisJobTable() {
super("Jobs", "analysistable", AnalysisType.HTML);
final String job = Html.FONT_AWESOME_ICON.parse("suitcase") + " Job";
final String workers = Html.FONT_AWESOME_ICON.parse("users") + " Workers";
final String tLevel = Html.FONT_AWESOME_ICON.parse("plus") + " Total Level";
final String aLevel = Html.FONT_AWESOME_ICON.parse("plus") + " Avg Level";
super.setPrefix(Html.TABLE_START_4.parse(job, workers, aLevel, tLevel));
super.setSuffix(Html.TABLE_END.parse());
}
@Override
public String getHtmlReplaceValue(String modifierPrefix, UUID uuid) {
PlayerManager pm = Jobs.getPlayerManager();
List<List<JobProgression>> players = Arrays.stream(getOfflinePlayers())
.filter(p -> p != null)
.map(p -> pm.getPlayerInfo(p.getUniqueId()))
.filter(i -> i != null)
.map(i -> pm.getJobsPlayerOffline(i))
.map(p -> p.getJobProgression())
.filter(list -> !list.isEmpty())
.collect(Collectors.toList());
if (players.isEmpty()) {
return parseContainer("", Html.TABLELINE_4.parse("No Players with Jobs", "", "", ""));
}
Map<String, Integer> workers = new HashMap<>();
Map<String, Long> totals = new HashMap<>();
for (List<JobProgression> jobs : players) {
for (JobProgression job : jobs) {
String name = job.getJob().getName();
int level = job.getLevel();
if (!workers.containsKey(name)) {
workers.put(name, 0);
}
workers.put(name, workers.get(name) + 1);
if (!totals.containsKey(name)) {
totals.put(name, 0L);
}
totals.put(name, totals.get(name) + level);
}
}
StringBuilder html = new StringBuilder();
for (String job : workers.keySet()) {
Integer amountOfWorkers = workers.get(job);
Long totalLevel = totals.get(job);
html.append(Html.TABLELINE_4.parse(
job,
"" + amountOfWorkers,
FormatUtils.cutDecimals(MathUtils.average((int) (long) totalLevel, amountOfWorkers)),
"" + totalLevel)
);
}
return parseContainer("", html.toString());
}
@Override
public Serializable getValue(UUID uuid) {
return -1;
}
}

View File

@ -0,0 +1,31 @@
package main.java.com.djrapitops.plan.data.additional.jobs;
import main.java.com.djrapitops.plan.data.additional.Hook;
import main.java.com.djrapitops.plan.api.API;
import main.java.com.djrapitops.plan.data.additional.HookHandler;
import main.java.com.djrapitops.plan.data.additional.mcmmo.McmmoAnalysisSkillTable;
/**
* A Class responsible for hooking to Jobs and registering data sources.
*
* @author Rsl1122
* @since 3.2.1
*/
public class JobsHook extends Hook {
/**
* Hooks the plugin and registers it's PluginData objects.
*
* API#addPluginDataSource uses the same method from HookHandler.
*
* @param hookH HookHandler instance for registering the data sources.
* @see API
*/
public JobsHook(HookHandler hookH) {
super("com.gamingmesh.jobs.Jobs");
if (enabled) {
hookH.addPluginDataSource(new JobsInspectJobTable());
hookH.addPluginDataSource(new JobsAnalysisJobTable());
}
}
}

View File

@ -0,0 +1,54 @@
package main.java.com.djrapitops.plan.data.additional.jobs;
import com.gamingmesh.jobs.Jobs;
import com.gamingmesh.jobs.PlayerManager;
import com.gamingmesh.jobs.container.JobProgression;
import com.gamingmesh.jobs.container.JobsPlayer;
import com.gamingmesh.jobs.container.PlayerInfo;
import java.io.Serializable;
import java.util.List;
import java.util.UUID;
import main.java.com.djrapitops.plan.data.additional.PluginData;
import main.java.com.djrapitops.plan.ui.Html;
/**
* PluginData class for Jobs-plugin.
*
* Registered to the plugin by JobsHook
*
* @author Rsl1122
* @since 3.2.1
* @see JobsHook
*/
public class JobsInspectJobTable extends PluginData {
public JobsInspectJobTable() {
super("Jobs", "inspecttable");
super.setAnalysisOnly(false);
final String job = Html.FONT_AWESOME_ICON.parse("suitcase") + " Job";
final String level = Html.FONT_AWESOME_ICON.parse("plus") + " Level";
super.setPrefix(Html.TABLE_START_2.parse(job, level));
super.setSuffix(Html.TABLE_END.parse());
}
@Override
public String getHtmlReplaceValue(String modifierPrefix, UUID uuid) {
PlayerManager pm = Jobs.getPlayerManager();
PlayerInfo info = pm.getPlayerInfo(uuid);
JobsPlayer player = pm.getJobsPlayerOffline(info);
List<JobProgression> progression = player.getJobProgression();
if (progression.isEmpty()) {
return parseContainer("", Html.TABLELINE_2.parse("No Jobs.", ""));
}
StringBuilder html = new StringBuilder();
for (JobProgression job : progression) {
html.append(Html.TABLELINE_2.parse(job.getJob().getName(), "" + job.getLevel()));
}
return parseContainer("", html.toString());
}
@Override
public Serializable getValue(UUID uuid) {
return -1;
}
}

View File

@ -0,0 +1,68 @@
package main.java.com.djrapitops.plan.data.additional.mcmmo;
import com.gmail.nossr50.datatypes.player.PlayerProfile;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.util.player.UserManager;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.data.additional.AnalysisType;
import main.java.com.djrapitops.plan.data.additional.PluginData;
import main.java.com.djrapitops.plan.ui.Html;
import main.java.com.djrapitops.plan.utilities.FormatUtils;
import main.java.com.djrapitops.plan.utilities.MathUtils;
import org.apache.commons.lang.StringUtils;
import static org.bukkit.Bukkit.getOfflinePlayers;
/**
* PluginData class for McMMO-plugin.
*
* Registered to the plugin by McmmoHook
*
* @author Rsl1122
* @since 3.2.1
* @see McmmoHook
*/
public class McmmoAnalysisSkillTable extends PluginData {
public McmmoAnalysisSkillTable() {
super("McMMO", "analysistable", AnalysisType.HTML);
final String skill = Html.FONT_AWESOME_ICON.parse("star") + " Skill";
final String tLevel = Html.FONT_AWESOME_ICON.parse("plus") + " Total Level";
final String aLevel = Html.FONT_AWESOME_ICON.parse("plus") + " Average Level";
final String notice = "Only online players shown. " + Html.LINK_EXTERNAL.parse("https://github.com/mcMMO-Dev/mcMMO/blob/master/src/main/java/com/gmail/nossr50/util/player/UserManager.java#L105", "More info") + "<br>";
super.setPrefix(notice + Html.TABLE_START_3.parse(skill, tLevel, aLevel));
super.setSuffix(Html.TABLE_END.parse());
}
@Override
public String getHtmlReplaceValue(String modifierPrefix, UUID uuid) {
List<PlayerProfile> profiles = Arrays.stream(getOfflinePlayers())
.filter(p -> p != null)
.map(p -> UserManager.getOfflinePlayer(p))
.filter(u -> u != null)
.map(u -> u.getProfile())
.collect(Collectors.toList());
if (profiles.isEmpty()) {
return parseContainer("", Html.TABLELINE_3.parse("No players online", "", ""));
}
final List<SkillType> skills = new ArrayList<>();
skills.addAll(Arrays.stream(SkillType.values()).distinct().collect(Collectors.toList()));
final StringBuilder html = new StringBuilder();
for (SkillType skill : skills) {
long total = MathUtils.sumInt(profiles.stream().map(p -> (Serializable) p.getSkillLevel(skill)));
html.append(Html.TABLELINE_3.parse(StringUtils.capitalize(skill.getName().toLowerCase()), "" + total, FormatUtils.cutDecimals(MathUtils.average((int) total, profiles.size()))));
}
return parseContainer("", html.toString());
}
@Override
public Serializable getValue(UUID uuid) {
return -1;
}
}

View File

@ -0,0 +1,30 @@
package main.java.com.djrapitops.plan.data.additional.mcmmo;
import main.java.com.djrapitops.plan.data.additional.Hook;
import main.java.com.djrapitops.plan.api.API;
import main.java.com.djrapitops.plan.data.additional.HookHandler;
/**
* A Class responsible for hooking to MCMMO and registering data sources.
*
* @author Rsl1122
* @since 3.2.1
*/
public class McmmoHook extends Hook {
/**
* Hooks the plugin and registers it's PluginData objects.
*
* API#addPluginDataSource uses the same method from HookHandler.
*
* @param hookH HookHandler instance for registering the data sources.
* @see API
*/
public McmmoHook(HookHandler hookH) {
super("com.gmail.nossr50.mcMMO");
if (enabled) {
hookH.addPluginDataSource(new McmmoInspectSkillTable());
hookH.addPluginDataSource(new McmmoAnalysisSkillTable());
}
}
}

View File

@ -0,0 +1,64 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package main.java.com.djrapitops.plan.data.additional.mcmmo;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.player.PlayerProfile;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.util.player.UserManager;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.data.additional.PluginData;
import main.java.com.djrapitops.plan.ui.Html;
import org.apache.commons.lang.StringUtils;
import static org.bukkit.Bukkit.getOfflinePlayer;
/**
* PluginData class for McMMO-plugin.
*
* Registered to the plugin by McmmoHook
*
* @author Rsl1122
* @since 3.2.1
* @see McmmoHook
*/
public class McmmoInspectSkillTable extends PluginData {
public McmmoInspectSkillTable() {
super("McMMO", "inspectskilltable");
super.setAnalysisOnly(false);
final String skill = Html.FONT_AWESOME_ICON.parse("star") + " Skill";
final String level = Html.FONT_AWESOME_ICON.parse("plus") + " Level";
final String notice = "Only online players shown. " + Html.LINK_EXTERNAL.parse("https://github.com/mcMMO-Dev/mcMMO/blob/master/src/main/java/com/gmail/nossr50/util/player/UserManager.java#L105", "More info") + "<br>";
super.setPrefix(notice + Html.TABLE_START_2.parse(skill, level));
super.setSuffix(Html.TABLE_END.parse());
}
@Override
public String getHtmlReplaceValue(String modifierPrefix, UUID uuid) {
McMMOPlayer user = UserManager.getOfflinePlayer(getOfflinePlayer(uuid));
if (user == null) {
return parseContainer("", Html.TABLELINE_2.parse("User not known/online", ""));
}
final PlayerProfile skillProfile = user.getProfile();
final List<SkillType> skills = new ArrayList<>();
skills.addAll(Arrays.stream(SkillType.values()).distinct().collect(Collectors.toList()));
final StringBuilder html = new StringBuilder();
for (SkillType skill : skills) {
html.append(Html.TABLELINE_2.parse(StringUtils.capitalize(skill.getName().toLowerCase()), "" + skillProfile.getSkillLevel(skill)));
}
return parseContainer("", html.toString());
}
@Override
public Serializable getValue(UUID uuid) {
return -1;
}
}

View File

@ -39,6 +39,7 @@ public enum Html {
BUTTON("<a class=\"button\" href=\"" + REPLACE0 + "\">" + REPLACE1 + "</a>"),
BUTTON_CLASS("class=\"button\""),
LINK("<a class=\"link\" href=\"" + REPLACE0 + "\">" + REPLACE1 + "</a>"),
LINK_EXTERNAL("<a class=\"link\" target=\"_blank\" href=\"" + REPLACE0 + "\">" + REPLACE1 + "</a>"),
LINK_CLASS("class=\"link\""),
IMG("<img src=\"" + REPLACE0 + "\">"),
COLUMNS_DIV_WRAPPER("<div class=\"columns\">" + REPLACE0 + "</div>"),

View File

@ -122,7 +122,6 @@ public class PunchCardGraphCreator {
int[][] scaled = new int[7][24];
for (int i = 0; i < 7; i++) {
Log.debug("Scaling: " + Arrays.toString(dataArray[i]) + " | " + big);
for (int j = 0; j < 24; j++) {
int value = (int) ((dataArray[i][j] * 10.0) / big);
if (value != 0) {
@ -130,7 +129,6 @@ public class PunchCardGraphCreator {
}
scaled[i][j] = value;
}
Log.debug(" Scaled: " + Arrays.toString(scaled[i]));
}
return scaled;

View File

@ -262,6 +262,9 @@ header p {
.tab {
flex-direction: column;
}
.columns {
flex-direction: column;
}
.row {
width: 100%;
}

View File

@ -299,6 +299,9 @@ table.sortable th:not(.sorttable_sorted):not(.sorttable_sorted_reverse):not(.sor
.tab {
flex-direction: column;
}
.columns {
flex-direction: column;
}
.row {
width: 100%;
}

View File

@ -1,7 +1,7 @@
name: Plan
author: Rsl1122
main: main.java.com.djrapitops.plan.Plan
version: 3.2.0
version: 3.2.1
softdepend:
- OnTime
@ -10,6 +10,8 @@ softdepend:
- Vault
- Factions
- AdvancedAchievements
- McMMO
- Jobs
commands:
plan:

View File

@ -15,6 +15,7 @@ import org.bukkit.plugin.java.JavaPlugin;
import org.easymock.EasyMock;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
@ -168,6 +169,7 @@ public class MiscUtilsTest {
/**
*
*/
@Ignore("Inconsistant")
@Test
public void testGetMatchingDisplaynames() {
String search = "testname";