package com.eu.habbo.habbohotel.modtool; import com.eu.habbo.Emulator; import com.eu.habbo.habbohotel.gameclients.GameClient; import com.eu.habbo.habbohotel.permissions.Permission; import com.eu.habbo.habbohotel.rooms.Room; import com.eu.habbo.habbohotel.rooms.RoomState; import com.eu.habbo.habbohotel.users.Habbo; import com.eu.habbo.habbohotel.users.HabboInfo; import com.eu.habbo.habbohotel.users.HabboManager; import com.eu.habbo.messages.ClientMessage; import com.eu.habbo.messages.outgoing.modtool.ModToolIssueHandledComposer; import com.eu.habbo.messages.outgoing.modtool.ModToolIssueInfoComposer; import com.eu.habbo.messages.outgoing.modtool.ModToolUserInfoComposer; import com.eu.habbo.plugin.events.support.*; import com.eu.habbo.threading.runnables.InsertModToolIssue; import gnu.trove.TCollections; import gnu.trove.map.TIntObjectMap; import gnu.trove.map.hash.THashMap; import gnu.trove.map.hash.TIntObjectHashMap; import gnu.trove.procedure.TObjectProcedure; import gnu.trove.set.hash.THashSet; import io.netty.channel.Channel; import java.net.InetSocketAddress; import java.sql.*; import java.util.ArrayList; import java.util.List; import java.util.Map; public class ModToolManager { private final TIntObjectMap category; private final THashMap> presets; private final THashMap tickets; private final TIntObjectMap cfhCategories; public ModToolManager() { long millis = System.currentTimeMillis(); this.category = TCollections.synchronizedMap(new TIntObjectHashMap<>()); this.presets = new THashMap<>(); this.tickets = new THashMap<>(); this.cfhCategories = new TIntObjectHashMap<>(); this.loadModTool(); Emulator.getLogging().logStart("ModTool Manager -> Loaded! (" + (System.currentTimeMillis() - millis) + " MS)"); } public synchronized void loadModTool() { this.category.clear(); this.presets.clear(); this.cfhCategories.clear(); this.presets.put("user", new THashSet<>()); this.presets.put("room", new THashSet<>()); try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) { this.loadCategory(connection); this.loadPresets(connection); this.loadTickets(connection); this.loadCfhCategories(connection); } catch (SQLException e) { Emulator.getLogging().logSQLException(e); } } private void loadCategory(Connection connection) { try (Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM support_issue_categories")) { while(set.next()) { this.category.put(set.getInt("id"), new ModToolCategory(set.getString("name"))); try (PreparedStatement settings = connection.prepareStatement("SELECT * FROM support_issue_presets WHERE category = ?")) { settings.setInt(1, set.getInt("id")); try (ResultSet presets = settings.executeQuery()) { while (presets.next()) { this.category.get(set.getInt("id")).addPreset(new ModToolPreset(presets)); } } } } } catch (SQLException e) { Emulator.getLogging().logSQLException(e); } } private void loadPresets(Connection connection) { synchronized (this.presets) { try (Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM support_presets")) { while (set.next()) { this.presets.get(set.getString("type")).add(set.getString("preset")); } } catch (SQLException e) { Emulator.getLogging().logSQLException(e); } } } private void loadTickets(Connection connection) { synchronized (this.tickets) { try (Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT S.username as sender_username, R.username AS reported_username, M.username as mod_username, support_tickets.* FROM support_tickets INNER JOIN users as S ON S.id = sender_id INNER JOIN users AS R ON R.id = reported_id INNER JOIN users AS M ON M.id = mod_id WHERE state != 0")) { while(set.next()) { this.tickets.put(set.getInt("id"), new ModToolIssue(set)); } } catch (SQLException e) { Emulator.getLogging().logSQLException(e); } } } private void loadCfhCategories(Connection connection) { try (Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT " + "support_cfh_topics.id, " + "support_cfh_topics.category_id, " + "support_cfh_topics.name_internal, " + "support_cfh_topics.action, " + "support_cfh_topics.auto_reply," + "support_cfh_topics.ignore_target, " + "support_cfh_categories.name_internal AS category_name_internal, " + "support_cfh_categories.id AS support_cfh_category_id, " + "support_cfh_topics.default_sanction AS default_sanction " + "FROM support_cfh_topics " + "LEFT JOIN support_cfh_categories ON support_cfh_categories.id = support_cfh_topics.category_id")) { while(set.next()) { if (!this.cfhCategories.containsKey(set.getInt("support_cfh_category_id"))) { this.cfhCategories.put(set.getInt("support_cfh_category_id"), new CfhCategory(set.getInt("id"), set.getString("category_name_internal"))); } this.cfhCategories.get(set.getInt("support_cfh_category_id")).addTopic(new CfhTopic(set, this.getIssuePreset(set.getInt("default_sanction")))); } } catch (SQLException e) { Emulator.getLogging().logSQLException(e); } } public CfhTopic getCfhTopic(int topicId) { for(CfhCategory category : this.getCfhCategories().valueCollection()) { for(CfhTopic topic : category.getTopics().valueCollection()) { if(topic.id == topicId) { return topic; } } } return null; } public ModToolPreset getIssuePreset(int id) { if (id == 0) return null; final ModToolPreset[] preset = {null}; this.category.forEachValue(new TObjectProcedure() { @Override public boolean execute(ModToolCategory object) { preset[0] = object.getPresets().get(id); return preset[0] == null; } }); return preset[0]; } public void quickTicket(Habbo reported, String reason, String message) { ModToolIssue issue = new ModToolIssue(0, reason, reported.getHabboInfo().getId(), reported.getHabboInfo().getUsername(), 0, message, ModToolTicketType.AUTOMATIC); if (Emulator.getPluginManager().fireEvent(new SupportTicketEvent(null, issue)).isCancelled()) return; Emulator.getGameEnvironment().getModToolManager().addTicket(issue); Emulator.getGameEnvironment().getModToolManager().updateTicketToMods(issue); } public static void requestUserInfo(GameClient client, ClientMessage packet) { int userId = packet.readInt(); if(userId <= 0) return; try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT users.*, users_settings.*, permissions.rank_name, permissions.id as rank_id FROM users INNER JOIN users_settings ON users.id = users_settings.user_id INNER JOIN permissions ON permissions.id = users.rank WHERE users.id = ? LIMIT 1")) { statement.setInt(1, userId); try (ResultSet set = statement.executeQuery()) { while (set.next()) { client.sendResponse(new ModToolUserInfoComposer(set)); } } } catch (SQLException e) { Emulator.getLogging().logSQLException(e); } catch (Exception e) { Emulator.getLogging().logErrorLine(e); } } public ArrayList getRoomChatlog(int roomId) { ArrayList chatlogs = new ArrayList<>(); try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT users.username, users.id, chatlogs_room.* FROM chatlogs_room INNER JOIN users ON users.id = chatlogs_room.user_from_id WHERE room_id = ? ORDER BY timestamp DESC LIMIT 150")) { statement.setInt(1, roomId); try (ResultSet set = statement.executeQuery()) { while (set.next()) { chatlogs.add(new ModToolChatLog(set.getInt("timestamp"), set.getInt("id"), set.getString("username"), set.getString("message"))); } } } catch (SQLException e) { Emulator.getLogging().logSQLException(e); } return chatlogs; } public ArrayList getUserChatlog(int userId) { ArrayList chatlogs = new ArrayList<>(); try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT users.username, users.id, chatlogs_room.* FROM chatlogs_room INNER JOIN users ON users.id = chatlogs_room.user_from_id WHERE user_from_id = ? ORDER BY timestamp DESC LIMIT 150")) { statement.setInt(1, userId); try (ResultSet set = statement.executeQuery()) { while (set.next()) { chatlogs.add(new ModToolChatLog(set.getInt("timestamp"), set.getInt("id"), set.getString("username"), set.getString("message"))); } } } catch (SQLException e) { Emulator.getLogging().logSQLException(e); } return chatlogs; } public ArrayList getMessengerChatlog(int userOneId, int userTwoId) { ArrayList chatLogs = new ArrayList<>(); try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT users.username, chatlogs_private.* FROM chatlogs_private INNER JOIN users ON users.id = user_from_id WHERE (user_from_id = ? AND user_to_id = ?) OR (user_from_id = ? AND user_to_id = ?) ORDER BY timestamp DESC LIMIT 50")) { statement.setInt(1, userOneId); statement.setInt(2, userTwoId); statement.setInt(3, userTwoId); statement.setInt(4, userOneId); try (ResultSet set = statement.executeQuery()) { while (set.next()) { chatLogs.add(new ModToolChatLog(set.getInt("timestamp"), set.getInt("chatlogs_private.user_from_id"), set.getString("users.username"), set.getString("message"))); } } } catch (SQLException e) { Emulator.getLogging().logSQLException(e); } return chatLogs; } public ArrayList getUserRoomVisitsAndChatlogs(int userId) { ArrayList chatlogs = new ArrayList<>(); try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT rooms.name, users.username, room_enter_log.timestamp AS enter_timestamp, room_enter_log.exit_timestamp, chatlogs_room.* FROM room_enter_log INNER JOIN rooms ON room_enter_log.room_id = rooms.id INNER JOIN users ON room_enter_log.user_id = users.id LEFT JOIN chatlogs_room ON room_enter_log.user_id = chatlogs_room.user_from_id AND room_enter_log.room_id = chatlogs_room.room_id AND chatlogs_room.timestamp >= room_enter_log.timestamp AND chatlogs_room.timestamp < room_enter_log.exit_timestamp WHERE chatlogs_room.user_from_id = ? ORDER BY room_enter_log.timestamp DESC LIMIT 500")) { statement.setInt(1, userId); try (ResultSet set = statement.executeQuery()) { int userid = 0; String username = "unknown"; while (set.next()) { ModToolRoomVisit visit = null; for (ModToolRoomVisit v : chatlogs) { if (v.timestamp == set.getInt("enter_timestamp") && v.exitTimestamp == set.getInt("exit_timestamp")) { visit = v; } } if (visit == null) { visit = new ModToolRoomVisit(set.getInt("room_id"), set.getString("name"), set.getInt("enter_timestamp"), set.getInt("exit_timestamp")); chatlogs.add(visit); } visit.chat.add(new ModToolChatLog(set.getInt("timestamp"), set.getInt("user_from_id"), set.getString("username"), set.getString("message"))); if (userid == 0) userid = set.getInt("user_from_id"); if (username.equals("unknown")) username = set.getString("username"); } } } catch (SQLException e) { Emulator.getLogging().logSQLException(e); } return chatlogs; } public THashSet requestUserRoomVisits(Habbo habbo) { THashSet roomVisits = new THashSet<>(); try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT rooms.name, room_enter_log.* FROM room_enter_log INNER JOIN rooms ON rooms.id = room_enter_log.room_id WHERE user_id = ? AND timestamp >= ? ORDER BY timestamp DESC LIMIT 50")) { statement.setInt(1, habbo.getHabboInfo().getId()); statement.setInt(2, Emulator.getIntUnixTimestamp() - 84600); try (ResultSet set = statement.executeQuery()) { while (set.next()) { roomVisits.add(new ModToolRoomVisit(set)); } } } catch (SQLException e) { Emulator.getLogging().logSQLException(e); } return roomVisits; } public THashSet getVisitsForRoom(Room room, int amount, boolean groupUser, int fromTimestamp, int toTimestamp) { return this.getVisitsForRoom(room, amount, groupUser, fromTimestamp, toTimestamp, ""); } public THashSet getVisitsForRoom(Room room, int amount, boolean groupUser, int fromTimestamp, int toTimestamp, String excludeUsername) { THashSet roomVisits = new THashSet<>(); try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM (" + "SELECT " + "users.username as name, " + "room_enter_log.* " + "FROM" + "`room_enter_log` " + "INNER JOIN " + "users " + "ON " + "users.id = room_enter_log.user_id " + "WHERE " + "room_enter_log.room_id = ? " + (fromTimestamp > 0 ? "AND timestamp >= ? " : "") + (toTimestamp > 0 ? "AND exit_timestamp <= ? " : "") + "AND users.username != ? " + "ORDER BY " + "timestamp " + "DESC LIMIT ?) x " + (groupUser ? "GROUP BY user_id" : "") + ";")) { statement.setInt(1, room.getId()); if(fromTimestamp > 0) statement.setInt(2, fromTimestamp); if(toTimestamp > 0) statement.setInt((fromTimestamp > 0 ? 3 : 2), toTimestamp); statement.setString((toTimestamp > 0 ? fromTimestamp > 0 ? 4 : 3 : 2), excludeUsername); int columnAmount = 3; if(fromTimestamp > 0) columnAmount++; if(toTimestamp > 0) columnAmount++; statement.setInt(columnAmount, amount); try (ResultSet set = statement.executeQuery()) { while (set.next()) { roomVisits.add(new ModToolRoomVisit(set)); } } } catch (SQLException e) { Emulator.getLogging().logSQLException(e); } return roomVisits; } public ModToolBan createOfflineUserBan(int userId, int staffId, int duration, String reason, ModToolBanType type) { try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO bans (user_id, ip, machine_id, user_staff_id, ban_expire, ban_reason, type) VALUES (?, (SELECT ip_current FROM users WHERE id = ?), (SELECT machine_id FROM users WHERE id = ?), ?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS)) { statement.setInt(1, userId); statement.setInt(2, userId); statement.setInt(3, userId); statement.setInt(4, staffId); statement.setInt(5, Emulator.getIntUnixTimestamp() + duration); statement.setString(6, reason); statement.setString(7, type.getType()); try (ResultSet set = statement.executeQuery()) { if (set.next()) { try (PreparedStatement selectBanStatement = connection.prepareStatement("SELECT * FROM bans WHERE id = ? LIMIT 1")) { selectBanStatement.setInt(1, set.getInt(1)); try (ResultSet selectSet = selectBanStatement.executeQuery()) { if (selectSet.next()) { return new ModToolBan(selectSet); } } } } } } catch (SQLException e) { Emulator.getLogging().logSQLException(e); } return null; } public void alert(Habbo moderator, Habbo target, String message) { alert(moderator, target, message, SupportUserAlertedReason.ALERT); } public void alert(Habbo moderator, Habbo target, String message, SupportUserAlertedReason reason) { if(!moderator.hasPermission(Permission.ACC_SUPPORTTOOL)) { ScripterManager.scripterDetected(moderator.getClient(), Emulator.getTexts().getValue("scripter.warning.modtools.alert").replace("%username%", moderator.getHabboInfo().getUsername()).replace("%message%", message)); return; } SupportUserAlertedEvent alertedEvent = new SupportUserAlertedEvent(moderator, target, message, reason); if (Emulator.getPluginManager().fireEvent(alertedEvent).isCancelled()) return; if(target != null) alertedEvent.target.getClient().sendResponse(new ModToolIssueHandledComposer(alertedEvent.message)); } public void kick(Habbo moderator, Habbo target, String message) { if (moderator.hasPermission(Permission.ACC_SUPPORTTOOL) && !target.hasPermission(Permission.ACC_UNKICKABLE)) { if (target.getHabboInfo().getCurrentRoom() != null) { Emulator.getGameEnvironment().getRoomManager().leaveRoom(target, target.getHabboInfo().getCurrentRoom()); } this.alert(moderator, target, message, SupportUserAlertedReason.KICKED); } } public List ban(int targetUserId, Habbo moderator, String reason, int duration, ModToolBanType type, int cfhTopic) { if (moderator == null) return null; List bans = new ArrayList<>(); Habbo target = Emulator.getGameEnvironment().getHabboManager().getHabbo(targetUserId); HabboInfo offlineInfo = target != null ? target.getHabboInfo() : HabboManager.getOfflineHabboInfo(targetUserId); if (moderator.getHabboInfo().getRank().getId() < offlineInfo.getRank().getId()) { return bans; } ModToolBan ban = new ModToolBan(targetUserId, offlineInfo != null ? offlineInfo.getIpLogin() : "offline", offlineInfo != null ? offlineInfo.getMachineID() : "offline", moderator.getHabboInfo().getId(), Emulator.getIntUnixTimestamp() + duration, reason, type, cfhTopic); Emulator.getPluginManager().fireEvent(new SupportUserBannedEvent(moderator, target, ban)); Emulator.getThreading().run(ban); bans.add(ban); if (target != null) { Emulator.getGameServer().getGameClientManager().disposeClient(target.getClient()); } if ((type == ModToolBanType.IP || type == ModToolBanType.SUPER) && target != null && !ban.ip.equals("offline")) { for (Habbo h : Emulator.getGameServer().getGameClientManager().getHabbosWithIP(ban.ip)) { if (h.getHabboInfo().getRank().getId() >= moderator.getHabboInfo().getRank().getId()) continue; ban = new ModToolBan(h.getHabboInfo().getId(), h != null ? h.getHabboInfo().getIpLogin() : "offline", h != null ? h.getClient().getMachineId() : "offline", moderator.getHabboInfo().getId(), Emulator.getIntUnixTimestamp() + duration, reason, type, cfhTopic); Emulator.getPluginManager().fireEvent(new SupportUserBannedEvent(moderator, h, ban)); Emulator.getThreading().run(ban); bans.add(ban); Emulator.getGameServer().getGameClientManager().disposeClient(h.getClient()); } } if ((type == ModToolBanType.MACHINE || type == ModToolBanType.SUPER) && target != null && !ban.machineId.equals("offline")) { for (Habbo h : Emulator.getGameServer().getGameClientManager().getHabbosWithMachineId(ban.machineId)) { if (h.getHabboInfo().getRank().getId() >= moderator.getHabboInfo().getRank().getId()) continue; ban = new ModToolBan(h.getHabboInfo().getId(), h != null ? h.getHabboInfo().getIpLogin() : "offline", h != null ? h.getClient().getMachineId() : "offline", moderator.getHabboInfo().getId(), Emulator.getIntUnixTimestamp() + duration, reason, type, cfhTopic); Emulator.getPluginManager().fireEvent(new SupportUserBannedEvent(moderator, h, ban)); Emulator.getThreading().run(ban); bans.add(ban); Emulator.getGameServer().getGameClientManager().disposeClient(h.getClient()); } } return bans; } public void roomAction(Room room, Habbo moderator, boolean kickUsers, boolean lockDoor, boolean changeTitle) { SupportRoomActionEvent roomActionEvent = new SupportRoomActionEvent(moderator, room, kickUsers, lockDoor, changeTitle); Emulator.getPluginManager().fireEvent(roomActionEvent); if (roomActionEvent.changeTitle) { room.setName(Emulator.getTexts().getValue("hotel.room.inappropriate.title")); room.setNeedsUpdate(true); } if (roomActionEvent.lockDoor) { room.setState(RoomState.LOCKED); room.setNeedsUpdate(true); } if (roomActionEvent.kickUsers) { for (Habbo habbo : room.getHabbos()) { if (!(habbo.hasPermission(Permission.ACC_UNKICKABLE) || habbo.hasPermission(Permission.ACC_SUPPORTTOOL) || room.isOwner(habbo))) { room.kickHabbo(habbo, false); } } } } public ModToolBan checkForBan(int userId) { ModToolBan ban = null; try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM bans WHERE user_id = ? AND ban_expire >= ? AND (type = 'account' OR type = 'super') ORDER BY timestamp LIMIT 1")) { statement.setInt(1, userId); statement.setInt(2, Emulator.getIntUnixTimestamp()); try (ResultSet set = statement.executeQuery()) { if (set.next()) { ban = new ModToolBan(set); } } } catch (SQLException e) { Emulator.getLogging().logSQLException(e); } return ban; } public boolean hasIPBan(Channel habbo) { if (habbo == null) return false; if (habbo.remoteAddress() == null || ((InetSocketAddress)habbo.remoteAddress()).getAddress() == null) return false; boolean banned = false; try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM bans WHERE ip = ? AND (type = 'ip' OR type = 'super') AND ban_expire > ? LIMIT 1")) { statement.setString(1, ((InetSocketAddress) habbo.remoteAddress()).getAddress().getHostAddress()); statement.setInt(2, Emulator.getIntUnixTimestamp()); try (ResultSet set = statement.executeQuery()) { if (set.next()) { banned = true; } } } catch (SQLException e) { Emulator.getLogging().logSQLException(e); } return banned; } public boolean hasMACBan(GameClient habbo) { if (habbo == null) return false; if (habbo.getMachineId().isEmpty()) { return false; } try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM bans WHERE machine_id = ? AND (type = 'machine' OR type = 'super') AND ban_expire > ? LIMIT 1")) { statement.setString(1, habbo.getMachineId()); statement.setInt(2, Emulator.getIntUnixTimestamp()); try (ResultSet set = statement.executeQuery()) { if (set.next()) { return true; } } } catch (SQLException e) { Emulator.getLogging().logSQLException(e); } return false; } public boolean unban(String username) { try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE bans INNER JOIN users ON bans.user_id = users.id SET ban_expire = ?, ban_reason = CONCAT('" + Emulator.getTexts().getValue("unbanned") + ": ', ban_reason) WHERE users.username LIKE ? AND ban_expire > ?")) { statement.setInt(1, Emulator.getIntUnixTimestamp()); statement.setString(2, username); statement.setInt(3, Emulator.getIntUnixTimestamp()); statement.execute(); return statement.getUpdateCount() > 0; } catch (SQLException e) { Emulator.getLogging().logSQLException(e); } return false; } public void pickTicket(ModToolIssue issue, Habbo habbo) { issue.modId = habbo.getHabboInfo().getId(); issue.modName = habbo.getHabboInfo().getUsername(); issue.state = ModToolTicketState.PICKED; this.updateTicketToMods(issue); issue.updateInDatabase(); } public void updateTicketToMods(ModToolIssue issue) { SupportTicketStatusChangedEvent event = new SupportTicketStatusChangedEvent(null, issue); if (!Emulator.getPluginManager().fireEvent(event).isCancelled()) { Emulator.getGameEnvironment().getHabboManager().sendPacketToHabbosWithPermission(new ModToolIssueInfoComposer(issue).compose(), Permission.ACC_SUPPORTTOOL); } } public void addTicket(ModToolIssue issue) { if (Emulator.getPluginManager().fireEvent(new SupportTicketEvent(null, issue)).isCancelled()) return; if (issue.id == 0) { new InsertModToolIssue(issue).run(); } synchronized (this.tickets) { this.tickets.put(issue.id, issue); } } public void removeTicket(ModToolIssue issue) { this.removeTicket(issue.id); } public void removeTicket(int issueId) { synchronized (this.tickets) { this.tickets.remove(issueId); } } public void closeTicketAsUseless(ModToolIssue issue, Habbo sender) { issue.state = ModToolTicketState.CLOSED; issue.updateInDatabase(); if(sender != null) { sender.getClient().sendResponse(new ModToolIssueHandledComposer(ModToolIssueHandledComposer.USELESS)); } this.updateTicketToMods(issue); this.removeTicket(issue); } public void closeTicketAsAbusive(ModToolIssue issue, Habbo sender) { issue.state = ModToolTicketState.CLOSED; issue.updateInDatabase(); if(sender != null) { sender.getClient().sendResponse(new ModToolIssueHandledComposer(ModToolIssueHandledComposer.ABUSIVE)); } this.updateTicketToMods(issue); this.removeTicket(issue); } public void closeTicketAsHandled(ModToolIssue issue, Habbo sender) { issue.state = ModToolTicketState.CLOSED; issue.updateInDatabase(); if(sender != null) { sender.getClient().sendResponse(new ModToolIssueHandledComposer(ModToolIssueHandledComposer.HANDLED)); } this.updateTicketToMods(issue); this.removeTicket(issue); } public boolean hasPendingTickets(int userId) { synchronized (this.tickets) { for(Map.Entry map : this.tickets.entrySet()) { if(map.getValue().senderId == userId) return true; } } return false; } public int totalBans(int userId) { int total = 0; try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT COUNT(*) as total FROM bans WHERE user_id = ?")) { statement.setInt(1, userId); try (ResultSet set = statement.executeQuery()) { if (set.next()) { total = set.getInt("total"); } } } catch (SQLException e) { Emulator.getLogging().logSQLException(e); } return total; } public TIntObjectMap getCategory() { return this.category; } public ModToolCategory getCategory(int id) { return this.category.get(id); } public THashMap> getPresets() { return this.presets; } public THashMap getTickets() { return this.tickets; } public ModToolIssue getTicket(int ticketId) { return this.tickets.get(ticketId); } public TIntObjectMap getCfhCategories() { return this.cfhCategories; } public List openTicketsForHabbo(Habbo habbo) { List issues = new ArrayList<>(); synchronized (this.tickets) { this.tickets.forEachValue(new TObjectProcedure() { @Override public boolean execute(ModToolIssue object) { if (object.senderId == habbo.getHabboInfo().getId() && object.state == ModToolTicketState.OPEN) { issues.add(object); } return true; } }); } return issues; } }