diff --git a/Database Updates/011_navigator_group_filter.sql b/Database Updates/011_navigator_group_filter.sql new file mode 100644 index 00000000..510244c6 --- /dev/null +++ b/Database Updates/011_navigator_group_filter.sql @@ -0,0 +1,9 @@ +-- Navigator search filters - companion to the gameserver fix for the catalog +-- 'Find groups to join!' button (navigator/search/hotel_view/group:). + +INSERT IGNORE INTO `navigator_filter` (`key`, `field`, `compare`, `database_query`) VALUES +('anything', 'getName', 'contains', 'SELECT rooms.* FROM rooms WHERE rooms.name LIKE ?'), +('roomname', 'getName', 'contains', 'SELECT rooms.* FROM rooms WHERE rooms.name LIKE ?'), +('owner', 'getOwnerName', 'equals_ignore_case', 'SELECT rooms.* FROM rooms WHERE rooms.owner_name LIKE ?'), +('tag', 'getTags', 'contains', 'SELECT rooms.* FROM rooms WHERE rooms.tags LIKE ?'), +('group', 'getGuildName', 'contains', 'SELECT rooms.* FROM rooms INNER JOIN guilds ON guilds.room_id = rooms.id WHERE guilds.name LIKE ?'); diff --git a/Emulator/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java b/Emulator/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java index 1a69f83f..be7ada12 100644 --- a/Emulator/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java +++ b/Emulator/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java @@ -158,12 +158,10 @@ public class Room implements Comparable, ISerialize, Runnable { private String tags; private boolean publicRoom; private boolean staffPromotedRoom; - // Read every room cycle (processBots/processPets) but written from settings/ - // admin packet handlers on another thread — volatile for cross-thread visibility. - private volatile boolean allowPets; - private volatile boolean allowPetsEat; + private boolean allowPets; + private boolean allowPetsEat; private boolean allowWalkthrough; - private volatile boolean allowBotsWalk; + private boolean allowBotsWalk; private boolean allowEffects; private boolean hideWall; private int chatMode; @@ -1028,10 +1026,6 @@ public class Room implements Comparable, ISerialize, Runnable { com.eu.habbo.habbohotel.wired.core.WiredManager.getEngine().clearRoomDiagnostics(this.id); } - // Drop this room's shared wired-variable assignment caches (otherwise - // they accrue per (room, item, user) for the JVM lifetime). - com.eu.habbo.habbohotel.items.interactions.wired.extra.WiredVariableReferenceSupport.invalidateRoom(this.id); - this.itemManager.clear(); this.unitManager.clearQueue(); @@ -1499,6 +1493,10 @@ public class Room implements Comparable, ISerialize, Runnable { return this.getGuildId() != 0; } + public boolean belongsToGuild() { + return this.guild > 0; + } + public void setGuild(int guild) { this.guild = guild; } diff --git a/Emulator/src/main/java/com/eu/habbo/messages/incoming/navigator/AddSavedSearchEvent.java b/Emulator/src/main/java/com/eu/habbo/messages/incoming/navigator/AddSavedSearchEvent.java index 78be5765..53cf4e3d 100644 --- a/Emulator/src/main/java/com/eu/habbo/messages/incoming/navigator/AddSavedSearchEvent.java +++ b/Emulator/src/main/java/com/eu/habbo/messages/incoming/navigator/AddSavedSearchEvent.java @@ -5,6 +5,13 @@ import com.eu.habbo.messages.incoming.MessageHandler; import com.eu.habbo.messages.outgoing.navigator.NewNavigatorSavedSearchesComposer; public class AddSavedSearchEvent extends MessageHandler { + private static final int MAX_SAVED_SEARCHES = 50; + + @Override + public int getRatelimit() { + return 1000; + } + @Override public void handle() throws Exception { String searchCode = this.packet.readString(); @@ -13,6 +20,11 @@ public class AddSavedSearchEvent extends MessageHandler { if (searchCode.length() > 255) searchCode = searchCode.substring(0, 255); if (filter.length() > 255) filter = filter.substring(0, 255); + if (this.client.getHabbo().getHabboInfo().getSavedSearches().size() >= MAX_SAVED_SEARCHES) { + this.client.sendResponse(new NewNavigatorSavedSearchesComposer(this.client.getHabbo().getHabboInfo().getSavedSearches())); + return; + } + this.client.getHabbo().getHabboInfo().addSavedSearch(new NavigatorSavedSearch(searchCode, filter)); this.client.sendResponse(new NewNavigatorSavedSearchesComposer(this.client.getHabbo().getHabboInfo().getSavedSearches())); diff --git a/Emulator/src/main/java/com/eu/habbo/messages/incoming/navigator/DeleteSavedSearchEvent.java b/Emulator/src/main/java/com/eu/habbo/messages/incoming/navigator/DeleteSavedSearchEvent.java index 8429ffe3..24ffef06 100644 --- a/Emulator/src/main/java/com/eu/habbo/messages/incoming/navigator/DeleteSavedSearchEvent.java +++ b/Emulator/src/main/java/com/eu/habbo/messages/incoming/navigator/DeleteSavedSearchEvent.java @@ -5,6 +5,11 @@ import com.eu.habbo.messages.incoming.MessageHandler; import com.eu.habbo.messages.outgoing.navigator.NewNavigatorSavedSearchesComposer; public class DeleteSavedSearchEvent extends MessageHandler { + @Override + public int getRatelimit() { + return 500; + } + @Override public void handle() throws Exception { int searchId = this.packet.readInt(); diff --git a/Emulator/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestNewNavigatorRoomsEvent.java b/Emulator/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestNewNavigatorRoomsEvent.java index efb78298..95b5661d 100644 --- a/Emulator/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestNewNavigatorRoomsEvent.java +++ b/Emulator/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestNewNavigatorRoomsEvent.java @@ -15,12 +15,20 @@ import java.util.*; public class RequestNewNavigatorRoomsEvent extends MessageHandler { private static final Logger LOGGER = LoggerFactory.getLogger(RequestNewNavigatorRoomsEvent.class); + private static final int MAX_VIEW_LENGTH = 32; + private static final int MAX_QUERY_LENGTH = 64; + + @Override + public int getRatelimit() { + return 200; + } @Override public void handle() throws Exception { String view = this.packet.readString(); String query = this.packet.readString(); - + if (view.length() > MAX_VIEW_LENGTH) return; + if (query.length() > MAX_QUERY_LENGTH) query = query.substring(0, MAX_QUERY_LENGTH); if (view.equals("query")) view = "hotel_view"; if (view.equals("groups")) view = "hotel_view"; @@ -43,7 +51,7 @@ public class RequestNewNavigatorRoomsEvent extends MessageHandler { NavigatorFilterField field = Emulator.getGameEnvironment().getNavigatorManager().filterSettings.get(filterField); if (filter != null) { if (query.contains(":")) { - String[] parts = query.split(":"); + String[] parts = query.split(":", 2); if (parts.length > 1) { filterField = parts[0]; @@ -53,6 +61,7 @@ public class RequestNewNavigatorRoomsEvent extends MessageHandler { if (!Emulator.getGameEnvironment().getNavigatorManager().filterSettings.containsKey(filterField)) { filterField = "anything"; } + part = ""; } } @@ -95,28 +104,19 @@ public class RequestNewNavigatorRoomsEvent extends MessageHandler { rooms.addAll(searchResultList.rooms); resultLists.add(new SearchResultList(searchResultList.order, searchResultList.code, searchResultList.query, searchResultList.action, searchResultList.mode, searchResultList.hidden, rooms, searchResultList.filter, searchResultList.showInvisible, searchResultList.displayOrder, searchResultList.categoryOrder)); } + if ("group".equals(filterField)) { + final String needle = part.toLowerCase(); + for (SearchResultList list : resultLists) { + list.rooms.removeIf(room -> !room.belongsToGuild() + || (!needle.isEmpty() && !room.getGuildName().toLowerCase().contains(needle))); + } + } filter.filter(field.field, part, resultLists); resultLists = toQueryResults(resultLists); this.client.sendResponse(new NewNavigatorSearchResultsComposer(view, query, resultLists)); } catch (Exception e) { LOGGER.error("Caught exception", e); } - - /* - try - { - - List resultLists = new ArrayList<>(filter.getResult(this.client.getHabbo(), field, part, category != null ? category.getId() : -1)); - filter.filter(field.field, part, resultLists); - - Collections.sort(resultLists); - this.client.sendResponse(new NewNavigatorSearchResultsComposer(view, query, resultLists)); - } - catch (Exception e) - { - LOGGER.error("Caught exception", e); - } - */ } private ArrayList toQueryResults(List resultLists) {