Merge remote-tracking branch 'refs/remotes/origin/master' into develop-feedback
This commit is contained in:
commit
a412f5c24c
src/main
java/eu/mhsl/craftattack/spawn/appliances
resources
@ -13,13 +13,12 @@ import org.bukkit.event.Listener;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.WeakHashMap;
|
||||
import java.util.*;
|
||||
|
||||
public class AfkTag extends Appliance implements DisplayName.DisplayNamed {
|
||||
private final WeakHashMap<Player, Long> afkTimings = new WeakHashMap<>();
|
||||
private final HashMap<UUID, Long> afkTimings = new HashMap<>();
|
||||
private static final int updateIntervalSeconds = 30;
|
||||
private static final int afkWhenMillis = 5 * 60 * 1000;
|
||||
private static final int afkWhenMillis = 3 * 60 * 1000;
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
@ -33,21 +32,22 @@ public class AfkTag extends Appliance implements DisplayName.DisplayNamed {
|
||||
|
||||
public void resetTiming(Player player) {
|
||||
boolean wasAfk = isAfk(player);
|
||||
this.afkTimings.put(player, System.currentTimeMillis());
|
||||
this.afkTimings.put(player.getUniqueId(), System.currentTimeMillis());
|
||||
if (wasAfk) this.updateAfkPrefix(player);
|
||||
}
|
||||
|
||||
private void checkAfkPlayers() {
|
||||
this.afkTimings.keySet().forEach((player) -> {
|
||||
if(!isAfk(player)) return;
|
||||
this.updateAfkPrefix(player);
|
||||
});
|
||||
this.afkTimings.keySet().stream()
|
||||
.map(Bukkit::getPlayer)
|
||||
.filter(Objects::nonNull)
|
||||
.filter(this::isAfk)
|
||||
.forEach(this::updateAfkPrefix);
|
||||
}
|
||||
|
||||
private boolean isAfk(Player player) {
|
||||
if(player.isSleeping()) return false;
|
||||
|
||||
long lastTimeActive = this.afkTimings.getOrDefault(player, 0L);
|
||||
long lastTimeActive = this.afkTimings.getOrDefault(player.getUniqueId(), 0L);
|
||||
long timeSinceLastActive = System.currentTimeMillis() - lastTimeActive;
|
||||
return timeSinceLastActive >= afkWhenMillis;
|
||||
}
|
||||
|
@ -5,9 +5,12 @@ import eu.mhsl.craftattack.spawn.Main;
|
||||
import eu.mhsl.craftattack.spawn.appliance.Appliance;
|
||||
import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.ComponentBuilder;
|
||||
import net.kyori.adventure.text.TextComponent;
|
||||
import net.kyori.adventure.text.event.ClickEvent;
|
||||
import net.kyori.adventure.text.event.HoverEvent;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import org.apache.http.client.utils.URIBuilder;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.entity.Player;
|
||||
@ -16,6 +19,7 @@ import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.http.HttpClient;
|
||||
import java.net.http.HttpRequest;
|
||||
import java.net.http.HttpResponse;
|
||||
@ -45,7 +49,16 @@ public class Report extends Appliance {
|
||||
private record Request(@NotNull UUID reporter, @Nullable UUID reported, String reason) {
|
||||
}
|
||||
|
||||
private record Response(@NotNull String url) {
|
||||
private record ReportResponse(@NotNull String url) {
|
||||
}
|
||||
|
||||
private record ReportsResponse(List<ReportInfo> from_self, Object to_self) {
|
||||
}
|
||||
|
||||
private record ReportInfo(Reporter reported, @NotNull String subject, boolean draft, @NotNull String status, @NotNull String url) {
|
||||
}
|
||||
|
||||
private record Reporter(@NotNull String username, @NotNull String uuid) {
|
||||
}
|
||||
|
||||
public void reportToUnknown(@NotNull Player issuer) {
|
||||
@ -66,6 +79,27 @@ public class Report extends Appliance {
|
||||
this.issueReport(issuer, request);
|
||||
}
|
||||
|
||||
public void requestReports(Player issuer) {
|
||||
URIBuilder uriBuilder = new URIBuilder(this.apiEndpoint);
|
||||
uriBuilder.addParameter("uuid", issuer.getUniqueId().toString());
|
||||
|
||||
try(HttpClient client = HttpClient.newHttpClient()) {
|
||||
HttpRequest httpRequest = HttpRequest.newBuilder()
|
||||
.uri(uriBuilder.build())
|
||||
.header("Content-Type", "application/json")
|
||||
.GET()
|
||||
.build();
|
||||
|
||||
HttpResponse<String> httpResponse = client.send(httpRequest, HttpResponse.BodyHandlers.ofString());
|
||||
this.printReports(issuer, httpResponse);
|
||||
} catch (IOException | InterruptedException | URISyntaxException e) {
|
||||
issuer.sendMessage(
|
||||
Component.text("Internal server description: " + e.getMessage()).color(NamedTextColor.RED)
|
||||
);
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
private void issueReport(Player issuer, Request reportRequest) {
|
||||
try(HttpClient client = HttpClient.newHttpClient()) {
|
||||
HttpRequest httpRequest = HttpRequest.newBuilder()
|
||||
@ -84,10 +118,57 @@ public class Report extends Appliance {
|
||||
}
|
||||
}
|
||||
|
||||
private void printReports(Player issuer, HttpResponse<String> httpResponse) {
|
||||
if(httpResponse.statusCode() != 200) {
|
||||
Main.logger().warning("Failed to request Reports: " + httpResponse.statusCode());
|
||||
issuer.sendMessage(
|
||||
Component.text()
|
||||
.append(Component.text("Interner Serverfehler beim abfragen der Reports.", NamedTextColor.RED))
|
||||
.appendNewline()
|
||||
.append(Component.text("Bitte melde dich bei einem Admin!", NamedTextColor.RED))
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
List<ReportInfo> reports = new Gson().fromJson(httpResponse.body(), ReportsResponse.class).from_self;
|
||||
reports.removeIf(reportInfo -> reportInfo.draft);
|
||||
if(reports.isEmpty()) {
|
||||
issuer.sendMessage(
|
||||
Component.text()
|
||||
.append(Component.text("Du hast noch niemanden reportet.", NamedTextColor.RED))
|
||||
.appendNewline()
|
||||
.append(Component.text("Um jemanden zu melden, nutze /report", NamedTextColor.GRAY))
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
ComponentBuilder<TextComponent, TextComponent.Builder> component = Component.text();
|
||||
|
||||
component.append(
|
||||
Component.newline()
|
||||
.append(Component.text("Von dir erstellte Reports: ", NamedTextColor.GOLD))
|
||||
.appendNewline()
|
||||
);
|
||||
|
||||
reports.forEach(reportInfo -> {
|
||||
component.append(
|
||||
Component.text()
|
||||
.append(Component.text(" - ", NamedTextColor.WHITE))
|
||||
.append(Component.text(reportInfo.reported.username, NamedTextColor.WHITE))
|
||||
.append(Component.text(String.format(": %s", reportInfo.subject), NamedTextColor.GRAY))
|
||||
.clickEvent(ClickEvent.openUrl(reportInfo.url))
|
||||
.hoverEvent(HoverEvent.showText(Component.text("Klicke, um den Report einzusehen.", NamedTextColor.GOLD)))
|
||||
);
|
||||
component.appendNewline();
|
||||
});
|
||||
|
||||
issuer.sendMessage(component.build());
|
||||
}
|
||||
|
||||
private void printResultMessage(Player issuer, HttpResponse<String> httpResponse) {
|
||||
switch(httpResponse.statusCode()) {
|
||||
case 201:
|
||||
Response response = new Gson().fromJson(httpResponse.body(), Response.class);
|
||||
ReportResponse createdReport = new Gson().fromJson(httpResponse.body(), ReportResponse.class);
|
||||
issuer.sendMessage(
|
||||
Component.text()
|
||||
.append(Component.text("\\/".repeat(20), NamedTextColor.DARK_GRAY))
|
||||
@ -99,15 +180,15 @@ public class Report extends Appliance {
|
||||
.append(
|
||||
Component
|
||||
.text(" > Hier klicken < ", NamedTextColor.GREEN)
|
||||
.hoverEvent(HoverEvent.showText(Component.text(response.url).color(NamedTextColor.GREEN)))
|
||||
.clickEvent(ClickEvent.clickEvent(ClickEvent.Action.OPEN_URL, response.url))
|
||||
.hoverEvent(HoverEvent.showText(Component.text(createdReport.url).color(NamedTextColor.GREEN)))
|
||||
.clickEvent(ClickEvent.clickEvent(ClickEvent.Action.OPEN_URL, createdReport.url))
|
||||
)
|
||||
.appendNewline()
|
||||
.appendNewline()
|
||||
.append(
|
||||
Component
|
||||
.text(response.url, NamedTextColor.GRAY)
|
||||
.clickEvent(ClickEvent.clickEvent(ClickEvent.Action.OPEN_URL, response.url))
|
||||
.text(createdReport.url, NamedTextColor.GRAY)
|
||||
.clickEvent(ClickEvent.clickEvent(ClickEvent.Action.OPEN_URL, createdReport.url))
|
||||
)
|
||||
.appendNewline()
|
||||
.appendNewline()
|
||||
@ -142,6 +223,9 @@ public class Report extends Appliance {
|
||||
@Override
|
||||
@NotNull
|
||||
protected List<ApplianceCommand<?>> commands() {
|
||||
return List.of(new ReportCommand());
|
||||
return List.of(
|
||||
new ReportCommand(),
|
||||
new ReportsCommand()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,19 @@
|
||||
package eu.mhsl.craftattack.spawn.appliances.report;
|
||||
|
||||
import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand;
|
||||
import eu.mhsl.craftattack.spawn.util.text.ComponentUtil;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class ReportsCommand extends ApplianceCommand.PlayerChecked<Report> {
|
||||
public ReportsCommand() {
|
||||
super("reports");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
|
||||
sender.sendMessage(ComponentUtil.pleaseWait());
|
||||
getAppliance().requestReports(getPlayer());
|
||||
}
|
||||
}
|
@ -10,6 +10,8 @@ commands:
|
||||
permission: admin
|
||||
report:
|
||||
description: Reporte einen Spieler
|
||||
reports:
|
||||
description: Von dir erstellte Reports
|
||||
userinfo:
|
||||
description: Get UUID from any user
|
||||
projectStart:
|
||||
|
Loading…
x
Reference in New Issue
Block a user