GameUtilities service refactored.

This commit is contained in:
Michael Wain 2024-06-03 18:53:48 +03:00
parent e646db41fe
commit ff362593d8
40 changed files with 1490 additions and 1081 deletions

File diff suppressed because one or more lines are too long

View File

@ -2,15 +2,15 @@ package com.alterdekim.hearthhack.component.processor;
import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.reflect.AbstractParser;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.Compute32;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@NoArgsConstructor
public abstract class Processor {
public abstract class Processor implements AbstractParser {
@Setter
private int processorId;
@ -31,4 +31,9 @@ public abstract class Processor {
if(object_id != null) b.setObjectId(object_id);
return b.build();
}
@Override
public int getId() {
return processorId;
}
}

View File

@ -1,13 +1,31 @@
package com.alterdekim.hearthhack.component.processor.client.request;
import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.ClientRequestBody;
import static com.alterdekim.hearthhack.util.GameUtilities.generateNotification;
public class CheckAccountLicenses extends ClientRequestParser {
@Override
public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) {
public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) throws Exception {
Protocol.CheckAccountLicensesResponse response = Protocol.CheckAccountLicensesResponse.newBuilder()
.setSuccess(true)
.build();
Protocol.Notification n = generateNotification(330, response.toByteString(), response.getSerializedSize());
Protocol.Header header = Protocol.Header.newBuilder()
.setServiceId(4)
.setMethodId(1)
.setToken(conn.nextToken())
.setStatus(0)
.setObjectId(0)
.setSize(n.getSerializedSize())
.build();
conn.send(new BattleNetPacket(header, n.toByteArray()));
}
@Override

View File

@ -1,13 +1,31 @@
package com.alterdekim.hearthhack.component.processor.client.request;
import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.ClientRequestBody;
import static com.alterdekim.hearthhack.util.GameUtilities.generateNotification;
public class CheckGameLicenses extends ClientRequestParser {
@Override
public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) {
public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) throws Exception {
Protocol.CheckGameLicensesResponse checkGameLicensesResponse = Protocol.CheckGameLicensesResponse.newBuilder()
.setSuccess(true)
.build();
Protocol.Notification n = generateNotification(331, checkGameLicensesResponse.toByteString(), checkGameLicensesResponse.getSerializedSize());
Protocol.Header header = Protocol.Header.newBuilder()
.setServiceId(4)
.setMethodId(1)
.setToken(conn.nextToken())
.setObjectId(0)
.setSize(n.getSerializedSize())
.setStatus(0)
.build();
conn.send(new BattleNetPacket(header, n.toByteArray()));
}
@Override

View File

@ -8,7 +8,7 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor
public abstract class ClientRequestParser {
public abstract void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn);
public abstract void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) throws Exception;
public abstract int getId();
}

View File

@ -1,13 +1,31 @@
package com.alterdekim.hearthhack.component.processor.client.request;
import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.ClientRequestBody;
import static com.alterdekim.hearthhack.util.GameUtilities.generateEmptyNotification;
public class GetAdventureProgress extends ClientRequestParser {
@Override
public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) {
public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) throws Exception {
/* Protocol.AdventureProgressResponse progressResponse = Protocol.AdventureProgressResponse.newBuilder()
.build();*/
// Protocol.Notification n = generateNotification(306, progressResponse.toByteString(), progressResponse.getSerializedSize());
Protocol.Notification n = generateEmptyNotification(306);
Protocol.Header header = Protocol.Header.newBuilder()
.setServiceId(4)
.setMethodId(1)
.setToken(conn.nextToken())
.setObjectId(0)
.setSize(n.getSerializedSize())
.setStatus(0)
.build();
conn.send(new BattleNetPacket(header, n.toByteArray()));
}
@Override

View File

@ -1,13 +1,31 @@
package com.alterdekim.hearthhack.component.processor.client.request;
import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.ClientRequestBody;
import static com.alterdekim.hearthhack.util.GameUtilities.generateNotification;
public class GetAssetsVersion extends ClientRequestParser {
@Override
public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) {
public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) throws Exception {
Protocol.AssetsVersionResponse assetsVersionResponse = Protocol.AssetsVersionResponse.newBuilder()
.setVersion(11046)
.build();
Protocol.Notification n = generateNotification(304, assetsVersionResponse.toByteString(), assetsVersionResponse.getSerializedSize());
Protocol.Header header = Protocol.Header.newBuilder()
.setServiceId(4)
.setMethodId(1)
.setToken(conn.nextToken())
.setStatus(0)
.setObjectId(0)
.setSize(n.getSerializedSize())
.build();
conn.send(new BattleNetPacket(header, n.toByteArray()));
}
@Override

View File

@ -1,13 +1,38 @@
package com.alterdekim.hearthhack.component.processor.client.request;
import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.component.processor.Processor;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.ClientRequestBody;
import com.alterdekim.hearthhack.util.Util;
import static com.alterdekim.hearthhack.util.GameUtilities.generateNotification;
public class GetBattlePayStatus extends ClientRequestParser {
@Override
public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) {
public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) throws Exception {
byte[] b = Util.hexStringToByteArray("0A090A02696412031889020A0F0A0570726F746F1206320408002001");
Protocol.Header header = Processor.generateResponse(b.length, packet.getHeader().getToken(), 0, 0);
conn.send(new BattleNetPacket(header, b));
Protocol.BattlePayStatusResponse response = Protocol.BattlePayStatusResponse.newBuilder()
.setStatus(Protocol.BattlePayStatusResponse.PurchaseState.PS_READY)
.setBattlePayAvailable(true)
.build();
Protocol.Notification n = generateNotification(265, response.toByteString(), response.getSerializedSize());
header = Protocol.Header.newBuilder()
.setServiceId(4)
.setMethodId(1)
.setToken(conn.nextToken())
.setObjectId(0)
.setSize(n.getSerializedSize())
.setStatus(0)
.build();
conn.send(new BattleNetPacket(header, n.toByteArray()));
}
@Override

View File

