This commit is contained in:
Michael Wain 2024-06-03 20:02:36 +03:00
parent ff362593d8
commit 0dc0f0b9ce
24 changed files with 60 additions and 108 deletions

View File

@ -10,9 +10,7 @@ import javax.net.ssl.SSLSocket;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Set;
@Slf4j @Slf4j
public class TcpConnection extends Thread { public class TcpConnection extends Thread {
@ -24,11 +22,11 @@ public class TcpConnection extends Thread {
private int token; private int token;
@Getter @Getter
private Map<Integer, Processor> processors; private final Map<Integer, Processor> processors;
public TcpConnection(SSLSocket socket, Set<Class<? extends Processor>> processorClasses) { public TcpConnection(SSLSocket socket, Map<Integer, Processor> processors) {
this.fromClient = socket; this.fromClient = socket;
this.init(processorClasses); this.processors = processors;
this.start(); this.start();
} }
@ -47,18 +45,6 @@ public class TcpConnection extends Thread {
this.outToClient.flush(); this.outToClient.flush();
} }
private void init(Set<Class<? extends Processor>> classes) {
this.processors = new HashMap<>();
classes.forEach(c -> {
try {
var ci = c.getDeclaredConstructor().newInstance();
this.processors.put(ci.getProcessorId(), ci);
} catch (Exception e) {
log.error(e.getMessage());
}
});
}
private void processPacket( BattleNetPacket packet ) { private void processPacket( BattleNetPacket packet ) {
try { try {
Processor is = this.processors.get(Integer.parseUnsignedInt(Integer.toUnsignedString(packet.getHeader().getServiceId()))); Processor is = this.processors.get(Integer.parseUnsignedInt(Integer.toUnsignedString(packet.getHeader().getServiceId())));

View File

@ -2,9 +2,9 @@ package com.alterdekim.hearthhack.component;
import com.alterdekim.hearthhack.component.processor.Processor; import com.alterdekim.hearthhack.component.processor.Processor;
import com.alterdekim.hearthhack.reflect.ReflectionLoader;
import com.alterdekim.hearthhack.util.Util; import com.alterdekim.hearthhack.util.Util;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.reflections.Reflections;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -17,19 +17,17 @@ import java.util.Set;
@Slf4j @Slf4j
@Component @Component
public class TcpServer { public class TcpServer extends ReflectionLoader<Processor> {
private final int socketPort = 1119; private final int socketPort = 1119;
private SSLServerSocket serverSocket; private SSLServerSocket serverSocket;
private List<TcpConnection> connections; private List<TcpConnection> connections;
private Set<Class<? extends Processor>> processorClasses;
@Scheduled(fixedDelay = 5000) @Scheduled(fixedDelay = 5000)
private void start() { private void start() {
try { try {
processorClasses = new Reflections(this.getClass().getPackageName()).getSubTypesOf(Processor.class); this.initReflect(Processor.class);
if( serverSocket != null && !serverSocket.isClosed() ) { if( serverSocket != null && !serverSocket.isClosed() ) {
serverSocket.close(); serverSocket.close();
serverSocket = null; serverSocket = null;
@ -44,7 +42,7 @@ public class TcpServer {
while(true) { while(true) {
SSLSocket s = (SSLSocket) serverSocket.accept(); SSLSocket s = (SSLSocket) serverSocket.accept();
TcpConnection c = new TcpConnection(s, processorClasses); TcpConnection c = new TcpConnection(s, this.getParsers());
connections.add(c); connections.add(c);
log.info("New Connection Established From {}", s.getInetAddress().toString()); log.info("New Connection Established From {}", s.getInetAddress().toString());
} }

View File

@ -4,25 +4,23 @@ package com.alterdekim.hearthhack.component.processor;
import com.alterdekim.Protocol; import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection; import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.component.processor.client.request.ClientRequestParser; import com.alterdekim.hearthhack.component.processor.client.request.ClientRequestParser;
import com.alterdekim.hearthhack.reflect.ReflectionLoader;
import com.alterdekim.hearthhack.util.*; import com.alterdekim.hearthhack.util.*;
import com.google.protobuf.InvalidProtocolBufferException; import com.google.protobuf.InvalidProtocolBufferException;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.reflections.Reflections;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.Set;
@Slf4j @Slf4j
public class GameUtilitiesProcessor extends Processor { public class GameUtilitiesProcessor extends Processor {
private Map<Integer, ClientRequestParser> parsers; private ReflectionLoader<ClientRequestParser> parsers;
public GameUtilitiesProcessor() { public GameUtilitiesProcessor() {
this.setProcessorId(9); this.setProcessorId(9);
this.init(); this.parsers = new ReflectionLoader<>();
this.parsers.initReflect(ClientRequestParser.class);
} }
private ClientRequestBody parseClientRequest(Protocol.ClientRequest request) { private ClientRequestBody parseClientRequest(Protocol.ClientRequest request) {
@ -86,19 +84,6 @@ public class GameUtilitiesProcessor extends Processor {
}); });
} }
private void init() {
this.parsers = new HashMap<>();
Set<Class<? extends ClientRequestParser>> classes = new Reflections(ClientRequestParser.class.getPackageName()).getSubTypesOf(ClientRequestParser.class);
classes.forEach(c -> {
try {
var ci = c.getDeclaredConstructor().newInstance();
this.parsers.put(ci.getId(), ci);
} catch (Exception e) {
log.error(e.getMessage());
}
});
}
private void processClientRequest(BattleNetPacket packet, TcpConnection conn) throws Exception { private void processClientRequest(BattleNetPacket packet, TcpConnection conn) throws Exception {
Protocol.ClientRequest cr = Protocol.ClientRequest.parseFrom(packet.getBody()); Protocol.ClientRequest cr = Protocol.ClientRequest.parseFrom(packet.getBody());
@ -163,11 +148,11 @@ public class GameUtilitiesProcessor extends Processor {
conn.send(new BattleNetPacket(header, new byte[0])); conn.send(new BattleNetPacket(header, new byte[0]));
} }
if( !this.parsers.containsKey(type) ) { if( !this.parsers.getParsers().containsKey(type) ) {
log.error("Unknown ClientRequest type #{}", type); log.error("Unknown ClientRequest type #{}", type);
return; return;
} }
this.parsers.get(type).parse(packet, p, conn); this.parsers.getParsers().get(type).parse(packet, p, conn);
} }
@Override @Override

View File

@ -1,14 +1,16 @@
package com.alterdekim.hearthhack.component.processor.client.request; package com.alterdekim.hearthhack.component.processor.client.request;
import com.alterdekim.hearthhack.component.TcpConnection; import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.reflect.AbstractParser;
import com.alterdekim.hearthhack.util.BattleNetPacket; import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.ClientRequestBody; import com.alterdekim.hearthhack.util.ClientRequestBody;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@NoArgsConstructor @NoArgsConstructor
public abstract class ClientRequestParser { public abstract class ClientRequestParser implements AbstractParser {
public abstract void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) throws Exception; public abstract void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) throws Exception;
@Override
public abstract int getId(); public abstract int getId();
} }

View File

@ -28,7 +28,7 @@ public class AccountLicensesInfo extends GenericParser {
} }
@Override @Override
public GetAccountInfoRequest getId() { public int getId() {
return ACCOUNT_LICENSES; return ACCOUNT_LICENSES.getValue();
} }
} }

View File

@ -43,7 +43,7 @@ public class AvailableFeatures extends GenericParser {
} }
@Override @Override
public GetAccountInfoRequest getId() { public int getId() {
return FEATURES; return FEATURES.getValue();
} }
} }

View File

@ -28,7 +28,7 @@ public class Boosters extends GenericParser {
} }
@Override @Override
public GetAccountInfoRequest getId() { public int getId() {
return BOOSTERS; return BOOSTERS.getValue();
} }
} }

View File

@ -30,7 +30,7 @@ public class CardBacks extends GenericParser {
} }
@Override @Override
public GetAccountInfoRequest getId() { public int getId() {
return CARD_BACKS; return CARD_BACKS.getValue();
} }
} }

