diff --git a/src/main/java/com/icedberries/UBFunkeysServer/ArkOne/ArkOneController.java b/src/main/java/com/icedberries/UBFunkeysServer/ArkOne/ArkOneController.java index fbb1141..504744e 100644 --- a/src/main/java/com/icedberries/UBFunkeysServer/ArkOne/ArkOneController.java +++ b/src/main/java/com/icedberries/UBFunkeysServer/ArkOne/ArkOneController.java @@ -147,6 +147,9 @@ public class ArkOneController implements TcpHandler { case "gfl": responses.add(trunkPlugin.GetFamiliarsList()); break; + case "gjl": + responses.add(trunkPlugin.GetJammerList()); + break; case "gutc": responses.add(trunkPlugin.GetUserTransactionsCount(connection)); break; @@ -154,11 +157,14 @@ public class ArkOneController implements TcpHandler { responses.add(trunkPlugin.GetUserTransactions(connection)); break; case "asp": - responses.add(trunkPlugin.AssetParam()); + responses.add(trunkPlugin.AssetParam(commandInfo, connection)); break; case "bf": responses.add(trunkPlugin.BuyFamiliar(commandInfo, connection)); break; + case "bj": + responses.add(trunkPlugin.BuyJammer(commandInfo, connection)); + break; // Catch Unhandled Commands default: diff --git a/src/main/java/com/icedberries/UBFunkeysServer/ArkOne/Plugins/TrunkPlugin.java b/src/main/java/com/icedberries/UBFunkeysServer/ArkOne/Plugins/TrunkPlugin.java index a1edf9d..e9c550d 100644 --- a/src/main/java/com/icedberries/UBFunkeysServer/ArkOne/Plugins/TrunkPlugin.java +++ b/src/main/java/com/icedberries/UBFunkeysServer/ArkOne/Plugins/TrunkPlugin.java @@ -1,10 +1,13 @@ package com.icedberries.UBFunkeysServer.ArkOne.Plugins; import com.icedberries.UBFunkeysServer.ArkOne.ArkOneParser; +import com.icedberries.UBFunkeysServer.DatabaseSetup.TrunkData; import com.icedberries.UBFunkeysServer.domain.Familiar; +import com.icedberries.UBFunkeysServer.domain.Jammer; import com.icedberries.UBFunkeysServer.domain.User; import com.icedberries.UBFunkeysServer.service.FamiliarService; import com.icedberries.UBFunkeysServer.service.FileService; +import com.icedberries.UBFunkeysServer.service.JammerService; import com.icedberries.UBFunkeysServer.service.UserService; import javagrinko.spring.tcp.Connection; import javagrinko.spring.tcp.Server; @@ -34,7 +37,8 @@ public class TrunkPlugin { private final Integer LOOT_BALANCE = 2500; private enum PurchaseType { - FAMILIAR + FAMILIAR, + JAMMER } @Autowired @@ -46,11 +50,14 @@ public class TrunkPlugin { @Autowired FamiliarService familiarService; + @Autowired + JammerService jammerService; + @Autowired UserService userService; public String GetUserAssets(Connection connection) throws ParserConfigurationException, IOException, SAXException { - //TODO: IMPLEMENT ITEMS | MOODS | JAMMERS + //TODO: IMPLEMENT ITEMS | MOODS // Moods - Tag looks like this: // Append the starting tags @@ -88,6 +95,17 @@ public class TrunkPlugin { // id -> item id response.append(""); } + + /* Append the jammers + * NOTE: We have to store this on the profile since the user doesn't properly save jammer + * counts to the profile data + */ + User user = server.getConnectedUsers().get(connection.getClientIdentifier()); + Integer p = user.getJammersUsed() != null ? user.getJammersUsed() : 0; + Integer c = user.getJammersTotal() != null ? user.getJammersTotal() : 0; + if (c > 0) { + response.append(""); + } } // Append the ending tags @@ -112,7 +130,7 @@ public class TrunkPlugin { // Iterate over the items in the familiars list to add them to the response for (Familiar familiar : familiars) { - stringBuilder.append(""); } @@ -124,6 +142,28 @@ public class TrunkPlugin { return stringBuilder.toString(); } + public String GetJammerList() { + + // Get all the jammers + List jammers = jammerService.findAll(); + + // Start to build the response + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(""); + + // Iterate over the items in the familiars list to add them to the response + for (Jammer jammer : jammers) { + stringBuilder.append(""); + } + + // Add closing tags + stringBuilder.append(""); + + // Return the list + return stringBuilder.toString(); + } + public String GetUserTransactionsCount(Connection connection) { User user = server.getConnectedUsers().get(connection.getClientIdentifier()); @@ -157,20 +197,50 @@ public class TrunkPlugin { } } - public String AssetParam() { - // Doesn't seem to be needed so we can just respond with an empty xml tag + public String AssetParam(Element element, Connection connection) { + /* This method would be used to update the server profile data for when familiars are started (setting start time) + * Or when you use a jammer + * + * For familiars we can trust the profile data saved and load from those + * For jammers, the profile doesn't update properly so we need to update the jammer used count when received + */ + + // Check for id equal to the jammer rid + if (element.getAttribute("id").equals("80014a")) { + User user = server.getConnectedUsers().get(connection.getClientIdentifier()); + Integer newUsed = Integer.valueOf(element.getAttribute("p")); + user.setJammersUsed(newUsed); + userService.updateUserOnServer(connection, user); + } + + // Return this regardless of outcome (I don't believe a response is read from this) return ""; } public String BuyFamiliar(Element element, Connection connection) { // Save this transaction to the DB - PostTransaction(connection, PurchaseType.FAMILIAR, element.getAttribute("id")); + PostTransaction(connection, PurchaseType.FAMILIAR, Integer.valueOf(element.getAttribute("id"))); // We always return LOOT_BALANCE so players are never charged for these items return ""; } - public void PostTransaction(Connection connection, PurchaseType purchaseType, String itemId) { + public String BuyJammer(Element element, Connection connection) { + // Save this transaction to the DB + PostTransaction(connection, PurchaseType.JAMMER, Integer.valueOf(element.getAttribute("id"))); + + // Increase the amount of jammers a player has in their account + User user = server.getConnectedUsers().get(connection.getClientIdentifier()); + Integer qtyBought = jammerService.getQtyById(Integer.valueOf(element.getAttribute("id"))); + Integer currentTotal = user.getJammersTotal() != null ? user.getJammersTotal() : 0; + user.setJammersTotal(currentTotal + qtyBought); + userService.updateUserOnServer(connection, user); + + // We always return LOOT_BALANCE so players are never charged for these items + return ""; + } + + public void PostTransaction(Connection connection, PurchaseType purchaseType, Integer itemId) { User user = server.getConnectedUsers().get(connection.getClientIdentifier()); // Get the date for this transaction @@ -184,10 +254,24 @@ public class TrunkPlugin { case FAMILIAR: cost = familiarService.getCostById(itemId); break; + case JAMMER: + cost = jammerService.getCostById(itemId); + break; + } + + // Get the rid of the item + String rid = ""; + switch(purchaseType) { + case FAMILIAR: + rid = familiarService.getRidById(itemId); + break; + case JAMMER: + rid = jammerService.getRidById(itemId); + break; } // Create a transaction xml tag - String transaction = ""; // Append to the user's transaction history diff --git a/src/main/java/com/icedberries/UBFunkeysServer/ArkOne/Plugins/UserPlugin.java b/src/main/java/com/icedberries/UBFunkeysServer/ArkOne/Plugins/UserPlugin.java index c37b226..25a3dd4 100644 --- a/src/main/java/com/icedberries/UBFunkeysServer/ArkOne/Plugins/UserPlugin.java +++ b/src/main/java/com/icedberries/UBFunkeysServer/ArkOne/Plugins/UserPlugin.java @@ -54,6 +54,8 @@ public class UserPlugin { .rawBuddyList("") .transactionCount(0) .transactionHistory("") + .jammersUsed(0) + .jammersTotal(0) .build(); // 0 - Successfully registered diff --git a/src/main/java/com/icedberries/UBFunkeysServer/DatabaseSetup/TrunkData.java b/src/main/java/com/icedberries/UBFunkeysServer/DatabaseSetup/TrunkData.java index 171ed31..0adc0e4 100644 --- a/src/main/java/com/icedberries/UBFunkeysServer/DatabaseSetup/TrunkData.java +++ b/src/main/java/com/icedberries/UBFunkeysServer/DatabaseSetup/TrunkData.java @@ -1,7 +1,9 @@ package com.icedberries.UBFunkeysServer.DatabaseSetup; import com.icedberries.UBFunkeysServer.domain.Familiar; +import com.icedberries.UBFunkeysServer.domain.Jammer; import com.icedberries.UBFunkeysServer.service.FamiliarService; +import com.icedberries.UBFunkeysServer.service.JammerService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.event.EventListener; @@ -16,10 +18,25 @@ public class TrunkData { @Autowired FamiliarService familiarService; + @Autowired + JammerService jammerService; + // List of all familiar ids private final List familiarIds = Arrays.asList("80036a", "80035a", "80034a", "80033a", "80032a", "80031a", "80030a", "80029a", "80028a", "80027a", "80026a", "80025a", "80017a", "80016a", "80015a", "80007a", "80006a", "80005a", "80004a", "80003a", "80002a", "80001a", "80000a"); + + public static final String JAMMER_RID = "80014a"; + private final List JAMMER_PACKAGE_QTYS = Arrays.asList(1, 5, 10, 25, 50, 100); + String PackageOf1 = ""; + String PackageOf5 = ""; + String PackageOf10 = ""; + String PackageOf25 = ""; + String PackageOf50 = ""; + String PackageOf100 = ""; + + private final Integer JAMMER_COST = 10; + private final Integer FAMILIAR_COST = 100; private final Integer FAMILIAR_DISCOUNT_COST = 50; private final Integer FAMILIAR_DURATION = 720; @@ -27,15 +44,17 @@ public class TrunkData { @EventListener(ApplicationReadyEvent.class) public void insertFamiliars() { // Iterate over the familiar ids + int idNum = 0; for (String id : familiarIds) { // Attempt to get it from the DB - Familiar familiar = familiarService.findById(id).orElse(null); + Familiar familiar = familiarService.findByRid(id).orElse(null); // Only insert if the data is null if (familiar == null) { // Build a new familiar to insert Familiar newFamiliar = Familiar.builder() - .id(id) + .id(idNum) + .rid(id) .cost(FAMILIAR_COST) .discountedCost(FAMILIAR_DISCOUNT_COST) .duration(FAMILIAR_DURATION) @@ -44,6 +63,36 @@ public class TrunkData { // Save it to the db familiarService.save(newFamiliar); } + + // Increment id + idNum++; + } + } + + @EventListener(ApplicationReadyEvent.class) + public void insertJammers() { + // Iterate over the jammer package quantities + int idNum = 0; + for (Integer qty : JAMMER_PACKAGE_QTYS) { + // Attempt to get from the DB + Jammer jammer = jammerService.findByQty(qty).orElse(null); + + // Only insert if the data is null + if (jammer == null) { + // Build a new jammer to insert + Jammer newJammer = Jammer.builder() + .id(idNum) + .rid(JAMMER_RID) + .cost(JAMMER_COST * qty) + .qty(qty) + .build(); + + // Save it to the db + jammerService.save(newJammer); + } + + // Increment id + idNum++; } } } diff --git a/src/main/java/com/icedberries/UBFunkeysServer/domain/Familiar.java b/src/main/java/com/icedberries/UBFunkeysServer/domain/Familiar.java index 328a00d..5f69caa 100644 --- a/src/main/java/com/icedberries/UBFunkeysServer/domain/Familiar.java +++ b/src/main/java/com/icedberries/UBFunkeysServer/domain/Familiar.java @@ -15,9 +15,12 @@ import javax.persistence.Table; @Table(name = "Familiars") public class Familiar { - // Item ID + // DB ID @Id - private String id; + private Integer id; + + // Item ID + private String rid; private Integer cost; diff --git a/src/main/java/com/icedberries/UBFunkeysServer/domain/Jammer.java b/src/main/java/com/icedberries/UBFunkeysServer/domain/Jammer.java new file mode 100644 index 0000000..3351019 --- /dev/null +++ b/src/main/java/com/icedberries/UBFunkeysServer/domain/Jammer.java @@ -0,0 +1,28 @@ +package com.icedberries.UBFunkeysServer.domain; + +import lombok.*; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "Jammers") +public class Jammer { + + // DB ID + @Id + private Integer id; + + // Item ID + private String rid; + + private Integer cost; + + private Integer qty; +} diff --git a/src/main/java/com/icedberries/UBFunkeysServer/domain/User.java b/src/main/java/com/icedberries/UBFunkeysServer/domain/User.java index b01f900..bef208b 100644 --- a/src/main/java/com/icedberries/UBFunkeysServer/domain/User.java +++ b/src/main/java/com/icedberries/UBFunkeysServer/domain/User.java @@ -81,6 +81,10 @@ public class User { @Type(type = "org.hibernate.type.TextType") private String transactionHistory; + private Integer jammersTotal; + + private Integer jammersUsed; + public java.util.UUID getConnectionId() { return java.util.UUID.fromString(connectionId); } diff --git a/src/main/java/com/icedberries/UBFunkeysServer/repository/FamiliarRepository.java b/src/main/java/com/icedberries/UBFunkeysServer/repository/FamiliarRepository.java index 56a8c31..bb0b43a 100644 --- a/src/main/java/com/icedberries/UBFunkeysServer/repository/FamiliarRepository.java +++ b/src/main/java/com/icedberries/UBFunkeysServer/repository/FamiliarRepository.java @@ -7,12 +7,18 @@ import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.util.List; +import java.util.Optional; @Repository -public interface FamiliarRepository extends CrudRepository { +public interface FamiliarRepository extends CrudRepository { List findAll(); @Query("select familiar.cost from Familiar familiar where familiar.id = :id") - Integer getCostById(@Param("id") String id); + Integer getCostById(@Param("id") Integer id); + + Optional findByRid(String rid); + + @Query("select familiar.rid from Familiar familiar where familiar.id = :id") + String getRidById(@Param("id") Integer id); } diff --git a/src/main/java/com/icedberries/UBFunkeysServer/repository/JammerRepository.java b/src/main/java/com/icedberries/UBFunkeysServer/repository/JammerRepository.java new file mode 100644 index 0000000..3c7e47a --- /dev/null +++ b/src/main/java/com/icedberries/UBFunkeysServer/repository/JammerRepository.java @@ -0,0 +1,28 @@ +package com.icedberries.UBFunkeysServer.repository; + +import com.icedberries.UBFunkeysServer.domain.Jammer; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +public interface JammerRepository extends CrudRepository { + + @Query("select jammer.cost from Jammer jammer where jammer.id = :id") + Integer getCostById(@Param("id") Integer id); + + @Query("select jammer from Jammer jammer where jammer.qty = :qty") + Optional findByQty(@Param("qty") Integer qty); + + @Query("select jammer.rid from Jammer jammer where jammer.id = :id") + String getRidById(@Param("id") Integer id); + + @Query("select jammer.qty from Jammer jammer where jammer.id = :id") + Integer getQtyById(@Param("id") Integer id); + + List findAll(); +} diff --git a/src/main/java/com/icedberries/UBFunkeysServer/service/FamiliarService.java b/src/main/java/com/icedberries/UBFunkeysServer/service/FamiliarService.java index fa9abc5..e7123cf 100644 --- a/src/main/java/com/icedberries/UBFunkeysServer/service/FamiliarService.java +++ b/src/main/java/com/icedberries/UBFunkeysServer/service/FamiliarService.java @@ -7,11 +7,13 @@ import java.util.Optional; public interface FamiliarService { - Optional findById(String id); + Optional findByRid(String rid); Familiar save(Familiar familiar); List findAll(); - Integer getCostById(String id); + Integer getCostById(Integer id); + + String getRidById(Integer id); } diff --git a/src/main/java/com/icedberries/UBFunkeysServer/service/JammerService.java b/src/main/java/com/icedberries/UBFunkeysServer/service/JammerService.java new file mode 100644 index 0000000..c229e9f --- /dev/null +++ b/src/main/java/com/icedberries/UBFunkeysServer/service/JammerService.java @@ -0,0 +1,21 @@ +package com.icedberries.UBFunkeysServer.service; + +import com.icedberries.UBFunkeysServer.domain.Jammer; + +import java.util.List; +import java.util.Optional; + +public interface JammerService { + + Integer getCostById(Integer id); + + Jammer save(Jammer jammer); + + Optional findByQty(Integer qty); + + String getRidById(Integer id); + + List findAll(); + + Integer getQtyById(Integer id); +} diff --git a/src/main/java/com/icedberries/UBFunkeysServer/service/impl/FamiliarServiceImpl.java b/src/main/java/com/icedberries/UBFunkeysServer/service/impl/FamiliarServiceImpl.java index e7b4d03..7883bf4 100644 --- a/src/main/java/com/icedberries/UBFunkeysServer/service/impl/FamiliarServiceImpl.java +++ b/src/main/java/com/icedberries/UBFunkeysServer/service/impl/FamiliarServiceImpl.java @@ -16,8 +16,8 @@ public class FamiliarServiceImpl implements FamiliarService { private final FamiliarRepository familiarRepository; @Override - public Optional findById(String id) { - return familiarRepository.findById(id); + public Optional findByRid(String rid) { + return familiarRepository.findByRid(rid); } @Override @@ -31,7 +31,12 @@ public class FamiliarServiceImpl implements FamiliarService { } @Override - public Integer getCostById(String id) { + public Integer getCostById(Integer id) { return familiarRepository.getCostById(id); } + + @Override + public String getRidById(Integer id) { + return familiarRepository.getRidById(id); + } } diff --git a/src/main/java/com/icedberries/UBFunkeysServer/service/impl/JammerServiceImpl.java b/src/main/java/com/icedberries/UBFunkeysServer/service/impl/JammerServiceImpl.java new file mode 100644 index 0000000..f313f36 --- /dev/null +++ b/src/main/java/com/icedberries/UBFunkeysServer/service/impl/JammerServiceImpl.java @@ -0,0 +1,47 @@ +package com.icedberries.UBFunkeysServer.service.impl; + +import com.icedberries.UBFunkeysServer.domain.Jammer; +import com.icedberries.UBFunkeysServer.repository.JammerRepository; +import com.icedberries.UBFunkeysServer.service.JammerService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Service +@RequiredArgsConstructor +public class JammerServiceImpl implements JammerService { + + private final JammerRepository jammerRepository; + + @Override + public Integer getCostById(Integer id) { + return jammerRepository.getCostById(id); + } + + @Override + public Jammer save(Jammer jammer) { + return jammerRepository.save(jammer); + } + + @Override + public Optional findByQty(Integer qty) { + return jammerRepository.findByQty(qty); + } + + @Override + public String getRidById(Integer id) { + return jammerRepository.getRidById(id); + } + + @Override + public List findAll() { + return jammerRepository.findAll(); + } + + @Override + public Integer getQtyById(Integer id) { + return jammerRepository.getQtyById(id); + } +}