diff --git a/src/main/java/dev/pgm/community/requests/commands/SponsorCommands.java b/src/main/java/dev/pgm/community/requests/commands/SponsorCommands.java index 0590770..5df4149 100644 --- a/src/main/java/dev/pgm/community/requests/commands/SponsorCommands.java +++ b/src/main/java/dev/pgm/community/requests/commands/SponsorCommands.java @@ -69,142 +69,111 @@ public SponsorCommands() { @Command("") public void info(CommandAudience audience, Player player) { - Component header = - TextFormatter.horizontalLineHeading( - audience.getSender(), - text("Sponsor", NamedTextColor.YELLOW, TextDecoration.BOLD), - NamedTextColor.GOLD, - TextFormatter.MAX_CHAT_WIDTH); + Component header = TextFormatter.horizontalLineHeading( + audience.getSender(), + text("Sponsor", NamedTextColor.YELLOW, TextDecoration.BOLD), + NamedTextColor.GOLD, + TextFormatter.MAX_CHAT_WIDTH); Component footer = TextFormatter.horizontalLine(NamedTextColor.GOLD, TextFormatter.MAX_CHAT_WIDTH); RequestConfig config = ((RequestConfig) requests.getConfig()); - requests - .getRequestProfile(player.getUniqueId()) - .thenAcceptAsync( - profile -> { - Component tokenBalance = - text() - .append(RequestFeature.TOKEN) - .append(text(" Token balance: ")) - .append(text(profile.getSponsorTokens(), NamedTextColor.YELLOW)) - .append(text(" / ")) - .append(text(config.getMaxTokens(), NamedTextColor.GOLD)) - .append(renderExtraInfo(player, profile)) - .color(NamedTextColor.GRAY) - .clickEvent(ClickEvent.runCommand("/tokens")) - .hoverEvent( - HoverEvent.showText(text("Click to view tokens", NamedTextColor.GRAY))) - .build(); - - Component buttons = - text() - .append(text(" ")) - .append( - button( - "Map List", - NamedTextColor.DARK_AQUA, - "/sponsor maps 1", - "Click to view available maps as a chat list")) - .append(text(" ")) - .append( - button( - "Map Menu", - NamedTextColor.GREEN, - "/sponsor menu", - "Click to view available maps as a GUI menu")) - .append(text(" ")) - .append( - button( - "Queue", - NamedTextColor.DARK_GREEN, - "/sponsor queue", - "View a list of waiting sponsor requests (" - + ChatColor.YELLOW - + requests.getSponsorQueue().size() - + ChatColor.GRAY - + ")")) - .build(); - - audience.sendMessage(header); - - // TOKEN BALANCE - audience.sendMessage(tokenBalance); - - // Existing request status - requests - .getPendingSponsor(player.getUniqueId()) - .ifPresent( - sponsor -> { - int queueIndex = requests.queueIndex(sponsor); - boolean next = queueIndex == 0; - - Component current = - text("Current Request: ", NamedTextColor.GRAY, TextDecoration.BOLD) - .append( - button( - "Cancel", - NamedTextColor.RED, - "/sponsor cancel", - "Click to cancel this request")); - Component queue = - next - ? text( - "(Will be added to the next vote)", - NamedTextColor.GRAY, - TextDecoration.ITALIC) - : text() - .append(text("(Queue location: ")) - .append(text("#" + queueIndex, NamedTextColor.YELLOW)) - .append(text(")")) - .color(NamedTextColor.GRAY) - .hoverEvent( - HoverEvent.showText( - text( - "Your request's location in the queue", - NamedTextColor.GRAY))) - .build(); - - audience.sendMessage(empty()); - audience.sendMessage(current); - audience.sendMessage( - text() - .append(text(" - ", NamedTextColor.YELLOW)) - .append( - sponsor.getMap().getStyledName(MapNameStyle.COLOR_WITH_AUTHORS)) - .build()); - audience.sendMessage(queue); - }); - - audience.sendMessage(empty()); - - // Cooldown message - if (!requests.canSponsor(player)) { - audience.sendMessage( - text() - .append(text("Cooldown", NamedTextColor.GOLD, TextDecoration.BOLD)) - .append(text(": ", NamedTextColor.GRAY)) - .append( - MessageUtils.formatTimeLeft( - ((RequestConfig) requests.getConfig()).getSponsorCooldown(player), - profile.getLastSponsorTime(), - NamedTextColor.RED)) - .color(NamedTextColor.GRAY) - .hoverEvent( - HoverEvent.showText( - text( - "Time until you can sponsor another map", NamedTextColor.GRAY))) - .build()); - audience.sendMessage(empty()); - } - - // [Maps] [Queue] - audience.sendMessage(buttons); - - audience.sendMessage(footer); - }); + requests.getRequestProfile(player.getUniqueId()).thenAcceptAsync(profile -> { + Component tokenBalance = text() + .append(RequestFeature.TOKEN) + .append(text(" Token balance: ")) + .append(text(profile.getSponsorTokens(), NamedTextColor.YELLOW)) + .append(text(" / ")) + .append(text(config.getMaxTokens(), NamedTextColor.GOLD)) + .append(renderExtraInfo(player, profile)) + .color(NamedTextColor.GRAY) + .clickEvent(ClickEvent.runCommand("/tokens")) + .hoverEvent(HoverEvent.showText(text("Click to view tokens", NamedTextColor.GRAY))) + .build(); + + Component buttons = text() + .append(text(" ")) + .append(button( + "Map List", + NamedTextColor.DARK_AQUA, + "/sponsor maps 1", + "Click to view available maps as a chat list")) + .append(text(" ")) + .append(button( + "Map Menu", + NamedTextColor.GREEN, + "/sponsor menu", + "Click to view available maps as a GUI menu")) + .append(text(" ")) + .append(button( + "Queue", + NamedTextColor.DARK_GREEN, + "/sponsor queue", + "View a list of waiting sponsor requests (" + + ChatColor.YELLOW + + requests.getSponsorQueue().size() + + ChatColor.GRAY + + ")")) + .build(); + + audience.sendMessage(header); + + // TOKEN BALANCE + audience.sendMessage(tokenBalance); + + // Existing request status + requests.getPendingSponsor(player.getUniqueId()).ifPresent(sponsor -> { + int queueIndex = requests.queueIndex(sponsor); + boolean next = queueIndex == 0; + + Component current = text("Current Request: ", NamedTextColor.GRAY, TextDecoration.BOLD) + .append(button( + "Cancel", NamedTextColor.RED, "/sponsor cancel", "Click to cancel this request")); + Component queue = next + ? text("(Will be added to the next vote)", NamedTextColor.GRAY, TextDecoration.ITALIC) + : text() + .append(text("(Queue location: ")) + .append(text("#" + queueIndex, NamedTextColor.YELLOW)) + .append(text(")")) + .color(NamedTextColor.GRAY) + .hoverEvent(HoverEvent.showText( + text("Your request's location in the queue", NamedTextColor.GRAY))) + .build(); + + audience.sendMessage(empty()); + audience.sendMessage(current); + audience.sendMessage(text() + .append(text(" - ", NamedTextColor.YELLOW)) + .append(sponsor.getMap().getStyledName(MapNameStyle.COLOR_WITH_AUTHORS)) + .build()); + audience.sendMessage(queue); + }); + + audience.sendMessage(empty()); + + // Cooldown message + if (!requests.canSponsor(player)) { + audience.sendMessage(text() + .append(text("Cooldown", NamedTextColor.GOLD, TextDecoration.BOLD)) + .append(text(": ", NamedTextColor.GRAY)) + .append(MessageUtils.formatTimeLeft( + ((RequestConfig) requests.getConfig()).getSponsorCooldown(player), + profile.getLastSponsorTime(), + NamedTextColor.RED)) + .color(NamedTextColor.GRAY) + .hoverEvent(HoverEvent.showText( + text("Time until you can sponsor another map", NamedTextColor.GRAY))) + .build()); + audience.sendMessage(empty()); + } + + // [Maps] [Queue] + audience.sendMessage(buttons); + + audience.sendMessage(footer); + }); } @Command("request ") @@ -237,26 +206,22 @@ public void viewMapList( List tags, @Flag(value = "author", aliases = "a") String author, @Flag(value = "name", aliases = "n") String name) { - Stream search = - PGM.get() - .getMapLibrary() - .getMaps(name) - .filter(PGMUtils::isMapSizeAllowed) - .filter(m -> m.getPhase() != Phase.DEVELOPMENT) - .filter(m -> !requests.hasMapCooldown(m)); + Stream search = PGM.get() + .getMapLibrary() + .getMaps(name) + .filter(PGMUtils::isMapSizeAllowed) + .filter(m -> m.getPhase() == Phase.PRODUCTION) + .filter(m -> !requests.hasMapCooldown(m)); if (!tags.isEmpty()) { - final Map> tagSet = - tags.stream() - .flatMap(t -> Arrays.stream(t.split(","))) - .map(String::toLowerCase) - .map(String::trim) - .collect( - Collectors.partitioningBy( - s -> s.startsWith("!"), - Collectors.mapping( - (String s) -> s.startsWith("!") ? s.substring(1) : s, - Collectors.toSet()))); + final Map> tagSet = tags.stream() + .flatMap(t -> Arrays.stream(t.split(","))) + .map(String::toLowerCase) + .map(String::trim) + .collect(Collectors.partitioningBy( + s -> s.startsWith("!"), + Collectors.mapping( + (String s) -> s.startsWith("!") ? s.substring(1) : s, Collectors.toSet()))); search = search.filter(map -> matchesTags(map, tagSet.get(false), tagSet.get(true))); } @@ -270,31 +235,19 @@ public void viewMapList( int resultsPerPage = 8; int pages = (maps.size() + resultsPerPage - 1) / resultsPerPage; - Component paginated = - TextFormatter.paginate( - text("Available Maps"), - page, - pages, - NamedTextColor.DARK_AQUA, - NamedTextColor.AQUA, - true); + Component paginated = TextFormatter.paginate( + text("Available Maps"), page, pages, NamedTextColor.DARK_AQUA, NamedTextColor.AQUA, true); - Component formattedTitle = - TextFormatter.horizontalLineHeading( - audience.getSender(), paginated, NamedTextColor.DARK_PURPLE, 250); + Component formattedTitle = TextFormatter.horizontalLineHeading( + audience.getSender(), paginated, NamedTextColor.DARK_PURPLE, 250); new PaginatedComponentResults(formattedTitle, resultsPerPage) { @Override public Component format(MapInfo map, int index) { - Component mapName = - map.getStyledName(MapNameStyle.COLOR_WITH_AUTHORS) - .clickEvent(ClickEvent.runCommand("/map " + map.getName())) - .hoverEvent( - HoverEvent.showText( - translatable( - "command.maps.hover", - NamedTextColor.GRAY, - map.getStyledName(MapNameStyle.COLOR)))); + Component mapName = map.getStyledName(MapNameStyle.COLOR_WITH_AUTHORS) + .clickEvent(ClickEvent.runCommand("/map " + map.getName())) + .hoverEvent(HoverEvent.showText(translatable( + "command.maps.hover", NamedTextColor.GRAY, map.getStyledName(MapNameStyle.COLOR)))); return text() .append(text((index + 1) + ". ")) @@ -315,13 +268,12 @@ public Component formatEmpty() { TextComponent.Builder buttons = text(); if (page > 1) { - buttons.append( - text() - .append(BroadcastUtils.LEFT_DIV.color(NamedTextColor.GOLD)) - .append(text(" Previous Page", NamedTextColor.BLUE)) - .hoverEvent( - HoverEvent.showText(text("Click to view previous page", NamedTextColor.GRAY))) - .clickEvent(ClickEvent.runCommand("/sponsor maps " + (page - 1)))); + buttons.append(text() + .append(BroadcastUtils.LEFT_DIV.color(NamedTextColor.GOLD)) + .append(text(" Previous Page", NamedTextColor.BLUE)) + .hoverEvent( + HoverEvent.showText(text("Click to view previous page", NamedTextColor.GRAY))) + .clickEvent(ClickEvent.runCommand("/sponsor maps " + (page - 1)))); } if (page > 1 && page < pages) { @@ -329,17 +281,14 @@ public Component formatEmpty() { } if (page < pages) { - buttons.append( - text() - .append(text("Next Page ", NamedTextColor.BLUE)) - .append(BroadcastUtils.RIGHT_DIV.color(NamedTextColor.GOLD)) - .hoverEvent( - HoverEvent.showText(text("Click to view next page", NamedTextColor.GRAY))) - .clickEvent(ClickEvent.runCommand("/sponsor maps " + (page + 1)))); + buttons.append(text() + .append(text("Next Page ", NamedTextColor.BLUE)) + .append(BroadcastUtils.RIGHT_DIV.color(NamedTextColor.GOLD)) + .hoverEvent(HoverEvent.showText(text("Click to view next page", NamedTextColor.GRAY))) + .clickEvent(ClickEvent.runCommand("/sponsor maps " + (page + 1)))); } - audience.sendMessage( - TextFormatter.horizontalLineHeading( - audience.getSender(), buttons.build(), NamedTextColor.DARK_PURPLE, 250)); + audience.sendMessage(TextFormatter.horizontalLineHeading( + audience.getSender(), buttons.build(), NamedTextColor.DARK_PURPLE, 250)); } } @@ -388,40 +337,27 @@ public void viewQueue(CommandAudience audience, @Argument("page") @Default("1") int resultsPerPage = ((RequestConfig) requests.getConfig()).getMaxQueue(); int pages = (queue.size() + resultsPerPage - 1) / resultsPerPage; - Component paginated = - TextFormatter.paginate( - text("Sponsor Queue"), - page, - pages, - NamedTextColor.DARK_AQUA, - NamedTextColor.AQUA, - true); + Component paginated = TextFormatter.paginate( + text("Sponsor Queue"), page, pages, NamedTextColor.DARK_AQUA, NamedTextColor.AQUA, true); - Component formattedTitle = - TextFormatter.horizontalLineHeading( - audience.getSender(), paginated, NamedTextColor.DARK_PURPLE, 250); + Component formattedTitle = TextFormatter.horizontalLineHeading( + audience.getSender(), paginated, NamedTextColor.DARK_PURPLE, 250); new PaginatedComponentResults(formattedTitle, resultsPerPage) { @Override public Component format(SponsorRequest sponsor, int index) { MapInfo map = sponsor.getMap(); - Component mapName = - map.getStyledName(MapNameStyle.COLOR) - .clickEvent(ClickEvent.runCommand("/map " + map.getName())) - .hoverEvent( - HoverEvent.showText( - translatable( - "command.maps.hover", - NamedTextColor.GRAY, - map.getStyledName(MapNameStyle.COLOR)))); - - Component playerName = - VisibilityUtils.isDisguised(sponsor.getPlayerId()) - ? empty() - : text() - .append(BroadcastUtils.BROADCAST_DIV) - .append(player(sponsor.getPlayerId(), NameStyle.FANCY)) - .build(); + Component mapName = map.getStyledName(MapNameStyle.COLOR) + .clickEvent(ClickEvent.runCommand("/map " + map.getName())) + .hoverEvent(HoverEvent.showText(translatable( + "command.maps.hover", NamedTextColor.GRAY, map.getStyledName(MapNameStyle.COLOR)))); + + Component playerName = VisibilityUtils.isDisguised(sponsor.getPlayerId()) + ? empty() + : text() + .append(BroadcastUtils.BROADCAST_DIV) + .append(player(sponsor.getPlayerId(), NameStyle.FANCY)) + .build(); return text() .append(text((index + 1) + ". ")) @@ -449,9 +385,8 @@ private Component renderExtraInfo(Player player, RequestProfile profile) { .append(text(" | ")) .append(text("Cooldown: ")) .append(duration(config.getSponsorCooldown(player), NamedTextColor.GOLD)) - .hoverEvent( - HoverEvent.showText( - text("This is your cooldown time between sponsor requests", NamedTextColor.GRAY))) + .hoverEvent(HoverEvent.showText( + text("This is your cooldown time between sponsor requests", NamedTextColor.GRAY))) .color(NamedTextColor.GRAY) .build(); } @@ -473,11 +408,9 @@ private Component renderExtraInfo(Player player, RequestProfile profile) { } else { return text() .append(text(" | No tokens to claim")) - .hoverEvent( - HoverEvent.showText( - text( - "You have the max amount of sponsor tokens! To claim more you need to spend some first.", - NamedTextColor.RED))) + .hoverEvent(HoverEvent.showText(text( + "You have the max amount of sponsor tokens! To claim more you need to spend some first.", + NamedTextColor.RED))) .build(); } } @@ -496,10 +429,8 @@ private Component renderSponsorButton(CommandSender sender, MapInfo map) { .append(text("[")) .append(RequestFeature.SPONSOR) .append(text("]")) - .hoverEvent( - HoverEvent.showText( - text("Click to sponsor ", NamedTextColor.GRAY) - .append(map.getStyledName(MapNameStyle.COLOR)))) + .hoverEvent(HoverEvent.showText(text("Click to sponsor ", NamedTextColor.GRAY) + .append(map.getStyledName(MapNameStyle.COLOR)))) .clickEvent(ClickEvent.runCommand("/sponsor request " + map.getName())) .color(NamedTextColor.GRAY) .build(); diff --git a/src/main/java/dev/pgm/community/requests/feature/RequestFeatureBase.java b/src/main/java/dev/pgm/community/requests/feature/RequestFeatureBase.java index 57ead72..5bc2c1c 100644 --- a/src/main/java/dev/pgm/community/requests/feature/RequestFeatureBase.java +++ b/src/main/java/dev/pgm/community/requests/feature/RequestFeatureBase.java @@ -92,11 +92,11 @@ public abstract class RequestFeatureBase extends FeatureBase implements RequestF public RequestFeatureBase( RequestConfig config, Logger logger, String featureName, UsersFeature users) { super(config, logger, "Requests (" + featureName + ")"); - this.requests = CacheBuilder.newBuilder().expireAfterWrite(1, TimeUnit.HOURS).build(); - this.cooldown = - CacheBuilder.newBuilder() - .expireAfterWrite(config.getCooldown().getSeconds(), TimeUnit.SECONDS) - .build(); + this.requests = + CacheBuilder.newBuilder().expireAfterWrite(1, TimeUnit.HOURS).build(); + this.cooldown = CacheBuilder.newBuilder() + .expireAfterWrite(config.getCooldown().getSeconds(), TimeUnit.SECONDS) + .build(); this.mapCooldown = Maps.newHashMap(); this.sponsors = Lists.newLinkedList(); this.currentSponsor = null; @@ -122,7 +122,7 @@ public void openMenu(Player viewer) { public List getAvailableSponsorMaps() { return Lists.newArrayList(PGM.get().getMapLibrary().getMaps()).stream() .filter(PGMUtils::isMapSizeAllowed) - .filter(m -> m.getPhase() != Phase.DEVELOPMENT) + .filter(m -> m.getPhase() == Phase.PRODUCTION) .filter(m -> !hasMapCooldown(m)) .collect(Collectors.toList()); } @@ -149,36 +149,34 @@ public Queue getSponsorQueue() { @EventHandler public void onPlayerJoin(PlayerJoinEvent event) { - onLogin(event) - .thenAcceptAsync( - profile -> { - if (event.getPlayer().hasPermission(CommunityPermissions.REQUEST_SPONSOR)) { - int refresh = 0; - boolean daily = false; - - // Check permission to determine what amount to refresh - // Always prefer the daily compared to the weekly (e.g sponsor inherits donor perms, - // only give daily not weekly) - if (event.getPlayer().hasPermission(CommunityPermissions.TOKEN_DAILY)) { - if (profile.hasDayElapsed()) { - refresh = getRequestConfig().getDailyTokenAmount(); - daily = true; - } - } else if (event.getPlayer().hasPermission(CommunityPermissions.TOKEN_WEEKLY)) { - if (profile.hasWeekElapsed()) { - refresh = getRequestConfig().getWeeklyTokenAmount(); - } - } - - // Refresh token amount as long as they have less than the max - if (refresh > 0 && profile.getSponsorTokens() < getRequestConfig().getMaxTokens()) { - profile.refreshTokens(refresh); // Set new token amount - update(profile); // Save new token balance to database - sendDelayedTokenRefreshMessage( - event.getPlayer(), refresh, daily, profile.getSponsorTokens()); - } - } - }); + onLogin(event).thenAcceptAsync(profile -> { + if (event.getPlayer().hasPermission(CommunityPermissions.REQUEST_SPONSOR)) { + int refresh = 0; + boolean daily = false; + + // Check permission to determine what amount to refresh + // Always prefer the daily compared to the weekly (e.g sponsor inherits donor perms, + // only give daily not weekly) + if (event.getPlayer().hasPermission(CommunityPermissions.TOKEN_DAILY)) { + if (profile.hasDayElapsed()) { + refresh = getRequestConfig().getDailyTokenAmount(); + daily = true; + } + } else if (event.getPlayer().hasPermission(CommunityPermissions.TOKEN_WEEKLY)) { + if (profile.hasWeekElapsed()) { + refresh = getRequestConfig().getWeeklyTokenAmount(); + } + } + + // Refresh token amount as long as they have less than the max + if (refresh > 0 && profile.getSponsorTokens() < getRequestConfig().getMaxTokens()) { + profile.refreshTokens(refresh); // Set new token amount + update(profile); // Save new token balance to database + sendDelayedTokenRefreshMessage( + event.getPlayer(), refresh, daily, profile.getSponsorTokens()); + } + } + }); } @EventHandler @@ -206,30 +204,26 @@ public void onMatchEnd(MatchFinishEvent event) { this.currentSponsor = nextRequest; // Update profile - getRequestProfile(nextRequest.getPlayerId()) - .thenAcceptAsync( - profile -> { - // Update RequestProfile with sponsor map info - profile.sponsor(nextRequest.getMap()); - update(profile); - }); + getRequestProfile(nextRequest.getPlayerId()).thenAcceptAsync(profile -> { + // Update RequestProfile with sponsor map info + profile.sponsor(nextRequest.getMap()); + update(profile); + }); // Alert online player if their sponsor request has been processed Player requester = Bukkit.getPlayer(nextRequest.getPlayerId()); if (requester != null) { Audience player = Audience.get(requester); - player.sendMessage( - formatTokenTransaction( - -1, - text( - "Your sponsored map has been added to the vote!", - NamedTextColor.GREEN, - TextDecoration.BOLD), - canRefund(requester) - ? text( - "If your map wins the vote, you'll get your token back", - NamedTextColor.GRAY) - : null)); + player.sendMessage(formatTokenTransaction( + -1, + text( + "Your sponsored map has been added to the vote!", + NamedTextColor.GREEN, + TextDecoration.BOLD), + canRefund(requester) + ? text( + "If your map wins the vote, you'll get your token back", NamedTextColor.GRAY) + : null)); player.playSound(Sounds.SPEND_TOKENS); } } @@ -243,24 +237,21 @@ public void onVoteEnd(MatchVoteFinishEvent event) { // Same map = winner, refund the token even if offline if (currentSponsor.getMap().equals(event.getPickedMap()) && currentSponsor.canRefund()) { - getRequestProfile(currentSponsor.getPlayerId()) - .thenAcceptAsync( - profile -> { - profile.award(1); - update(profile); - - if (player != null) { - Audience viewer = Audience.get(player); - viewer.sendMessage( - formatTokenTransaction( - 1, - text( - "Your sponsored map won the vote!", - NamedTextColor.GREEN, - TextDecoration.BOLD))); - viewer.playSound(Sounds.GET_TOKENS); - } - }); + getRequestProfile(currentSponsor.getPlayerId()).thenAcceptAsync(profile -> { + profile.award(1); + update(profile); + + if (player != null) { + Audience viewer = Audience.get(player); + viewer.sendMessage(formatTokenTransaction( + 1, + text( + "Your sponsored map won the vote!", + NamedTextColor.GREEN, + TextDecoration.BOLD))); + viewer.playSound(Sounds.GET_TOKENS); + } + }); } } } @@ -276,12 +267,11 @@ public void onMatchJoinMessage(PlayerJoinMatchEvent event) { event.getExtraLines().add(empty()); event .getExtraLines() - .add( - text() - .append(text(" Sponsored by ")) - .append(player(getCurrentSponsor().getPlayerId(), NameStyle.FANCY)) - .color(NamedTextColor.GRAY) - .build()); + .add(text() + .append(text(" Sponsored by ")) + .append(player(getCurrentSponsor().getPlayerId(), NameStyle.FANCY)) + .color(NamedTextColor.GRAY) + .build()); } private Cache voteConfirm = @@ -297,16 +287,13 @@ public void onVoteAddCommand(PlayerCommandPreprocessEvent event) { voteConfirm.put(event.getPlayer().getUniqueId(), ""); Audience viewer = Audience.get(event.getPlayer()); viewer.sendWarning(text("A sponsor map has already been added to the vote!")); - viewer.sendWarning( - text("If you still want to adjust the vote, click ", NamedTextColor.GRAY) - .append( - text() - .append(text("[", NamedTextColor.GRAY)) - .append(text("here", NamedTextColor.YELLOW)) - .append(text("]", NamedTextColor.GRAY))) - .clickEvent(ClickEvent.runCommand(event.getMessage())) - .hoverEvent( - HoverEvent.showText(text("Click to run command again", NamedTextColor.GRAY)))); + viewer.sendWarning(text("If you still want to adjust the vote, click ", NamedTextColor.GRAY) + .append(text() + .append(text("[", NamedTextColor.GRAY)) + .append(text("here", NamedTextColor.YELLOW)) + .append(text("]", NamedTextColor.GRAY))) + .clickEvent(ClickEvent.runCommand(event.getMessage())) + .hoverEvent(HoverEvent.showText(text("Click to run command again", NamedTextColor.GRAY)))); } @Override @@ -319,6 +306,15 @@ public void request(Player player, MapInfo map) { return; } + // Don't allow developmental maps + if (map.getPhase() == Phase.DEVELOPMENT) { + viewer.sendWarning(text() + .append(map.getStyledName(MapNameStyle.COLOR)) + .append(text(" may not be requested")) + .build()); + return; + } + // Cooldown if (hasCooldown(player, viewer)) return; @@ -345,12 +341,10 @@ public void request(Player player, MapInfo map) { cooldown.put(player.getUniqueId(), Instant.now()); // Update profile - getRequestProfile(player.getUniqueId()) - .thenAcceptAsync( - profile -> { - profile.request(map); - update(profile); - }); + getRequestProfile(player.getUniqueId()).thenAcceptAsync(profile -> { + profile.request(map); + update(profile); + }); // Alert the staff alertStaff(player, map, false); @@ -382,58 +376,52 @@ public void sponsor(Player player, MapInfo map) { // Ensure match is RUNNING and OVER one minute if (!compareMatchLength(Duration.ofSeconds(30))) { - viewer.sendWarning( - text() - .append(text("The match just started!")) - .append(newline()) - .append(text("Please try again after ")) - .append(text("30 seconds", NamedTextColor.AQUA)) - .append(text(" of the match has passed")) - .build()); + viewer.sendWarning(text() + .append(text("The match just started!")) + .append(newline()) + .append(text("Please try again after ")) + .append(text("30 seconds", NamedTextColor.AQUA)) + .append(text(" of the match has passed")) + .build()); return; } // Don't allow developmental maps - if (map.getPhase() == Phase.DEVELOPMENT) { - viewer.sendWarning( - text() - .append(map.getStyledName(MapNameStyle.COLOR)) - .append(text(" may not be selected")) - .build()); + if (map.getPhase() != Phase.PRODUCTION) { + viewer.sendWarning(text() + .append(map.getStyledName(MapNameStyle.COLOR)) + .append(text(" may not be selected")) + .build()); return; } // Check if map is already queued if (isMapQueued(map)) { - viewer.sendWarning( - text() - .append(map.getStyledName(MapNameStyle.COLOR)) - .append(text(" is already in the queue!")) - .build()); + viewer.sendWarning(text() + .append(map.getStyledName(MapNameStyle.COLOR)) + .append(text(" is already in the queue!")) + .build()); return; } // Check if map has a cooldown if (hasMapCooldown(map)) { MapCooldown cooldown = mapCooldown.get(map); - viewer.sendWarning( - text() - .append(text("This map can be sponsored in ", NamedTextColor.RED)) - .append( - TemporalComponent.duration(cooldown.getTimeRemaining(), NamedTextColor.YELLOW)) - .build()); + viewer.sendWarning(text() + .append(text("This map can be sponsored in ", NamedTextColor.RED)) + .append(TemporalComponent.duration(cooldown.getTimeRemaining(), NamedTextColor.YELLOW)) + .build()); return; } // Check map size if (!isMapSizeAllowed(map)) { - viewer.sendWarning( - text() - .append(map.getStyledName(MapNameStyle.COLOR)) - .append(text(" does not fit the online player count")) - .append(newline()) - .append(text("Please request a different map")) - .build()); + viewer.sendWarning(text() + .append(map.getStyledName(MapNameStyle.COLOR)) + .append(text(" does not fit the online player count")) + .append(newline()) + .append(text("Please request a different map")) + .build()); return; } @@ -449,51 +437,43 @@ public void sponsor(Player player, MapInfo map) { return; } - getRequestProfile(player.getUniqueId()) - .thenAcceptAsync( - profile -> { - if (!canSponsor(player)) { - viewer.sendWarning( - getCooldownMessage( - profile.getLastSponsorTime(), - getRequestConfig().getSponsorCooldown(player))); - return; - } - - // Check tokens - if (profile.getSponsorTokens() < 1) { - viewer.sendWarning(text("You don't have enough sponsor tokens")); - return; - } - - // Sponsor Queue - // -> Add to queue, don't charge token until sponsor is processed - queueRequest(player, map); - - // Send confirmation, including map queue position - viewer.sendMessage( - text() - .append(SPONSOR) - .append(text(" You've sponsored ", NamedTextColor.YELLOW)) - .append(map.getStyledName(MapNameStyle.COLOR))); - if (sponsors.size() > 1) { - viewer.sendMessage( - text() - .append(text("Queue position ")) - .append(text("#" + sponsors.size(), NamedTextColor.YELLOW)) - .append(text(" Use ")) - .append(text("/queue", NamedTextColor.AQUA)) - .append(text(" to track status")) - .color(NamedTextColor.GRAY) - .clickEvent(ClickEvent.runCommand("/sponsor queue")) - .hoverEvent( - showText(text("Click to view queue status", NamedTextColor.GRAY))) - .build()); - } else { - viewer.sendMessage( - text("Request will be added to the next map vote", NamedTextColor.GRAY)); - } - }); + getRequestProfile(player.getUniqueId()).thenAcceptAsync(profile -> { + if (!canSponsor(player)) { + viewer.sendWarning(getCooldownMessage( + profile.getLastSponsorTime(), getRequestConfig().getSponsorCooldown(player))); + return; + } + + // Check tokens + if (profile.getSponsorTokens() < 1) { + viewer.sendWarning(text("You don't have enough sponsor tokens")); + return; + } + + // Sponsor Queue + // -> Add to queue, don't charge token until sponsor is processed + queueRequest(player, map); + + // Send confirmation, including map queue position + viewer.sendMessage(text() + .append(SPONSOR) + .append(text(" You've sponsored ", NamedTextColor.YELLOW)) + .append(map.getStyledName(MapNameStyle.COLOR))); + if (sponsors.size() > 1) { + viewer.sendMessage(text() + .append(text("Queue position ")) + .append(text("#" + sponsors.size(), NamedTextColor.YELLOW)) + .append(text(" Use ")) + .append(text("/queue", NamedTextColor.AQUA)) + .append(text(" to track status")) + .color(NamedTextColor.GRAY) + .clickEvent(ClickEvent.runCommand("/sponsor queue")) + .hoverEvent(showText(text("Click to view queue status", NamedTextColor.GRAY))) + .build()); + } else { + viewer.sendMessage(text("Request will be added to the next map vote", NamedTextColor.GRAY)); + } + }); } @Override @@ -549,7 +529,9 @@ public boolean cancelSponsorRequest(UUID playerId) { @Override public Optional getPendingSponsor(UUID playerId) { - return this.sponsors.stream().filter(sr -> sr.getPlayerId().equals(playerId)).findAny(); + return this.sponsors.stream() + .filter(sr -> sr.getPlayerId().equals(playerId)) + .findAny(); } @Override @@ -591,7 +573,8 @@ private boolean hasCooldown(Player player, Audience viewer) { if (!canRequest) { Instant lastRequestTime = cooldown.getIfPresent(player.getUniqueId()); if (lastRequestTime != null) { - viewer.sendWarning(getCooldownMessage(lastRequestTime, getRequestConfig().getCooldown())); + viewer.sendWarning( + getCooldownMessage(lastRequestTime, getRequestConfig().getCooldown())); } } return !canRequest; @@ -609,20 +592,16 @@ private Component getRequestMessage(Player player, MapInfo map) { if (player.hasPermission(CommunityPermissions.REQUEST_SPONSOR) && canSponsor(player) && isMapSizeAllowed(map)) { - message.append( - text() - .append(space()) - .append(SPONSOR) - .clickEvent(ClickEvent.runCommand("/sponsor request" + map.getName())) - .hoverEvent( - HoverEvent.showText( - text() - .append(text("Click to sponsor this request", NamedTextColor.GRAY)) - .append(newline()) - .append( - text( - "Map will queue and be auto-added to the vote when avaiable", - NamedTextColor.YELLOW))))); + message.append(text() + .append(space()) + .append(SPONSOR) + .clickEvent(ClickEvent.runCommand("/sponsor request" + map.getName())) + .hoverEvent(HoverEvent.showText(text() + .append(text("Click to sponsor this request", NamedTextColor.GRAY)) + .append(newline()) + .append(text( + "Map will queue and be auto-added to the vote when avaiable", + NamedTextColor.YELLOW))))); } return message.color(NamedTextColor.GRAY).build(); @@ -649,10 +628,8 @@ private Component getTokenRefreshMessage(int amount, int total, boolean daily) { .append(text(total, NamedTextColor.YELLOW, TextDecoration.BOLD)) .append(text(")")) .color(NamedTextColor.GOLD) - .hoverEvent( - HoverEvent.showText( - text("Next token refresh will be in ", NamedTextColor.GRAY) - .append(duration(Duration.ofDays(daily ? 1 : 7), NamedTextColor.YELLOW)))) + .hoverEvent(HoverEvent.showText(text("Next token refresh will be in ", NamedTextColor.GRAY) + .append(duration(Duration.ofDays(daily ? 1 : 7), NamedTextColor.YELLOW)))) .build(); } @@ -665,24 +642,22 @@ private void sendDelayedTokenRefreshMessage(Player player, int amount, boolean d () -> { Audience viewer = Audience.get(player); viewer.sendMessage(getTokenRefreshMessage(amount, total, daily)); - viewer.sendMessage( - text() - .append(text("Spend tokens by using ", NamedTextColor.GRAY)) - .append(text("/sponsor", NamedTextColor.YELLOW))); + viewer.sendMessage(text() + .append(text("Spend tokens by using ", NamedTextColor.GRAY)) + .append(text("/sponsor", NamedTextColor.YELLOW))); viewer.playSound(Sounds.GET_TOKENS); }, 20L * 3); } private void alertStaff(Player player, MapInfo map, boolean sponsor) { - Component alert = - text() - .append(player(player, NameStyle.FANCY)) - .append(text(" has ")) - .append(text(sponsor ? "sponsored " : "requested ")) - .append(map.getStyledName(MapNameStyle.COLOR)) - .color(NamedTextColor.YELLOW) - .build(); + Component alert = text() + .append(player(player, NameStyle.FANCY)) + .append(text(" has ")) + .append(text(sponsor ? "sponsored " : "requested ")) + .append(map.getStyledName(MapNameStyle.COLOR)) + .color(NamedTextColor.YELLOW) + .build(); BroadcastUtils.sendAdminChatMessage(alert, CommunityPermissions.REQUEST_STAFF); } @@ -730,11 +705,10 @@ private void checkQueuedMaps() { if (!isMapSizeAllowed(request.getMap())) { Player player = Bukkit.getPlayer(request.getPlayerId()); Audience viewer = Audience.get(player); - viewer.sendWarning( - text() - .append(request.getMap().getStyledName(MapNameStyle.COLOR)) - .append(text(" no longer fits the online player count.", NamedTextColor.RED)) - .build()); + viewer.sendWarning(text() + .append(request.getMap().getStyledName(MapNameStyle.COLOR)) + .append(text(" no longer fits the online player count.", NamedTextColor.RED)) + .build()); queue.remove(); } }