View File

@ -43,7 +43,7 @@ public class CardValues extends GenericParser {
} }
@Override @Override
public GetAccountInfoRequest getId() { public int getId() {
return CARD_VALUES; return CARD_VALUES.getValue();
} }
} }

View File

@ -50,7 +50,7 @@ public class ClientOptions extends GenericParser {
} }
@Override @Override
public GetAccountInfoRequest getId() { public int getId() {
return CLIENT_OPTIONS; return CLIENT_OPTIONS.getValue();
} }
} }

View File

@ -28,7 +28,7 @@ public class Collection extends GenericParser {
} }
@Override @Override
public GetAccountInfoRequest getId() { public int getId() {
return COLLECTION; return COLLECTION.getValue();
} }
} }

View File

@ -79,7 +79,7 @@ public class DeckList extends GenericParser {
} }
@Override @Override
public GetAccountInfoRequest getId() { public int getId() {
return DECK_LIST; return DECK_LIST.getValue();
} }
} }

View File

@ -31,7 +31,7 @@ public class DustBalance extends GenericParser {
} }
@Override @Override
public GetAccountInfoRequest getId() { public int getId() {
return ARCANE_DUST_BALANCE; return ARCANE_DUST_BALANCE.getValue();
} }
} }

View File

@ -74,7 +74,7 @@ public class FavoriteHeroes extends GenericParser {
} }
@Override @Override
public GetAccountInfoRequest getId() { public int getId() {
return FAVORITE_HEROES; return FAVORITE_HEROES.getValue();
} }
} }

View File