@ -1,13 +1,26 @@
package com.alterdekim.hearthhack.component.processor.client.request;
import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.component.processor.client.request.generic.GeneralGenericParser;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.ClientRequestBody;
public class NetCacheObject extends ClientRequestParser {
@Override
public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) {
private final GeneralGenericParser parser;
public NetCacheObject() {
this.parser = new GeneralGenericParser();
}
@Override
public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) throws Exception {
this.parser.parseGenericRequest(
packet.getHeader().getToken(),
Protocol.UtilGenericRequest.parseFrom(body.getBody()),
conn
);
}
@Override

View File

@ -1,13 +1,23 @@
package com.alterdekim.hearthhack.component.processor.client.request;
import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.component.processor.client.request.generic.GeneralGenericParser;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.ClientRequestBody;
public class NetCacheObjectList extends ClientRequestParser {
@Override
public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) {
private final GeneralGenericParser parser;
public NetCacheObjectList() {
this.parser = new GeneralGenericParser();
}
@Override
public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) throws Exception {
Protocol.GenericRequestList genericRequestList = Protocol.GenericRequestList.parseFrom(body.getBody());
genericRequestList.getRequestsList().forEach(gr -> parser.parseGenericRequest(packet.getHeader().getToken(), gr, conn));
}
@Override

View File

@ -3,11 +3,13 @@ package com.alterdekim.hearthhack.component.processor.client.request;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.ClientRequestBody;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class SendUnsubcribeRequest extends ClientRequestParser {
@Override
public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) {
log.info("parseSendUnsubcribeRequest: got");
}
@Override

View File

@ -1,13 +1,17 @@
package com.alterdekim.hearthhack.component.processor.client.request;
import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.ClientRequestBody;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class SetOptions extends ClientRequestParser {
@Override
public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) {
public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) throws Exception {
Protocol.SetOptions setOptions = Protocol.SetOptions.parseFrom(body.getBody());
log.info("parseSetOptions: got");
}
@Override

View File

@ -1,13 +1,38 @@
package com.alterdekim.hearthhack.component.processor.client.request;
import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.component.processor.Processor;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.ClientRequestBody;
public class SubscriptionRequest extends ClientRequestParser {
@Override
public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) {
public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) throws Exception {
//body.getRoute()
Protocol.UtilSubscribeResponse response = Protocol.UtilSubscribeResponse.newBuilder()
.setRoute((int) (Math.random() * 100d))
.setKeepAliveSecs(300)
.setMaxResubscribeAttempts(0)
.setPendingResponseTimeout(0)
.setPendingSubscribeTimeout(15)
.setRequestMaxWaitSecs(120)
.build();
Protocol.ClientResponse clResponse = Protocol.ClientResponse.newBuilder()
.addAttribute(Protocol.Attribute.newBuilder()
.setName("id")
.setValue(Protocol.Variant.newBuilder()
.setIntValue(315)
))
.addAttribute(Protocol.Attribute.newBuilder()
.setName("proto")
.setValue(Protocol.Variant.newBuilder()
.setBlobValue(response.toByteString())
))
.build();
Protocol.Header header = Processor.generateResponse(clResponse.getSerializedSize(), packet.getHeader().getToken(), 0, 0);
conn.send(new BattleNetPacket(header, clResponse.toByteArray()));
}
@Override

View File

@ -1,13 +1,31 @@
package com.alterdekim.hearthhack.component.processor.client.request;
import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.ClientRequestBody;
import static com.alterdekim.hearthhack.util.GameUtilities.generateNotification;
public class UpdateLogin extends ClientRequestParser {
@Override
public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) {
public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) throws Exception {
//Protocol.UpdateLogin updateLogin = Protocol.UpdateLogin.parseFrom(body.getBody());
Protocol.UpdateLoginComplete updateLoginComplete = Protocol.UpdateLoginComplete.newBuilder().build();
Protocol.Notification n = generateNotification(307, updateLoginComplete.toByteString(), updateLoginComplete.getSerializedSize());
Protocol.Header header = Protocol.Header.newBuilder()
.setServiceId(4)
.setMethodId(1)
.setToken(conn.nextToken())
.setObjectId(0)
.setSize(n.getSerializedSize())
.setStatus(0)
.build();
conn.send(new BattleNetPacket(header, n.toByteArray()));
}
@Override

View File

@ -0,0 +1,34 @@
package com.alterdekim.hearthhack.component.processor.client.request.generic;
import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.GetAccountInfoRequest;
import static com.alterdekim.hearthhack.util.GameUtilities.generateEmptyNotification;
import static com.alterdekim.hearthhack.util.GetAccountInfoRequest.ACCOUNT_LICENSES;
public class AccountLicensesInfo extends GenericParser {
@Override
public void parseGenericRequest(int token, TcpConnection conn) throws Exception {
// Protocol.AccountLicensesInfoResponse
Protocol.Notification n = generateEmptyNotification(325);
Protocol.Header header = Protocol.Header.newBuilder()
.setServiceId(4)
.setMethodId(1)
.setToken(conn.nextToken())
.setObjectId(0)
.setSize(n.getSerializedSize())
.setStatus(0)
.build();
conn.send(new BattleNetPacket(header, n.toByteArray()));
}
@Override
public GetAccountInfoRequest getId() {
return ACCOUNT_LICENSES;
}
}

View File

@ -0,0 +1,49 @@
package com.alterdekim.hearthhack.component.processor.client.request.generic;
import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.GetAccountInfoRequest;
import lombok.extern.slf4j.Slf4j;
import static com.alterdekim.hearthhack.util.GameUtilities.generateNotification;
import static com.alterdekim.hearthhack.util.GetAccountInfoRequest.FEATURES;
import static com.alterdekim.hearthhack.util.Util.setInterval;
@Slf4j
public class AvailableFeatures extends GenericParser {
private void executeFeatures(TcpConnection conn) {
Protocol.GuardianVars guardianVars = Protocol.GuardianVars.newBuilder()
.setShowUserUi(1)
.setClientOptionsUpdateIntervalSeconds(300)
.build();
Protocol.Notification n = generateNotification(264, guardianVars.toByteString(), guardianVars.getSerializedSize());
Protocol.Header header = Protocol.Header.newBuilder()
.setServiceId(4)
.setMethodId(1)
.setToken(conn.nextToken())
.setStatus(0)
.setObjectId(0)
.setSize(n.getSerializedSize())
.build();
try {
conn.send(new BattleNetPacket(header, n.toByteArray()));
} catch (Exception e) {
log.error(e.getMessage());
}
}
@Override
public void parseGenericRequest(int token, TcpConnection conn) throws Exception {
setInterval(() -> executeFeatures(conn), 4000);
}
@Override
public GetAccountInfoRequest getId() {
return FEATURES;
}
}

