Merge remote-tracking branch 'refs/remotes/origin/master' into develop-feedback

This commit is contained in:
Elias Müller 2024-12-03 20:38:06 +01:00
commit a412f5c24c
4 changed files with 122 additions and 17 deletions

View File

@ -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;
}

View File

@ -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()
);
}
}

View File

@ -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());
}
}

View File

@ -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: