Merge pull request 'Update to Discord JDA 5.0' (#22) from dc-5 into main

Reviewed-on: https://steamwar.de/devlabs/SteamWar/SteamWar/pulls/22
This commit is contained in:
Lixfel
2024-08-23 11:41:40 +02:00
15 changed files with 110 additions and 115 deletions
@@ -32,18 +32,20 @@ import de.steamwar.velocitycore.discord.util.AuthManager;
import lombok.Getter; import lombok.Getter;
import net.dv8tion.jda.api.*; import net.dv8tion.jda.api.*;
import net.dv8tion.jda.api.entities.*; import net.dv8tion.jda.api.entities.*;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent; import net.dv8tion.jda.api.entities.emoji.Emoji;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.exceptions.ErrorResponseException; import net.dv8tion.jda.api.exceptions.ErrorResponseException;
import net.dv8tion.jda.api.interactions.commands.Command; import net.dv8tion.jda.api.interactions.commands.Command;
import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.interactions.commands.OptionType;
import net.dv8tion.jda.api.interactions.commands.build.CommandData; import net.dv8tion.jda.api.interactions.commands.build.CommandData;
import net.dv8tion.jda.api.interactions.commands.build.Commands;
import net.dv8tion.jda.api.interactions.commands.build.OptionData; import net.dv8tion.jda.api.interactions.commands.build.OptionData;
import net.dv8tion.jda.api.interactions.components.ActionRow; import net.dv8tion.jda.api.interactions.components.ActionRow;
import net.dv8tion.jda.api.interactions.components.Button; import net.dv8tion.jda.api.interactions.components.buttons.Button;
import net.dv8tion.jda.api.requests.restaction.CommandListUpdateAction; import net.dv8tion.jda.api.requests.restaction.CommandListUpdateAction;
import net.dv8tion.jda.api.utils.MemberCachePolicy; import net.dv8tion.jda.api.utils.MemberCachePolicy;
import net.dv8tion.jda.api.utils.messages.MessageCreateBuilder;
import javax.security.auth.login.LoginException;
import java.awt.*; import java.awt.*;
import java.util.List; import java.util.List;
import java.util.*; import java.util.*;
@@ -87,15 +89,11 @@ public class DiscordBot {
public DiscordBot(DiscordConfig config) { public DiscordBot(DiscordConfig config) {
this.config = config; this.config = config;
try { jda = JDABuilder
jda = JDABuilder .createDefault(config.getToken())
.createDefault(config.getToken()) .setStatus(OnlineStatus.ONLINE)
.setStatus(OnlineStatus.ONLINE) .setMemberCachePolicy(MemberCachePolicy.ONLINE)
.setMemberCachePolicy(MemberCachePolicy.ONLINE) .build();
.build();
} catch (LoginException e) {
throw new SecurityException("Could not login", e);
}
instance = this; instance = this;
VelocityCore.schedule(this::asyncInit).schedule(); VelocityCore.schedule(this::asyncInit).schedule();
@@ -109,9 +107,9 @@ public class DiscordBot {
} }
activity(); activity();
new StaticMessageChannel(config.channel("roles"), () -> new MessageBuilder() new StaticMessageChannel(config.channel("roles"), () -> new MessageCreateBuilder()
.setContent("**Rollenvergabe**\nKlicke um eine Rolle zu bekommen:") .setContent("**Rollenvergabe**\nKlicke um eine Rolle zu bekommen:")
.setActionRows(ActionRow.of(config.getRoles().values().stream().map(DiscordConfig.DiscordRole::toButton).toArray(Button[]::new))), event -> InteractionReply.reply(event, reply -> { .setComponents(ActionRow.of(config.getRoles().values().stream().map(DiscordConfig.DiscordRole::toButton).toArray(Button[]::new))), event -> InteractionReply.reply(event, reply -> {
Member member = event.getMember(); Member member = event.getMember();
Guild guild = event.getGuild(); Guild guild = event.getGuild();
Role role = guild.getRoleById(event.getComponentId()); Role role = guild.getRoleById(event.getComponentId());
@@ -124,33 +122,33 @@ public class DiscordBot {
reply.system("DC_ROLE_ADDED", role.getAsMention()); reply.system("DC_ROLE_ADDED", role.getAsMention());
} }
})); }));
new StaticMessageChannel(config.channel("rules"), () -> new MessageBuilder() new StaticMessageChannel(config.channel("rules"), () -> new MessageCreateBuilder()
.setEmbeds(new EmbedBuilder() .setEmbeds(new EmbedBuilder()
.setDescription(String.join("\n", config.getRules())) .setDescription(String.join("\n", config.getRules()))
.setColor(Color.GRAY) .setColor(Color.GRAY)
.setAuthor("SteamWar", "https://steamwar.de") .setAuthor("SteamWar", "https://steamwar.de")
.setTitle("Regeln und Infos") .setTitle("Regeln und Infos")
.build()) .build())
.setActionRows( .setComponents(
ActionRow.of(Button.link("https://steamwar.de", "Website"), Button.link("https://steamwar.de/youtube", "YouTube")), ActionRow.of(Button.link("https://steamwar.de", "Website"), Button.link("https://steamwar.de/youtube", "YouTube")),
ActionRow.of(Button.primary("auth", Emoji.fromUnicode("U+2705")).withLabel("Minecraft verknüpfen")) ActionRow.of(Button.primary("auth", Emoji.fromUnicode("U+2705")).withLabel("Minecraft verknüpfen"))
), event -> { ), event -> {
if(event.getComponentId().equals("auth")) if(event.getComponentId().equals("auth"))
event.reply("Gebe innerhalb der nächsten 10 Minuten ``/verify " + AuthManager.createDiscordAuthToken(event.getUser()) + "`` auf dem Minecraft Server ein").setEphemeral(true).queue(); event.reply("Gebe innerhalb der nächsten 10 Minuten ``/verify " + AuthManager.createDiscordAuthToken(event.getUser()) + "`` auf dem Minecraft Server ein").setEphemeral(true).queue();
}); });
new StaticMessageChannel(config.channel("ticket"), () -> new MessageBuilder() new StaticMessageChannel(config.channel("ticket"), () -> new MessageCreateBuilder()
.setEmbeds(new EmbedBuilder() .setEmbeds(new EmbedBuilder()
.setDescription("Hier kannst du Tickets öffnen, welche nur von dir und Teammitgliedern eingesehen werden können.") .setDescription("Hier kannst du Tickets öffnen, welche nur von dir und Teammitgliedern eingesehen werden können.")
.setTitle("SteamWar Tickets") .setTitle("SteamWar Tickets")
.setColor(Color.RED) .setColor(Color.RED)
.build()) .build())
.setActionRows(ActionRow.of(Arrays.stream(DiscordTicketType.values()).map(DiscordTicketType::toButton).toArray(Button[]::new))), DiscordTicketHandler::openTicket); .setComponents(ActionRow.of(Arrays.stream(DiscordTicketType.values()).map(DiscordTicketType::toButton).toArray(Button[]::new))), DiscordTicketHandler::openTicket);
eventChannel = new StaticMessageChannel(config.channel("events"), EventChannel::get); eventChannel = new StaticMessageChannel(config.channel("events"), EventChannel::get);
checklistChannel = new ChecklistChannel(config.channel("checklist")); checklistChannel = new ChecklistChannel(config.channel("checklist"));
announcementChannel = new DiscordChannel(config.channel("announcement")) { announcementChannel = new DiscordChannel(config.channel("announcement")) {
@Override @Override
public void received(GuildMessageReceivedEvent event) { public void received(MessageReceivedEvent event) {
Chatter.broadcast().system("ALERT", event.getMessage().getContentDisplay()); Chatter.broadcast().system("ALERT", event.getMessage().getContentDisplay());
} }
}; };
@@ -198,7 +196,7 @@ public class DiscordBot {
.keySet().stream() .keySet().stream()
.filter(command -> !correctCommands.contains(command)) .filter(command -> !correctCommands.contains(command))
.filter(command -> command.matches("^[\\w-]+$")) .filter(command -> command.matches("^[\\w-]+$"))
.map(command -> new CommandData(command, command).addOptions(commandArgument)) .map(command -> Commands.slash(command, command).addOptions(commandArgument))
.toArray(CommandData[]::new)) .toArray(CommandData[]::new))
.queue(); .queue();
} }
@@ -23,9 +23,9 @@ import de.steamwar.velocitycore.Config;
import de.steamwar.velocitycore.VelocityCore; import de.steamwar.velocitycore.VelocityCore;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import net.dv8tion.jda.api.entities.Emoji; import net.dv8tion.jda.api.entities.emoji.Emoji;
import net.dv8tion.jda.api.interactions.components.Button; import net.dv8tion.jda.api.interactions.components.buttons.Button;
import net.dv8tion.jda.api.interactions.components.ButtonStyle; import net.dv8tion.jda.api.interactions.components.buttons.ButtonStyle;
import java.io.File; import java.io.File;
import java.util.List; import java.util.List;
@@ -20,9 +20,9 @@
package de.steamwar.velocitycore.discord; package de.steamwar.velocitycore.discord;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import net.dv8tion.jda.api.entities.Emoji; import net.dv8tion.jda.api.entities.emoji.Emoji;
import net.dv8tion.jda.api.interactions.components.Button; import net.dv8tion.jda.api.interactions.components.buttons.Button;
import net.dv8tion.jda.api.interactions.components.ButtonStyle; import net.dv8tion.jda.api.interactions.components.buttons.ButtonStyle;
@AllArgsConstructor @AllArgsConstructor
public enum DiscordTicketType { public enum DiscordTicketType {
@@ -26,11 +26,12 @@ import de.steamwar.messages.Message;
import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.SteamwarUser;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import net.dv8tion.jda.api.MessageBuilder;
import net.dv8tion.jda.api.entities.MessageChannel;
import net.dv8tion.jda.api.entities.User; import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.events.interaction.GenericComponentInteractionCreateEvent; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent; import net.dv8tion.jda.api.events.interaction.component.GenericComponentInteractionCreateEvent;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.utils.messages.MessageCreateBuilder;
import net.dv8tion.jda.api.utils.messages.MessageCreateData;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
@@ -57,19 +58,19 @@ public class DiscordChannel extends Chatter.PlayerlessChatter {
} }
public void send(String message) { public void send(String message) {
send(new MessageBuilder() send(new MessageCreateBuilder()
.append(message .setContent(message
.replace("&", "") .replace("&", "")
.replace("@everyone", "`@everyone`") .replace("@everyone", "`@everyone`")
.replace("@here", "`@here`") .replace("@here", "`@here`")
.replaceAll("<[@#]!?\\d+>", "`$0`"))); .replaceAll("<[@#]!?\\d+>", "`$0`")));
} }
public void send(MessageBuilder builder) { public void send(MessageCreateBuilder builder) {
channel.sendMessage(builder.build()).queue(); channel.sendMessage(builder.build()).queue();
} }
public void received(GuildMessageReceivedEvent event) { public void received(MessageReceivedEvent event) {
event.getMessage().delete().queue(); event.getMessage().delete().queue();
} }
@@ -24,7 +24,7 @@ import de.steamwar.messages.Chatter;
import de.steamwar.messages.ChatterGroup; import de.steamwar.messages.ChatterGroup;
import de.steamwar.sql.Punishment; import de.steamwar.sql.Punishment;
import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.SteamwarUser;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent; import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import java.util.function.Supplier; import java.util.function.Supplier;
@@ -40,7 +40,7 @@ public class DiscordChatRoom extends DiscordChannel {
} }
@Override @Override
public void received(GuildMessageReceivedEvent event) { public void received(MessageReceivedEvent event) {
SteamwarUser user = SteamwarUser.get(event.getAuthor().getIdLong()); SteamwarUser user = SteamwarUser.get(event.getAuthor().getIdLong());
if (user == null || event.getMessage().getContentRaw().length() > 250 || user.isPunished(Punishment.PunishmentType.Ban) || user.isPunished(Punishment.PunishmentType.Mute)) { if (user == null || event.getMessage().getContentRaw().length() > 250 || user.isPunished(Punishment.PunishmentType.Ban) || user.isPunished(Punishment.PunishmentType.Mute)) {
event.getMessage().delete().queue(); event.getMessage().delete().queue();
@@ -25,10 +25,10 @@ import de.steamwar.sql.Team;
import de.steamwar.sql.TeamTeilnahme; import de.steamwar.sql.TeamTeilnahme;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.MessageBuilder; import net.dv8tion.jda.api.entities.emoji.Emoji;
import net.dv8tion.jda.api.entities.Emoji;
import net.dv8tion.jda.api.interactions.components.ActionRow; import net.dv8tion.jda.api.interactions.components.ActionRow;
import net.dv8tion.jda.api.interactions.components.selections.SelectionMenu; import net.dv8tion.jda.api.interactions.components.selections.StringSelectMenu;
import net.dv8tion.jda.api.utils.messages.MessageCreateBuilder;
import java.awt.*; import java.awt.*;
import java.sql.Timestamp; import java.sql.Timestamp;
@@ -40,21 +40,21 @@ import java.util.stream.Collectors;
@UtilityClass @UtilityClass
public class EventChannel { public class EventChannel {
public MessageBuilder get() { public MessageCreateBuilder get() {
if (Event.get() == null) if (Event.get() == null)
return updateComing(); return updateComing();
return updateCurrent(); return updateCurrent();
} }
private MessageBuilder updateComing() { private MessageCreateBuilder updateComing() {
EmbedBuilder embedBuilder = new EmbedBuilder() EmbedBuilder embedBuilder = new EmbedBuilder()
.setColor(Color.GRAY) .setColor(Color.GRAY)
.setTitle("Zukünftige Events") .setTitle("Zukünftige Events")
.setAuthor("SteamWar", "https://www.steamwar.de"); .setAuthor("SteamWar", "https://www.steamwar.de");
SelectionMenu.Builder menuBuilder = SelectionMenu.create("eventName") StringSelectMenu.Builder menuBuilder = StringSelectMenu.create("eventName")
.setPlaceholder("Wähle ein Event aus!") .setPlaceholder("Wähle ein Event aus!")
.setMinValues(1) .setMinValues(1)
.setMaxValues(1); .setMaxValues(1);
@@ -77,16 +77,16 @@ public class EventChannel {
} }
}); });
MessageBuilder messageBuilder = new MessageBuilder() MessageCreateBuilder messageBuilder = new MessageCreateBuilder()
.setEmbeds(embedBuilder.build()); .setEmbeds(embedBuilder.build());
if(events.stream().anyMatch(event -> event.getDeadline().after(Timestamp.from(Instant.now())))) { if(events.stream().anyMatch(event -> event.getDeadline().after(Timestamp.from(Instant.now())))) {
messageBuilder.setActionRows(ActionRow.of(menuBuilder.build())); messageBuilder.setComponents(ActionRow.of(menuBuilder.build()));
} }
return messageBuilder; return messageBuilder;
} }
private MessageBuilder updateCurrent() { private MessageCreateBuilder updateCurrent() {
Event event = Event.get(); Event event = Event.get();
EmbedBuilder embedBuilder = new EmbedBuilder() EmbedBuilder embedBuilder = new EmbedBuilder()
.setColor(Color.GRAY) .setColor(Color.GRAY)
@@ -19,7 +19,8 @@
package de.steamwar.velocitycore.discord.channels; package de.steamwar.velocitycore.discord.channels;
import net.dv8tion.jda.api.interactions.Interaction; import net.dv8tion.jda.api.interactions.callbacks.IReplyCallback;
import net.dv8tion.jda.api.interactions.components.ComponentInteraction;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
@@ -29,18 +30,18 @@ import java.util.function.Consumer;
public class InteractionReply extends DiscordChannel { public class InteractionReply extends DiscordChannel {
public static void reply(Interaction interaction, Consumer<InteractionReply> consumer) { public static void reply(IReplyCallback interaction, Consumer<InteractionReply> consumer) {
InteractionReply reply = new InteractionReply(interaction); InteractionReply reply = new InteractionReply(interaction);
consumer.accept(reply); consumer.accept(reply);
reply.submit(); reply.submit();
} }
private final Interaction interaction; private final IReplyCallback interaction;
private boolean replied = false; private boolean replied = false;
private final List<String> messages = new ArrayList<>(); private final List<String> messages = new ArrayList<>();
private InteractionReply(Interaction interaction) { private InteractionReply(IReplyCallback interaction) {
super(interaction.getUser()); super(interaction.getUser());
this.interaction = interaction; this.interaction = interaction;
} }
@@ -20,35 +20,36 @@
package de.steamwar.velocitycore.discord.channels; package de.steamwar.velocitycore.discord.channels;
import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.MessageBuilder;
import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.events.interaction.GenericComponentInteractionCreateEvent; import net.dv8tion.jda.api.events.interaction.component.GenericComponentInteractionCreateEvent;
import net.dv8tion.jda.api.utils.messages.MessageCreateBuilder;
import net.dv8tion.jda.api.utils.messages.MessageEditData;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.Supplier; import java.util.function.Supplier;
public class StaticMessageChannel extends DiscordChannel { public class StaticMessageChannel extends DiscordChannel {
public static MessageBuilder toMessageBuilder(EmbedBuilder embedBuilder) { public static MessageCreateBuilder toMessageBuilder(EmbedBuilder embedBuilder) {
MessageBuilder messageBuilder = new MessageBuilder(); MessageCreateBuilder messageBuilder = new MessageCreateBuilder();
messageBuilder.setEmbeds(embedBuilder.build()); messageBuilder.setEmbeds(embedBuilder.build());
return messageBuilder; return messageBuilder;
} }
private Message message; private Message message;
private final Supplier<MessageBuilder> supplier; private final Supplier<MessageCreateBuilder> supplier;
private final Consumer<GenericComponentInteractionCreateEvent> interaction; private final Consumer<GenericComponentInteractionCreateEvent> interaction;
public StaticMessageChannel(String channel, Supplier<MessageBuilder> supplier) { public StaticMessageChannel(String channel, Supplier<MessageCreateBuilder> supplier) {
this(channel, supplier, event -> {}); this(channel, supplier, event -> {});
} }
public StaticMessageChannel(String channel, Supplier<MessageBuilder> supplier, Consumer<GenericComponentInteractionCreateEvent> interaction) { public StaticMessageChannel(String channel, Supplier<MessageCreateBuilder> supplier, Consumer<GenericComponentInteractionCreateEvent> interaction) {
super(channel); super(channel);
this.supplier = supplier; this.supplier = supplier;
this.interaction = interaction; this.interaction = interaction;
if(getChannel().hasLatestMessage()) if(getChannel().getLatestMessageIdLong() != 0)
message = getChannel().getIterableHistory().complete().stream().filter(m -> m.getAuthor().isBot()).findFirst().orElse(null); message = getChannel().getIterableHistory().complete().stream().filter(m -> m.getAuthor().isBot()).findFirst().orElse(null);
update(); update();
@@ -58,7 +59,7 @@ public class StaticMessageChannel extends DiscordChannel {
if (message == null) { if (message == null) {
getChannel().sendMessage(supplier.get().build()).queue(m -> message = m); getChannel().sendMessage(supplier.get().build()).queue(m -> message = m);
} else { } else {
message.editMessage(supplier.get().build()).queue(); message.editMessage(MessageEditData.fromCreateData(supplier.get().build())).queue();
} }
} }
@@ -25,11 +25,11 @@ import de.steamwar.velocitycore.discord.DiscordBot;
import de.steamwar.velocitycore.discord.channels.DiscordChannel; import de.steamwar.velocitycore.discord.channels.DiscordChannel;
import de.steamwar.velocitycore.discord.channels.InteractionReply; import de.steamwar.velocitycore.discord.channels.InteractionReply;
import lombok.Getter; import lombok.Getter;
import net.dv8tion.jda.api.entities.ChannelType; import net.dv8tion.jda.api.entities.channel.ChannelType;
import net.dv8tion.jda.api.entities.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.events.interaction.GenericComponentInteractionCreateEvent; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; import net.dv8tion.jda.api.events.interaction.component.GenericComponentInteractionCreateEvent;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent; import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter; import net.dv8tion.jda.api.hooks.ListenerAdapter;
import net.dv8tion.jda.api.interactions.InteractionType; import net.dv8tion.jda.api.interactions.InteractionType;
import net.dv8tion.jda.api.interactions.commands.OptionMapping; import net.dv8tion.jda.api.interactions.commands.OptionMapping;
@@ -44,7 +44,7 @@ public class ChannelListener extends ListenerAdapter {
private static final Map<MessageChannel, DiscordChannel> channels = new HashMap<>(); private static final Map<MessageChannel, DiscordChannel> channels = new HashMap<>();
@Override @Override
public void onGuildMessageReceived(@NotNull GuildMessageReceivedEvent event) { public void onMessageReceived(@NotNull MessageReceivedEvent event) {
if(event.getAuthor().isBot()) if(event.getAuthor().isBot())
return; return;
@@ -69,7 +69,7 @@ public class ChannelListener extends ListenerAdapter {
} }
@Override @Override
public void onSlashCommand(@NotNull SlashCommandEvent event) { public void onSlashCommandInteraction(@NotNull SlashCommandInteractionEvent event) {
InteractionReply.reply(event, sender -> { InteractionReply.reply(event, sender -> {
if(sender.user().getDiscordId() == null) if(sender.user().getDiscordId() == null)
return; return;
@@ -26,7 +26,7 @@ import de.steamwar.sql.Punishment;
import de.steamwar.sql.SchematicNode; import de.steamwar.sql.SchematicNode;
import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.SteamwarUser;
import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.events.message.priv.PrivateMessageReceivedEvent; import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter; import net.dv8tion.jda.api.hooks.ListenerAdapter;
import java.io.IOException; import java.io.IOException;
@@ -41,7 +41,9 @@ public class DiscordSchemUpload extends ListenerAdapter {
private static final List<String> SCHEM_FILE_ENDINGS = Arrays.asList(".schem", ".schematic"); private static final List<String> SCHEM_FILE_ENDINGS = Arrays.asList(".schem", ".schematic");
@Override @Override
public void onPrivateMessageReceived(PrivateMessageReceivedEvent event) { public void onMessageReceived(MessageReceivedEvent event) {
if (event.isFromGuild()) return;
Message message = event.getMessage(); Message message = event.getMessage();
if(message.getAttachments().isEmpty()) if(message.getAttachments().isEmpty())
return; return;
@@ -76,7 +78,7 @@ public class DiscordSchemUpload extends ListenerAdapter {
if(node == null) if(node == null)
node = SchematicNode.createSchematic(user.getId(), name, null); node = SchematicNode.createSchematic(user.getId(), name, null);
try (InputStream in = attachment.retrieveInputStream().get()) { try (InputStream in = attachment.getProxy().download().get()) {
NodeData.get(node).saveFromStream(in, fileName.substring(dot).equalsIgnoreCase(".schem")); NodeData.get(node).saveFromStream(in, fileName.substring(dot).equalsIgnoreCase(".schem"));
sender.system("DC_SCHEMUPLOAD_SUCCESS", name); sender.system("DC_SCHEMUPLOAD_SUCCESS", name);
} catch (InterruptedException e) { } catch (InterruptedException e) {
@@ -23,7 +23,7 @@ import de.steamwar.velocitycore.VelocityCore;
import de.steamwar.velocitycore.discord.DiscordBot; import de.steamwar.velocitycore.discord.DiscordBot;
import de.steamwar.velocitycore.discord.channels.InteractionReply; import de.steamwar.velocitycore.discord.channels.InteractionReply;
import de.steamwar.sql.Event; import de.steamwar.sql.Event;
import net.dv8tion.jda.api.events.interaction.SelectionMenuEvent; import net.dv8tion.jda.api.events.interaction.component.StringSelectInteractionEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter; import net.dv8tion.jda.api.hooks.ListenerAdapter;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -32,7 +32,7 @@ public class DiscordTeamEvent extends ListenerAdapter {
private final String eventsChannel = DiscordBot.getInstance().getConfig().channel("events"); private final String eventsChannel = DiscordBot.getInstance().getConfig().channel("events");
@Override @Override
public void onSelectionMenu(@NotNull SelectionMenuEvent event) { public void onStringSelectInteraction(@NotNull StringSelectInteractionEvent event) {
if(!event.getChannel().getId().equals(eventsChannel)) if(!event.getChannel().getId().equals(eventsChannel))
return; return;
@@ -29,17 +29,18 @@ import de.steamwar.velocitycore.discord.DiscordTicketType;
import de.steamwar.velocitycore.discord.channels.DiscordChannel; import de.steamwar.velocitycore.discord.channels.DiscordChannel;
import de.steamwar.velocitycore.discord.channels.InteractionReply; import de.steamwar.velocitycore.discord.channels.InteractionReply;
import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.MessageBuilder;
import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.entities.Emoji;
import net.dv8tion.jda.api.entities.MessageChannel;
import net.dv8tion.jda.api.entities.TextChannel;
import net.dv8tion.jda.api.entities.User; import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.events.interaction.GenericComponentInteractionCreateEvent; import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.entities.emoji.Emoji;
import net.dv8tion.jda.api.events.interaction.component.GenericComponentInteractionCreateEvent;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter; import net.dv8tion.jda.api.hooks.ListenerAdapter;
import net.dv8tion.jda.api.interactions.components.ActionRow; import net.dv8tion.jda.api.interactions.components.ActionRow;
import net.dv8tion.jda.api.interactions.components.Button; import net.dv8tion.jda.api.interactions.components.buttons.Button;
import net.dv8tion.jda.api.utils.SplitUtil;
import net.dv8tion.jda.api.utils.messages.MessageCreateBuilder;
import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.event.ClickEvent;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -59,24 +60,23 @@ public class DiscordTicketHandler extends ListenerAdapter {
SteamwarUser user = SteamwarUser.get(event.getUser().getIdLong()); SteamwarUser user = SteamwarUser.get(event.getUser().getIdLong());
TextChannel ticketChannel = event.getGuild().getCategoryById(TICKET_CATEGORY).createTextChannel((user == null ? event.getUser().getName() : user.getUserName()) + "-" + event.getComponentId() + "-" + System.currentTimeMillis() % 1000).complete(); TextChannel ticketChannel = event.getGuild().getCategoryById(TICKET_CATEGORY).createTextChannel((user == null ? event.getUser().getName() : user.getUserName()) + "-" + event.getComponentId() + "-" + System.currentTimeMillis() % 1000).complete();
ticketChannel.createPermissionOverride(event.getMember()).setAllow( ticketChannel.getPermissionContainer().upsertPermissionOverride(event.getMember()).setAllowed(
Permission.VIEW_CHANNEL, Permission.VIEW_CHANNEL,
Permission.MESSAGE_WRITE, Permission.MESSAGE_SEND,
Permission.MESSAGE_ATTACH_FILES, Permission.MESSAGE_ATTACH_FILES,
Permission.MESSAGE_ADD_REACTION, Permission.MESSAGE_ADD_REACTION,
Permission.MESSAGE_READ,
Permission.MESSAGE_EMBED_LINKS, Permission.MESSAGE_EMBED_LINKS,
Permission.MESSAGE_HISTORY).complete(); Permission.MESSAGE_HISTORY).complete();
ticketChannel.getManager().setTopic(event.getUser().getId()).complete(); ticketChannel.getManager().setTopic(event.getUser().getId()).complete();
DiscordChannel channel = new DiscordChannel(DiscordChannel.userOrPublic(event.getUser()), ticketChannel); DiscordChannel channel = new DiscordChannel(DiscordChannel.userOrPublic(event.getUser()), ticketChannel);
channel.send(new MessageBuilder() channel.send(new MessageCreateBuilder()
.setEmbeds(new EmbedBuilder() .setEmbeds(new EmbedBuilder()
.setTitle(channel.parseToPlain("DC_TICKET_TITLE")) .setTitle(channel.parseToPlain("DC_TICKET_TITLE"))
.setDescription(channel.parseToPlain(ticketType.introduction())) .setDescription(channel.parseToPlain(ticketType.introduction()))
.setColor(Color.GREEN) .setColor(Color.GREEN)
.build()) .build())
.setActionRows(ActionRow.of(Button.danger("close-" + ticketChannel.getName(), channel.parseToPlain("DC_TICKET_CLOSE")).withEmoji(Emoji.fromUnicode("U+26A0"))))); .setComponents(ActionRow.of(Button.danger("close-" + ticketChannel.getName(), channel.parseToPlain("DC_TICKET_CLOSE")).withEmoji(Emoji.fromUnicode("U+26A0")))));
InteractionReply.reply(event, reply -> reply.system("DC_TICKET_CREATED", ticketChannel.getAsMention())); InteractionReply.reply(event, reply -> reply.system("DC_TICKET_CREATED", ticketChannel.getAsMention()));
Chatter.serverteam().prefixless("DISCORD_TICKET_NEW", ticketChannel.getName()); Chatter.serverteam().prefixless("DISCORD_TICKET_NEW", ticketChannel.getName());
@@ -85,7 +85,7 @@ public class DiscordTicketHandler extends ListenerAdapter {
@Override @Override
public void onGenericComponentInteractionCreate(@NotNull GenericComponentInteractionCreateEvent event) { public void onGenericComponentInteractionCreate(@NotNull GenericComponentInteractionCreateEvent event) {
MessageChannel messageChannel = event.getChannel(); MessageChannel messageChannel = event.getChannel();
if(messageChannel instanceof TextChannel channel && channel.getParent() != null && channel.getParent().getId().equals(TICKET_CATEGORY) && event.getComponentId().startsWith("close-")) { if(messageChannel instanceof TextChannel channel && channel.getParentCategoryIdLong() != 0 && channel.getParentCategoryId().equals(TICKET_CATEGORY) && event.getComponentId().startsWith("close-")) {
LinkedList<StringBuilder> messages = channel.getIterableHistory().complete().stream() LinkedList<StringBuilder> messages = channel.getIterableHistory().complete().stream()
.filter(message -> !message.getAuthor().isSystem() && !message.getAuthor().isBot()) .filter(message -> !message.getAuthor().isSystem() && !message.getAuthor().isBot())
.map(message -> { .map(message -> {
@@ -106,24 +106,10 @@ public class DiscordTicketHandler extends ListenerAdapter {
messages.addFirst(new StringBuilder().append("<t:").append(Instant.now().getEpochSecond()).append("> **").append(event.getUser().getName()).append("**: Ticket closed")); messages.addFirst(new StringBuilder().append("<t:").append(Instant.now().getEpochSecond()).append("> **").append(event.getUser().getName()).append("**: Ticket closed"));
LinkedList<StringBuilder> messageBuilders = new LinkedList<>();
messageBuilders.add(new StringBuilder());
messages.descendingIterator()
.forEachRemaining(stringBuilder -> {
if(stringBuilder.length() >= 4096) {
messageBuilders.getLast().append(stringBuilder.substring(0, 4090));
messageBuilders.add(new StringBuilder(stringBuilder.substring(4090, stringBuilder.length() - 1)));
} else if (stringBuilder.length() + messageBuilders.getLast().length() >= 4096) {
messageBuilders.add(new StringBuilder(stringBuilder.toString()));
} else {
messageBuilders.getLast().append(stringBuilder);
}
});
EmbedBuilder embedBuilder = new EmbedBuilder() EmbedBuilder embedBuilder = new EmbedBuilder()
.setColor(Color.GREEN) .setColor(Color.GREEN)
.setTimestamp(Instant.now()) .setTimestamp(Instant.now())
.setTitle(event.getTextChannel().getName()); .setTitle(event.getChannel().getName());
if(channel.getTopic() != null && !channel.getTopic().isEmpty()) { if(channel.getTopic() != null && !channel.getTopic().isEmpty()) {
User user = event.getJDA().retrieveUserById(channel.getTopic()).complete(); User user = event.getJDA().retrieveUserById(channel.getTopic()).complete();
@@ -131,7 +117,12 @@ public class DiscordTicketHandler extends ListenerAdapter {
} }
TextChannel logChannel = event.getGuild().getTextChannelById(TICKET_LOG); TextChannel logChannel = event.getGuild().getTextChannelById(TICKET_LOG);
messageBuilders.forEach(stringBuilder -> logChannel.sendMessage(new MessageBuilder().setEmbeds(embedBuilder.setDescription(stringBuilder.toString()).build()).build()).queue()); SplitUtil.split(
messages.stream().map(StringBuilder::toString).collect(Collectors.joining("\n")),
2000,
SplitUtil.Strategy.NEWLINE,
SplitUtil.Strategy.ANYWHERE
).stream().map(message -> new MessageCreateBuilder().setEmbeds(embedBuilder.setDescription(message).build())).forEach(builder -> logChannel.sendMessage(builder.build()).queue());
Chatter.serverteam().prefixless("DISCORD_TICKET_CLOSED", channel.getName()); Chatter.serverteam().prefixless("DISCORD_TICKET_CLOSED", channel.getName());
channel.delete().reason("Closed").queue(); channel.delete().reason("Closed").queue();
@@ -139,11 +130,12 @@ public class DiscordTicketHandler extends ListenerAdapter {
} }
@Override @Override
public void onGuildMessageReceived(@NotNull GuildMessageReceivedEvent event) { public void onMessageReceived(@NotNull MessageReceivedEvent event) {
TextChannel channel = event.getChannel(); MessageChannel channel = event.getChannel();
if( if(
channel.getParent() != null && channel instanceof TextChannel textChannel &&
channel.getParent().getId().equals(TICKET_CATEGORY) && textChannel.getParentCategoryIdLong() != 0 &&
textChannel.getParentCategoryId().equals(TICKET_CATEGORY) &&
!channel.getId().equals(TICKET_CHANNEL) && !channel.getId().equals(TICKET_CHANNEL) &&
!channel.getId().equals(TICKET_LOG) !channel.getId().equals(TICKET_LOG)
) { ) {
@@ -152,7 +144,7 @@ public class DiscordTicketHandler extends ListenerAdapter {
ChatterGroup receivers = new ChatterGroup(Chatter.allStream().filter(player -> player.user().hasPerm(UserPerm.TICKET_LOG))); ChatterGroup receivers = new ChatterGroup(Chatter.allStream().filter(player -> player.user().hasPerm(UserPerm.TICKET_LOG)));
try { try {
SteamwarUser user = SteamwarUser.get(Long.parseLong(channel.getTopic())); SteamwarUser user = SteamwarUser.get(Long.parseLong(textChannel.getTopic()));
if(user != null && !user.perms().contains(UserPerm.TEAM)) if(user != null && !user.perms().contains(UserPerm.TEAM))
receivers = new ChatterGroup(receivers, Chatter.of(user)); receivers = new ChatterGroup(receivers, Chatter.of(user));
} catch(NumberFormatException e) { } catch(NumberFormatException e) {
@@ -23,11 +23,11 @@ import de.steamwar.velocitycore.VelocityCore;
import de.steamwar.velocitycore.discord.channels.DiscordChannel; import de.steamwar.velocitycore.discord.channels.DiscordChannel;
import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.SteamwarUser;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
import net.dv8tion.jda.api.MessageBuilder;
import net.dv8tion.jda.api.entities.Emoji;
import net.dv8tion.jda.api.entities.User; import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.entities.emoji.Emoji;
import net.dv8tion.jda.api.interactions.components.ActionRow; import net.dv8tion.jda.api.interactions.components.ActionRow;
import net.dv8tion.jda.api.interactions.components.Button; import net.dv8tion.jda.api.interactions.components.buttons.Button;
import net.dv8tion.jda.api.utils.messages.MessageCreateBuilder;
import java.util.Base64; import java.util.Base64;
import java.util.HashMap; import java.util.HashMap;
@@ -63,9 +63,9 @@ public class AuthManager {
user.setDiscordId(dcUser.getIdLong()); user.setDiscordId(dcUser.getIdLong());
DiscordChannel channel = new DiscordChannel(dcUser); DiscordChannel channel = new DiscordChannel(dcUser);
channel.send(new MessageBuilder() channel.send(new MessageCreateBuilder()
.setContent(channel.parseToPlain("DC_AUTH_SUCCESS", user)) .setContent(channel.parseToPlain("DC_AUTH_SUCCESS", user))
.setActionRows(ActionRow.of(Button.success("tada", Emoji.fromUnicode("U+1F389"))))); .setComponents(ActionRow.of(Button.success("tada", Emoji.fromUnicode("U+1F389")))));
return dcUser; return dcUser;
} }
@@ -25,11 +25,11 @@ import de.steamwar.velocitycore.discord.DiscordBot;
import de.steamwar.velocitycore.discord.channels.DiscordChannel; import de.steamwar.velocitycore.discord.channels.DiscordChannel;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.MessageBuilder;
import net.dv8tion.jda.api.entities.Emoji;
import net.dv8tion.jda.api.entities.User; import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.entities.emoji.Emoji;
import net.dv8tion.jda.api.interactions.components.ActionRow; import net.dv8tion.jda.api.interactions.components.ActionRow;
import net.dv8tion.jda.api.interactions.components.Button; import net.dv8tion.jda.api.interactions.components.buttons.Button;
import net.dv8tion.jda.api.utils.messages.MessageCreateBuilder;
import java.awt.*; import java.awt.*;
import java.time.Instant; import java.time.Instant;
@@ -47,7 +47,7 @@ public class DiscordAlert {
if(user == null) if(user == null)
return; return;
MessageBuilder builder = new MessageBuilder() MessageCreateBuilder builder = new MessageCreateBuilder()
.setEmbeds(new EmbedBuilder() .setEmbeds(new EmbedBuilder()
.setAuthor("SteamWar", "https://steamwar.de", "https://cdn.discordapp.com/app-icons/869606970099904562/60c884000407c02671d91d8e7182b8a1.png") .setAuthor("SteamWar", "https://steamwar.de", "https://cdn.discordapp.com/app-icons/869606970099904562/60c884000407c02671d91d8e7182b8a1.png")
.setColor(color) .setColor(color)
@@ -56,7 +56,7 @@ public class DiscordAlert {
.setTimestamp(Instant.now()) .setTimestamp(Instant.now())
.build()); .build());
if(success) if(success)
builder.setActionRows(ActionRow.of(Button.success("tada", Emoji.fromUnicode("U+1F389")))); builder.setComponents(ActionRow.of(Button.success("tada", Emoji.fromUnicode("U+1F389"))));
new DiscordChannel(user).send(builder); new DiscordChannel(user).send(builder);
}); });
+1 -1
View File
@@ -107,7 +107,7 @@ dependencyResolutionManagement {
library("netty", "io.netty:netty-all:4.1.68.Final") library("netty", "io.netty:netty-all:4.1.68.Final")
library("junit", "junit:junit:4.13.2") library("junit", "junit:junit:4.13.2")
library("hamcrest", "org.hamcrest:hamcrest:2.2") library("hamcrest", "org.hamcrest:hamcrest:2.2")
library("jda", "net.dv8tion:JDA:4.4.0_352") library("jda", "net.dv8tion:JDA:5.0.2")
library("msgpack", "org.msgpack:msgpack-core:0.9.8") library("msgpack", "org.msgpack:msgpack-core:0.9.8")
library("classindex", "org.atteo.classindex:classindex:3.13") library("classindex", "org.atteo.classindex:classindex:3.13")