Merge pull request #153 from duckietm/dev

Dev
This commit is contained in:
DuckieTM
2026-06-04 10:43:21 +02:00
committed by GitHub
6 changed files with 75 additions and 18 deletions
+14 -1
View File
@@ -73,4 +73,17 @@ INSERT IGNORE INTO `emulator_settings` (`key`, `value`, `comment`) VALUES
ALTER TABLE `wordfilter` ALTER TABLE `wordfilter`
ADD COLUMN `prefix_only` ENUM('0','1') NOT NULL DEFAULT '0' ADD COLUMN `prefix_only` ENUM('0','1') NOT NULL DEFAULT '0'
COMMENT 'When 1, this word only applies to custom prefixes, not to chat/motto/guild.' AFTER `mute`; COMMENT 'When 1, this word only applies to custom prefixes, not to chat/motto/guild.' AFTER `mute`;
-- ----------------------------------------------------------------------------
-- 5. Per-user mention preferences (:disablementions / :disablemassmentions)
--
-- Read by HabboStats (default '1' = enabled), toggled by the commands.
-- Without these columns the toggle commands cannot persist.
-- ----------------------------------------------------------------------------
ALTER TABLE `users_settings`
ADD COLUMN IF NOT EXISTS `mentions_enabled` ENUM('0','1') NOT NULL DEFAULT '1'
COMMENT 'Receive @nick mention notifications.',
ADD COLUMN IF NOT EXISTS `mass_mentions_enabled` ENUM('0','1') NOT NULL DEFAULT '1'
COMMENT 'Receive broadcast (@all / @friends / @room) mentions.';
@@ -21,6 +21,7 @@ public class HabboMention {
private final int mentionType; private final int mentionType;
private final int timestamp; private final int timestamp;
private final boolean read; private final boolean read;
private final String senderFigure;
public HabboMention(ResultSet set) throws SQLException { public HabboMention(ResultSet set) throws SQLException {
this.id = set.getInt("id"); this.id = set.getInt("id");
@@ -33,6 +34,16 @@ public class HabboMention {
this.mentionType = set.getInt("mention_type"); this.mentionType = set.getInt("mention_type");
this.timestamp = set.getInt("timestamp"); this.timestamp = set.getInt("timestamp");
this.read = set.getInt("read") == 1; this.read = set.getInt("read") == 1;
this.senderFigure = hasSenderFigure(set) ? set.getString("sender_figure") : "";
}
private static boolean hasSenderFigure(ResultSet set) {
try {
set.findColumn("sender_figure");
return true;
} catch (SQLException e) {
return false;
}
} }
public HabboMention(int targetUserId, int id, Habbo sender, Room room, String roomName, String message, int mentionType, int timestamp) { public HabboMention(int targetUserId, int id, Habbo sender, Room room, String roomName, String message, int mentionType, int timestamp) {
@@ -46,6 +57,7 @@ public class HabboMention {
this.mentionType = mentionType; this.mentionType = mentionType;
this.timestamp = timestamp; this.timestamp = timestamp;
this.read = false; this.read = false;
this.senderFigure = sender.getHabboInfo().getLook();
} }
public int getId() { public int getId() {
@@ -87,4 +99,8 @@ public class HabboMention {
public boolean isRead() { public boolean isRead() {
return this.read; return this.read;
} }
public String getSenderFigure() {
return this.senderFigure == null ? "" : this.senderFigure;
}
} }
@@ -9,18 +9,8 @@ import com.eu.habbo.habbohotel.users.HabboManager;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.sql.Connection; import java.sql.*;
import java.sql.PreparedStatement; import java.util.*;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
public class MentionManager { public class MentionManager {
@@ -43,7 +33,6 @@ public class MentionManager {
return Emulator.getConfig().getInt("mentions.enabled", 1) == 1; return Emulator.getConfig().getInt("mentions.enabled", 1) == 1;
} }
/** Broadcast category resolved from a mention alias. */
public enum BroadcastScope { public enum BroadcastScope {
NONE, NONE,
ROOM, ROOM,
@@ -249,7 +238,9 @@ public class MentionManager {
} }
private boolean acceptsMention(Habbo recipient, boolean isBroadcast) { private boolean acceptsMention(Habbo recipient, boolean isBroadcast) {
if (recipient == null || recipient.getHabboStats() == null) return true; if (recipient == null) return false;
if (recipient.getClient() == null) return false;
if (recipient.getHabboStats() == null) return false;
if (!recipient.getHabboStats().mentionsEnabled()) return false; if (!recipient.getHabboStats().mentionsEnabled()) return false;
if (isBroadcast && !recipient.getHabboStats().massMentionsEnabled()) return false; if (isBroadcast && !recipient.getHabboStats().massMentionsEnabled()) return false;
return true; return true;
@@ -297,7 +288,7 @@ public class MentionManager {
if (limit > 200) limit = 200; if (limit > 200) limit = 200;
try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); try (Connection connection = Emulator.getDatabase().getDataSource().getConnection();
PreparedStatement statement = connection.prepareStatement( PreparedStatement statement = connection.prepareStatement(
"SELECT * FROM habbo_mentions WHERE target_user_id = ? ORDER BY id DESC LIMIT ?")) { "SELECT habbo_mentions.*, users.look AS sender_figure FROM habbo_mentions LEFT JOIN users ON users.id = habbo_mentions.sender_user_id WHERE target_user_id = ? ORDER BY id DESC LIMIT ?")) {
statement.setInt(1, userId); statement.setInt(1, userId);
statement.setInt(2, limit); statement.setInt(2, limit);
try (ResultSet set = statement.executeQuery()) { try (ResultSet set = statement.executeQuery()) {
@@ -423,14 +414,49 @@ public class MentionManager {
return value.substring(0, max); return value.substring(0, max);
} }
private boolean isBotOrPetName(Room room, String token) {
if (room == null || token == null || token.isEmpty()) return false;
List<com.eu.habbo.habbohotel.bots.Bot> bots = room.getBots(token);
if (bots != null && !bots.isEmpty()) return true;
if (room.getUnitManager() != null && room.getUnitManager().getPets() != null) {
for (com.eu.habbo.habbohotel.pets.Pet pet : room.getUnitManager().getPets()) {
if (pet != null && pet.getName() != null && pet.getName().equalsIgnoreCase(token)) {
return true;
}
}
}
return false;
}
private Habbo resolveHabbo(Room room, String rawToken) { private Habbo resolveHabbo(Room room, String rawToken) {
if (isBotOrPetName(room, rawToken)) {
return null;
}
String trimmedForBotCheck = trimTrailingPunctuation(rawToken);
if (!trimmedForBotCheck.equals(rawToken) && isBotOrPetName(room, trimmedForBotCheck)) {
return null;
}
Habbo habbo = room.getHabbo(rawToken); Habbo habbo = room.getHabbo(rawToken);
if (habbo != null) { if (habbo != null) {
return habbo; return habbo;
} }
HabboManager habboManager = Emulator.getGameEnvironment().getHabboManager();
habbo = habboManager.getHabbo(rawToken);
if (habbo != null) {
return habbo;
}
String trimmed = trimTrailingPunctuation(rawToken); String trimmed = trimTrailingPunctuation(rawToken);
if (!trimmed.isEmpty() && !trimmed.equals(rawToken)) { if (!trimmed.isEmpty() && !trimmed.equals(rawToken)) {
return room.getHabbo(trimmed); habbo = room.getHabbo(trimmed);
if (habbo != null) {
return habbo;
}
return habboManager.getHabbo(trimmed);
} }
return null; return null;
} }
@@ -18,6 +18,7 @@ public class MentionReceivedComposer extends MessageComposer {
this.response.appendInt(this.mention.getId()); this.response.appendInt(this.mention.getId());
this.response.appendInt(this.mention.getSenderUserId()); this.response.appendInt(this.mention.getSenderUserId());
this.response.appendString(this.mention.getSenderUsername()); this.response.appendString(this.mention.getSenderUsername());
this.response.appendString(this.mention.getSenderFigure());
this.response.appendInt(this.mention.getRoomId()); this.response.appendInt(this.mention.getRoomId());
this.response.appendString(this.mention.getRoomName()); this.response.appendString(this.mention.getRoomName());
this.response.appendString(this.mention.getMessage()); this.response.appendString(this.mention.getMessage());
@@ -23,6 +23,7 @@ public class MentionsListComposer extends MessageComposer {
this.response.appendInt(mention.getId()); this.response.appendInt(mention.getId());
this.response.appendInt(mention.getSenderUserId()); this.response.appendInt(mention.getSenderUserId());
this.response.appendString(mention.getSenderUsername()); this.response.appendString(mention.getSenderUsername());
this.response.appendString(mention.getSenderFigure());
this.response.appendInt(mention.getRoomId()); this.response.appendInt(mention.getRoomId());
this.response.appendString(mention.getRoomName()); this.response.appendString(mention.getRoomName());
this.response.appendString(mention.getMessage()); this.response.appendString(mention.getMessage());
+1 -1
View File
@@ -10,7 +10,7 @@ and is developed for free by talented developers and is compatible with the foll
[Latest compiled version](https://github.com/duckietm/Arcturus-Morningstar-Extended/tree/main/Latest_Compiled_Version) [Latest compiled version](https://github.com/duckietm/Arcturus-Morningstar-Extended/tree/main/Latest_Compiled_Version)
## Connection ## ## Connection ##
Use the Websocket plugin! Use the BUILD-IN Websocket so do NOT load any websocket plugin!
### How do I connect to my emulator using Secure Websockets (wss)? ### How do I connect to my emulator using Secure Websockets (wss)?
You have several options to add WSS support to your websocket server. You have several options to add WSS support to your websocket server.