View File

@ -0,0 +1,34 @@
package com.alterdekim.hearthhack.component.processor.client.request.generic;
import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.GetAccountInfoRequest;
import static com.alterdekim.hearthhack.util.GameUtilities.generateEmptyNotification;
import static com.alterdekim.hearthhack.util.GetAccountInfoRequest.BOOSTERS;
public class Boosters extends GenericParser {
@Override
public void parseGenericRequest(int token, TcpConnection conn) throws Exception {
//Protocol.BoosterList boosterList = Protocol.BoosterList.newBuilder().build();
Protocol.Notification n = generateEmptyNotification(224);
Protocol.Header header = Protocol.Header.newBuilder()
.setServiceId(4)
.setMethodId(1)
.setToken(conn.nextToken())
.setObjectId(0)
.setSize(n.getSerializedSize())
.setStatus(0)
.build();
conn.send(new BattleNetPacket(header, n.toByteArray()));
}
@Override
public GetAccountInfoRequest getId() {
return BOOSTERS;
}
}

View File

@ -0,0 +1,36 @@
package com.alterdekim.hearthhack.component.processor.client.request.generic;
import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.GetAccountInfoRequest;
import static com.alterdekim.hearthhack.util.GameUtilities.generateNotification;
import static com.alterdekim.hearthhack.util.GetAccountInfoRequest.CARD_BACKS;
public class CardBacks extends GenericParser {
@Override
public void parseGenericRequest(int token, TcpConnection conn) throws Exception {
Protocol.CardBacks cardBacks = Protocol.CardBacks.newBuilder()
.setDefaultCardBack(0)
.build();
Protocol.Notification n = generateNotification(236, cardBacks.toByteString(), cardBacks.getSerializedSize());
Protocol.Header header = Protocol.Header.newBuilder()
.setServiceId(4)
.setMethodId(1)
.setToken(conn.nextToken())
.setObjectId(0)
.setSize(n.getSerializedSize())
.setStatus(0)
.build();
conn.send(new BattleNetPacket(header, n.toByteArray()));
}
@Override
public GetAccountInfoRequest getId() {
return CARD_BACKS;
}
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,56 @@
package com.alterdekim.hearthhack.component.processor.client.request.generic;
import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.GetAccountInfoRequest;
import static com.alterdekim.hearthhack.util.GameUtilities.generateNotification;
import static com.alterdekim.hearthhack.util.GetAccountInfoRequest.CLIENT_OPTIONS;
public class ClientOptions extends GenericParser {
@Override
public void parseGenericRequest(int token, TcpConnection conn) throws Exception {
Protocol.ClientOptions clientOptions = Protocol.ClientOptions.newBuilder()
.addOptions(Protocol.ClientOption.newBuilder()
.setIndex(24)
.setAsInt32(3))
.addOptions(Protocol.ClientOption.newBuilder()
.setIndex(1)
.setAsUint64(13514148956663808L))
.addOptions(Protocol.ClientOption.newBuilder()
.setIndex(2)
.setAsUint64(549755813888L))
.addOptions(Protocol.ClientOption.newBuilder()
.setIndex(20)
.setAsInt32(2))
.addOptions(Protocol.ClientOption.newBuilder()
.setIndex(21)
.setAsInt32(1))
.addOptions(Protocol.ClientOption.newBuilder()
.setIndex(8)
.setAsInt32(4))
.addOptions(Protocol.ClientOption.newBuilder()
.setIndex(10)
.setAsInt32(1))
.build();
Protocol.Notification n = generateNotification(241, clientOptions.toByteString(), clientOptions.getSerializedSize());
Protocol.Header header = Protocol.Header.newBuilder()
.setServiceId(4)
.setMethodId(1)
.setToken(conn.nextToken())
.setObjectId(0)
.setSize(n.getSerializedSize())
.setStatus(0)
.build();
conn.send(new BattleNetPacket(header, n.toByteArray()));
}
@Override
public GetAccountInfoRequest getId() {
return CLIENT_OPTIONS;
}
}

View File

@ -0,0 +1,34 @@
package com.alterdekim.hearthhack.component.processor.client.request.generic;
import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.GetAccountInfoRequest;
import static com.alterdekim.hearthhack.util.GameUtilities.generateEmptyNotification;
import static com.alterdekim.hearthhack.util.GetAccountInfoRequest.COLLECTION;
public class Collection extends GenericParser {
@Override
public void parseGenericRequest(int token, TcpConnection conn) throws Exception {
// Protocol.Collection collection = Protocol.Collection.newBuilder().build();
Protocol.Notification n = generateEmptyNotification(207);
Protocol.Header header = Protocol.Header.newBuilder()
.setServiceId(4)
.setMethodId(1)
.setToken(conn.nextToken())
.setObjectId(0)
.setSize(n.getSerializedSize())
.setStatus(0)
.build();
conn.send(new BattleNetPacket(header, n.toByteArray()));
}
@Override
public GetAccountInfoRequest getId() {
return COLLECTION;
}
}

View File

@ -0,0 +1,85 @@
package com.alterdekim.hearthhack.component.processor.client.request.generic;
import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.GetAccountInfoRequest;
import static com.alterdekim.hearthhack.util.GameUtilities.generateNotification;
import static com.alterdekim.hearthhack.util.GetAccountInfoRequest.DECK_LIST;
public class DeckList extends GenericParser {
@Override
public void parseGenericRequest(int token, TcpConnection conn) throws Exception {
Protocol.DeckList deckList = Protocol.DeckList.newBuilder()
.addDecks(Protocol.DeckInfo.newBuilder()
.setId(794851023L)
.setName("The Fuck")
.setCardBack(0)
.setHero(637)
.setDeckType(Protocol.DeckType.NORMAL_DECK)
.setValidity(767L)
.setHeroPremium(0)
.setCardBackOverride(false)
.setHeroOverride(false)
.setLastModified(1461490210L)
.setSortOrder(1461490210L)
.setSourceType(Protocol.DeckSourceType.DECK_SOURCE_TYPE_BASIC_DECK))
.addDecks(Protocol.DeckInfo.newBuilder()
.setId(794938262L)
.setName("The Cock")
.setCardBack(0)
.setHero(31)
.setDeckType(Protocol.DeckType.NORMAL_DECK)
.setValidity(767L)
.setHeroPremium(0)
.setCardBackOverride(false)
.setHeroOverride(false)
.setLastModified(1461490581L)
.setSortOrder(1461490581L)
.setSourceType(Protocol.DeckSourceType.DECK_SOURCE_TYPE_BASIC_DECK))
.addDecks(Protocol.DeckInfo.newBuilder()
.setId(172325L)
.setName("precon")
.setCardBack(0)
.setHero(31)
.setDeckType(Protocol.DeckType.PRECON_DECK)
.setValidity(31L)
.setHeroPremium(0)
.setCardBackOverride(false)
.setHeroOverride(false)
.setSortOrder(0L)
.setSourceType(Protocol.DeckSourceType.DECK_SOURCE_TYPE_UNKNOWN))
.addDecks(Protocol.DeckInfo.newBuilder()
.setId(171593L)
.setName("precon")
.setCardBack(0)
.setHero(637)
.setDeckType(Protocol.DeckType.PRECON_DECK)
.setValidity(31L)
.setHeroPremium(0)
.setCardBackOverride(false)
.setHeroOverride(false)
.setSortOrder(0L)
.setSourceType(Protocol.DeckSourceType.DECK_SOURCE_TYPE_UNKNOWN))
.build();
Protocol.Notification n = generateNotification(202, deckList.toByteString(), deckList.getSerializedSize());
Protocol.Header header = Protocol.Header.newBuilder()
.setServiceId(4)
.setMethodId(1)
.setToken(conn.nextToken())
.setObjectId(0)
.setSize(n.getSerializedSize())
.setStatus(0)
.build();
conn.send(new BattleNetPacket(header, n.toByteArray()));
}
@Override
public GetAccountInfoRequest getId() {
return DECK_LIST;
}
}

View File

@ -0,0 +1,37 @@
package com.alterdekim.hearthhack.component.processor.client.request.generic;
import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.GetAccountInfoRequest;
import static com.alterdekim.hearthhack.util.GameUtilities.generateNotification;
import static com.alterdekim.hearthhack.util.GetAccountInfoRequest.ARCANE_DUST_BALANCE;
public class DustBalance extends GenericParser {
@Override
public void parseGenericRequest(int token, TcpConnection conn) throws Exception {
Protocol.ArcaneDustBalance dustBalance = Protocol.ArcaneDustBalance.newBuilder()
.setBalance(665)
.build();
Protocol.Notification n = generateNotification(262, dustBalance.toByteString(), dustBalance.getSerializedSize());
Protocol.Header header = Protocol.Header.newBuilder()
.setServiceId(4)
.setMethodId(1)
.setToken(conn.nextToken())
.setObjectId(0)
.setSize(n.getSerializedSize())
.setStatus(0)
.build();
conn.send(new BattleNetPacket(header, n.toByteArray()));
}
@Override
public GetAccountInfoRequest getId() {
return ARCANE_DUST_BALANCE;
}
}

View File

@ -0,0 +1,80 @@
package com.alterdekim.hearthhack.component.processor.client.request.generic;
import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.GetAccountInfoRequest;
import static com.alterdekim.hearthhack.util.GameUtilities.generateNotification;
import static com.alterdekim.hearthhack.util.GetAccountInfoRequest.FAVORITE_HEROES;
public class FavoriteHeroes extends GenericParser {
@Override
public void parseGenericRequest(int token, TcpConnection conn) throws Exception {
Protocol.FavoriteHeroesResponse favoriteHeroesResponse = Protocol.FavoriteHeroesResponse.newBuilder()
.addFavoriteHeroes(Protocol.FavoriteHero.newBuilder()
.setClassId(2)
.setHero(Protocol.CardDef.newBuilder()
.setAsset(274)
.setPremium(0)))
.addFavoriteHeroes(Protocol.FavoriteHero.newBuilder()
.setClassId(3)
.setHero(Protocol.CardDef.newBuilder()
.setAsset(31)
.setPremium(0)))
.addFavoriteHeroes(Protocol.FavoriteHero.newBuilder()
.setClassId(4)
.setHero(Protocol.CardDef.newBuilder()
.setAsset(637)
.setPremium(0)))
.addFavoriteHeroes(Protocol.FavoriteHero.newBuilder()
.setClassId(5)
.setHero(Protocol.CardDef.newBuilder()
.setAsset(671)
.setPremium(0)))
.addFavoriteHeroes(Protocol.FavoriteHero.newBuilder()
.setClassId(6)
.setHero(Protocol.CardDef.newBuilder()
.setAsset(813)
.setPremium(0)))
.addFavoriteHeroes(Protocol.FavoriteHero.newBuilder()
.setClassId(7)
.setHero(Protocol.CardDef.newBuilder()
.setAsset(930)
.setPremium(0)))
.addFavoriteHeroes(Protocol.FavoriteHero.newBuilder()
.setClassId(8)
.setHero(Protocol.CardDef.newBuilder()
.setAsset(1066)
.setPremium(0)))
.addFavoriteHeroes(Protocol.FavoriteHero.newBuilder()
.setClassId(9)
.setHero(Protocol.CardDef.newBuilder()
.setAsset(893)
.setPremium(0)))
.addFavoriteHeroes(Protocol.FavoriteHero.newBuilder()
.setClassId(10)
.setHero(Protocol.CardDef.newBuilder()
.setAsset(7)
.setPremium(0)))
.build();
Protocol.Notification n = generateNotification(318, favoriteHeroesResponse.toByteString(), favoriteHeroesResponse.getSerializedSize());
Protocol.Header header = Protocol.Header.newBuilder()
.setServiceId(4)
.setMethodId(1)
.setToken(conn.nextToken())
.setObjectId(0)
.setSize(n.getSerializedSize())
.setStatus(0)
.build();
conn.send(new BattleNetPacket(header, n.toByteArray()));
}
@Override
public GetAccountInfoRequest getId() {
return FAVORITE_HEROES;
}
}

View File

@ -0,0 +1,47 @@
package com.alterdekim.hearthhack.component.processor.client.request.generic;
import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.GetAccountInfoRequest;
import lombok.extern.slf4j.Slf4j;
import org.reflections.Reflections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
@Slf4j
public class GeneralGenericParser {
private Map<GetAccountInfoRequest, GenericParser> parsers;
public GeneralGenericParser() {
init();
}
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) {
GetAccountInfoRequest req = GetAccountInfoRequest.parseFromInt(request.getRequestSubId());
if( !this.parsers.containsKey(req) ) {
log.warn("Unknown generic request: {}", req);
return;
}
try {
this.parsers.get(req).parseGenericRequest(token, conn);
} catch (Exception e) {
log.error(e.getMessage());
}
}
}

