Replace ReportProfile by using statistics to track total reports and accepted, denied & abusive reports. 1 or more abusive reports results in being banned from the report system.
This commit is contained in:
parent
fc6e1fe003
commit
470ff67f86
@ -1,5 +1,6 @@
|
|||||||
package mineplex.core.report;
|
package mineplex.core.report;
|
||||||
|
|
||||||
|
import java.sql.SQLException;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -17,6 +18,8 @@ import mineplex.core.report.command.ReportHandlerNotification;
|
|||||||
import mineplex.core.report.command.ReportNotificationCallback;
|
import mineplex.core.report.command.ReportNotificationCallback;
|
||||||
import mineplex.core.report.command.ReportNotification;
|
import mineplex.core.report.command.ReportNotification;
|
||||||
import mineplex.core.report.task.ReportHandlerMessageTask;
|
import mineplex.core.report.task.ReportHandlerMessageTask;
|
||||||
|
import mineplex.core.stats.PlayerStats;
|
||||||
|
import mineplex.core.stats.StatsManager;
|
||||||
import mineplex.serverdata.Region;
|
import mineplex.serverdata.Region;
|
||||||
import mineplex.serverdata.Utility;
|
import mineplex.serverdata.Utility;
|
||||||
import mineplex.serverdata.commands.ServerCommandManager;
|
import mineplex.serverdata.commands.ServerCommandManager;
|
||||||
@ -41,28 +44,31 @@ public class ReportManager {
|
|||||||
|
|
||||||
private static final String NAME = "Report";
|
private static final String NAME = "Report";
|
||||||
|
|
||||||
|
// statistic constants
|
||||||
|
private static final String STAT_TOTAL_COUNT = "Global.TotalReportsCount";
|
||||||
|
private static final int ABUSE_BAN_THRESHOLD = 1;
|
||||||
|
|
||||||
private JavaPlugin _javaPlugin;
|
private JavaPlugin _javaPlugin;
|
||||||
private PreferencesManager _preferencesManager;
|
private PreferencesManager _preferencesManager;
|
||||||
|
private StatsManager _statsManager;
|
||||||
private String _serverName;
|
private String _serverName;
|
||||||
|
|
||||||
// Holds active/open reports in a synchronized database.
|
// Holds active/open reports in a synchronized database.
|
||||||
private DataRepository<Report> _reportRepository;
|
private DataRepository<Report> _reportRepository;
|
||||||
|
|
||||||
private DataRepository<ReportProfile> _reportProfiles;
|
|
||||||
|
|
||||||
// Stores/logs closed tickets, and various reporter/staff actions.
|
// Stores/logs closed tickets, and various reporter/staff actions.
|
||||||
private ReportRepository _reportSqlRepository;
|
private ReportRepository _reportSqlRepository;
|
||||||
|
|
||||||
// A mapping of PlayerName(String) to the ReportId(Integer) for all active reports on this server.
|
// A mapping of PlayerName(String) to the ReportId(Integer) for all active reports on this server.
|
||||||
private Map<String, Integer> _activeReports;
|
private Map<String, Integer> _activeReports;
|
||||||
|
|
||||||
public ReportManager(JavaPlugin javaPlugin, PreferencesManager preferencesManager, String serverName)
|
public ReportManager(JavaPlugin javaPlugin, PreferencesManager preferencesManager, StatsManager statsManager, String serverName)
|
||||||
{
|
{
|
||||||
_javaPlugin = javaPlugin;
|
_javaPlugin = javaPlugin;
|
||||||
_preferencesManager = preferencesManager;
|
_preferencesManager = preferencesManager;
|
||||||
|
_statsManager = statsManager;
|
||||||
_serverName = serverName;
|
_serverName = serverName;
|
||||||
_reportRepository = new RedisDataRepository<Report>(Region.ALL, Report.class, "reports");
|
_reportRepository = new RedisDataRepository<Report>(Region.ALL, Report.class, "reports");
|
||||||
_reportProfiles = new RedisDataRepository<ReportProfile>(Region.ALL, ReportProfile.class, "reportprofiles");
|
|
||||||
_activeReports = new HashMap<String, Integer>();
|
_activeReports = new HashMap<String, Integer>();
|
||||||
_reportSqlRepository = new ReportRepository(javaPlugin);
|
_reportSqlRepository = new ReportRepository(javaPlugin);
|
||||||
_reportSqlRepository.initialize();
|
_reportSqlRepository.initialize();
|
||||||
@ -89,10 +95,7 @@ public class ReportManager {
|
|||||||
// Update the reputation/profiles of all reporters on this closing report.
|
// Update the reputation/profiles of all reporters on this closing report.
|
||||||
for (String reporterName : report.getReporters())
|
for (String reporterName : report.getReporters())
|
||||||
{
|
{
|
||||||
CoreClient reporterAccount = getPlayerAccount(reporterName);
|
incrementStat(reporterName, result);
|
||||||
ReportProfile reportProfile = getReportProfile(String.valueOf(reporterAccount.getAccountId()));
|
|
||||||
reportProfile.onReportClose(result);
|
|
||||||
saveReportProfile(reportProfile);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (reportCloser != null)
|
if (reportCloser != null)
|
||||||
@ -133,13 +136,43 @@ public class ReportManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean canReport(Player player)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
PlayerStats playerStats = _statsManager.getOfflinePlayerStats(player.getName());
|
||||||
|
long abusiveReportsCount = playerStats.getStat(ReportResult.ABUSIVE.getStatName());
|
||||||
|
return abusiveReportsCount < ABUSE_BAN_THRESHOLD;
|
||||||
|
}
|
||||||
|
catch (SQLException e)
|
||||||
|
{
|
||||||
|
player.sendMessage(C.cRed + "Internal error.");
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void incrementTotalStat(String reporter)
|
||||||
|
{
|
||||||
|
int accountId = getAccountId(reporter);
|
||||||
|
_statsManager.incrementStat(accountId, STAT_TOTAL_COUNT, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void incrementStat(String reporter, ReportResult reportResult)
|
||||||
|
{
|
||||||
|
String statName = reportResult.getStatName();
|
||||||
|
|
||||||
|
if (statName != null)
|
||||||
|
{
|
||||||
|
int accountId = getAccountId(reporter);
|
||||||
|
_statsManager.incrementStat(accountId, statName, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public Report reportPlayer(Player reporter, Player reportedPlayer, ReportCategory category, String reason)
|
public Report reportPlayer(Player reporter, Player reportedPlayer, ReportCategory category, String reason)
|
||||||
{
|
{
|
||||||
int reporterId = getPlayerAccount(reporter).getAccountId();
|
if (canReport(reportedPlayer))
|
||||||
ReportProfile reportProfile = getReportProfile(String.valueOf(reporterId));
|
|
||||||
|
|
||||||
if (reportProfile.canReport())
|
|
||||||
{
|
{
|
||||||
|
int reporterId = getPlayerAccount(reporter).getAccountId();
|
||||||
Report report = getActiveReport(reportedPlayer.getName());
|
Report report = getActiveReport(reportedPlayer.getName());
|
||||||
|
|
||||||
if (report != null && report.getCategory() == category)
|
if (report != null && report.getCategory() == category)
|
||||||
@ -153,12 +186,13 @@ public class ReportManager {
|
|||||||
_activeReports.put(reportedPlayer.getName().toLowerCase(), report.getReportId());
|
_activeReports.put(reportedPlayer.getName().toLowerCase(), report.getReportId());
|
||||||
}
|
}
|
||||||
|
|
||||||
int reportId = report.getReportId();
|
incrementTotalStat(reporter.getName());
|
||||||
saveReport(report);
|
saveReport(report);
|
||||||
|
|
||||||
// only start notifying staff when
|
// only start notifying staff when
|
||||||
if (report.getReporters().size() >= category.getNotifyThreshold())
|
if (report.getReporters().size() >= category.getNotifyThreshold())
|
||||||
{
|
{
|
||||||
|
int reportId = report.getReportId();
|
||||||
String prefix = getReportPrefix(reportId);
|
String prefix = getReportPrefix(reportId);
|
||||||
|
|
||||||
// Report #2 > iKeirNez - Flying around in arcade game (Hacking)
|
// Report #2 > iKeirNez - Flying around in arcade game (Hacking)
|
||||||
@ -175,7 +209,7 @@ public class ReportManager {
|
|||||||
if (report.getHandler() == null)
|
if (report.getHandler() == null)
|
||||||
{
|
{
|
||||||
// this needs to be 'equals' otherwise we get errors when attempting to send this (due to incomplete JSON)
|
// this needs to be 'equals' otherwise we get errors when attempting to send this (due to incomplete JSON)
|
||||||
message = message.extra("\n" + F.main(getReportPrefix(reportId), "Click to handle this ticket."))
|
message = message.extra("\n" + F.main(prefix, "Click to handle this ticket."))
|
||||||
.click(ClickEvent.RUN_COMMAND, "/reporthandle " + reportId);
|
.click(ClickEvent.RUN_COMMAND, "/reporthandle " + reportId);
|
||||||
|
|
||||||
sendStaffNotification(message);
|
sendStaffNotification(message);
|
||||||
@ -211,24 +245,6 @@ public class ReportManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ReportProfile getReportProfile(String playerName)
|
|
||||||
{
|
|
||||||
ReportProfile profile = _reportProfiles.getElement(playerName);
|
|
||||||
|
|
||||||
if (profile == null)
|
|
||||||
{
|
|
||||||
profile = new ReportProfile(playerName, getAccountId(playerName));
|
|
||||||
saveReportProfile(profile);
|
|
||||||
}
|
|
||||||
|
|
||||||
return profile;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void saveReportProfile(ReportProfile profile)
|
|
||||||
{
|
|
||||||
_reportProfiles.addElement(profile);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return a uniquely generated report id.
|
* @return a uniquely generated report id.
|
||||||
*/
|
*/
|
||||||
|
@ -1,69 +0,0 @@
|
|||||||
package mineplex.core.report;
|
|
||||||
|
|
||||||
import mineplex.serverdata.data.Data;
|
|
||||||
|
|
||||||
public class ReportProfile implements Data
|
|
||||||
{
|
|
||||||
|
|
||||||
private String _playerName;
|
|
||||||
private int _playerId;
|
|
||||||
|
|
||||||
private int _totalReports;
|
|
||||||
public int getTotalReports() { return _totalReports; }
|
|
||||||
|
|
||||||
private int _acceptedReports;
|
|
||||||
public int getAcceptedReports() { return _acceptedReports; }
|
|
||||||
|
|
||||||
private int _deniedReports;
|
|
||||||
public int getDeniedReports() { return _deniedReports; }
|
|
||||||
|
|
||||||
private int _abuseReports;
|
|
||||||
public int getAbuseReports() { return _abuseReports; }
|
|
||||||
|
|
||||||
private boolean _banned;
|
|
||||||
|
|
||||||
public ReportProfile(String playerName, int playerId)
|
|
||||||
{
|
|
||||||
_playerName = playerName;
|
|
||||||
_playerId = playerId;
|
|
||||||
_totalReports = 0;
|
|
||||||
_acceptedReports = 0;
|
|
||||||
_deniedReports = 0;
|
|
||||||
_abuseReports = 0;
|
|
||||||
_banned = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDataId()
|
|
||||||
{
|
|
||||||
return String.valueOf(_playerId);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean canReport()
|
|
||||||
{
|
|
||||||
return !_banned;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when a report made by this player is closed.
|
|
||||||
* @param result - the result of the closed report.
|
|
||||||
*/
|
|
||||||
public void onReportClose(ReportResult result)
|
|
||||||
{
|
|
||||||
_totalReports++;
|
|
||||||
|
|
||||||
switch (result)
|
|
||||||
{
|
|
||||||
default: break;
|
|
||||||
case ACCEPTED:
|
|
||||||
_acceptedReports++;
|
|
||||||
break;
|
|
||||||
case DENIED:
|
|
||||||
_deniedReports++;
|
|
||||||
break;
|
|
||||||
case ABUSIVE:
|
|
||||||
_abuseReports++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -4,23 +4,30 @@ import org.bukkit.ChatColor;
|
|||||||
|
|
||||||
public enum ReportResult
|
public enum ReportResult
|
||||||
{
|
{
|
||||||
ACCEPTED(ChatColor.GREEN, "Accept Report (Punish Player)", "Accepted (Player Received Punishment)"),
|
ACCEPTED("Global.AcceptedReportsCount", ChatColor.GREEN, "Accept Report (Punish Player)", "Accepted (Player Received Punishment)"),
|
||||||
DENIED(ChatColor.YELLOW, "Deny Report", "Denied"),
|
DENIED("Global.DeniedReportsCount", ChatColor.YELLOW, "Deny Report", "Denied"),
|
||||||
ABUSIVE(ChatColor.RED, "Mark Abusive Report", "Abusive Report");
|
ABUSIVE("Global.AbusiveReportsCount", ChatColor.RED, "Mark Abusive Report", "Abusive Report");
|
||||||
|
|
||||||
private ChatColor _color;
|
private final String _statName;
|
||||||
private String _actionMessage;
|
private final ChatColor _color;
|
||||||
private String _resultMessage;
|
private final String _actionMessage;
|
||||||
private String[] _lore;
|
private final String _resultMessage;
|
||||||
|
private final String[] _lore;
|
||||||
|
|
||||||
ReportResult(ChatColor color, String actionMessage, String resultMessage, String... lore)
|
ReportResult(String statName, ChatColor color, String actionMessage, String resultMessage, String... lore)
|
||||||
{
|
{
|
||||||
|
_statName = statName;
|
||||||
_color = color;
|
_color = color;
|
||||||
_actionMessage = actionMessage;
|
_actionMessage = actionMessage;
|
||||||
_resultMessage = resultMessage;
|
_resultMessage = resultMessage;
|
||||||
_lore = lore;
|
_lore = lore;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getStatName()
|
||||||
|
{
|
||||||
|
return _statName;
|
||||||
|
}
|
||||||
|
|
||||||
public ChatColor getColor()
|
public ChatColor getColor()
|
||||||
{
|
{
|
||||||
return _color;
|
return _color;
|
||||||
|
Loading…
Reference in New Issue
Block a user