diff --git a/sqlupdates/2_3_0-RC-1_TO_2_3_0-RC-2.sql b/sqlupdates/2_3_0-RC-1_TO_2_3_0-RC-2.sql index f766bc3a..66bbf938 100644 --- a/sqlupdates/2_3_0-RC-1_TO_2_3_0-RC-2.sql +++ b/sqlupdates/2_3_0-RC-1_TO_2_3_0-RC-2.sql @@ -10,3 +10,11 @@ ADD COLUMN `category` int(11) NOT NULL DEFAULT 0 AFTER `start_timestamp`; INSERT INTO `emulator_settings`(`key`, `value`) VALUES ('navigator.eventcategories', '1,Hottest Events,false;2,Parties & Music,true;3,Role Play,true;4,Help Desk,true;5,Trading,true;6,Games,true;7,Debates & Discussions,true;8,Grand Openings,true;9,Friending,true;10,Jobs,true;11,Group Events,true'); INSERT INTO `emulator_settings`(`key`, `value`) VALUES ('room.promotion.badge', 'RADZZ'); + +CREATE TABLE `guild_forum_views` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL, + `guild_id` int(11) NOT NULL, + `timestamp` int(11) NOT NULL, + PRIMARY KEY (`id`) +); diff --git a/src/main/java/com/eu/habbo/habbohotel/guilds/GuildManager.java b/src/main/java/com/eu/habbo/habbohotel/guilds/GuildManager.java index 42aff936..71a017aa 100644 --- a/src/main/java/com/eu/habbo/habbohotel/guilds/GuildManager.java +++ b/src/main/java/com/eu/habbo/habbohotel/guilds/GuildManager.java @@ -2,6 +2,7 @@ package com.eu.habbo.habbohotel.guilds; import com.eu.habbo.Emulator; import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.guilds.forums.ForumView; import com.eu.habbo.habbohotel.items.interactions.InteractionGuildFurni; import com.eu.habbo.habbohotel.rooms.Room; import com.eu.habbo.habbohotel.users.Habbo; @@ -14,10 +15,8 @@ import gnu.trove.map.hash.TIntObjectHashMap; import gnu.trove.set.hash.THashSet; import java.sql.*; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.NoSuchElementException; +import java.util.*; +import java.util.stream.Collectors; public class GuildManager { @@ -25,12 +24,16 @@ public class GuildManager { private final TIntObjectMap guilds; + private final THashSet views = new THashSet<>(); + public GuildManager() { long millis = System.currentTimeMillis(); this.guildParts = new THashMap>(); this.guilds = TCollections.synchronizedMap(new TIntObjectHashMap()); this.loadGuildParts(); + this.loadGuildViews(); + Emulator.getLogging().logStart("Guild Manager -> Loaded! (" + (System.currentTimeMillis() - millis) + " MS)"); } @@ -53,6 +56,19 @@ public class GuildManager { } } + public void loadGuildViews() { + this.views.clear(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); + Statement statement = connection.createStatement(); + ResultSet set = statement.executeQuery("SELECT * FROM guild_forum_views")) { + while (set.next()) { + this.views.add(new ForumView(set)); + } + } catch (SQLException e) { + Emulator.getLogging().logSQLException(e); + } + } public Guild createGuild(Habbo habbo, int roomId, String roomName, String name, String description, String badge, int colorOne, int colorTwo) { Guild guild = new Guild(habbo.getHabboInfo().getId(), habbo.getHabboInfo().getUsername(), roomId, roomName, name, description, colorOne, colorTwo, badge); @@ -594,4 +610,38 @@ public class GuildManager { } Emulator.getLogging().logShutdownLine("Guild Manager -> Disposed!"); } + + public boolean hasViewedForum(int userId, int guildId) { + return this.views.stream() + .anyMatch(v -> v.getUserId() == userId && v.getGuildId() == guildId && v.getTimestamp() > (Emulator.getIntUnixTimestamp() - 7 * 24 * 60 * 60)); + } + + public void addView(int userId, int guildId) { + ForumView view = new ForumView(userId, guildId, Emulator.getIntUnixTimestamp()); + + this.views.add(view); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO `guild_forum_views`(`user_id`, `guild_id`, `timestamp`) VALUES (?, ?, ?)")) { + statement.setInt(1, view.getUserId()); + statement.setInt(2, view.getGuildId()); + statement.setInt(3, view.getTimestamp()); + + statement.execute(); + } catch (SQLException e) { + Emulator.getLogging().logSQLException(e); + } + } + + public Set getMostViewed() { + return this.views.stream() + .filter(v -> v.getTimestamp() > (Emulator.getIntUnixTimestamp() - 7 * 24 * 60 * 60)) + .collect(Collectors.groupingBy(ForumView::getGuildId)) + .entrySet() + .stream() + .sorted(Comparator.comparingInt((Map.Entry> a) -> a.getValue().size())) + .map(k -> this.getGuild(k.getKey())) + .filter(g -> g != null && g.canReadForum() == SettingsState.EVERYONE) + .limit(100) + .collect(Collectors.toSet()); + } } diff --git a/src/main/java/com/eu/habbo/habbohotel/guilds/forums/ForumView.java b/src/main/java/com/eu/habbo/habbohotel/guilds/forums/ForumView.java new file mode 100644 index 00000000..c1b2569e --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/guilds/forums/ForumView.java @@ -0,0 +1,34 @@ +package com.eu.habbo.habbohotel.guilds.forums; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class ForumView { + private final int userId; + private final int guildId; + private final int timestamp; + + public ForumView(int userId, int guildId, int timestamp) { + this.userId = userId; + this.guildId = guildId; + this.timestamp = timestamp; + } + + public ForumView(ResultSet set) throws SQLException { + this.userId = set.getInt("user_id"); + this.guildId = set.getInt("guild_id"); + this.timestamp = set.getInt("timestamp"); + } + + public int getUserId() { + return userId; + } + + public int getGuildId() { + return guildId; + } + + public int getTimestamp() { + return timestamp; + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumDataEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumDataEvent.java index 88fec7ab..ab78d2c0 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumDataEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumDataEvent.java @@ -16,5 +16,9 @@ public class GuildForumDataEvent extends MessageHandler { return; this.client.sendResponse(new GuildForumDataComposer(guild, this.client.getHabbo())); + + if (!Emulator.getGameEnvironment().getGuildManager().hasViewedForum(this.client.getHabbo().getHabboInfo().getId(), guildId)) { + Emulator.getGameEnvironment().getGuildManager().addView(this.client.getHabbo().getHabboInfo().getId(), guildId); + } } } \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumListEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumListEvent.java index a47a52bc..9dc377e3 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumListEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumListEvent.java @@ -11,6 +11,7 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.Set; public class GuildForumListEvent extends MessageHandler { @Override @@ -19,14 +20,14 @@ public class GuildForumListEvent extends MessageHandler { int offset = this.packet.readInt(); int amount = this.packet.readInt(); - THashSet guilds = null; + Set guilds = null; switch (mode) { case 0: // most active - guilds = getPopularForums(); + guilds = getActiveForums(); break; case 1: // most viewed - guilds = getPopularForums(); + guilds = Emulator.getGameEnvironment().getGuildManager().getMostViewed(); break; case 2: // my groups @@ -39,14 +40,16 @@ public class GuildForumListEvent extends MessageHandler { } } - private THashSet getPopularForums() { + private THashSet getActiveForums() { THashSet guilds = new THashSet(); try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT `guilds`.`id`, SUM(`guilds_forums_threads`.`posts_count`) AS `post_count` " + "FROM `guilds_forums_threads` " + "LEFT JOIN `guilds` ON `guilds`.`id` = `guilds_forums_threads`.`guild_id` " + + "WHERE `guilds`.`read_forum` = 'EVERYONE' AND `guilds_forums_threads`.`created_at` > ? " + "GROUP BY `guilds`.`id` " + "ORDER BY `post_count` DESC LIMIT 100")) { + statement.setInt(1, Emulator.getIntUnixTimestamp() - 7 * 24 * 60 * 60); ResultSet set = statement.executeQuery(); while (set.next()) { diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumListComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumListComposer.java index f3050354..4700bc13 100644 --- a/src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumListComposer.java +++ b/src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumListComposer.java @@ -8,14 +8,15 @@ import com.eu.habbo.messages.outgoing.Outgoing; import gnu.trove.set.hash.THashSet; import java.util.Iterator; +import java.util.Set; public class GuildForumListComposer extends MessageComposer { - private final THashSet guilds; + private final Set guilds; private final Habbo habbo; private final int mode; private final int index; - public GuildForumListComposer(THashSet guilds, Habbo habbo, int mode, int index) { + public GuildForumListComposer(Set guilds, Habbo habbo, int mode, int index) { this.guilds = guilds; this.habbo = habbo; this.mode = mode;