View File

@ -0,0 +1,20 @@
package com.alterdekim.hearthhack.component.processor.client.request.generic;
import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.reflect.AbstractParser;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.GetAccountInfoRequest;
import com.alterdekim.hearthhack.util.Util;
import lombok.NoArgsConstructor;
import static com.alterdekim.hearthhack.util.GameUtilities.generateNotification;
@NoArgsConstructor
public abstract class GenericParser implements AbstractParser {
public abstract void parseGenericRequest(int token, TcpConnection conn) throws Exception;
@Override
public abstract int getId();
}

View File

@ -0,0 +1,39 @@
package com.alterdekim.hearthhack.component.processor.client.request.generic;
import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.GetAccountInfoRequest;
import static com.alterdekim.hearthhack.util.GameUtilities.generateNotification;
import static com.alterdekim.hearthhack.util.GetAccountInfoRequest.GOLD_BALANCE;
public class GoldBalance extends GenericParser{
@Override
public void parseGenericRequest(int token, TcpConnection conn) throws Exception {
Protocol.GoldBalance gb = Protocol.GoldBalance.newBuilder()
.setCap(999999)
.setBonusBalance(165)
.setCappedBalance(160)
.setCapWarning(2000)
.build();
byte[] b = generateNotification(278, gb.toByteString(), gb.getSerializedSize()).toByteArray();
Protocol.Header header = Protocol.Header.newBuilder()
.setServiceId(4)
.setMethodId(1)
.setToken(conn.nextToken())
.setObjectId(0)
.setSize(b.length)
.setStatus(0)
.build();
conn.send(new BattleNetPacket(header, b));
}
@Override
public GetAccountInfoRequest getId() {
return GOLD_BALANCE;
}
}

