From 879316750dd5c0760f07c1368f76bb9c172e1ecb Mon Sep 17 00:00:00 2001 From: nickreesdev Date: Fri, 19 Feb 2021 19:18:40 -0600 Subject: [PATCH 1/3] Added Harold the Delivery Man --- .../themcgamer/core/common/SkullTexture.java | 18 +++- .../core/deliveryMan/DeliveryManClient.java | 16 ++++ .../core/deliveryMan/DeliveryManManager.java | 92 +++++++++++++++++++ .../deliveryMan/DeliveryManRepository.java | 41 +++++++++ .../core/deliveryMan/DeliveryManReward.java | 38 ++++++++ .../command/DeliveryManCommand.java | 22 +++++ .../deliveryMan/menu/DeliveryManMenu.java | 89 ++++++++++++++++++ .../rewardPackage/RewardPackage.java | 20 ++++ .../impl/DailyRewardPackage.java | 16 ++++ .../impl/MonthlyRewardPackage.java | 28 ++++++ .../impl/WeeklyRewardPackage.java | 16 ++++ .../main/java/zone/themcgamer/hub/Hub.java | 3 + .../data/mysql/MySQLController.java | 6 ++ 13 files changed, 404 insertions(+), 1 deletion(-) create mode 100644 core/src/main/java/zone/themcgamer/core/deliveryMan/DeliveryManClient.java create mode 100644 core/src/main/java/zone/themcgamer/core/deliveryMan/DeliveryManManager.java create mode 100644 core/src/main/java/zone/themcgamer/core/deliveryMan/DeliveryManRepository.java create mode 100644 core/src/main/java/zone/themcgamer/core/deliveryMan/DeliveryManReward.java create mode 100644 core/src/main/java/zone/themcgamer/core/deliveryMan/command/DeliveryManCommand.java create mode 100644 core/src/main/java/zone/themcgamer/core/deliveryMan/menu/DeliveryManMenu.java create mode 100644 core/src/main/java/zone/themcgamer/core/deliveryMan/rewardPackage/RewardPackage.java create mode 100644 core/src/main/java/zone/themcgamer/core/deliveryMan/rewardPackage/impl/DailyRewardPackage.java create mode 100644 core/src/main/java/zone/themcgamer/core/deliveryMan/rewardPackage/impl/MonthlyRewardPackage.java create mode 100644 core/src/main/java/zone/themcgamer/core/deliveryMan/rewardPackage/impl/WeeklyRewardPackage.java diff --git a/core/src/main/java/zone/themcgamer/core/common/SkullTexture.java b/core/src/main/java/zone/themcgamer/core/common/SkullTexture.java index 747f863..5e67c22 100644 --- a/core/src/main/java/zone/themcgamer/core/common/SkullTexture.java +++ b/core/src/main/java/zone/themcgamer/core/common/SkullTexture.java @@ -10,8 +10,9 @@ public class SkullTexture { public static final String DIAMOND_BLOCK = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMWUwNTc5OTZjYmE0NzMyOGRmNzJmYmEzZWEyYjlhYTM1YzhhODIyN2YxY2VjODljMTg4NGRjYWRhYTgyNGQ4NSJ9fX0="; public static final String EMERALD_BLOCK = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjcyYzA1ZGQ3NjI4OGY0MzI4YTI0MzkxYmY0NzI1ZmQyMjYwNTkyZGIzY2Y5YjJiYzIwMzJkZDA1OTZjZjQ0MCJ9fX0="; public static final String COAL_BLOCK = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDdmNTc2NmQyOTI4ZGMwZGYxYjM0MDRjM2JkMDczYzk0NzZkMjZjODA1NzNiMDMzMmU3Y2NlNzNkZjE1NDgyYSJ9fX0="; - public static final String GREEN_BACKPACK = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjhhMTI3ZjFjZmQ3OTk4NmU3YmQ5NWQ5MmRlNGY0ZjY4MDQwZTRmODk5ZjgxYjFmOGYzY2ExNWI2NGY1MGYzIn19fQ=="; public static final String DISCORD = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzYyYTFiNDczYmEzYzI1ZTZlYjE0NThkZmM5NTM5MjFmNWQ5MTQ3OGFmOWQ2ZGRhMDdjMDMyZjkyOGMifX19"; + public static final String GOLD_CUBE = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTkxNDE0Nzc0NGNkMjE4YzlhMDc4MjM0ZjcwMzVjNzFlNGEzNDg1OWFmOTJmYzkxYjg4YzIxZThiMzcyMjNjNSJ9fX0="; + public static final String DIAMOND_CUBE = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvM2VkNGFjZThmYTUwN2M0NWIxMWI4OTMzNjJlNDViZWJmNDhjYjIyMDMxNTM1MzJlZmY0MjBhN2Y1Y2Y3NzEwYiJ9fX0="; // Team Colors (https://minecraft-heads.com/custom-heads/search?searchword=Leather+Helmet) public static final String TEAM_UNDYED = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjBiZjFkNjQzOWM5OGI0MDY2MTdhOWIxZjdjODM0NGVjZGJiODJhYjkyMTNkMzEzZWRiMjgyMTY2OTQ2MmJkZiJ9fX0="; @@ -31,4 +32,19 @@ public class SkullTexture { public static final String TEAM_LIGHT_GRAY = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZmNkYmJlYzJlN2M2Zjc5OTY2OTkyZThkM2I2OTAwZjk4ZGFhNGQ0ZGE4OTBlMmI4YWZlNjVhYmNkYzhiMjNjNyJ9fX0="; public static final String TEAM_GRAY = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZmNkYmJlYzJlN2M2Zjc5OTY2OTkyZThkM2I2OTAwZjk4ZGFhNGQ0ZGE4OTBlMmI4YWZlNjVhYmNkYzhiMjNjNyJ9fX0="; public static final String TEAM_BLACK = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjU3YjZlNGE3MmE5M2E3YTdhMjFmYTI4NmYyZWU3MTViNDlhNmJhNzgyNGRjNTMzZWQyNDBiOTYwNzExNDEzZSJ9fX0="; + + // Backpack Colors (https://minecraft-heads.com/custom-heads/search?searchword=Backpack) + public static final String BACKPACK_NAVY_BLUE = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOGRjYzZlYjQwZjNiYWRhNDFlNDMzOTg4OGQ2ZDIwNzQzNzU5OGJkYmQxNzVjMmU3MzExOTFkNWE5YTQyZDNjOCJ9fX0="; + public static final String BACKPACK_GREEN = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvY2E2YWQ4YWQ5MTNkZWYxM2JkNTc0MTY1NWU3N2QxMzRlYjFiNTdmMDI5NzBkYWE2YjMzMDgyNzU0ZDFhZmZjNCJ9fX0="; + public static final String BACKPACK_LIGHT_BLUE = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODJjMzdiZmExMTg2M2QwMDI1NTFhMDJiNTE5ZDcxNTRkYTgyNjcwNWQyMDk4MjU5MTUyMmRlMmVhMWIyODhjMiJ9fX0="; + public static final String BACKPACK_BLACK = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTgyNjQxNzg2YTQyMjA4OGY3NWRjZWU3MDIwNWQ1ODA2MDBmNjlkNmFhMmY3N2QyNjc4YjU4ZDg5YjY5NzNhNiJ9fX0="; + public static final String BACKPACK_LIME = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjIxMjhmNDhkOTk3MTg2NTYzZmJjNWI0N2E4OGMwZDBhYWM5MmZhMmMyODVjZDFmYWU0MjBjMzRmYThmMjAxMCJ9fX0="; + public static final String BACKPACK_ORANGE = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjcwYjU2MjJiN2QwNjhmNTc4OGJmMTlhODM5ODM5MzdiMTZjNTk3MmM5MWY1ZWU3YmY1NGJjYzM2MzhmOWEzNiJ9fX0="; + public static final String BACKPACK_PINK = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmUwODdjZDk3NWQyNjRjNzJhZGNhOWVmYzZmYzM0NDc2ZWMzOGUxOGRmNTM2YjMwNzYzNTI2N2EzN2ZhZjA3NiJ9fX0="; + public static final String BACKPACK_PURPLE = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjE4N2M3MzJhYTM5ZDI5MTM0NjUwYjZhNzJjNmY0MWI5OTA4NWEyNmVjNWU1MTNiYTE4YzQwZDVlY2E5ZTY5YyJ9fX0="; + public static final String BACKPACK_RED = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYmNlMDE2OTlmNzk2Y2JkZTk1Yzg0OWJlZTNjYzM2OTg3ODQ1MmI0MGE0MTE0NDM2NmQ2NmI0YTA4MjZjZmFhMCJ9fX0="; + public static final String BACKPACK_WHITE = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTJiYjM4NTE2YjI5NTA0MTg2ZTExNTU5Y2Q1MjUwYWUyMThkYjRkZGQyN2FlNDM4NzI2Yzg0N2NlNmIzYzk4In19fQ=="; + public static final String BACKPACK_YELLOW = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTFiYmJjNWMyNDM4NGVjYjJmNjg0NGRhMjg1Y2NjZjllYjAxMWM3YTY2NzAxNzdjZjc1Y2Q2NTUxM2JjMTI3NCJ9fX0="; + public static final String BACKPACK_GRAY = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYmFjNzdiNzZmMGM2NGMxNGMwNDkzNmE1NTc5NmM0OWE4MmZmMTc0ODM4ZGI5MzBkNTJiMGNhYWNkZDIxNTkxNyJ9fX0="; + public static final String BACKPACK_BLUE = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvM2U1YWJkYjczNzQ1NTNkMDU2NWNiY2IzMjk1YWVkNTE1YTg5N2ViY2U5ZTBiYzYwZjFjMWY4YWU1NGM3NDlkZiJ9fX0="; } \ No newline at end of file diff --git a/core/src/main/java/zone/themcgamer/core/deliveryMan/DeliveryManClient.java b/core/src/main/java/zone/themcgamer/core/deliveryMan/DeliveryManClient.java new file mode 100644 index 0000000..0e33ea9 --- /dev/null +++ b/core/src/main/java/zone/themcgamer/core/deliveryMan/DeliveryManClient.java @@ -0,0 +1,16 @@ +package zone.themcgamer.core.deliveryMan; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author Nicholas + */ +@RequiredArgsConstructor @Setter @Getter +public class DeliveryManClient { + private final Map lastClaimedRewards = new HashMap<>(); +} \ No newline at end of file diff --git a/core/src/main/java/zone/themcgamer/core/deliveryMan/DeliveryManManager.java b/core/src/main/java/zone/themcgamer/core/deliveryMan/DeliveryManManager.java new file mode 100644 index 0000000..7ba5320 --- /dev/null +++ b/core/src/main/java/zone/themcgamer/core/deliveryMan/DeliveryManManager.java @@ -0,0 +1,92 @@ +package zone.themcgamer.core.deliveryMan; + +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; +import zone.themcgamer.core.account.Account; +import zone.themcgamer.core.account.AccountManager; +import zone.themcgamer.core.account.MiniAccount; +import zone.themcgamer.core.common.Style; +import zone.themcgamer.core.deliveryMan.command.DeliveryManCommand; +import zone.themcgamer.core.module.ModuleInfo; +import zone.themcgamer.data.mysql.MySQLController; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Optional; +import java.util.UUID; + +/** + * @author Nicholas + */ +@ModuleInfo(name = "Delivery Man Manager") +public class DeliveryManManager extends MiniAccount { + public static final String DELIVERY_MAN_NAME = "Harold"; + + private final DeliveryManRepository repository; + + public DeliveryManManager(JavaPlugin plugin, MySQLController mySQLController) { + super(plugin); + repository = new DeliveryManRepository(mySQLController.getDataSource()); + registerCommand(new DeliveryManCommand(this)); + } + + @Override + public DeliveryManClient getAccount(int accountId, UUID uuid, String name, String ip, String encryptedIp) { + return new DeliveryManClient(); + } + + @Override + public String getQuery(int accountId, UUID uuid, String name, String ip, String encryptedIp) { + return "SELECT `rewardId`, `lastClaimed` FROM `deliveryMan` WHERE `accountId` = '" + accountId + "';"; + } + + @Override + public void loadAccount(int accountId, UUID uuid, String name, String ip, String encryptedIp, ResultSet resultSet) throws SQLException { + Optional client = lookup(uuid); + if (client.isEmpty()) + return; + while (resultSet.next()) { + DeliveryManReward reward = DeliveryManReward.match(resultSet.getString("rewardId")); + if (reward == null) + continue; + client.get().getLastClaimedRewards().put(reward, resultSet.getLong("lastClaimed")); + } + } + + /** + * Claims a {@link Player}'s {@link DeliveryManReward} + * + * @param player the player who is claiming the reward + * @param reward the reward that's being claimed + */ + public void claimReward(Player player, DeliveryManReward reward) { + Optional optionalClient = lookup(player.getUniqueId()); + if (optionalClient.isEmpty()) + return; + if (!canClaim(player, reward)) + return; + Optional optionalAccount = AccountManager.fromCache(player.getUniqueId()); + if (optionalAccount.isEmpty()) + return; + repository.claim(optionalAccount.get().getId(), reward); + optionalClient.get().getLastClaimedRewards().put(reward, System.currentTimeMillis()); + player.sendMessage(Style.main(DELIVERY_MAN_NAME, "You claimed §b" + reward.getDisplayName() + "§7.")); + } + + /** + * Checks if a {@link DeliveryManReward} can be claimed at the time of checking. + * + * @param player the player that we are checking from + * @param reward the reward that we are seeing if it can be claimed + * @return if the reward is claimable + */ + public boolean canClaim(Player player, DeliveryManReward reward) { + Optional optionalClient = lookup(player.getUniqueId()); + if (optionalClient.isEmpty()) + return false; + if (!optionalClient.get().getLastClaimedRewards().containsKey(reward)) + return true; + else + return System.currentTimeMillis() - optionalClient.get().getLastClaimedRewards().get(reward) > reward.getClaimCooldown(); + } +} \ No newline at end of file diff --git a/core/src/main/java/zone/themcgamer/core/deliveryMan/DeliveryManRepository.java b/core/src/main/java/zone/themcgamer/core/deliveryMan/DeliveryManRepository.java new file mode 100644 index 0000000..40b5483 --- /dev/null +++ b/core/src/main/java/zone/themcgamer/core/deliveryMan/DeliveryManRepository.java @@ -0,0 +1,41 @@ +package zone.themcgamer.core.deliveryMan; + +import com.zaxxer.hikari.HikariDataSource; +import zone.themcgamer.data.mysql.data.column.Column; +import zone.themcgamer.data.mysql.data.column.impl.IntegerColumn; +import zone.themcgamer.data.mysql.data.column.impl.LongColumn; +import zone.themcgamer.data.mysql.data.column.impl.StringColumn; +import zone.themcgamer.data.mysql.repository.MySQLRepository; + +import java.util.concurrent.CompletableFuture; + +/** + * @author Nicholas + */ +public class DeliveryManRepository extends MySQLRepository { + private static final String CLAIM_REWARD = "INSERT INTO `deliveryMan` " + + "(`accountId`, `rewardId`, `lastClaimed`) VALUES " + + "(?, ?, ?) ON DUPLICATE KEY UPDATE `lastClaimed`=?"; + + public DeliveryManRepository(HikariDataSource dataSource) { + super(dataSource); + } + + /** + * Executes a query to insert / update the reward in the database. + * + * @param accountId the id of the account that is claiming the reward + * @param reward the reward that is being claimed + */ + public void claim(int accountId, DeliveryManReward reward) { + long now = System.currentTimeMillis(); + CompletableFuture.runAsync(() -> { + executeInsert(CLAIM_REWARD, new Column[] { + new IntegerColumn("accountId", accountId), + new StringColumn("rewardId", reward.getId()), + new LongColumn("lastClaimed", now), + new LongColumn("lastClaimed", now) + }); + }); + } +} \ No newline at end of file diff --git a/core/src/main/java/zone/themcgamer/core/deliveryMan/DeliveryManReward.java b/core/src/main/java/zone/themcgamer/core/deliveryMan/DeliveryManReward.java new file mode 100644 index 0000000..08fef3b --- /dev/null +++ b/core/src/main/java/zone/themcgamer/core/deliveryMan/DeliveryManReward.java @@ -0,0 +1,38 @@ +package zone.themcgamer.core.deliveryMan; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import zone.themcgamer.core.common.SkullTexture; +import zone.themcgamer.core.deliveryMan.rewardPackage.RewardPackage; +import zone.themcgamer.core.deliveryMan.rewardPackage.impl.DailyRewardPackage; +import zone.themcgamer.core.deliveryMan.rewardPackage.impl.MonthlyRewardPackage; +import zone.themcgamer.core.deliveryMan.rewardPackage.impl.WeeklyRewardPackage; +import zone.themcgamer.data.Rank; + +import java.util.Arrays; +import java.util.concurrent.TimeUnit; + +/** + * @author Nicholas + */ +@AllArgsConstructor @Getter +public enum DeliveryManReward { + DAILY("dailyReward", "Daily Reward", Rank.DEFAULT, TimeUnit.DAYS.toMillis(1L), new DailyRewardPackage()), + WEEKLY("weeklyReward", "Weekly Reward", Rank.DEFAULT, TimeUnit.DAYS.toMillis(7L), new WeeklyRewardPackage()), + MONTHLY("monthlyReward", "Monthly Reward", Rank.GAMER, TimeUnit.DAYS.toMillis(30L), new MonthlyRewardPackage()); + + private final String id, displayName; + private final Rank requiredRank; + private final long claimCooldown; + private final RewardPackage rewardPackage; + + /** + * Get the {@link DeliveryManReward} matching the given id + * + * @param id the id + * @return the reward, otherwise null + */ + public static DeliveryManReward match(String id) { + return Arrays.stream(values()).filter(reward -> reward.getId().equalsIgnoreCase(id)).findFirst().orElse(null); + } +} \ No newline at end of file diff --git a/core/src/main/java/zone/themcgamer/core/deliveryMan/command/DeliveryManCommand.java b/core/src/main/java/zone/themcgamer/core/deliveryMan/command/DeliveryManCommand.java new file mode 100644 index 0000000..eda94a0 --- /dev/null +++ b/core/src/main/java/zone/themcgamer/core/deliveryMan/command/DeliveryManCommand.java @@ -0,0 +1,22 @@ +package zone.themcgamer.core.deliveryMan.command; + +import zone.themcgamer.core.command.Command; +import zone.themcgamer.core.command.CommandProvider; +import zone.themcgamer.core.deliveryMan.DeliveryManManager; +import zone.themcgamer.core.deliveryMan.menu.DeliveryManMenu; + +/** + * @author Nicholas + */ +public class DeliveryManCommand { + private final DeliveryManManager deliveryManManager; + + public DeliveryManCommand(DeliveryManManager deliveryManManager) { + this.deliveryManManager = deliveryManManager; + } + + @Command(name = "deliveryman", description = "Open the Delivery Man menu", playersOnly = true) + public void onCommand(CommandProvider command) { + new DeliveryManMenu(command.getPlayer(), deliveryManManager).open(); + } +} \ No newline at end of file diff --git a/core/src/main/java/zone/themcgamer/core/deliveryMan/menu/DeliveryManMenu.java b/core/src/main/java/zone/themcgamer/core/deliveryMan/menu/DeliveryManMenu.java new file mode 100644 index 0000000..6f888eb --- /dev/null +++ b/core/src/main/java/zone/themcgamer/core/deliveryMan/menu/DeliveryManMenu.java @@ -0,0 +1,89 @@ +package zone.themcgamer.core.deliveryMan.menu; + +import com.cryptomorin.xseries.XMaterial; +import org.bukkit.entity.Player; +import zone.themcgamer.common.TimeUtils; +import zone.themcgamer.core.account.Account; +import zone.themcgamer.core.account.AccountManager; +import zone.themcgamer.core.common.ItemBuilder; +import zone.themcgamer.core.common.SkullTexture; +import zone.themcgamer.core.common.menu.Button; +import zone.themcgamer.core.common.menu.MenuType; +import zone.themcgamer.core.common.menu.UpdatableMenu; +import zone.themcgamer.core.deliveryMan.DeliveryManClient; +import zone.themcgamer.core.deliveryMan.DeliveryManManager; +import zone.themcgamer.core.deliveryMan.DeliveryManReward; + +import java.util.Optional; +import java.util.concurrent.TimeUnit; + +/** + * @author Nicholas + */ +public class DeliveryManMenu extends UpdatableMenu { + private final DeliveryManManager deliveryManManager; + + public DeliveryManMenu(Player player, DeliveryManManager deliveryManManager) { + super(player, DeliveryManManager.DELIVERY_MAN_NAME, 4, MenuType.CHEST, TimeUnit.SECONDS.toMillis(1L)); + this.deliveryManManager = deliveryManManager; + } + + @Override + protected void onOpen() { + // TODO: 2/19/2021 Make these rewards actually work - Nick + set(2, 3, new Button(new ItemBuilder(XMaterial.PLAYER_HEAD) + .setSkullOwner(SkullTexture.EMERALD_BLOCK) + .setName("§b§lVoting Rewards") + .addLoreLine("§7Click to view your §b0 §7unclaimed") + .addLoreLine("§7voting rewards!") + .toItemStack(), event -> player.sendMessage("voting rewards"))); + set(2, 5, new Button(new ItemBuilder(XMaterial.PLAYER_HEAD) + .setSkullOwner(SkullTexture.DISCORD) + .setName("§d§lNitro Reward") + .addLoreLine("§7Claimable: §cNo") + .toItemStack(), event -> player.sendMessage("nitro reward"))); + } + + @Override + public void onUpdate() { + Optional optionalAccount = AccountManager.fromCache(player.getUniqueId()); + if (optionalAccount.isEmpty()) + return; + Optional optionalClient = deliveryManManager.lookup(player.getUniqueId()); + if (optionalClient.isEmpty()) + return; + int slot = 2; + for (DeliveryManReward reward : DeliveryManReward.values()) { + boolean canClaim = (deliveryManManager.canClaim(player, reward) && optionalAccount.get().hasRank(reward.getRequiredRank())); + ItemBuilder itemBuilder = new ItemBuilder(XMaterial.PLAYER_HEAD) + .setSkullOwner(reward.getRewardPackage().getIconTexture(player, optionalAccount.get())) + .setGlow(canClaim) + .setName((canClaim ? "§a" : "§c") + "§l" + reward.getDisplayName()) + .addLoreLine("§7Claimable: " + (canClaim ? "§aYes" : "§cNo")); + if (reward == DeliveryManReward.MONTHLY) { + if (optionalAccount.get().hasRank(reward.getRequiredRank())) { + itemBuilder.addLoreLine("") + .addLoreLine("§7Your Rank: §b" + optionalAccount.get().getPrimaryRankName()); + } else { + itemBuilder.addLoreLine("") + .addLoreLine("§cOnly §bdonators §ccan claim a §b" + reward.getDisplayName() + "§c!"); + } + } + itemBuilder.addLoreLine("") + .addLoreLine("§7Rewards:") + .addLoreLine(" §bNone!"); // TODO: 2/19/2021 This is static at the moment due to the fact the reward base isn't done. + if (!deliveryManManager.canClaim(player, reward)) { + itemBuilder.addLoreLine("") + .addLoreLine("§7Next Delivery: §b" + TimeUtils.formatIntoDetailedString((optionalClient.get().getLastClaimedRewards().get(reward) + + reward.getClaimCooldown()) - System.currentTimeMillis(), true)); + } + set(1, slot, new Button(itemBuilder.toItemStack(), event -> { + if (!canClaim) + return; + close(); + deliveryManManager.claimReward(player, reward); + })); + slot += 2; + } + } +} \ No newline at end of file diff --git a/core/src/main/java/zone/themcgamer/core/deliveryMan/rewardPackage/RewardPackage.java b/core/src/main/java/zone/themcgamer/core/deliveryMan/rewardPackage/RewardPackage.java new file mode 100644 index 0000000..bd764d4 --- /dev/null +++ b/core/src/main/java/zone/themcgamer/core/deliveryMan/rewardPackage/RewardPackage.java @@ -0,0 +1,20 @@ +package zone.themcgamer.core.deliveryMan.rewardPackage; + +import org.bukkit.entity.Player; +import zone.themcgamer.core.account.Account; +import zone.themcgamer.core.common.SkullTexture; +import zone.themcgamer.core.deliveryMan.menu.DeliveryManMenu; + +/** + * @author Nicholas + */ +public abstract class RewardPackage { + /** + * Gets the {@link SkullTexture} which is shown in the {@link DeliveryManMenu}. + * + * @param player the player to get the texture for + * @param account the account to get the texture for + * @return the texture + */ + public abstract String getIconTexture(Player player, Account account); +} \ No newline at end of file diff --git a/core/src/main/java/zone/themcgamer/core/deliveryMan/rewardPackage/impl/DailyRewardPackage.java b/core/src/main/java/zone/themcgamer/core/deliveryMan/rewardPackage/impl/DailyRewardPackage.java new file mode 100644 index 0000000..8b8dd80 --- /dev/null +++ b/core/src/main/java/zone/themcgamer/core/deliveryMan/rewardPackage/impl/DailyRewardPackage.java @@ -0,0 +1,16 @@ +package zone.themcgamer.core.deliveryMan.rewardPackage.impl; + +import org.bukkit.entity.Player; +import zone.themcgamer.core.account.Account; +import zone.themcgamer.core.common.SkullTexture; +import zone.themcgamer.core.deliveryMan.rewardPackage.RewardPackage; + +/** + * @author Nicholas + */ +public class DailyRewardPackage extends RewardPackage { + @Override + public String getIconTexture(Player player, Account account) { + return SkullTexture.GOLD_CUBE; + } +} \ No newline at end of file diff --git a/core/src/main/java/zone/themcgamer/core/deliveryMan/rewardPackage/impl/MonthlyRewardPackage.java b/core/src/main/java/zone/themcgamer/core/deliveryMan/rewardPackage/impl/MonthlyRewardPackage.java new file mode 100644 index 0000000..1ab24c3 --- /dev/null +++ b/core/src/main/java/zone/themcgamer/core/deliveryMan/rewardPackage/impl/MonthlyRewardPackage.java @@ -0,0 +1,28 @@ +package zone.themcgamer.core.deliveryMan.rewardPackage.impl; + +import org.bukkit.entity.Player; +import zone.themcgamer.core.account.Account; +import zone.themcgamer.core.common.SkullTexture; +import zone.themcgamer.core.deliveryMan.rewardPackage.RewardPackage; +import zone.themcgamer.data.Rank; + +/** + * @author Nicholas + */ +public class MonthlyRewardPackage extends RewardPackage { + @Override + public String getIconTexture(Player player, Account account) { + if (account.hasRank(Rank.ULTIMATE)) + return SkullTexture.BACKPACK_PURPLE; + else if (account.hasRank(Rank.EXPERT)) + return SkullTexture.BACKPACK_LIGHT_BLUE; + else if (account.hasRank(Rank.HERO)) + return SkullTexture.BACKPACK_YELLOW; + else if (account.hasRank(Rank.SKILLED)) + return SkullTexture.BACKPACK_ORANGE; + else if (account.hasRank(Rank.GAMER)) + return SkullTexture.BACKPACK_GREEN; + else + return SkullTexture.BACKPACK_GRAY; + } +} \ No newline at end of file diff --git a/core/src/main/java/zone/themcgamer/core/deliveryMan/rewardPackage/impl/WeeklyRewardPackage.java b/core/src/main/java/zone/themcgamer/core/deliveryMan/rewardPackage/impl/WeeklyRewardPackage.java new file mode 100644 index 0000000..1b0cf92 --- /dev/null +++ b/core/src/main/java/zone/themcgamer/core/deliveryMan/rewardPackage/impl/WeeklyRewardPackage.java @@ -0,0 +1,16 @@ +package zone.themcgamer.core.deliveryMan.rewardPackage.impl; + +import org.bukkit.entity.Player; +import zone.themcgamer.core.account.Account; +import zone.themcgamer.core.common.SkullTexture; +import zone.themcgamer.core.deliveryMan.rewardPackage.RewardPackage; + +/** + * @author Nicholas + */ +public class WeeklyRewardPackage extends RewardPackage { + @Override + public String getIconTexture(Player player, Account account) { + return SkullTexture.DIAMOND_CUBE; + } +} \ No newline at end of file diff --git a/hub/src/main/java/zone/themcgamer/hub/Hub.java b/hub/src/main/java/zone/themcgamer/hub/Hub.java index 91cc136..f623545 100644 --- a/hub/src/main/java/zone/themcgamer/hub/Hub.java +++ b/hub/src/main/java/zone/themcgamer/hub/Hub.java @@ -10,6 +10,7 @@ import zone.themcgamer.core.chat.component.impl.BasicNameComponent; import zone.themcgamer.core.chat.component.impl.BasicRankComponent; import zone.themcgamer.core.common.MathUtils; import zone.themcgamer.core.common.scoreboard.ScoreboardHandler; +import zone.themcgamer.core.deliveryMan.DeliveryManManager; import zone.themcgamer.core.game.kit.KitManager; import zone.themcgamer.core.kingdom.KingdomManager; import zone.themcgamer.core.plugin.MGZPlugin; @@ -55,6 +56,8 @@ public class Hub extends MGZPlugin { }); new KingdomManager(this, traveller); + AccountManager.addMiniAccount(new DeliveryManManager(this, mySQLController)); + commandManager.registerCommand(new SpawnCommand(this)); } } \ No newline at end of file diff --git a/serverdata/src/main/java/zone/themcgamer/data/mysql/MySQLController.java b/serverdata/src/main/java/zone/themcgamer/data/mysql/MySQLController.java index 5b6d22d..bfe0f30 100644 --- a/serverdata/src/main/java/zone/themcgamer/data/mysql/MySQLController.java +++ b/serverdata/src/main/java/zone/themcgamer/data/mysql/MySQLController.java @@ -68,6 +68,12 @@ public class MySQLController { new StringColumn("task", 255, false) }, new String[] { "accountId" }), + new Table("deliveryMan", new Column[] { + new IntegerColumn("accountId", false, false), + new StringColumn("rewardId", 50, false), + new LongColumn("lastClaimed", false) + }, new String[] { "accountId", "rewardId" }), + new Table("kits", new Column[] { new IntegerColumn("accountId", false, false), new StringColumn("game", 50, false), From 4668206fc52ffdde9a907c4e2a4f8993c7958bcc Mon Sep 17 00:00:00 2001 From: nickreesdev Date: Fri, 19 Feb 2021 20:02:10 -0600 Subject: [PATCH 2/3] Made it where the Delivery Man normal rewards are shown as coal skulls if the reward can't be claimed. --- .../zone/themcgamer/core/deliveryMan/menu/DeliveryManMenu.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/src/main/java/zone/themcgamer/core/deliveryMan/menu/DeliveryManMenu.java b/core/src/main/java/zone/themcgamer/core/deliveryMan/menu/DeliveryManMenu.java index 6f888eb..19c2ef5 100644 --- a/core/src/main/java/zone/themcgamer/core/deliveryMan/menu/DeliveryManMenu.java +++ b/core/src/main/java/zone/themcgamer/core/deliveryMan/menu/DeliveryManMenu.java @@ -56,8 +56,7 @@ public class DeliveryManMenu extends UpdatableMenu { for (DeliveryManReward reward : DeliveryManReward.values()) { boolean canClaim = (deliveryManManager.canClaim(player, reward) && optionalAccount.get().hasRank(reward.getRequiredRank())); ItemBuilder itemBuilder = new ItemBuilder(XMaterial.PLAYER_HEAD) - .setSkullOwner(reward.getRewardPackage().getIconTexture(player, optionalAccount.get())) - .setGlow(canClaim) + .setSkullOwner((canClaim ? reward.getRewardPackage().getIconTexture(player, optionalAccount.get()) : SkullTexture.COAL_BLOCK)) .setName((canClaim ? "§a" : "§c") + "§l" + reward.getDisplayName()) .addLoreLine("§7Claimable: " + (canClaim ? "§aYes" : "§cNo")); if (reward == DeliveryManReward.MONTHLY) { From cf1367bd4cd3e833015bb376f0b8acde9ff2b890 Mon Sep 17 00:00:00 2001 From: Rainnny7 Date: Fri, 19 Feb 2021 21:08:57 -0500 Subject: [PATCH 3/3] [16.9k Lines] Fixed an error whilst fetching an unknown account in the API --- .../main/java/zone/themcgamer/api/API.java | 18 +++++-- .../themcgamer/api/route/AccountRoute.java | 4 +- .../core/deliveryMan/DeliveryManReward.java | 1 - .../command/impl/InviteCommand.java | 1 - .../command/impl/SetActivityCommand.java | 1 - .../themcgamer/hub/command/SpawnCommand.java | 2 +- .../main/java/zone/themcgamer/test/Test.java | 50 +++++++++++++------ 7 files changed, 51 insertions(+), 26 deletions(-) diff --git a/api/src/main/java/zone/themcgamer/api/API.java b/api/src/main/java/zone/themcgamer/api/API.java index 2060d3a..b01a4fc 100644 --- a/api/src/main/java/zone/themcgamer/api/API.java +++ b/api/src/main/java/zone/themcgamer/api/API.java @@ -36,7 +36,7 @@ public class API { .create(); private static final List> models = new ArrayList<>(); private static final Map> routes = new HashMap<>(); - private static final boolean requiresAuthentication = false; + private static final boolean requiresAuthentication = true; // Rate Limiting private static final int rateLimit = 120; // The amount of requests a minute @@ -114,15 +114,21 @@ public class API { // if there is a problem checking the key or the key is invalid if (requiresAuthentication) { String apiKey = request.headers("key"); - if (apiKey == null) + if (apiKey == null) { + response.status(401); throw new APIException("Unauthorized"); + } // Check if the provided API key is valid Optional> keys = apiKeyRepository.lookup(apiKey); - if (keys.isEmpty() || (keys.get().isEmpty())) + if (keys.isEmpty() || (keys.get().isEmpty())) { + response.status(401); throw new APIException("Unauthorized"); + } key = keys.get().get(0); - if (restPath.accessLevel() == APIAccessLevel.DEV && (restPath.accessLevel() != key.getAccessLevel())) + if (restPath.accessLevel() == APIAccessLevel.DEV && (restPath.accessLevel() != key.getAccessLevel())) { + response.status(401); throw new APIException("Unauthorized"); + } } // Checking if the request has the appropriate headers for the get route if (restPath.headers().length > 0) { @@ -160,9 +166,11 @@ public class API { jsonObject.addProperty("error", message); // If the caught exception is not an API exception, print the stacktrace if (!(ex instanceof APIException)) { + response.status(500); System.err.println("The route \"" + entry.getKey().getClass().getSimpleName() + "\" raised an exception:"); ex.printStackTrace(); - } + } else if (response.status() == 200) + response.status(502); } return gson.toJson(jsonObject); }); diff --git a/api/src/main/java/zone/themcgamer/api/route/AccountRoute.java b/api/src/main/java/zone/themcgamer/api/route/AccountRoute.java index 5f63467..98c8393 100644 --- a/api/src/main/java/zone/themcgamer/api/route/AccountRoute.java +++ b/api/src/main/java/zone/themcgamer/api/route/AccountRoute.java @@ -26,7 +26,7 @@ import java.util.concurrent.TimeUnit; public class AccountRoute { // Account model cache for players that were looked up via the account route public static final Cache CACHE = CacheBuilder.newBuilder() - .expireAfterWrite(10, TimeUnit.MINUTES) + .expireAfterWrite(5, TimeUnit.MINUTES) .build(); private final AccountRepository accountRepository; @@ -42,6 +42,8 @@ public class AccountRoute { AccountModel account = CACHE.getIfPresent(uuid); if (account == null) { account = accountRepository.getAccount(uuid); + if (account == null) + throw new APIException("Account not found"); account.setTimeCached(System.currentTimeMillis()); CACHE.put(uuid, account); } diff --git a/core/src/main/java/zone/themcgamer/core/deliveryMan/DeliveryManReward.java b/core/src/main/java/zone/themcgamer/core/deliveryMan/DeliveryManReward.java index 08fef3b..cb75ddc 100644 --- a/core/src/main/java/zone/themcgamer/core/deliveryMan/DeliveryManReward.java +++ b/core/src/main/java/zone/themcgamer/core/deliveryMan/DeliveryManReward.java @@ -2,7 +2,6 @@ package zone.themcgamer.core.deliveryMan; import lombok.AllArgsConstructor; import lombok.Getter; -import zone.themcgamer.core.common.SkullTexture; import zone.themcgamer.core.deliveryMan.rewardPackage.RewardPackage; import zone.themcgamer.core.deliveryMan.rewardPackage.impl.DailyRewardPackage; import zone.themcgamer.core.deliveryMan.rewardPackage.impl.MonthlyRewardPackage; diff --git a/discordbot/src/main/java/zone/themcgamer/discordbot/command/impl/InviteCommand.java b/discordbot/src/main/java/zone/themcgamer/discordbot/command/impl/InviteCommand.java index b5b9f3e..3df10aa 100644 --- a/discordbot/src/main/java/zone/themcgamer/discordbot/command/impl/InviteCommand.java +++ b/discordbot/src/main/java/zone/themcgamer/discordbot/command/impl/InviteCommand.java @@ -2,7 +2,6 @@ package zone.themcgamer.discordbot.command.impl; import com.jagrosh.jdautilities.command.CommandEvent; import net.dv8tion.jda.api.entities.Guild; -import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.TextChannel; import zone.themcgamer.discordbot.command.BaseCommand; diff --git a/discordbot/src/main/java/zone/themcgamer/discordbot/command/impl/SetActivityCommand.java b/discordbot/src/main/java/zone/themcgamer/discordbot/command/impl/SetActivityCommand.java index bb5ff97..2e62294 100644 --- a/discordbot/src/main/java/zone/themcgamer/discordbot/command/impl/SetActivityCommand.java +++ b/discordbot/src/main/java/zone/themcgamer/discordbot/command/impl/SetActivityCommand.java @@ -3,7 +3,6 @@ package zone.themcgamer.discordbot.command.impl; import com.jagrosh.jdautilities.command.CommandEvent; import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.Activity; -import zone.themcgamer.discordbot.BotConstants; import zone.themcgamer.discordbot.MGZBot; import zone.themcgamer.discordbot.command.BaseCommand; import zone.themcgamer.discordbot.guild.Guild; diff --git a/hub/src/main/java/zone/themcgamer/hub/command/SpawnCommand.java b/hub/src/main/java/zone/themcgamer/hub/command/SpawnCommand.java index 9bbd084..6b5b6c8 100644 --- a/hub/src/main/java/zone/themcgamer/hub/command/SpawnCommand.java +++ b/hub/src/main/java/zone/themcgamer/hub/command/SpawnCommand.java @@ -13,4 +13,4 @@ public class SpawnCommand { public void onCommand(CommandProvider command) { command.getPlayer().teleport(hub.getSpawn()); } -} +} \ No newline at end of file diff --git a/testing/src/main/java/zone/themcgamer/test/Test.java b/testing/src/main/java/zone/themcgamer/test/Test.java index c66ee1e..2cea016 100644 --- a/testing/src/main/java/zone/themcgamer/test/Test.java +++ b/testing/src/main/java/zone/themcgamer/test/Test.java @@ -1,13 +1,12 @@ package zone.themcgamer.test; import lombok.SneakyThrows; -import zone.themcgamer.data.jedis.JedisController; -import zone.themcgamer.data.jedis.data.ServerGroup; -import zone.themcgamer.data.jedis.repository.RedisRepository; -import zone.themcgamer.data.jedis.repository.impl.ServerGroupRepository; -import java.util.List; -import java.util.Optional; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.time.Duration; /** * @author Braydon @@ -16,15 +15,34 @@ import java.util.Optional; public class Test { @SneakyThrows public static void main(String[] args) { - new JedisController().start(); - - Optional repository = RedisRepository.getRepository(ServerGroupRepository.class); - while (repository.isPresent()) { - List cached = repository.get().getCached(); - for (ServerGroup serverGroup : cached) - System.out.println(serverGroup.toString()); - System.out.println("total cached = " + cached.size()); - Thread.sleep(1000L); - } + HttpClient client = HttpClient.newBuilder() + .version(HttpClient.Version.HTTP_1_1) + .followRedirects(HttpClient.Redirect.NORMAL) + .connectTimeout(Duration.ofSeconds(30L)) + .build(); + HttpRequest request = HttpRequest.newBuilder() + .GET() + .uri(URI.create("https://api.cnetwork.club/v1/status/Rainnny")) + .timeout(Duration.ofMinutes(1L)) + .header("Content-Type", "application/json") + .build(); + client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) + .thenAccept(response -> { + System.out.println("status = " + response.statusCode()); + System.out.println("body = " + response.body()); + }); +// HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); +// System.out.println("status = " + response.statusCode()); +// System.out.println("body = " + response.body()); +// +// Optional repository = RedisRepository.getRepository(ServerGroupRepository.class); +// while (repository.isPresent()) { +// List cached = repository.get().getCached(); +// for (ServerGroup serverGroup : cached) +// System.out.println(serverGroup.toString()); +// System.out.println("total cached = " + cached.size()); +// Thread.sleep(1000L); +// } + Thread.sleep(2000L); } } \ No newline at end of file