fix(rcon): upsert offline pixel grants

RCON GivePixels previously used an UPDATE for offline users, so users without an existing users_currency type 0 row received no pixels while the command still returned success. Match the GivePoints and housekeeping paths with an upsert and add a contract test that keeps offline pixel grants creating missing currency rows.
This commit is contained in:
simoleo89
2026-06-13 02:14:02 +02:00
parent d7fa02a453
commit aaad94f954
2 changed files with 29 additions and 4 deletions
@@ -26,10 +26,11 @@ public class GivePixels extends RCONMessage<GivePixels.JSONGivePixels> {
if (habbo != null) {
habbo.givePixels(object.pixels);
} else {
try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE users_currency SET users_currency.amount = users_currency.amount + ? WHERE users_currency.user_id = ? AND users_currency.type = 0")) {
statement.setInt(1, object.pixels);
statement.setInt(2, object.user_id);
statement.execute();
try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO users_currency (`user_id`, `type`, `amount`) VALUES (?, 0, ?) ON DUPLICATE KEY UPDATE amount = amount + ?")) {
statement.setInt(1, object.user_id);
statement.setInt(2, object.pixels);
statement.setInt(3, object.pixels);
statement.executeUpdate();
} catch (SQLException e) {
this.status = RCONMessage.SYSTEM_ERROR;
LOGGER.error("Caught SQL exception", e);