View File

@ -0,0 +1,153 @@
package com.alterdekim.hearthhack.component.processor.client.request.generic;
import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.GetAccountInfoRequest;
import static com.alterdekim.hearthhack.util.GameUtilities.generateNotification;
import static com.alterdekim.hearthhack.util.GetAccountInfoRequest.HERO_XP;
public class HeroXP extends GenericParser {
@Override
public void parseGenericRequest(int token, TcpConnection conn) throws Exception {
Protocol.HeroXP xp = Protocol.HeroXP.newBuilder()
.addXpInfos(Protocol.HeroXPInfo.newBuilder()
.setClassId(2)
.setLevel(1)
.setCurrXp(0)
.setMaxXp(70)
.setNextReward(Protocol.NextHeroLevelReward.newBuilder()
.setLevel(2)
.setRewardCard(Protocol.ProfileNoticeRewardCard.newBuilder()
.setCard(Protocol.CardDef.newBuilder()
.setAsset(823)
.setPremium(0))
.setQuantity(2))
))
.addXpInfos(Protocol.HeroXPInfo.newBuilder()
.setClassId(3)
.setLevel(1)
.setCurrXp(0)
.setMaxXp(70)
.setNextReward(Protocol.NextHeroLevelReward.newBuilder()
.setLevel(2)
.setRewardCard(Protocol.ProfileNoticeRewardCard.newBuilder()
.setCard(Protocol.CardDef.newBuilder()
.setAsset(437)
.setPremium(0))
.setQuantity(2))
))
.addXpInfos(Protocol.HeroXPInfo.newBuilder()
.setClassId(4)
.setLevel(2)
.setCurrXp(12)
.setMaxXp(80)
.setNextReward(Protocol.NextHeroLevelReward.newBuilder()
.setLevel(4)
.setRewardCard(Protocol.ProfileNoticeRewardCard.newBuilder()
.setCard(Protocol.CardDef.newBuilder()
.setAsset(1084)
.setPremium(0))
.setQuantity(2))
))
.addXpInfos(Protocol.HeroXPInfo.newBuilder()
.setClassId(5)
.setLevel(1)
.setCurrXp(0)
.setMaxXp(70)
.setNextReward(Protocol.NextHeroLevelReward.newBuilder()
.setLevel(2)
.setRewardCard(Protocol.ProfileNoticeRewardCard.newBuilder()
.setCard(Protocol.CardDef.newBuilder()
.setAsset(847)
.setPremium(0))
.setQuantity(2))
))
.addXpInfos(Protocol.HeroXPInfo.newBuilder()
.setClassId(6)
.setLevel(1)
.setCurrXp(0)
.setMaxXp(70)
.setNextReward(Protocol.NextHeroLevelReward.newBuilder()
.setLevel(2)
.setRewardCard(Protocol.ProfileNoticeRewardCard.newBuilder()
.setCard(Protocol.CardDef.newBuilder()
.setAsset(1361)
.setPremium(0))
.setQuantity(2))
))
.addXpInfos(Protocol.HeroXPInfo.newBuilder()
.setClassId(7)
.setLevel(1)
.setCurrXp(0)
.setMaxXp(70)
.setNextReward(Protocol.NextHeroLevelReward.newBuilder()
.setLevel(2)
.setRewardCard(Protocol.ProfileNoticeRewardCard.newBuilder()
.setCard(Protocol.CardDef.newBuilder()
.setAsset(421)
.setPremium(0))
.setQuantity(2))
))
.addXpInfos(Protocol.HeroXPInfo.newBuilder()
.setClassId(8)
.setLevel(1)
.setCurrXp(0)
.setMaxXp(70)
.setNextReward(Protocol.NextHeroLevelReward.newBuilder()
.setLevel(2)
.setRewardCard(Protocol.ProfileNoticeRewardCard.newBuilder()
.setCard(Protocol.CardDef.newBuilder()
.setAsset(1171)
.setPremium(0))
.setQuantity(2))
))
.addXpInfos(Protocol.HeroXPInfo.newBuilder()
.setClassId(9)
.setLevel(1)
.setCurrXp(0)
.setMaxXp(70)
.setNextReward(Protocol.NextHeroLevelReward.newBuilder()
.setLevel(2)
.setRewardCard(Protocol.ProfileNoticeRewardCard.newBuilder()
.setCard(Protocol.CardDef.newBuilder()
.setAsset(982)
.setPremium(0))
.setQuantity(2))
))
.addXpInfos(Protocol.HeroXPInfo.newBuilder()
.setClassId(10)
.setLevel(1)
.setCurrXp(0)
.setMaxXp(70)
.setNextReward(Protocol.NextHeroLevelReward.newBuilder()
.setLevel(2)
.setRewardCard(Protocol.ProfileNoticeRewardCard.newBuilder()
.setCard(Protocol.CardDef.newBuilder()
.setAsset(940)
.setPremium(0))
.setQuantity(2))
))
.build();
Protocol.Notification n = generateNotification(283, xp.toByteString(), xp.getSerializedSize());
Protocol.Header header = Protocol.Header.newBuilder()
.setServiceId(4)
.setMethodId(1)
.setToken(conn.nextToken())
.setObjectId(0)
.setSize(n.getSerializedSize())
.setStatus(0)
.build();
conn.send(new BattleNetPacket(header, n.toByteArray()));
}
@Override
public GetAccountInfoRequest getId() {
return HERO_XP;
}
}

