Show correct ban reason

This commit is contained in:
P0nk
2024-09-29 17:30:09 +02:00
parent d00b4ed678
commit 50524a7740
6 changed files with 48 additions and 25 deletions

View File

@@ -13,10 +13,11 @@ import java.util.Objects;
@Builder @Builder
public record Account(int id, String name, String password, boolean acceptedTos, Byte gender, LocalDate birthdate, public record Account(int id, String name, String password, boolean acceptedTos, Byte gender, LocalDate birthdate,
String pin, String pic, byte chrSlots, LoginState loginState, LocalDateTime lastLogin, String pin, String pic, byte chrSlots, LoginState loginState, LocalDateTime lastLogin,
boolean banned, LocalDateTime tempBannedUntil) { boolean banned, Byte banReason, String banDescription, LocalDateTime tempBannedUntil) {
public Account { public Account {
Objects.requireNonNull(name); Objects.requireNonNull(name);
Objects.requireNonNull(password); Objects.requireNonNull(password);
Objects.requireNonNull(birthdate); Objects.requireNonNull(birthdate);
Objects.requireNonNull(loginState);
} }
} }

View File

@@ -20,7 +20,7 @@ public class AccountRepository {
public Optional<Account> findByNameIgnoreCase(String name) { public Optional<Account> findByNameIgnoreCase(String name) {
String sql = """ String sql = """
SELECT id, name, password, pin, pic, birthdate, gender, tos_accepted, chr_slots, login_state, SELECT id, name, password, pin, pic, birthdate, gender, tos_accepted, chr_slots, login_state,
last_login, banned, temp_banned_until last_login, banned, ban_reason, ban_description, temp_banned_until
FROM account FROM account
WHERE lower(name) = lower(:name)"""; WHERE lower(name) = lower(:name)""";
try (Handle handle = connection.getHandle()) { try (Handle handle = connection.getHandle()) {
@@ -34,7 +34,7 @@ public class AccountRepository {
public Optional<Account> findById(int accountId) { public Optional<Account> findById(int accountId) {
String sql = """ String sql = """
SELECT id, name, password, pin, pic, birthdate, gender, tos_accepted, chr_slots, login_state, SELECT id, name, password, pin, pic, birthdate, gender, tos_accepted, chr_slots, login_state,
last_login, banned, temp_banned_until last_login, banned, ban_reason, ban_description, temp_banned_until
FROM account FROM account
WHERE id = :id"""; WHERE id = :id""";
try (Handle handle = connection.getHandle()) { try (Handle handle = connection.getHandle()) {

View File

@@ -35,6 +35,8 @@ public class AccountRowMapper implements RowMapper<Account> {
.map(Timestamp::toLocalDateTime) .map(Timestamp::toLocalDateTime)
.orElse(null)) .orElse(null))
.banned(rs.getBoolean("banned")) .banned(rs.getBoolean("banned"))
.banReason(rs.getByte("ban_reason"))
.banDescription(rs.getString("ban_description"))
.tempBannedUntil(Optional.ofNullable(rs.getTimestamp("temp_banned_until")) .tempBannedUntil(Optional.ofNullable(rs.getTimestamp("temp_banned_until"))
.map(Timestamp::toLocalDateTime) .map(Timestamp::toLocalDateTime)
.orElse(null)) .orElse(null))

View File

@@ -49,6 +49,7 @@ import java.sql.PreparedStatement;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.util.Calendar; import java.util.Calendar;
import java.util.Objects;
import java.util.Optional; import java.util.Optional;
public final class LoginPasswordHandler implements PacketHandler { public final class LoginPasswordHandler implements PacketHandler {
@@ -107,22 +108,18 @@ public final class LoginPasswordHandler implements PacketHandler {
} }
if (account.banned()) { if (account.banned()) {
c.sendPacket(PacketCreator.getLoginFailed(3)); byte banReason = Objects.requireNonNullElse(account.banReason(), (byte) 0);
// TODO: send ban reason instead of login failed, something like this: c.sendPacket(PacketCreator.getPermBan(banReason));
// c.sendPacket(PacketCreator.getPermBan(c.getGReason()));
return; return;
} }
if (account.loginState() != LoginState.LOGGED_OUT) { boolean tempBanDisabled = false;
c.sendPacket(PacketCreator.getLoginFailed(7)); Calendar tempban = null;
return; if (!tempBanDisabled && (tempban = c.getTempBanCalendarFromDB()) != null) {
} if (tempban.getTimeInMillis() > Calendar.getInstance().getTimeInMillis()) {
c.sendPacket(PacketCreator.getTempBan(tempban.getTimeInMillis(), c.getGReason()));
c.setAccount(account); return;
}
if (!account.acceptedTos()) {
c.sendPacket(PacketCreator.getLoginFailed(23));
return;
} }
boolean banCheckDisabled = false; boolean banCheckDisabled = false;
@@ -138,13 +135,10 @@ public final class LoginPasswordHandler implements PacketHandler {
c.sendPacket(PacketCreator.getTempBan()); c.sendPacket(PacketCreator.getTempBan());
} }
*/ */
boolean tempBanDisabled = false;
Calendar tempban = null; if (account.loginState() != LoginState.LOGGED_OUT) {
if (!tempBanDisabled && (tempban = c.getTempBanCalendarFromDB()) != null) { c.sendPacket(PacketCreator.getLoginFailed(7));
if (tempban.getTimeInMillis() > Calendar.getInstance().getTimeInMillis()) { return;
c.sendPacket(PacketCreator.getTempBan(tempban.getTimeInMillis(), c.getGReason()));
return;
}
} }
Integer failureCode = checkMultiClient(c); Integer failureCode = checkMultiClient(c);
@@ -153,6 +147,13 @@ public final class LoginPasswordHandler implements PacketHandler {
return; return;
} }
c.setAccount(account);
if (!account.acceptedTos()) {
c.sendPacket(PacketCreator.getLoginFailed(23));
return;
}
if (!accountService.setLoggedIn(c)) { if (!accountService.setLoggedIn(c)) {
c.sendPacket(PacketCreator.getLoginFailed(7)); c.sendPacket(PacketCreator.getLoginFailed(7));
} }

View File

@@ -683,12 +683,30 @@ public class PacketCreator {
return p; return p;
} }
/**
* @param reason
* 0: "This is an ID that has been deleted or blocked from connection. Please check again."
* 1: "You account has been blocked for hacking or illegal use of third-party programs. (...)"
* 2: "Your account has been blocked for using macro / auto-keyboard. (...)"
* 3: "Your account has been blocked for illicit promotion and advertising. (...)"
* 4: "Your account has been blocked for harassment. (...)"
* 5: "Your account has been blocked for using profane language. (...)"
* 6: "Your account has been blocked for scamming. (...)"
* 7: "Your account has been blocked for misconduct. (...)"
* 8: "Your account has been blocked for illegal cash transaction. (...)"
* 9: "Your account has been blocked for illegal charging/funding. Please contact customer support for further details. (...)"
* 10: "Your account has been blocked for temporary request. Please contact customer support for further details. (...)"
* 11: "Your account has been blocked for impersonating GM. (...)"
* 12: "Your account has been blocked for using illegal programs or violating the game policy. (...)"
* 13: "Your account has been blocked for one of cursing, scamming, or illegal trading via Megaphones. (...)"
* 14+ "The ID has been permanently blocked. So YOu won't be able to use this account."
*/
public static Packet getPermBan(byte reason) { public static Packet getPermBan(byte reason) {
final OutPacket p = OutPacket.create(SendOpcode.LOGIN_STATUS); final OutPacket p = OutPacket.create(SendOpcode.LOGIN_STATUS);
p.writeByte(2); // Account is banned p.writeByte(2); // Account is banned
p.writeByte(0); p.writeByte(0);
p.writeInt(0); p.writeInt(0);
p.writeByte(0); p.writeByte(reason);
p.writeLong(getTime(-1)); p.writeLong(getTime(-1));
return p; return p;
} }

View File

@@ -16,7 +16,8 @@ CREATE TABLE account
login_state smallint NOT NULL, login_state smallint NOT NULL,
last_login timestamp, last_login timestamp,
banned boolean DEFAULT false NOT NULL, banned boolean DEFAULT false NOT NULL,
banreason text, ban_reason smallint,
ban_description text,
temp_banned_until timestamp, temp_banned_until timestamp,
greason smallint, greason smallint,
ip text, ip text,