From 94149385496a0ccb23869ee1c7c7f02139cf6f11 Mon Sep 17 00:00:00 2001 From: Ben Date: Tue, 25 Aug 2026 18:12:47 -0600 Subject: [PATCH] Split VoteParty state and reward handling --- .../specialrewards/voteparty/VoteParty.java | 831 ++++++++---------- .../voteparty/VotePartyRewardHandler.java | 128 +++ .../voteparty/VotePartyState.java | 62 ++ 3 files changed, 546 insertions(+), 475 deletions(-) create mode 100644 VotingPlugin/src/main/java/com/bencodez/votingplugin/specialrewards/voteparty/VotePartyRewardHandler.java create mode 100644 VotingPlugin/src/main/java/com/bencodez/votingplugin/specialrewards/voteparty/VotePartyState.java diff --git a/VotingPlugin/src/main/java/com/bencodez/votingplugin/specialrewards/voteparty/VoteParty.java b/VotingPlugin/src/main/java/com/bencodez/votingplugin/specialrewards/voteparty/VoteParty.java index 2177fb8a99..5295042f99 100644 --- a/VotingPlugin/src/main/java/com/bencodez/votingplugin/specialrewards/voteparty/VoteParty.java +++ b/VotingPlugin/src/main/java/com/bencodez/votingplugin/specialrewards/voteparty/VoteParty.java @@ -1,475 +1,356 @@ - -package com.bencodez.votingplugin.specialrewards.voteparty; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Random; -import java.util.UUID; -import java.util.concurrent.ThreadLocalRandom; - -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; - -import com.bencodez.advancedcore.api.messages.PlaceholderUtils; -import com.bencodez.advancedcore.api.misc.MiscUtils; -import com.bencodez.advancedcore.api.rewards.RewardBuilder; -import com.bencodez.advancedcore.api.time.events.DayChangeEvent; -import com.bencodez.advancedcore.api.time.events.MonthChangeEvent; -import com.bencodez.advancedcore.api.time.events.WeekChangeEvent; -import com.bencodez.advancedcore.api.user.UserDataFetchMode; -import com.bencodez.simpleapi.array.ArrayUtils; -import com.bencodez.simpleapi.messages.MessageAPI; -import com.bencodez.simpleapi.sql.DataType; -import com.bencodez.votingplugin.VotingPluginMain; -import com.bencodez.votingplugin.events.VotePartyEvent; -import com.bencodez.votingplugin.user.VotingPluginUser; - -// TODO: Auto-generated Javadoc -/** - * The Class VoteParty. - */ -public class VoteParty implements Listener { - - private VotingPluginMain plugin; - - /** - * Constructs a new VoteParty. - * - * @param plugin the main plugin instance - */ - public VoteParty(VotingPluginMain plugin) { - this.plugin = plugin; - } - - /** - * Adds a vote total for the user. - * - * @param user the voting plugin user - */ - public void addTotal(VotingPluginUser user) { - setTotalVotes(getTotalVotes() + 1); - user.setVotePartyVotes(user.getVotePartyVotes() + 1); - plugin.getPlaceholders().onVotePartyUpdate(); - } - - /** - * Adds the vote player. - * - * @param user the user - */ - public void addVotePlayer(VotingPluginUser user) { - String uuid = user.getUUID(); - List voted = getVotedUsers(); - if (voted == null) { - voted = new ArrayList<>(); - } - if (!voted.contains(uuid)) { - voted.add(uuid); - setVotedUsers(voted); - } - } - - /** - * Checks if vote party requirements are met and triggers if appropriate. - * - * @param user the voting plugin user - * @param forceBungee whether to force Bungee processing - */ - public void check(VotingPluginUser user, boolean forceBungee) { - if (getTotalVotes() < getVotesRequired()) { - plugin.extraDebug("Not enough votes for vote party: " + getTotalVotes() + " / " + getVotesRequired()); - return; - } - - if (plugin.getSpecialRewardsConfig().isVotePartyOnlyOncePerDay() - && plugin.getServerData().isLastVotePartySameDay()) { - plugin.extraDebug("Already had vote party today"); - return; - } - if (plugin.getSpecialRewardsConfig().isVotePartyOnlyOncePerWeek() - && plugin.getServerData().isLastVotePartySameWeek()) { - plugin.extraDebug("Already had vote party this week"); - return; - } - if (plugin.getSpecialRewardsConfig().isVotePartyResetCount()) { - setTotalVotes(getTotalVotes() - getVotesRequired()); - } - - VotePartyEvent event = new VotePartyEvent(); - Bukkit.getPluginManager().callEvent(event); - if (event.isCancelled()) { - return; - } - - giveRewards(user, forceBungee); - - if (plugin.getSpecialRewardsConfig().getVotePartyIncreaseVotesRequired() > 0) { - plugin.getServerData().setVotePartyExtraRequired(plugin.getServerData().getVotePartyExtraRequired() - + plugin.getSpecialRewardsConfig().getVotePartyIncreaseVotesRequired()); - } - - plugin.getServerData().updateLastVoteParty(); - - if (plugin.getSpecialRewardsConfig().isVotePartyOnlyOncePerWeek()) { - plugin.getServerData().updateLastVotePartyWeek(); - } - - } - - /** - * Checks and sends vote reminders if requirements are met. - * - * @param user the voting plugin user - */ - public void checkVoteReminder(VotingPluginUser user) { - if (!user.isVanished()) { - int neededVotes = getNeededVotes(); - - for (Integer num1 : plugin.getSpecialRewardsConfig().getVotePartyVoteReminderAtVotes()) { - int num = num1.intValue(); - if (neededVotes == num) { - String broadcastMessage = plugin.getSpecialRewardsConfig().getVotePartyVoteReminderBroadcast(); - HashMap placeholders = new HashMap<>(); - placeholders.put("player", user.getPlayerName()); - placeholders.put("votesrequired", "" + neededVotes); - MiscUtils.getInstance() - .broadcast(PlaceholderUtils.replacePlaceHolder(broadcastMessage, placeholders)); - - MiscUtils.getInstance().executeConsoleCommands( - plugin.getSpecialRewardsConfig().getVotePartyVoteReminderCommands(), placeholders, false); - } - } - } - - } - - /** - * Command vote party. - * - * @param sender the sender - */ - public void commandVoteParty(CommandSender sender) { - if (plugin.getSpecialRewardsConfig().isVotePartyEnabled()) { - ArrayList msg = plugin.getConfigFile().getFormatCommandsVoteParty(); - int votesRequired = getVotesRequired(); - int votes = getTotalVotes(); - int neededVotes = votesRequired - votes; - HashMap placeholders = new HashMap<>(); - placeholders.put("votesrequired", "" + votesRequired); - placeholders.put("neededvotes", "" + neededVotes); - placeholders.put("votes", "" + votes); - msg = ArrayUtils.colorize(PlaceholderUtils.replacePlaceHolder(msg, placeholders)); - if (sender instanceof Player) { - Player p = (Player) sender; - sender.sendMessage(ArrayUtils.convert(PlaceholderUtils.replacePlaceHolders(msg, p))); - } else { - sender.sendMessage(ArrayUtils.convert(msg)); - } - } else { - sender.sendMessage(MessageAPI.colorize("&cVoteParty not enabled")); - } - } - - /** - * Gets the needed votes. - * - * @return the needed votes - */ - public int getNeededVotes() { - int votesRequired = getVotesRequired(); - int votes = getTotalVotes(); - int neededVotes = votesRequired - votes; - return neededVotes; - } - - /** - * Gets a random player name from voted users. - * - * @return random player name or "No Player" if none available - */ - public String getRandomPlayerName() { - ArrayList allPlayers = new ArrayList<>(); - for (Player players : Bukkit.getOnlinePlayers()) { - allPlayers.add(players.getName()); - } - if (allPlayers.size() == 0) { - return "No Player"; - } - int random = new Random().nextInt(allPlayers.size()); - return allPlayers.get(random); - } - - /** - * Gets the total votes. - * - * @return the total votes - */ - public int getTotalVotes() { - return plugin.getServerData().getData().getInt("VoteParty.Total"); - } - - /** - * Gets the voted users. - * - * @return the voted users - */ - public List getVotedUsers() { - List list = plugin.getServerData().getData().getStringList("VoteParty.Voted"); - if (list != null) { - return list; - } - return new ArrayList<>(); - } - - /** - * Gets the number of votes required for the vote party. - * - * @return votes required including extra requirements - */ - public int getVotesRequired() { - int required = plugin.getSpecialRewardsConfig().getVotePartyVotesRequired(); - int extra = plugin.getServerData().getVotePartyExtraRequired(); - if (extra > 0) { - return required + extra; - } - return required; - } - - /** - * Gives vote party reward to a user. - * - * @param user the voting plugin user - * @param useBungee whether to use Bungee processing - */ - public void giveReward(VotingPluginUser user, boolean useBungee) { - if (plugin.getSpecialRewardsConfig().getVotePartyUserVotesRequired() > 0) { - if (user.getVotePartyVotes() < plugin.getSpecialRewardsConfig().getVotePartyUserVotesRequired()) { - return; - } - } - giveReward(user, user.isOnline(), useBungee); - } - - /** - * Gives vote party reward to a user with online status. - * - * @param user the voting plugin user - * @param online whether the user is online - * @param useBungee whether to use Bungee processing - */ - public void giveReward(VotingPluginUser user, boolean online, boolean useBungee) { - new RewardBuilder(plugin.getSpecialRewardsConfig().getData(), - plugin.getSpecialRewardsConfig().getVotePartyRewardsPath()).setOnline(online) - .withPlaceHolder("VotesRequired", "" + plugin.getSpecialRewardsConfig().getVotePartyVotesRequired()) - .withPlaceHolder("FirstVotePartyToday", "" + !plugin.getServerData().isLastVotePartySameDay()) - .setServer(useBungee).send(user); - } - - /** - * Gives rewards to all eligible players for the vote party. - * - * @param orgUser the original voting user who triggered the party - * @param forceBungee whether to force Bungee processing - */ - public void giveRewards(VotingPluginUser orgUser, boolean forceBungee) { - MiscUtils.getInstance().broadcast(plugin.getSpecialRewardsConfig().getVotePartyBroadcast()); - - String player = getRandomPlayerName(); - for (final String cmd : plugin.getSpecialRewardsConfig().getVotePartyGlobalCommands()) { - plugin.getBukkitScheduler().runTask(plugin, new Runnable() { - - @Override - public void run() { - Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), - PlaceholderUtils.replacePlaceHolder(cmd, "randomonlineplayer", player)); - } - - }); - } - - final ArrayList list = plugin.getSpecialRewardsConfig().getVotePartyGlobalRandomCommand(); - if (list.size() > 0) { - plugin.getBukkitScheduler().runTask(plugin, new Runnable() { - - @Override - public void run() { - Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), PlaceholderUtils.replacePlaceHolder( - list.get(ThreadLocalRandom.current().nextInt(list.size())), "randomonlineplayer", player)); - } - - }); - } - - if (plugin.getSpecialRewardsConfig().isVotePartyGiveAllPlayers()) { - plugin.debug("Trying to give all players vote party"); - - ArrayList alreadyGotten = new ArrayList<>(); - for (Player p : Bukkit.getOnlinePlayers()) { - VotingPluginUser user; - if (orgUser != null && orgUser.getJavaUUID().equals(p.getUniqueId())) { - user = orgUser; - } else { - user = plugin.getVotingPluginUserManager().getVotingPluginUser(p); - user.userDataFetechMode(UserDataFetchMode.NO_CACHE); - } - - if (!plugin.getSpecialRewardsConfig().isVotePartyGiveOnlinePlayersOnly() || user.isOnline()) { - giveReward(user, forceBungee); - } - alreadyGotten.add(p.getUniqueId().toString()); - } - for (String uuid : plugin.getVotingPluginUserManager().getAllUUIDs()) { - if (!alreadyGotten.contains(uuid)) { - VotingPluginUser user; - if (orgUser != null && orgUser.getJavaUUID().toString().equals(uuid)) { - user = orgUser; - } else { - user = plugin.getVotingPluginUserManager().getVotingPluginUser(UUID.fromString(uuid)); - user.userDataFetechMode(UserDataFetchMode.NO_CACHE); - } - - if (!plugin.getSpecialRewardsConfig().isVotePartyGiveOnlinePlayersOnly() || user.isOnline()) { - giveReward(user, forceBungee); - } - } - } - } else { - plugin.debug("Trying to give all voted players vote party"); - plugin.debug(ArrayUtils.makeStringList(getVotedUsers())); - for (String uuid : - - getVotedUsers()) { - VotingPluginUser user; - if (orgUser != null && orgUser.getJavaUUID().toString().equals(uuid)) { - user = orgUser; - } else { - user = plugin.getVotingPluginUserManager().getVotingPluginUser(UUID.fromString(uuid)); - user.userDataFetechMode(UserDataFetchMode.NO_CACHE); - } - if (!plugin.getSpecialRewardsConfig().isVotePartyGiveOnlinePlayersOnly() || user.isOnline()) { - giveReward(user, forceBungee); - } - - } - } - - reset(false); - } - - /** - * Handles day change events to reset vote party if configured. - * - * @param event the day change event - */ - @EventHandler - public void onDayChange(DayChangeEvent event) { - if (plugin.getSpecialRewardsConfig().isVotePartyResetEachDay()) { - reset(true); - } - } - - /** - * Handles month change events to reset vote party if configured. - * - * @param event the month change event - */ - @EventHandler - public void onMonthChange(MonthChangeEvent event) { - if (plugin.getSpecialRewardsConfig().isVotePartyResetMonthly()) { - reset(true); - } - - if (plugin.getSpecialRewardsConfig().isVotePartyResetExtraVotesMonthly()) { - plugin.getServerData().setVotePartyExtraRequired(0); - } - } - - /** - * Handles week change events to reset vote party if configured. - * - * @param event the week change event - */ - @EventHandler - public void onWeekChange(WeekChangeEvent event) { - if (plugin.getSpecialRewardsConfig().isVotePartyResetWeekly()) { - reset(true); - } - - if (plugin.getSpecialRewardsConfig().isVotePartyResetExtraVotesWeekly()) { - plugin.getServerData().setVotePartyExtraRequired(0); - } - } - - /** - * Registers this class as an event listener. - */ - public void register() { - plugin.getServer().getPluginManager().registerEvents(this, plugin); - } - - /** - * Resets the vote party state. - * - * @param override whether to override total votes to zero - */ - public void reset(boolean override) { - if (override) { - setTotalVotes(0); - } - setVotedUsers(new ArrayList<>()); - resetVotePartyCount(); - - } - - /** - * Resets the vote party count for all users. - */ - public void resetVotePartyCount() { - plugin.getUserManager().removeAllKeyValues("VotePartyVotes", DataType.INTEGER); - } - - /** - * Sets the total votes. - * - * @param value the new total votes - */ - public void setTotalVotes(int value) { - plugin.getServerData().getData().set("VoteParty.Total", value); - plugin.getServerData().saveData(); - } - - /** - * Sets the voted users. - * - * @param value the new voted users - */ - public void setVotedUsers(List value) { - plugin.getServerData().getData().set("VoteParty.Voted", value); - plugin.getServerData().saveData(); - } - - /** - * Processes a vote for the vote party system. - * - * @param user the voting plugin user - * @param realVote whether this is a real vote - * @param forceBungee whether to force Bungee processing - */ - public synchronized void vote(VotingPluginUser user, boolean realVote, boolean forceBungee) { - if (plugin.getSpecialRewardsConfig().isVotePartyEnabled()) { - if (plugin.getSpecialRewardsConfig().isVotePartyCountFakeVotes() || realVote) { - if (plugin.getSpecialRewardsConfig().isVotePartyCountOfflineVotes() || user.isOnline()) { - addTotal(user); - addVotePlayer(user); - check(user, forceBungee); - checkVoteReminder(user); - } - } - } - } - -} + +package com.bencodez.votingplugin.specialrewards.voteparty; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +import com.bencodez.advancedcore.api.messages.PlaceholderUtils; +import com.bencodez.advancedcore.api.misc.MiscUtils; +import com.bencodez.advancedcore.api.time.events.DayChangeEvent; +import com.bencodez.advancedcore.api.time.events.MonthChangeEvent; +import com.bencodez.advancedcore.api.time.events.WeekChangeEvent; +import com.bencodez.simpleapi.array.ArrayUtils; +import com.bencodez.simpleapi.messages.MessageAPI; +import com.bencodez.votingplugin.VotingPluginMain; +import com.bencodez.votingplugin.events.VotePartyEvent; +import com.bencodez.votingplugin.user.VotingPluginUser; + +/** Coordinates VoteParty voting, reminders, commands, and reset events. */ +public class VoteParty implements Listener { + + private VotingPluginMain plugin; + private final VotePartyState state; + private final VotePartyRewardHandler rewardHandler; + + /** + * Constructs a new VoteParty. + * + * @param plugin the main plugin instance + */ + public VoteParty(VotingPluginMain plugin) { + this.plugin = plugin; + this.state = new VotePartyState(plugin); + this.rewardHandler = new VotePartyRewardHandler(plugin, state, this); + } + + /** + * Adds a vote total for the user. + * + * @param user the voting plugin user + */ + public void addTotal(VotingPluginUser user) { + setTotalVotes(getTotalVotes() + 1); + user.setVotePartyVotes(user.getVotePartyVotes() + 1); + plugin.getPlaceholders().onVotePartyUpdate(); + } + + /** + * Adds the vote player. + * + * @param user the user + */ + public void addVotePlayer(VotingPluginUser user) { + String uuid = user.getUUID(); + List voted = getVotedUsers(); + if (!voted.contains(uuid)) { + voted.add(uuid); + setVotedUsers(voted); + } + } + + /** + * Checks if vote party requirements are met and triggers if appropriate. + * + * @param user the voting plugin user + * @param forceBungee whether to force Bungee processing + */ + public void check(VotingPluginUser user, boolean forceBungee) { + if (getTotalVotes() < getVotesRequired()) { + plugin.extraDebug("Not enough votes for vote party: " + getTotalVotes() + " / " + getVotesRequired()); + return; + } + + if (plugin.getSpecialRewardsConfig().isVotePartyOnlyOncePerDay() + && plugin.getServerData().isLastVotePartySameDay()) { + plugin.extraDebug("Already had vote party today"); + return; + } + if (plugin.getSpecialRewardsConfig().isVotePartyOnlyOncePerWeek() + && plugin.getServerData().isLastVotePartySameWeek()) { + plugin.extraDebug("Already had vote party this week"); + return; + } + if (plugin.getSpecialRewardsConfig().isVotePartyResetCount()) { + setTotalVotes(getTotalVotes() - getVotesRequired()); + } + + VotePartyEvent event = new VotePartyEvent(); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) { + return; + } + + giveRewards(user, forceBungee); + + if (plugin.getSpecialRewardsConfig().getVotePartyIncreaseVotesRequired() > 0) { + plugin.getServerData().setVotePartyExtraRequired(plugin.getServerData().getVotePartyExtraRequired() + + plugin.getSpecialRewardsConfig().getVotePartyIncreaseVotesRequired()); + } + + plugin.getServerData().updateLastVoteParty(); + + if (plugin.getSpecialRewardsConfig().isVotePartyOnlyOncePerWeek()) { + plugin.getServerData().updateLastVotePartyWeek(); + } + } + + /** + * Checks and sends vote reminders if requirements are met. + * + * @param user the voting plugin user + */ + public void checkVoteReminder(VotingPluginUser user) { + if (!user.isVanished()) { + int neededVotes = getNeededVotes(); + + for (Integer num1 : plugin.getSpecialRewardsConfig().getVotePartyVoteReminderAtVotes()) { + int num = num1.intValue(); + if (neededVotes == num) { + String broadcastMessage = plugin.getSpecialRewardsConfig().getVotePartyVoteReminderBroadcast(); + HashMap placeholders = new HashMap<>(); + placeholders.put("player", user.getPlayerName()); + placeholders.put("votesrequired", "" + neededVotes); + MiscUtils.getInstance() + .broadcast(PlaceholderUtils.replacePlaceHolder(broadcastMessage, placeholders)); + + MiscUtils.getInstance().executeConsoleCommands( + plugin.getSpecialRewardsConfig().getVotePartyVoteReminderCommands(), placeholders, false); + } + } + } + } + + /** + * Command vote party. + * + * @param sender the sender + */ + public void commandVoteParty(CommandSender sender) { + if (plugin.getSpecialRewardsConfig().isVotePartyEnabled()) { + ArrayList msg = plugin.getConfigFile().getFormatCommandsVoteParty(); + int votesRequired = getVotesRequired(); + int votes = getTotalVotes(); + int neededVotes = votesRequired - votes; + HashMap placeholders = new HashMap<>(); + placeholders.put("votesrequired", "" + votesRequired); + placeholders.put("neededvotes", "" + neededVotes); + placeholders.put("votes", "" + votes); + msg = ArrayUtils.colorize(PlaceholderUtils.replacePlaceHolder(msg, placeholders)); + if (sender instanceof Player) { + Player p = (Player) sender; + sender.sendMessage(ArrayUtils.convert(PlaceholderUtils.replacePlaceHolders(msg, p))); + } else { + sender.sendMessage(ArrayUtils.convert(msg)); + } + } else { + sender.sendMessage(MessageAPI.colorize("&cVoteParty not enabled")); + } + } + + /** + * Gets the needed votes. + * + * @return the needed votes + */ + public int getNeededVotes() { + return getVotesRequired() - getTotalVotes(); + } + + /** + * Gets a random player name from voted users. + * + * @return random player name or "No Player" if none available + */ + public String getRandomPlayerName() { + return rewardHandler.randomOnlinePlayerName(); + } + + /** + * Gets the total votes. + * + * @return the total votes + */ + public int getTotalVotes() { + return state.getTotalVotes(); + } + + /** + * Gets the voted users. + * + * @return the voted users + */ + public List getVotedUsers() { + return state.getVotedUsers(); + } + + /** + * Gets the number of votes required for the vote party. + * + * @return votes required including extra requirements + */ + public int getVotesRequired() { + return state.getVotesRequired(); + } + + /** + * Gives vote party reward to a user. + * + * @param user the voting plugin user + * @param useBungee whether to use Bungee processing + */ + public void giveReward(VotingPluginUser user, boolean useBungee) { + if (plugin.getSpecialRewardsConfig().getVotePartyUserVotesRequired() > 0 + && user.getVotePartyVotes() < plugin.getSpecialRewardsConfig().getVotePartyUserVotesRequired()) { + return; + } + giveReward(user, user.isOnline(), useBungee); + } + + /** + * Gives vote party reward to a user with online status. + * + * @param user the voting plugin user + * @param online whether the user is online + * @param useBungee whether to use Bungee processing + */ + public void giveReward(VotingPluginUser user, boolean online, boolean useBungee) { + rewardHandler.giveReward(user, online, useBungee); + } + + /** + * Gives rewards to all eligible players for the vote party. + * + * @param orgUser the original voting user who triggered the party + * @param forceBungee whether to force Bungee processing + */ + public void giveRewards(VotingPluginUser orgUser, boolean forceBungee) { + rewardHandler.giveRewards(orgUser, forceBungee); + reset(false); + } + + /** + * Handles day change events to reset vote party if configured. + * + * @param event the day change event + */ + @EventHandler + public void onDayChange(DayChangeEvent event) { + if (plugin.getSpecialRewardsConfig().isVotePartyResetEachDay()) { + reset(true); + } + } + + /** + * Handles month change events to reset vote party if configured. + * + * @param event the month change event + */ + @EventHandler + public void onMonthChange(MonthChangeEvent event) { + if (plugin.getSpecialRewardsConfig().isVotePartyResetMonthly()) { + reset(true); + } + + if (plugin.getSpecialRewardsConfig().isVotePartyResetExtraVotesMonthly()) { + plugin.getServerData().setVotePartyExtraRequired(0); + } + } + + /** + * Handles week change events to reset vote party if configured. + * + * @param event the week change event + */ + @EventHandler + public void onWeekChange(WeekChangeEvent event) { + if (plugin.getSpecialRewardsConfig().isVotePartyResetWeekly()) { + reset(true); + } + + if (plugin.getSpecialRewardsConfig().isVotePartyResetExtraVotesWeekly()) { + plugin.getServerData().setVotePartyExtraRequired(0); + } + } + + /** + * Registers this class as an event listener. + */ + public void register() { + plugin.getServer().getPluginManager().registerEvents(this, plugin); + } + + /** + * Resets the vote party state. + * + * @param override whether to override total votes to zero + */ + public void reset(boolean override) { + if (override) { + setTotalVotes(0); + } + setVotedUsers(new ArrayList<>()); + resetVotePartyCount(); + } + + /** + * Resets the vote party count for all users. + */ + public void resetVotePartyCount() { + state.resetUserCounts(); + } + + /** + * Sets the total votes. + * + * @param value the new total votes + */ + public void setTotalVotes(int value) { + state.setTotalVotes(value); + } + + /** + * Sets the voted users. + * + * @param value the new voted users + */ + public void setVotedUsers(List value) { + state.setVotedUsers(value); + } + + /** + * Processes a vote for the vote party system. + * + * @param user the voting plugin user + * @param realVote whether this is a real vote + * @param forceBungee whether to force Bungee processing + */ + public synchronized void vote(VotingPluginUser user, boolean realVote, boolean forceBungee) { + if (plugin.getSpecialRewardsConfig().isVotePartyEnabled()) { + if (plugin.getSpecialRewardsConfig().isVotePartyCountFakeVotes() || realVote) { + if (plugin.getSpecialRewardsConfig().isVotePartyCountOfflineVotes() || user.isOnline()) { + addTotal(user); + addVotePlayer(user); + check(user, forceBungee); + checkVoteReminder(user); + } + } + } + } +} diff --git a/VotingPlugin/src/main/java/com/bencodez/votingplugin/specialrewards/voteparty/VotePartyRewardHandler.java b/VotingPlugin/src/main/java/com/bencodez/votingplugin/specialrewards/voteparty/VotePartyRewardHandler.java new file mode 100644 index 0000000000..822ac4e3e5 --- /dev/null +++ b/VotingPlugin/src/main/java/com/bencodez/votingplugin/specialrewards/voteparty/VotePartyRewardHandler.java @@ -0,0 +1,128 @@ +package com.bencodez.votingplugin.specialrewards.voteparty; + +import java.util.ArrayList; +import java.util.UUID; +import java.util.concurrent.ThreadLocalRandom; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import com.bencodez.advancedcore.api.messages.PlaceholderUtils; +import com.bencodez.advancedcore.api.misc.MiscUtils; +import com.bencodez.advancedcore.api.rewards.RewardBuilder; +import com.bencodez.advancedcore.api.user.UserDataFetchMode; +import com.bencodez.simpleapi.array.ArrayUtils; +import com.bencodez.votingplugin.VotingPluginMain; +import com.bencodez.votingplugin.user.VotingPluginUser; + +/** Owns VoteParty reward delivery and global command fan-out. */ +public final class VotePartyRewardHandler { + + private final VotingPluginMain plugin; + private final VotePartyState state; + private final VoteParty voteParty; + + public VotePartyRewardHandler(VotingPluginMain plugin, VotePartyState state, VoteParty voteParty) { + this.plugin = plugin; + this.state = state; + this.voteParty = voteParty; + } + + public void giveReward(VotingPluginUser user, boolean useBungee) { + if (plugin.getSpecialRewardsConfig().getVotePartyUserVotesRequired() > 0 + && user.getVotePartyVotes() < plugin.getSpecialRewardsConfig().getVotePartyUserVotesRequired()) { + return; + } + giveReward(user, user.isOnline(), useBungee); + } + + public void giveReward(VotingPluginUser user, boolean online, boolean useBungee) { + new RewardBuilder(plugin.getSpecialRewardsConfig().getData(), + plugin.getSpecialRewardsConfig().getVotePartyRewardsPath()).setOnline(online) + .withPlaceHolder("VotesRequired", "" + plugin.getSpecialRewardsConfig().getVotePartyVotesRequired()) + .withPlaceHolder("FirstVotePartyToday", "" + !plugin.getServerData().isLastVotePartySameDay()) + .setServer(useBungee).send(user); + } + + public void giveRewards(VotingPluginUser triggeringUser, boolean forceBungee) { + MiscUtils.getInstance().broadcast(plugin.getSpecialRewardsConfig().getVotePartyBroadcast()); + dispatchGlobalCommands(voteParty.getRandomPlayerName()); + + if (plugin.getSpecialRewardsConfig().isVotePartyGiveAllPlayers()) { + giveAllPlayers(triggeringUser, forceBungee); + } else { + giveVotedPlayers(triggeringUser, forceBungee); + } + } + + public String randomOnlinePlayerName() { + ArrayList players = new ArrayList<>(); + for (Player player : Bukkit.getOnlinePlayers()) { + players.add(player.getName()); + } + if (players.isEmpty()) { + return "No Player"; + } + return players.get(ThreadLocalRandom.current().nextInt(players.size())); + } + + private void dispatchGlobalCommands(String randomPlayer) { + for (String command : plugin.getSpecialRewardsConfig().getVotePartyGlobalCommands()) { + plugin.getBukkitScheduler().runTask(plugin, + () -> Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), + PlaceholderUtils.replacePlaceHolder(command, "randomonlineplayer", randomPlayer))); + } + + ArrayList randomCommands = plugin.getSpecialRewardsConfig().getVotePartyGlobalRandomCommand(); + if (!randomCommands.isEmpty()) { + plugin.getBukkitScheduler().runTask(plugin, () -> Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), + PlaceholderUtils.replacePlaceHolder( + randomCommands.get(ThreadLocalRandom.current().nextInt(randomCommands.size())), + "randomonlineplayer", randomPlayer))); + } + } + + private void giveAllPlayers(VotingPluginUser triggeringUser, boolean forceBungee) { + plugin.debug("Trying to give all players vote party"); + ArrayList alreadyGiven = new ArrayList<>(); + for (Player player : Bukkit.getOnlinePlayers()) { + VotingPluginUser user = resolveUser(triggeringUser, player.getUniqueId(), player); + if (!plugin.getSpecialRewardsConfig().isVotePartyGiveOnlinePlayersOnly() || user.isOnline()) { + voteParty.giveReward(user, forceBungee); + } + alreadyGiven.add(player.getUniqueId().toString()); + } + + for (String uuid : plugin.getVotingPluginUserManager().getAllUUIDs()) { + if (alreadyGiven.contains(uuid)) { + continue; + } + VotingPluginUser user = resolveUser(triggeringUser, UUID.fromString(uuid), null); + if (!plugin.getSpecialRewardsConfig().isVotePartyGiveOnlinePlayersOnly() || user.isOnline()) { + voteParty.giveReward(user, forceBungee); + } + } + } + + private void giveVotedPlayers(VotingPluginUser triggeringUser, boolean forceBungee) { + plugin.debug("Trying to give all voted players vote party"); + plugin.debug(ArrayUtils.makeStringList(voteParty.getVotedUsers())); + for (String uuid : voteParty.getVotedUsers()) { + VotingPluginUser user = resolveUser(triggeringUser, UUID.fromString(uuid), null); + if (!plugin.getSpecialRewardsConfig().isVotePartyGiveOnlinePlayersOnly() || user.isOnline()) { + voteParty.giveReward(user, forceBungee); + } + } + } + + private VotingPluginUser resolveUser(VotingPluginUser triggeringUser, UUID uuid, Player onlinePlayer) { + if (triggeringUser != null && triggeringUser.getJavaUUID().equals(uuid)) { + return triggeringUser; + } + VotingPluginUser user = onlinePlayer == null + ? plugin.getVotingPluginUserManager().getVotingPluginUser(uuid) + : plugin.getVotingPluginUserManager().getVotingPluginUser(onlinePlayer); + user.userDataFetechMode(UserDataFetchMode.NO_CACHE); + return user; + } +} diff --git a/VotingPlugin/src/main/java/com/bencodez/votingplugin/specialrewards/voteparty/VotePartyState.java b/VotingPlugin/src/main/java/com/bencodez/votingplugin/specialrewards/voteparty/VotePartyState.java new file mode 100644 index 0000000000..99d31ce860 --- /dev/null +++ b/VotingPlugin/src/main/java/com/bencodez/votingplugin/specialrewards/voteparty/VotePartyState.java @@ -0,0 +1,62 @@ +package com.bencodez.votingplugin.specialrewards.voteparty; + +import java.util.ArrayList; +import java.util.List; + +import com.bencodez.simpleapi.sql.DataType; +import com.bencodez.votingplugin.VotingPluginMain; + +/** Owns persistent VoteParty totals, participant state, and per-user counters. */ +public final class VotePartyState { + + private static final String TOTAL_PATH = "VoteParty.Total"; + private static final String VOTED_PATH = "VoteParty.Voted"; + private static final String USER_COUNT_KEY = "VotePartyVotes"; + + private final VotingPluginMain plugin; + + public VotePartyState(VotingPluginMain plugin) { + this.plugin = plugin; + } + + public int getTotalVotes() { + return plugin.getServerData().getData().getInt(TOTAL_PATH); + } + + public void setTotalVotes(int value) { + plugin.getServerData().getData().set(TOTAL_PATH, value); + plugin.getServerData().saveData(); + } + + public List getVotedUsers() { + List users = plugin.getServerData().getData().getStringList(VOTED_PATH); + return users == null ? new ArrayList<>() : users; + } + + public void setVotedUsers(List users) { + plugin.getServerData().getData().set(VOTED_PATH, users); + plugin.getServerData().saveData(); + } + + public int getVotesRequired() { + int required = plugin.getSpecialRewardsConfig().getVotePartyVotesRequired(); + int extra = plugin.getServerData().getVotePartyExtraRequired(); + return extra > 0 ? required + extra : required; + } + + public int getNeededVotes() { + return getVotesRequired() - getTotalVotes(); + } + + public void reset(boolean resetTotal) { + if (resetTotal) { + setTotalVotes(0); + } + setVotedUsers(new ArrayList<>()); + resetUserCounts(); + } + + public void resetUserCounts() { + plugin.getUserManager().removeAllKeyValues(USER_COUNT_KEY, DataType.INTEGER); + } +}