use of mc.dragons.tools.moderation.report.ReportLoader.Report in project DragonsOnline by UniverseCraft.
the class ModUserHook method onVerifiedJoin.
@Override
public void onVerifiedJoin(User user) {
WrappedUser wrapped = WrappedUser.of(user);
Player player = user.getPlayer();
Set<User> alts = IPAnalysisUtil.scanAlts(Dragons.getInstance().getPersistentStorageManager(), user).stream().filter(u -> WrappedUser.of(u).getActivePunishmentData(PunishmentType.BAN) != null).collect(Collectors.toSet());
if (alts.size() > 0) {
alertHandler.sendSuspiciousJoinMessage(ChatColor.GRAY + "[" + ChatColor.RED + "Join" + ChatColor.GRAY + "] User " + user.getName() + " shares an IP address with " + alts.size() + " currently banned user" + (alts.size() > 1 ? "s" : ""));
}
PaginatedResult<Report> watchlist = reportLoader.getReportsByTypeStatusAndTarget(ReportType.WATCHLIST, List.of(ReportStatus.OPEN, ReportStatus.SUSPENDED), user, 1);
if (watchlist.getTotal() > 0) {
watchlist.getPage().get(0).setStatus(ReportStatus.OPEN);
alertHandler.sendSuspiciousJoinMessage(ChatColor.GRAY + "[" + ChatColor.RED + "Join" + ChatColor.GRAY + "] User " + user.getName() + " is currently on the watchlist (Report #" + watchlist.getPage().get(0).getId() + ")");
}
if (wrapped.reportWasHandled()) {
player.sendMessage(ChatColor.GOLD + "" + ChatColor.ITALIC + "Your recent report was handled and closed. Thank you!");
wrapped.setReportHandled(false);
}
PaginatedResult<Report> waiting = reportLoader.getAuthorizedUnreviewedReports(1, user.getActivePermissionLevel(), user.getUUID());
if (waiting.getTotal() > 0) {
player.sendMessage(ChatColor.LIGHT_PURPLE + "There are " + waiting.getTotal() + " reports in your moderation queue! To get started, do " + ChatColor.DARK_PURPLE + "/modqueue");
}
int i = 0;
for (PunishmentData punishment : wrapped.getPunishmentHistory()) {
if (punishment.getType() == PunishmentType.WARNING && !punishment.isWarningAcknowledged()) {
String reason = punishment.getReason();
player.sendMessage(" ");
player.sendMessage(PunishCommand.RECEIVE_PREFIX + ChatColor.BOLD + "You received a warning since the last time you were online.");
if (!reason.equals(" ")) {
player.sendMessage(PunishCommand.RECEIVE_PREFIX + "Reason: " + reason);
}
player.sendMessage(PunishCommand.RECEIVE_PREFIX + ChatColor.GRAY + "Repeated warnings may result in a mute or ban.");
player.spigot().sendMessage(StringUtil.clickableHoverableText(PunishCommand.RECEIVE_PREFIX + ChatColor.RESET + "[Click here to acknowledge warning]", "/acknowledgewarning " + i, "Click to acknowledge this warning"));
player.sendMessage("");
}
i++;
}
}
use of mc.dragons.tools.moderation.report.ReportLoader.Report in project DragonsOnline by UniverseCraft.
the class PeriodicNotificationTask method run.
@Override
public void run() {
for (User user : UserLoader.allUsers()) {
if (!PermissionUtil.verifyActiveProfileFlag(user, SystemProfileFlag.HELPER, false))
continue;
List<HoldEntry> holds = holdLoader.getActiveHoldsByFiler(user).stream().filter(h -> {
Report report = reportLoader.getReportById(h.getReportId());
return report.getType() == ReportType.HOLD && (!report.getData().containsKey("permissionReq") || // escalations don't notify because someone else needs to review them.
PermissionUtil.verifyActivePermissionLevel(user, PermissionLevel.valueOf(report.getData().getString("permissionReq")), false));
}).collect(Collectors.toList());
List<TextComponent> components = new ArrayList<>();
components.add(StringUtil.plainText(ChatColor.GOLD + "" + ChatColor.BOLD + "! " + ChatColor.YELLOW + "You have placed " + ChatColor.GOLD + holds.size() + ChatColor.YELLOW + " hold(s) that still need reviewing: "));
holds.stream().map(h -> StringUtil.clickableHoverableText(ChatColor.GRAY + "" + h.getId() + "." + h.getReportId() + " ", "/viewreport " + h.getReportId(), "Click to view the report for hold " + h.getId() + "-" + h.getReportId())).forEach(c -> components.add(c));
if (holds.size() > 0) {
user.getPlayer().spigot().sendMessage(components.toArray(new BaseComponent[] {}));
}
}
}
use of mc.dragons.tools.moderation.report.ReportLoader.Report in project DragonsOnline by UniverseCraft.
the class PunishCommand method onCommand.
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (!requirePlayer(sender) || !requirePermission(sender, SystemProfileFlag.HELPER))
return true;
if (args.length == 0) {
sender.sendMessage(ChatColor.RED + "Specify a player and code! /punish <player1 [player2 ...]> <code> [extra info]");
return true;
}
CmdData data = CmdUtil.parse(sender, "/punish <players> <code> ", args);
if (data == null)
return true;
int level = data.code.getStandingLevel();
boolean canApply = data.code.canApply(user(sender));
boolean notMod = !hasPermission(sender, SystemProfileFlag.MODERATION);
List<WrappedUser> wrapped = data.targets.stream().map(u -> WrappedUser.of(u)).collect(Collectors.toList());
int minEffectiveLevel = -1;
for (WrappedUser w : wrapped) {
w.updateStandingLevels();
if (canApply) {
// Punish immediately
PunishmentType type = w.autoPunish(data.code, data.extraInfo, user(sender)).type;
String punishment = "Punished";
if (type == PunishmentType.BAN) {
punishment = "Banned";
} else if (type == PunishmentType.MUTE) {
punishment = "Muted";
} else if (type == PunishmentType.KICK) {
punishment = "Kicked";
} else if (type == PunishmentType.WARNING) {
punishment = "Warned";
}
sender.sendMessage(ChatColor.GREEN + "Punishment applied to " + w.getUser().getName() + ": " + punishment + " for " + data.code.getName());
}
if (level >= 10 && notMod) {
Report review = reportLoader.fileStaffReport(data.targets, user(sender), "Post Review: " + data.formatInternalReason(), "");
sender.sendMessage(ChatColor.GRAY + " A senior staff member will review this punishment. (Escalation Report ID: " + review.getId() + ")");
}
}
if (!canApply) {
// Generate escalation report
Report r = reportLoader.fileStaffReport(data.targets, user(sender), data.formatInternalReason(), "punish " + StringUtil.parseList(data.targets.stream().map(u -> u.getUUID().toString()).collect(Collectors.toList()), " ") + " " + data.code.getCode() + (data.extraInfo.isBlank() ? "" : " " + data.extraInfo) + " -uuid");
boolean held = false;
if (r != null && minEffectiveLevel > 1) {
held = true;
HoldEntry hold = holdLoader.newHold(data.targets, user(sender), data.formatInternalReason(), r, true, data.code.getType() == StandingLevelType.BAN ? HoldType.SUSPEND : HoldType.MUTE);
r.getData().append("holdId", hold.getId());
r.save();
}
sender.sendMessage(ChatColor.GREEN + (held ? "Placed a " + HoldLoader.HOLD_DURATION_HOURS + "-hour hold and escalated" : "Escalated") + " this issue for review by a senior staff member.");
}
return true;
}
use of mc.dragons.tools.moderation.report.ReportLoader.Report in project DragonsOnline by UniverseCraft.
the class ReportLoader method fileReport.
private Report fileReport(Document data) {
Document fullData = new Document(data);
fullData.append("_id", reserveNextId()).append("filedOn", Instant.now().getEpochSecond()).append("skippedBy", new ArrayList<>()).append("status", ReportStatus.OPEN.toString()).append("notes", new ArrayList<>());
Report report = new Report(fullData);
reportPool.put(report.getId(), report);
collection.insertOne(report.toDocument());
return report;
}
use of mc.dragons.tools.moderation.report.ReportLoader.Report in project DragonsOnline by UniverseCraft.
the class ReportLoader method fileUserReport.
public Report fileUserReport(User target, User by, String reason) {
PaginatedResult<Report> existing = getRecentReportsByTypeReasonAndTarget(ReportType.REGULAR, reason, target, Instant.now().getEpochSecond(), -1, 1);
if (existing.getTotal() == 0) {
Document data = new Document().append("type", ReportType.REGULAR.toString()).append("target", List.of(target.getUUID().toString())).append("priority", by.isVerified() ? 3 : 2).append("filedBy", List.of(by.getUUID().toString())).append("data", new Document("reason", reason).append("states", getStateTokens(List.of(target))));
Report report = fileReport(data);
reportNotify(report.getId(), target.getName() + " was reported: " + reason + " (reported by " + by.getName() + ")");
return report;
} else {
Report report = existing.getPage().get(0);
if (!report.getFiledBy().contains(by)) {
report.addFiledBy(by);
report.setPriority(report.getPriority() + 1);
}
return report;
}
}
Aggregations