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
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,
boolean banned, LocalDateTime tempBannedUntil) {
boolean banned, Byte banReason, String banDescription, LocalDateTime tempBannedUntil) {
public Account {
Objects.requireNonNull(name);
Objects.requireNonNull(password);
Objects.requireNonNull(birthdate);
Objects.requireNonNull(loginState);
}
}

View File

@@ -20,7 +20,7 @@ public class AccountRepository {
public Optional<Account> findByNameIgnoreCase(String name) {
String sql = """
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
WHERE lower(name) = lower(:name)""";
try (Handle handle = connection.getHandle()) {
@@ -34,7 +34,7 @@ public class AccountRepository {
public Optional<Account> findById(int accountId) {
String sql = """
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
WHERE id = :id""";
try (Handle handle = connection.getHandle()) {

View File

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

View File

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

View File

@@ -683,12 +683,30 @@ public class PacketCreator {
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) {
final OutPacket p = OutPacket.create(SendOpcode.LOGIN_STATUS);
p.writeByte(2); // Account is banned
p.writeByte(0);
p.writeInt(0);
p.writeByte(0);
p.writeByte(reason);
p.writeLong(getTime(-1));
return p;
}