View File

@ -0,0 +1,55 @@
package com.alterdekim.hearthhack.component.processor.client.request.generic;
import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.GetAccountInfoRequest;
import static com.alterdekim.hearthhack.util.GameUtilities.generateNotification;
import static com.alterdekim.hearthhack.util.GetAccountInfoRequest.MEDAL_INFO;
public class MedalInfo extends GenericParser {
@Override
public void parseGenericRequest(int token, TcpConnection conn) throws Exception {
Protocol.MedalInfo medalInfo = Protocol.MedalInfo.newBuilder()
.setWild(Protocol.MedalInfoData.newBuilder()
.setSeasonWins(0)
.setStars(0)
.setStreak(0)
.setStarLevel(1)
.setLevelStart(1)
.setLevelEnd(3)
.setCanLoseLevel(false)
.setBestStarLevel(1)
.setCanLoseStars(false))
.setStandard(Protocol.MedalInfoData.newBuilder()
.setSeasonWins(0)
.setStars(0)
.setStreak(0)
.setStarLevel(1)
.setLevelStart(1)
.setLevelEnd(3)
.setCanLoseLevel(false)
.setBestStarLevel(1)
.setCanLoseStars(false))
.build();
Protocol.Notification n = generateNotification(232, medalInfo.toByteString(), medalInfo.getSerializedSize());
Protocol.Header header = Protocol.Header.newBuilder()
.setServiceId(4)
.setMethodId(1)
.setToken(conn.nextToken())
.setObjectId(0)
.setSize(n.getSerializedSize())
.setStatus(0)
.build();
conn.send(new BattleNetPacket(header, n.toByteArray()));
}
@Override
public GetAccountInfoRequest getId() {
return MEDAL_INFO;
}
}

View File

