Search in sources :

Example 6 with Report

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++;
    }
}
Also used : Document(org.bson.Document) ReportLoader(mc.dragons.tools.moderation.report.ReportLoader) HoldType(mc.dragons.tools.moderation.hold.HoldLoader.HoldType) User(mc.dragons.core.gameobject.user.User) HashMap(java.util.HashMap) Player(org.bukkit.entity.Player) IPAnalysisUtil(mc.dragons.tools.moderation.analysis.IPAnalysisUtil) UserHook(mc.dragons.core.gameobject.user.UserHook) PaginatedResult(mc.dragons.core.storage.mongo.pagination.PaginatedResult) StaffAlertMessageHandler(mc.dragons.core.networking.StaffAlertMessageHandler) Report(mc.dragons.tools.moderation.report.ReportLoader.Report) ReportStatus(mc.dragons.tools.moderation.report.ReportLoader.ReportStatus) HoldLoader(mc.dragons.tools.moderation.hold.HoldLoader) Map(java.util.Map) PunishmentType(mc.dragons.tools.moderation.punishment.PunishmentType) StringUtil(mc.dragons.core.util.StringUtil) HoldEntry(mc.dragons.tools.moderation.hold.HoldLoader.HoldEntry) Set(java.util.Set) Rank(mc.dragons.core.gameobject.user.Rank) Instant(java.time.Instant) Collectors(java.util.stream.Collectors) StandingLevelType(mc.dragons.tools.moderation.punishment.StandingLevelType) Dragons(mc.dragons.core.Dragons) PunishCommand(mc.dragons.tools.moderation.punishment.command.PunishCommand) List(java.util.List) PunishmentData(mc.dragons.tools.moderation.punishment.PunishmentData) ChatColor(org.bukkit.ChatColor) ReportType(mc.dragons.tools.moderation.report.ReportLoader.ReportType) HoldStatus(mc.dragons.tools.moderation.hold.HoldLoader.HoldStatus) Player(org.bukkit.entity.Player) User(mc.dragons.core.gameobject.user.User) Report(mc.dragons.tools.moderation.report.ReportLoader.Report) PunishmentData(mc.dragons.tools.moderation.punishment.PunishmentData)

Example 7 with Report

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[] {}));
        }
    }
}
Also used : StringUtil(mc.dragons.core.util.StringUtil) ReportLoader(mc.dragons.tools.moderation.report.ReportLoader) UserLoader(mc.dragons.core.gameobject.user.UserLoader) PermissionUtil(mc.dragons.core.util.PermissionUtil) BukkitRunnable(org.bukkit.scheduler.BukkitRunnable) HoldEntry(mc.dragons.tools.moderation.hold.HoldLoader.HoldEntry) User(mc.dragons.core.gameobject.user.User) SystemProfileFlag(mc.dragons.core.gameobject.user.permission.SystemProfile.SystemProfileFlags.SystemProfileFlag) Collectors(java.util.stream.Collectors) Dragons(mc.dragons.core.Dragons) ArrayList(java.util.ArrayList) TextComponent(net.md_5.bungee.api.chat.TextComponent) List(java.util.List) Report(mc.dragons.tools.moderation.report.ReportLoader.Report) BaseComponent(net.md_5.bungee.api.chat.BaseComponent) PermissionLevel(mc.dragons.core.gameobject.user.permission.PermissionLevel) HoldLoader(mc.dragons.tools.moderation.hold.HoldLoader) ChatColor(org.bukkit.ChatColor) ReportType(mc.dragons.tools.moderation.report.ReportLoader.ReportType) TextComponent(net.md_5.bungee.api.chat.TextComponent) BaseComponent(net.md_5.bungee.api.chat.BaseComponent) User(mc.dragons.core.gameobject.user.User) HoldEntry(mc.dragons.tools.moderation.hold.HoldLoader.HoldEntry) Report(mc.dragons.tools.moderation.report.ReportLoader.Report) ArrayList(java.util.ArrayList)

Example 8 with Report

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;
}
Also used : WrappedUser(mc.dragons.tools.moderation.WrappedUser) PunishmentType(mc.dragons.tools.moderation.punishment.PunishmentType) StringUtil(mc.dragons.core.util.StringUtil) ReportLoader(mc.dragons.tools.moderation.report.ReportLoader) CommandSender(org.bukkit.command.CommandSender) HoldType(mc.dragons.tools.moderation.hold.HoldLoader.HoldType) HoldEntry(mc.dragons.tools.moderation.hold.HoldLoader.HoldEntry) SystemProfileFlag(mc.dragons.core.gameobject.user.permission.SystemProfile.SystemProfileFlags.SystemProfileFlag) Collectors(java.util.stream.Collectors) StandingLevelType(mc.dragons.tools.moderation.punishment.StandingLevelType) List(java.util.List) Report(mc.dragons.tools.moderation.report.ReportLoader.Report) DragonsCommandExecutor(mc.dragons.core.commands.DragonsCommandExecutor) CmdUtil(mc.dragons.tools.moderation.util.CmdUtil) HoldLoader(mc.dragons.tools.moderation.hold.HoldLoader) CmdData(mc.dragons.tools.moderation.util.CmdUtil.CmdData) ChatColor(org.bukkit.ChatColor) Command(org.bukkit.command.Command) HoldEntry(mc.dragons.tools.moderation.hold.HoldLoader.HoldEntry) Report(mc.dragons.tools.moderation.report.ReportLoader.Report) CmdData(mc.dragons.tools.moderation.util.CmdUtil.CmdData) WrappedUser(mc.dragons.tools.moderation.WrappedUser) PunishmentType(mc.dragons.tools.moderation.punishment.PunishmentType)

Example 9 with Report

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;
}
Also used : Report(mc.dragons.tools.moderation.report.ReportLoader.Report) Document(org.bson.Document)

Example 10 with 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;
    }
}
Also used : Report(mc.dragons.tools.moderation.report.ReportLoader.Report) Document(org.bson.Document)

Aggregations

Report (mc.dragons.tools.moderation.report.ReportLoader.Report)16 Document (org.bson.Document)11 User (mc.dragons.core.gameobject.user.User)9 List (java.util.List)7 StringUtil (mc.dragons.core.util.StringUtil)7 Collectors (java.util.stream.Collectors)6 ArrayList (java.util.ArrayList)5 Dragons (mc.dragons.core.Dragons)5 PermissionLevel (mc.dragons.core.gameobject.user.permission.PermissionLevel)5 PaginatedResult (mc.dragons.core.storage.mongo.pagination.PaginatedResult)5 HoldEntry (mc.dragons.tools.moderation.hold.HoldLoader.HoldEntry)5 ReportLoader (mc.dragons.tools.moderation.report.ReportLoader)5 Instant (java.time.Instant)4 Map (java.util.Map)4 UUID (java.util.UUID)4 UserLoader (mc.dragons.core.gameobject.user.UserLoader)4 SystemProfileFlag (mc.dragons.core.gameobject.user.permission.SystemProfile.SystemProfileFlags.SystemProfileFlag)4 WrappedUser (mc.dragons.tools.moderation.WrappedUser)4 PunishmentType (mc.dragons.tools.moderation.punishment.PunishmentType)4 ReportStatus (mc.dragons.tools.moderation.report.ReportLoader.ReportStatus)4