|
1 | | -package dev.pgm.community.assistance.feature; |
| 1 | +package dev.pgm.community.assistance.feature.types; |
2 | 2 |
|
3 | 3 | import static net.kyori.adventure.text.Component.space; |
4 | 4 | import static net.kyori.adventure.text.Component.text; |
5 | 5 | import static net.kyori.adventure.text.Component.translatable; |
6 | 6 |
|
7 | 7 | import com.google.common.cache.Cache; |
8 | 8 | import com.google.common.cache.CacheBuilder; |
| 9 | +import com.google.common.collect.Lists; |
9 | 10 | import dev.pgm.community.CommunityPermissions; |
10 | 11 | import dev.pgm.community.assistance.AssistanceRequest; |
11 | 12 | import dev.pgm.community.assistance.AssistanceRequest.RequestType; |
12 | 13 | import dev.pgm.community.assistance.PlayerHelpRequest; |
13 | 14 | import dev.pgm.community.assistance.Report; |
14 | 15 | import dev.pgm.community.assistance.ReportConfig; |
| 16 | +import dev.pgm.community.assistance.feature.AssistanceFeature; |
15 | 17 | import dev.pgm.community.assistance.menu.ReportCategoryMenu; |
| 18 | +import dev.pgm.community.assistance.store.AssistanceStore; |
16 | 19 | import dev.pgm.community.events.PlayerHelpRequestEvent; |
17 | 20 | import dev.pgm.community.events.PlayerPunishmentEvent; |
18 | 21 | import dev.pgm.community.events.PlayerReportEvent; |
|
22 | 25 | import dev.pgm.community.network.updates.types.AssistUpdate; |
23 | 26 | import dev.pgm.community.users.feature.UsersFeature; |
24 | 27 | import dev.pgm.community.utils.BroadcastUtils; |
| 28 | +import dev.pgm.community.utils.NameUtils; |
25 | 29 | import dev.pgm.community.utils.NetworkUtils; |
26 | 30 | import dev.pgm.community.utils.Sounds; |
27 | 31 | import fr.minuskube.inv.InventoryManager; |
|
40 | 44 | import net.kyori.adventure.text.event.HoverEvent; |
41 | 45 | import net.kyori.adventure.text.format.NamedTextColor; |
42 | 46 | import org.bukkit.Bukkit; |
| 47 | +import org.bukkit.configuration.Configuration; |
43 | 48 | import org.bukkit.entity.Player; |
44 | 49 | import org.bukkit.event.EventHandler; |
45 | 50 | import org.jetbrains.annotations.Nullable; |
46 | 51 | import tc.oc.pgm.util.Audience; |
47 | 52 | import tc.oc.pgm.util.bukkit.BukkitUtils; |
48 | 53 | import tc.oc.pgm.util.named.NameStyle; |
49 | 54 |
|
50 | | -public abstract class AssistanceFeatureBase extends FeatureBase implements AssistanceFeature { |
| 55 | +public class AssistanceFeatureCore extends FeatureBase implements AssistanceFeature { |
51 | 56 |
|
52 | 57 | private final NetworkFeature network; |
53 | | - protected final UsersFeature users; |
| 58 | + private final UsersFeature users; |
54 | 59 | private final InventoryManager inventory; |
| 60 | + private final AssistanceStore store; |
55 | 61 |
|
56 | | - protected final Cache<UUID, Instant> cooldown; |
57 | | - protected final Cache<Report, Instant> recentReports; |
58 | | - protected final Cache<PlayerHelpRequest, Instant> recentHelp; |
| 62 | + private final Cache<UUID, Instant> cooldown; |
| 63 | + private final Cache<Report, Instant> recentReports; |
| 64 | + private final Cache<PlayerHelpRequest, Instant> recentHelp; |
59 | 65 |
|
60 | | - public AssistanceFeatureBase( |
61 | | - ReportConfig config, |
| 66 | + public AssistanceFeatureCore( |
| 67 | + Configuration config, |
62 | 68 | Logger logger, |
63 | | - String featureName, |
64 | | - NetworkFeature network, |
65 | 69 | UsersFeature users, |
66 | | - InventoryManager inventory) { |
67 | | - super(config, logger, featureName); |
68 | | - cooldown = CacheBuilder.newBuilder() |
69 | | - .expireAfterWrite(config.getCooldown(), TimeUnit.SECONDS) |
| 70 | + NetworkFeature network, |
| 71 | + InventoryManager inventory, |
| 72 | + AssistanceStore store) { |
| 73 | + super(new ReportConfig(config), logger, "Assistance"); |
| 74 | + this.cooldown = CacheBuilder.newBuilder() |
| 75 | + .expireAfterWrite(getReportConfig().getCooldown(), TimeUnit.SECONDS) |
70 | 76 | .build(); |
71 | 77 | this.recentReports = CacheBuilder.newBuilder() |
72 | | - .expireAfterWrite(config.getReportExpireTime().getSeconds(), TimeUnit.SECONDS) |
| 78 | + .expireAfterWrite(getReportConfig().getReportExpireTime().getSeconds(), TimeUnit.SECONDS) |
73 | 79 | .build(); |
74 | 80 | this.recentHelp = CacheBuilder.newBuilder() |
75 | | - .expireAfterWrite(config.getReportExpireTime().getSeconds(), TimeUnit.SECONDS) |
| 81 | + .expireAfterWrite(getReportConfig().getReportExpireTime().getSeconds(), TimeUnit.SECONDS) |
76 | 82 | .build(); |
77 | 83 | this.network = network; |
78 | 84 | this.users = users; |
79 | 85 | this.inventory = inventory; |
| 86 | + this.store = store; |
80 | 87 |
|
81 | | - if (config.isEnabled()) { |
| 88 | + if (getConfig().isEnabled()) { |
82 | 89 | enable(); |
83 | 90 | network.registerSubscriber(new AssistanceSubscriber(this, network.getNetworkId(), logger)); |
84 | 91 | } |
85 | 92 | } |
86 | 93 |
|
87 | | - protected ReportConfig getReportConfig() { |
| 94 | + private ReportConfig getReportConfig() { |
88 | 95 | return (ReportConfig) getConfig(); |
89 | 96 | } |
90 | 97 |
|
| 98 | + @Override |
| 99 | + public void enable() { |
| 100 | + super.enable(); |
| 101 | + } |
| 102 | + |
91 | 103 | private boolean isCooldownEnabled() { |
92 | 104 | return getReportConfig().getCooldown() > 0; |
93 | 105 | } |
94 | 106 |
|
95 | | - protected boolean isPersistent() { |
| 107 | + private boolean isPersistent() { |
96 | 108 | return getReportConfig().isPersistent(); |
97 | 109 | } |
98 | 110 |
|
@@ -162,9 +174,31 @@ public Report report(Player sender, Player target, String reason) { |
162 | 174 | // Reset cooldown |
163 | 175 | startCooldown(sender); |
164 | 176 |
|
| 177 | + if (isPersistent()) { |
| 178 | + store.save(report); |
| 179 | + } |
165 | 180 | return report; |
166 | 181 | } |
167 | 182 |
|
| 183 | + @Override |
| 184 | + public CompletableFuture<List<Report>> query(String target) { |
| 185 | + if (NameUtils.isMinecraftName(target)) { |
| 186 | + // CONVERT TO UUID if username |
| 187 | + return users |
| 188 | + .getStoredId(target) |
| 189 | + .thenApplyAsync(uuid -> uuid.isPresent() |
| 190 | + ? store.queryList(uuid.get().toString()).join() |
| 191 | + : Lists.newArrayList()); |
| 192 | + } |
| 193 | + |
| 194 | + return store.queryList(target); |
| 195 | + } |
| 196 | + |
| 197 | + @Override |
| 198 | + public CompletableFuture<Integer> count() { |
| 199 | + return store.count(); |
| 200 | + } |
| 201 | + |
168 | 202 | @Override |
169 | 203 | public Set<Report> getRecentReports() { |
170 | 204 | return recentReports.asMap().keySet(); |
@@ -198,6 +232,11 @@ public void recieveUpdate(AssistanceRequest request) { |
198 | 232 | broadcastRequest(request); |
199 | 233 | } |
200 | 234 |
|
| 235 | + @Override |
| 236 | + public void invalidate(UUID playerId) { |
| 237 | + store.invalidate(playerId); |
| 238 | + } |
| 239 | + |
201 | 240 | @EventHandler |
202 | 241 | public void onPlayerReport(PlayerReportEvent event) { |
203 | 242 | recentReports.put(event.getReport(), Instant.now()); |
|
0 commit comments