@ -0,0 +1,136 @@
package com.alterdekim.hearthhack.component.processor.client.request.generic;
import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.GetAccountInfoRequest;
import static com.alterdekim.hearthhack.util.GameUtilities.generateNotification;
import static com.alterdekim.hearthhack.util.GetAccountInfoRequest.NOT_SO_MASSIVE_LOGIN;
public class NotSoMassiveLoginReply extends GenericParser {
@Override
public void parseGenericRequest(int token, TcpConnection conn) throws Exception {
Protocol.NotSoMassiveLoginReply reply = Protocol.NotSoMassiveLoginReply.newBuilder()
.addSpecialEventTiming(Protocol.SpecialEventTiming.newBuilder()
.setEvent("launch"))
.addSpecialEventTiming(Protocol.SpecialEventTiming.newBuilder()
.setEvent("naxx_1")
.setStart(0))
.addSpecialEventTiming(Protocol.SpecialEventTiming.newBuilder()
.setEvent("naxx_2")
.setStart(0))
.addSpecialEventTiming(Protocol.SpecialEventTiming.newBuilder()
.setEvent("naxx_3")
.setStart(0))
.addSpecialEventTiming(Protocol.SpecialEventTiming.newBuilder()
.setEvent("naxx_4")
.setStart(0))
.addSpecialEventTiming(Protocol.SpecialEventTiming.newBuilder()
.setEvent("naxx_5")
.setStart(0))
.addSpecialEventTiming(Protocol.SpecialEventTiming.newBuilder()
.setEvent("gvg_promote")
.setStart(1)
.setEnd(0))
.addSpecialEventTiming(Protocol.SpecialEventTiming.newBuilder()
.setEvent("gvg_begin")
.setStart(1)
.setEnd(0))
.addSpecialEventTiming(Protocol.SpecialEventTiming.newBuilder()
.setEvent("gvg_arena")
.setStart(0))
.addSpecialEventTiming(Protocol.SpecialEventTiming.newBuilder()
.setEvent("brm_1")
.setStart(0))
.addSpecialEventTiming(Protocol.SpecialEventTiming.newBuilder()
.setEvent("brm_2")
.setStart(0))
.addSpecialEventTiming(Protocol.SpecialEventTiming.newBuilder()
.setEvent("brm_3")
.setStart(0))
.addSpecialEventTiming(Protocol.SpecialEventTiming.newBuilder()
.setEvent("brm_4")
.setStart(0))
.addSpecialEventTiming(Protocol.SpecialEventTiming.newBuilder()
.setEvent("brm_5")
.setStart(0))
.addSpecialEventTiming(Protocol.SpecialEventTiming.newBuilder()
.setEvent("brm_pre_sale")
.setStart(1)
.setEnd(0))
.addSpecialEventTiming(Protocol.SpecialEventTiming.newBuilder()
.setEvent("brm_normal_sale")
.setStart(0))
.addSpecialEventTiming(Protocol.SpecialEventTiming.newBuilder()
.setEvent("tgt_pre_sale")
.setStart(1)
.setEnd(0))
.addSpecialEventTiming(Protocol.SpecialEventTiming.newBuilder()
.setEvent("tgt_normal_sale")
.setStart(0))
.addSpecialEventTiming(Protocol.SpecialEventTiming.newBuilder()
.setEvent("loe_1")
.setStart(0))
.addSpecialEventTiming(Protocol.SpecialEventTiming.newBuilder()
.setEvent("loe_2")
.setStart(0))
.addSpecialEventTiming(Protocol.SpecialEventTiming.newBuilder()
.setEvent("loe_3")
.setStart(0))
.addSpecialEventTiming(Protocol.SpecialEventTiming.newBuilder()
.setEvent("loe_4")
.setStart(0))
.addSpecialEventTiming(Protocol.SpecialEventTiming.newBuilder()
.setEvent("feast_of_winter_veil")
.setStart(1)
.setEnd(0))
.addSpecialEventTiming(Protocol.SpecialEventTiming.newBuilder()
.setEvent("set_rotation_2016")
.setStart(0))
.addSpecialEventTiming(Protocol.SpecialEventTiming.newBuilder()
.setEvent("og_pre_purchase")
.setStart(1)
.setEnd(0))
.addSpecialEventTiming(Protocol.SpecialEventTiming.newBuilder()
.setEvent("og_normal_sale")
.setStart(0))
.addSpecialEventTiming(Protocol.SpecialEventTiming.newBuilder()
.setEvent("apple_charity_promo_2016")
.setStart(1)
.setEnd(0))
.addSpecialEventTiming(Protocol.SpecialEventTiming.newBuilder()
.setEvent("naxx_gvg_real_money_sale")
.setStart(1)
.setEnd(0))
.addSpecialEventTiming(Protocol.SpecialEventTiming.newBuilder()
.setEvent("set_rotation_2016_freepacks")
.setStart(0)
.setEnd(5059030))
.addSpecialEventTiming(Protocol.SpecialEventTiming.newBuilder()
.setEvent("set_rotation_2016_questline")
.setStart(0)
.setEnd(5059028))
.setTavernBrawls(Protocol.TavernBrawlInfo.newBuilder()
.setNextStartSecondsFromNow(124398L))
.build();
Protocol.Notification n = generateNotification(300, reply.toByteString(), reply.getSerializedSize());
Protocol.Header header = Protocol.Header.newBuilder()
.setServiceId(4)
.setMethodId(1)
.setToken(conn.nextToken())
.setObjectId(0)
.setSize(n.getSerializedSize())
.setStatus(0)
.build();
conn.send(new BattleNetPacket(header, n.toByteArray()));
}
@Override
public GetAccountInfoRequest getId() {
return NOT_SO_MASSIVE_LOGIN;
}
}

View File

@ -0,0 +1,59 @@
package com.alterdekim.hearthhack.component.processor.client.request.generic;
import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.GetAccountInfoRequest;
import static com.alterdekim.hearthhack.util.GameUtilities.generateNotification;
import static com.alterdekim.hearthhack.util.GetAccountInfoRequest.PLAYER_RECORD;
public class PlayerRecords extends GenericParser {
@Override
public void parseGenericRequest(int token, TcpConnection conn) throws Exception {
Protocol.PlayerRecords playerRecords = Protocol.PlayerRecords.newBuilder()
.addRecords(Protocol.PlayerRecord.newBuilder()
.setType(Protocol.GameType.GT_VS_AI)
.setWins(1)
.setLosses(0))
.addRecords(Protocol.PlayerRecord.newBuilder()
.setType(Protocol.GameType.GT_VS_AI)
.setData(637)
.setWins(1)
.setLosses(0))
.addRecords(Protocol.PlayerRecord.newBuilder()
.setType(Protocol.GameType.GT_TUTORIAL)
.setWins(6)
.setLosses(1))
.addRecords(Protocol.PlayerRecord.newBuilder()
.setType(Protocol.GameType.GT_TUTORIAL)
.setData(637)
.setWins(1)
.setLosses(0))
.addRecords(Protocol.PlayerRecord.newBuilder()
.setType(Protocol.GameType.GT_TUTORIAL)
.setData(1325)
.setWins(5)
.setLosses(1))
.build();
Protocol.Notification n = generateNotification(270, playerRecords.toByteString(), playerRecords.getSerializedSize());
Protocol.Header header = Protocol.Header.newBuilder()
.setServiceId(4)
.setMethodId(1)
.setToken(conn.nextToken())
.setObjectId(0)
.setSize(n.getSerializedSize())
.setStatus(0)
.build();
conn.send(new BattleNetPacket(header, n.toByteArray()));
}
@Override
public GetAccountInfoRequest getId() {
return PLAYER_RECORD;
}
}

View File

@ -0,0 +1,33 @@
package com.alterdekim.hearthhack.component.processor.client.request.generic;
import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.GetAccountInfoRequest;
import static com.alterdekim.hearthhack.util.GameUtilities.generateEmptyNotification;
import static com.alterdekim.hearthhack.util.GetAccountInfoRequest.NOTICES;
public class ProfileNotices extends GenericParser {
@Override
public void parseGenericRequest(int token, TcpConnection conn) throws Exception {
// Protocol.ProfileNotices
Protocol.Notification n = generateEmptyNotification(212);
Protocol.Header header = Protocol.Header.newBuilder()
.setServiceId(4)
.setMethodId(1)
.setToken(conn.nextToken())
.setObjectId(0)
.setSize(n.getSerializedSize())
.setStatus(0)
.build();
conn.send(new BattleNetPacket(header, n.toByteArray()));
}
@Override
public GetAccountInfoRequest getId() {
return NOTICES;
}
}

View File