@ -2,44 +2,24 @@ package com.alterdekim.hearthhack.component.processor.client.request.generic;
import com.alterdekim.Protocol; import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection; import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.reflect.ReflectionLoader;
import com.alterdekim.hearthhack.util.GetAccountInfoRequest; import com.alterdekim.hearthhack.util.GetAccountInfoRequest;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.reflections.Reflections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
@Slf4j @Slf4j
public class GeneralGenericParser { public class GeneralGenericParser extends ReflectionLoader<GenericParser> {
private Map<GetAccountInfoRequest, GenericParser> parsers;
public GeneralGenericParser() { public GeneralGenericParser() {
init(); this.initReflect(GenericParser.class);
}
private void init() {
this.parsers = new HashMap<>();
Set<Class<? extends GenericParser>> classes = new Reflections(this.getClass().getPackageName()).getSubTypesOf(GenericParser.class);
classes.forEach(c -> {
try {
var ci = c.getDeclaredConstructor().newInstance();
this.parsers.put(ci.getId(), ci);
} catch (Exception e) {
log.error(e.getMessage());
}
});
} }
public void parseGenericRequest(int token, Protocol.UtilGenericRequest request, TcpConnection conn) { public void parseGenericRequest(int token, Protocol.UtilGenericRequest request, TcpConnection conn) {
GetAccountInfoRequest req = GetAccountInfoRequest.parseFromInt(request.getRequestSubId()); GetAccountInfoRequest req = GetAccountInfoRequest.parseFromInt(request.getRequestSubId());
if( !this.parsers.containsKey(req) ) { if( !this.getParsers().containsKey(req.getValue()) ) {
log.warn("Unknown generic request: {}", req); log.warn("Unknown generic request: {}", req);
return; return;
} }
try { try {
this.parsers.get(req).parseGenericRequest(token, conn); this.getParsers().get(req.getValue()).parseGenericRequest(token, conn);
} catch (Exception e) { } catch (Exception e) {
log.error(e.getMessage()); log.error(e.getMessage());
} }

View File

@ -33,7 +33,7 @@ public class GoldBalance extends GenericParser{
} }
@Override @Override
public GetAccountInfoRequest getId() { public int getId() {
return GOLD_BALANCE; return GOLD_BALANCE.getValue();
} }
} }

View File

@ -147,7 +147,7 @@ public class HeroXP extends GenericParser {
} }
@Override @Override
public GetAccountInfoRequest getId() { public int getId() {
return HERO_XP; return HERO_XP.getValue();
} }
} }

View File

@ -49,7 +49,7 @@ public class MedalInfo extends GenericParser {
} }
@Override @Override
public GetAccountInfoRequest getId() { public int getId() {
return MEDAL_INFO; return MEDAL_INFO.getValue();
} }
} }

View File

@ -130,7 +130,7 @@ public class NotSoMassiveLoginReply extends GenericParser {
} }
@Override @Override
public GetAccountInfoRequest getId() { public int getId() {
return NOT_SO_MASSIVE_LOGIN; return NOT_SO_MASSIVE_LOGIN.getValue();
} }
} }

View File

@ -53,7 +53,7 @@ public class PlayerRecords extends GenericParser {
} }
@Override @Override
public GetAccountInfoRequest getId() { public int getId() {
return PLAYER_RECORD; return PLAYER_RECORD.getValue();
} }
} }

View File

@ -27,7 +27,7 @@ public class ProfileNotices extends GenericParser {
} }
@Override @Override
public GetAccountInfoRequest getId() { public int getId() {
return NOTICES; return NOTICES.getValue();
} }
} }

View File

@ -31,7 +31,7 @@ public class ProfileProgress extends GenericParser {
} }
@Override @Override
public GetAccountInfoRequest getId() { public int getId() {
return CAMPAIGN_INFO; return CAMPAIGN_INFO.getValue();
} }
} }

View File

@ -51,7 +51,7 @@ public class RewardProgress extends GenericParser {
} }
@Override @Override
public GetAccountInfoRequest getId() { public int getId() {
return REWARD_PROGRESS; return REWARD_PROGRESS.getValue();
} }
} }

View File

@ -1,5 +1,6 @@
package com.alterdekim.hearthhack.reflect; package com.alterdekim.hearthhack.reflect;
import com.alterdekim.hearthhack.component.processor.Processor;
import lombok.Getter; import lombok.Getter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.reflections.Reflections; import org.reflections.Reflections;
@ -8,14 +9,14 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@Getter
@Slf4j @Slf4j
public class ReflectionLoader<V extends AbstractParser> { public class ReflectionLoader<V extends AbstractParser> {
@Getter
private Map<Integer, V> parsers; private Map<Integer, V> parsers;
public void initReflect(Class<V> vClass) { public void initReflect(Class<V> vClass) {
this.parsers = new HashMap<>(); this.parsers = new HashMap<>();
Set<Class<? extends V>> processorClasses = new Reflections(this.getClass().getPackageName()).getSubTypesOf(vClass); Set<Class<? extends V>> processorClasses = new Reflections(vClass.getPackageName()).getSubTypesOf(vClass);
processorClasses.forEach(c -> { processorClasses.forEach(c -> {
try { try {
var ci = c.getDeclaredConstructor().newInstance(); var ci = c.getDeclaredConstructor().newInstance();