@ -0,0 +1,37 @@
package com.alterdekim.hearthhack.component.processor.client.request.generic;
import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.GetAccountInfoRequest;
import static com.alterdekim.hearthhack.util.GameUtilities.generateNotification;
import static com.alterdekim.hearthhack.util.GetAccountInfoRequest.CAMPAIGN_INFO;
public class ProfileProgress extends GenericParser {
@Override
public void parseGenericRequest(int token, TcpConnection conn) throws Exception {
Protocol.ProfileProgress profileProgress = Protocol.ProfileProgress.newBuilder()
.setProgress(6)
.setBestForge(0)
.build();
Protocol.Notification n = generateNotification(233, profileProgress.toByteString(), profileProgress.getSerializedSize());
Protocol.Header header = Protocol.Header.newBuilder()
.setServiceId(4)
.setMethodId(1)
.setToken(conn.nextToken())
.setObjectId(0)
.setSize(n.getSerializedSize())
.setStatus(0)
.build();
conn.send(new BattleNetPacket(header, n.toByteArray()));
}
@Override
public GetAccountInfoRequest getId() {
return CAMPAIGN_INFO;
}
}

View File

@ -0,0 +1,57 @@
package com.alterdekim.hearthhack.component.processor.client.request.generic;
import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.GetAccountInfoRequest;
import static com.alterdekim.hearthhack.util.GameUtilities.generateNotification;
import static com.alterdekim.hearthhack.util.GetAccountInfoRequest.REWARD_PROGRESS;
public class RewardProgress extends GenericParser {
@Override
public void parseGenericRequest(int token, TcpConnection conn) throws Exception {
Protocol.RewardProgress rewardProgress = Protocol.RewardProgress.newBuilder()
.setSeasonEnd(Protocol.Date.newBuilder()
.setYear(2016)
.setMonth(5)
.setDay(31)
.setHours(22)
.setMin(6)
.setSec(18))
.setWinsPerGold(3)
.setGoldPerReward(10)
.setMaxGoldPerDay(100)
.setSeasonNumber(31)
.setXpSoloLimit(60)
.setMaxHeroLevel(60)
.setEventTimingMod(-0.08333333f)
.setNextQuestCancel(Protocol.Date.newBuilder()
.setYear(2016)
.setMonth(5)
.setDay(3)
.setHours(0)
.setMin(0)
.setSec(0))
.build();
Protocol.Notification n = generateNotification(271, rewardProgress.toByteString(), rewardProgress.getSerializedSize());
Protocol.Header header = Protocol.Header.newBuilder()
.setServiceId(4)
.setMethodId(1)
.setToken(conn.nextToken())
.setObjectId(0)
.setSize(n.getSerializedSize())
.setStatus(0)
.build();
conn.send(new BattleNetPacket(header, n.toByteArray()));
}
@Override
public GetAccountInfoRequest getId() {
return REWARD_PROGRESS;
}
}

View File

@ -0,0 +1,5 @@
package com.alterdekim.hearthhack.reflect;
public interface AbstractParser {
int getId();
}

View File

@ -0,0 +1,28 @@
package com.alterdekim.hearthhack.reflect;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.reflections.Reflections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
@Slf4j
public class ReflectionLoader<V extends AbstractParser> {
@Getter
private Map<Integer, V> parsers;
public void initReflect(Class<V> vClass) {
this.parsers = new HashMap<>();
Set<Class<? extends V>> processorClasses = new Reflections(this.getClass().getPackageName()).getSubTypesOf(vClass);
processorClasses.forEach(c -> {
try {
var ci = c.getDeclaredConstructor().newInstance();
this.parsers.put(ci.getId(), ci);
} catch (Exception e) {
log.error(e.getMessage());
}
});
}
}

View File

@ -0,0 +1,64 @@
package com.alterdekim.hearthhack.util;
import com.alterdekim.Protocol;
import com.google.protobuf.ByteString;
public class GameUtilities {
public static Protocol.Notification generateNotification(int message_type, ByteString bs, int size) {
return Protocol.Notification.newBuilder()
.setSenderId(Protocol.EntityId.newBuilder()
.setHigh(144115188075855872L)
.setLow(0))
.setTargetId(Protocol.EntityId.newBuilder()
.setHigh(144115198130930503L)
.setLow(78330215))
.setType("WTCG.UtilNotificationMessage")
.setSenderBattleTag("")
.setSenderAccountId(Protocol.EntityId.newBuilder()
.setHigh(72057594037927936L)
.setLow(0))
.setTargetAccountId(Protocol.EntityId.newBuilder()
.setHigh(72057594037927936L)
.setLow(437154195))
.addAttribute(Protocol.Attribute.newBuilder()
.setName("message_type")
.setValue(Protocol.Variant.newBuilder()
.setIntValue(message_type)))
.addAttribute(Protocol.Attribute.newBuilder()
.setName("fragment_000")
.setValue(Protocol.Variant.newBuilder()
.setBlobValue(bs)))
.addAttribute(Protocol.Attribute.newBuilder()
.setName("message_size")
.setValue(Protocol.Variant.newBuilder()
.setIntValue(size)))
.build();
}
public static Protocol.Notification generateEmptyNotification(int message_type) {
return Protocol.Notification.newBuilder()
.setSenderId(Protocol.EntityId.newBuilder()
.setHigh(144115188075855872L)
.setLow(0))
.setTargetId(Protocol.EntityId.newBuilder()
.setHigh(144115198130930503L)
.setLow(78330215))
.setType("WTCG.UtilNotificationMessage")
.setSenderBattleTag("")
.setSenderAccountId(Protocol.EntityId.newBuilder()
.setHigh(72057594037927936L)
.setLow(0))
.setTargetAccountId(Protocol.EntityId.newBuilder()
.setHigh(72057594037927936L)
.setLow(437154195))
.addAttribute(Protocol.Attribute.newBuilder()
.setName("message_type")
.setValue(Protocol.Variant.newBuilder()
.setIntValue(message_type)))
.addAttribute(Protocol.Attribute.newBuilder()
.setName("message_size")
.setValue(Protocol.Variant.newBuilder()
.setIntValue(0)))
.build();
}
}

View File

@ -138,11 +138,13 @@ public class Util {
return s.length() % 2 == 0 ? s : "0" + s;
}
public static void setTimeout(Runnable runnable, int delay) {
public static void setInterval(Runnable runnable, int interval) {
new Thread(() -> {
try {
Thread.sleep(delay);
runnable.run();
while(true) {
Thread.sleep(interval);
runnable.run();
}
} catch (Exception e){
log.error(e.getMessage());
}