Archiviert
1
0

Merge branch 'master' into replaying

# Conflicts:
#	src/de/steamwar/bungeecore/sql/SteamwarUser.java
Dieser Commit ist enthalten in:
Lixfel 2021-09-11 09:05:57 +02:00
Commit ef471c9ff9
49 geänderte Dateien mit 824 neuen und 771 gelöschten Zeilen

Datei anzeigen

@ -24,11 +24,11 @@ import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
import de.steamwar.bungeecore.commands.*; import de.steamwar.bungeecore.commands.*;
import de.steamwar.bungeecore.comms.SpigotReceiver; import de.steamwar.bungeecore.comms.SpigotReceiver;
import de.steamwar.bungeecore.listeners.*; import de.steamwar.bungeecore.listeners.*;
import de.steamwar.bungeecore.listeners.mods.ModLoaderBlocker;
import de.steamwar.bungeecore.listeners.mods.Forge; import de.steamwar.bungeecore.listeners.mods.Forge;
import de.steamwar.bungeecore.listeners.mods.LabyMod; import de.steamwar.bungeecore.listeners.mods.LabyMod;
import de.steamwar.bungeecore.listeners.mods.ModLoaderBlocker;
import de.steamwar.bungeecore.listeners.mods.WorldDownloader; import de.steamwar.bungeecore.listeners.mods.WorldDownloader;
import de.steamwar.bungeecore.sql.SQL; import de.steamwar.bungeecore.sql.Statement;
import de.steamwar.bungeecore.sql.SteamwarUser; import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.bungeecore.sql.Team; import de.steamwar.bungeecore.sql.Team;
import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.JDA;
@ -131,6 +131,7 @@ public class BungeeCore extends Plugin {
new ReplayCommand(); new ReplayCommand();
if(!EVENT_MODE){ if(!EVENT_MODE){
new BauCommand();
new WebregisterCommand(); new WebregisterCommand();
new FightCommand(); new FightCommand();
new ChallengeCommand(); new ChallengeCommand();
@ -146,19 +147,20 @@ public class BungeeCore extends Plugin {
new EventStarter(); new EventStarter();
new SessionManager(); new SessionManager();
new SpigotReceiver(); new SpigotReceiver();
new SteamwarDiscordBot();
new TablistManager(); new TablistManager();
getProxy().getScheduler().schedule(this, () -> { getProxy().getScheduler().schedule(this, () -> {
SteamwarUser.clearCache(); SteamwarUser.clearCache();
Team.clearCache(); Team.clearCache();
}, 1, 1, TimeUnit.HOURS); }, 1, 1, TimeUnit.HOURS);
new SteamwarDiscordBot();
} }
@Override @Override
public void onDisable(){ public void onDisable(){
ErrorLogger.stop(); ErrorLogger.stop();
SQL.close(); Statement.close();
try { try {
SteamwarDiscordBot.instance().getJda().shutdownNow(); SteamwarDiscordBot.instance().getJda().shutdownNow();
SteamwarDiscordBot.instance().getJda().awaitStatus(JDA.Status.SHUTDOWN); SteamwarDiscordBot.instance().getJda().awaitStatus(JDA.Status.SHUTDOWN);
@ -259,7 +261,7 @@ public class BungeeCore extends Plugin {
Persistent.setChatPrefix(CHAT_PREFIX); Persistent.setChatPrefix(CHAT_PREFIX);
Persistent.setLobbyServer(LOBBY_SERVER); Persistent.setLobbyServer(LOBBY_SERVER);
SQL.connect( Statement.connect(
config.getString("db.url"), config.getString("db.url"),
config.getString("db.username"), config.getString("db.username"),
config.getString("db.password") config.getString("db.password")

Datei anzeigen

@ -48,11 +48,7 @@ public class AuthManager {
TOKENS.put(code, member.getIdLong()); TOKENS.put(code, member.getIdLong());
BungeeCore.log("Created Discord Auth-Token: " + code + " for: " + member.getUser().getAsTag()); BungeeCore.log("Created Discord Auth-Token: " + code + " for: " + member.getUser().getAsTag());
ScheduledTask[] task = new ScheduledTask[1]; BungeeCore.get().getProxy().getScheduler().schedule(BungeeCore.get(), () -> TOKENS.remove(code), 10, TimeUnit.MINUTES);
task[0] = BungeeCore.get().getProxy().getScheduler().schedule(BungeeCore.get(), () -> {
TOKENS.remove(code);
task[0].cancel();
}, 10, 10, TimeUnit.MINUTES);
return code; return code;
} }
@ -66,10 +62,10 @@ public class AuthManager {
builder.setActionRows(ActionRow.of(Button.success("tada", Emoji.fromUnicode("U+1F389")), Button.danger("invalid", "Ich war das nicht"))); builder.setActionRows(ActionRow.of(Button.success("tada", Emoji.fromUnicode("U+1F389")), Button.danger("invalid", "Ich war das nicht")));
try { try {
member.getUser().openPrivateChannel().complete().sendMessage(builder.build()).complete(); member.getUser().openPrivateChannel().queue(privateChannel -> privateChannel.sendMessage(builder.build()).queue());
if (member.getNickname() == null) { if (member.getNickname() == null) {
try { try {
member.getGuild().modifyNickname(member, user.getUserName()).complete(); member.getGuild().modifyNickname(member, user.getUserName()).queue();
} catch (Exception e) { } catch (Exception e) {
// Ignored // Ignored
} }

Datei anzeigen

@ -78,6 +78,7 @@ public class SteamwarDiscordBot {
} catch (LoginException e) { } catch (LoginException e) {
throw new SecurityException("Could not Login: " + SteamwarDiscordBotConfig.TOKEN, e); throw new SecurityException("Could not Login: " + SteamwarDiscordBotConfig.TOKEN, e);
} }
ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> {
try { try {
jda.awaitReady(); jda.awaitReady();
} catch (InterruptedException e) { } catch (InterruptedException e) {
@ -98,12 +99,13 @@ public class SteamwarDiscordBot {
new RolesInteractionButtonListener(); new RolesInteractionButtonListener();
new DiscordTicketListener(); new DiscordTicketListener();
new DiscordAuthListener(); new DiscordAuthListener();
new DiscordEventListener();
announcementListener = new AnnouncementListener(); announcementListener = new AnnouncementListener();
ingameChatListener = new IngameChatListener(); ingameChatListener = new IngameChatListener();
serverTeamChatListener = new ServerTeamChatListener(); serverTeamChatListener = new ServerTeamChatListener();
new SlashCommandListener(); new SlashCommandListener();
jda.retrieveCommands().complete().forEach(command -> jda.deleteCommandById(command.getId()).complete()); jda.retrieveCommands().complete().forEach(command -> jda.deleteCommandById(command.getId()).queue());
Guild guild = jda.getGuildById(SteamwarDiscordBotConfig.GUILD); Guild guild = jda.getGuildById(SteamwarDiscordBotConfig.GUILD);
guild.retrieveCommands().complete().forEach(command -> guild.deleteCommandById(command.getId()).complete()); guild.retrieveCommands().complete().forEach(command -> guild.deleteCommandById(command.getId()).complete());
@ -115,6 +117,7 @@ public class SteamwarDiscordBot {
addCommand(commands, new ListCommand()); addCommand(commands, new ListCommand());
addCommand(commands, new UnbanCommand()); addCommand(commands, new UnbanCommand());
commands.complete(); commands.complete();
});
} }
private void addCommand(CommandListUpdateAction commands, BasicDiscordCommand basicDiscordCommand) { private void addCommand(CommandListUpdateAction commands, BasicDiscordCommand basicDiscordCommand) {

Datei anzeigen

@ -45,13 +45,13 @@ public class BanCommand extends BasicDiscordCommand {
SteamwarUser sender = SteamwarUser.get(event.getMember().getIdLong()); SteamwarUser sender = SteamwarUser.get(event.getMember().getIdLong());
SteamwarUser target = SteamwarUser.getOrCreateOfflinePlayer(event.getOption("user").getAsString()); SteamwarUser target = SteamwarUser.getOrCreateOfflinePlayer(event.getOption("user").getAsString());
if (target == null) { if (target == null) {
event.reply("Angegebener User invalide").setEphemeral(true).complete(); event.reply("Angegebener User invalide").setEphemeral(true).queue();
return; return;
} }
Timestamp time = de.steamwar.bungeecore.commands.BanCommand.parseTime(null, event.getOption("time").getAsString()); Timestamp time = de.steamwar.bungeecore.commands.BanCommand.parseTime(null, event.getOption("time").getAsString());
if (time == null) { if (time == null) {
event.reply("Angegebene Zeit invalide").setEphemeral(true).complete(); event.reply("Angegebene Zeit invalide").setEphemeral(true).queue();
return; return;
} }
@ -60,6 +60,6 @@ public class BanCommand extends BasicDiscordCommand {
target.ban(time, msg, sender.getId(), isPerma); target.ban(time, msg, sender.getId(), isPerma);
Message.team("BAN_TEAM_BANNED", new Message("PREFIX"), target.getUserName(), sender.getUserName(), new Message((isPerma ? "BAN_PERMA" : "BAN_UNTIL"), time), msg); Message.team("BAN_TEAM_BANNED", new Message("PREFIX"), target.getUserName(), sender.getUserName(), new Message((isPerma ? "BAN_PERMA" : "BAN_UNTIL"), time), msg);
event.reply("Erfolgreich " + target.getUserName() + (isPerma ? " permanent" : " bis " + time) + " gebannt").setEphemeral(true).complete(); event.reply("Erfolgreich " + target.getUserName() + (isPerma ? " permanent" : " bis " + time) + " gebannt").setEphemeral(true).queue();
} }
} }

Datei anzeigen

@ -46,7 +46,7 @@ public abstract class BasicDiscordCommand extends CommandData {
Member member = event.getMember(); Member member = event.getMember();
SteamwarUser steamwarUser = SteamwarUser.get(member.getIdLong()); SteamwarUser steamwarUser = SteamwarUser.get(member.getIdLong());
if (steamwarUser == null || (!steamwarUser.getUserGroup().isTeamGroup() && steamwarUser.getUserGroup() != UserGroup.Builder)) { if (steamwarUser == null || (!steamwarUser.getUserGroup().isTeamGroup() && steamwarUser.getUserGroup() != UserGroup.Builder)) {
event.reply("Du hast für " + event.getName() + " keine Rechte oder es existiert keine Verknüpfung für dich.").setEphemeral(true).complete(); event.reply("Du hast für " + event.getName() + " keine Rechte oder es existiert keine Verknüpfung für dich.").setEphemeral(true).queue();
return false; return false;
} }
return true; return true;

Datei anzeigen

@ -38,6 +38,6 @@ public class ListCommand extends BasicDiscordCommand {
de.steamwar.bungeecore.commands.ListCommand.getPlayerMap().forEach((s, proxiedPlayers) -> { de.steamwar.bungeecore.commands.ListCommand.getPlayerMap().forEach((s, proxiedPlayers) -> {
embedBuilder.addField(s, proxiedPlayers.stream().map(player -> "`" + player.getName() + "`").collect(Collectors.joining(", ")), true); embedBuilder.addField(s, proxiedPlayers.stream().map(player -> "`" + player.getName() + "`").collect(Collectors.joining(", ")), true);
}); });
event.replyEmbeds(embedBuilder.build()).setEphemeral(true).complete(); event.replyEmbeds(embedBuilder.build()).setEphemeral(true).queue();
} }
} }

Datei anzeigen

@ -61,6 +61,6 @@ public class MuteCommand extends BasicDiscordCommand {
target.mute(time, msg, sender.getId(), isPerma); target.mute(time, msg, sender.getId(), isPerma);
Message.team("MUTE_TEAM_MUTED", new Message("PREFIX"), target.getUserName(), sender.getUserName(), new Message((isPerma ? "BAN_PERMA" : "BAN_UNTIL"), time), msg); Message.team("MUTE_TEAM_MUTED", new Message("PREFIX"), target.getUserName(), sender.getUserName(), new Message((isPerma ? "BAN_PERMA" : "BAN_UNTIL"), time), msg);
event.reply("Erfolgreich " + target.getUserName() + (isPerma ? " permanent" : " bis " + time) + " gemutet").setEphemeral(true).complete(); event.reply("Erfolgreich " + target.getUserName() + (isPerma ? " permanent" : " bis " + time) + " gemutet").setEphemeral(true).queue();
} }
} }

Datei anzeigen

@ -58,11 +58,11 @@ public class TeamCommand extends BasicDiscordCommand {
Team team; Team team;
if (optionMapping == null) { if (optionMapping == null) {
if (steamwarUser == null) { if (steamwarUser == null) {
event.reply("Dein Discord ist nicht verknüpft").setEphemeral(true).complete(); event.reply("Dein Discord ist nicht verknüpft").setEphemeral(true).queue();
return; return;
} }
if (steamwarUser.getTeam() == 0) { if (steamwarUser.getTeam() == 0) {
event.reply("Du bist in keinem Team").setEphemeral(true).complete(); event.reply("Du bist in keinem Team").setEphemeral(true).queue();
return; return;
} }
team = Team.get(steamwarUser.getTeam()); team = Team.get(steamwarUser.getTeam());
@ -70,7 +70,7 @@ public class TeamCommand extends BasicDiscordCommand {
team = Team.get(optionMapping.getAsString()); team = Team.get(optionMapping.getAsString());
} }
if (team == null) { if (team == null) {
event.reply("Unbekanntes Team").setEphemeral(true).complete(); event.reply("Unbekanntes Team").setEphemeral(true).queue();
return; return;
} }
EmbedBuilder embedBuilder = new EmbedBuilder(); EmbedBuilder embedBuilder = new EmbedBuilder();
@ -81,10 +81,10 @@ public class TeamCommand extends BasicDiscordCommand {
embedBuilder.addField("Leader", members.stream().filter(SteamwarUser::isLeader).map(user -> "`" + (isOnline(user) ? emoji.getAsMention() : "") + user.getUserName() + "`").collect(Collectors.joining(" ")), false); embedBuilder.addField("Leader", members.stream().filter(SteamwarUser::isLeader).map(user -> "`" + (isOnline(user) ? emoji.getAsMention() : "") + user.getUserName() + "`").collect(Collectors.joining(" ")), false);
embedBuilder.addField("Member", members.stream().filter(user -> !user.isLeader()).map(user -> "`" + (isOnline(user) ? emoji.getAsMention() : "") + user.getUserName() + "`").collect(Collectors.joining(" ")), false); embedBuilder.addField("Member", members.stream().filter(user -> !user.isLeader()).map(user -> "`" + (isOnline(user) ? emoji.getAsMention() : "") + user.getUserName() + "`").collect(Collectors.joining(" ")), false);
embedBuilder.addField("Events", "`" + TeamTeilnahme.getEvents(team.getTeamId()).stream().map(Event::getEventName).collect(Collectors.joining("` `")) + "`", false); embedBuilder.addField("Events", "`" + TeamTeilnahme.getEvents(team.getTeamId()).stream().map(Event::getEventName).collect(Collectors.joining("` `")) + "`", false);
event.replyEmbeds(embedBuilder.build()).setEphemeral(true).complete(); event.replyEmbeds(embedBuilder.build()).setEphemeral(true).queue();
return; return;
default: default:
event.reply("Unbekannter Befehl").setEphemeral(true).complete(); event.reply("Unbekannter Befehl").setEphemeral(true).queue();
return; return;
} }
} }

Datei anzeigen

@ -19,7 +19,6 @@
package de.steamwar.bungeecore.bot.commands; package de.steamwar.bungeecore.bot.commands;
import de.steamwar.bungeecore.Message;
import de.steamwar.bungeecore.sql.SteamwarUser; import de.steamwar.bungeecore.sql.SteamwarUser;
import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; import net.dv8tion.jda.api.events.interaction.SlashCommandEvent;
import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.interactions.commands.OptionType;
@ -44,16 +43,16 @@ public class UnbanCommand extends BasicDiscordCommand {
SteamwarUser sender = SteamwarUser.get(event.getMember().getIdLong()); SteamwarUser sender = SteamwarUser.get(event.getMember().getIdLong());
SteamwarUser target = SteamwarUser.getOrCreateOfflinePlayer(event.getOption("user").getAsString()); SteamwarUser target = SteamwarUser.getOrCreateOfflinePlayer(event.getOption("user").getAsString());
if (target == null) { if (target == null) {
event.reply("Angegebener User invalide").setEphemeral(true).complete(); event.reply("Angegebener User invalide").setEphemeral(true).queue();
return; return;
} }
if (!target.isBanned()) { if (!target.isBanned()) {
event.reply("Angegebener User ist nicht gebannt").setEphemeral(true).complete(); event.reply("Angegebener User ist nicht gebannt").setEphemeral(true).queue();
return; return;
} }
target.ban(Timestamp.from(new Date().toInstant()), "Unban", sender.getId(), false); target.ban(Timestamp.from(new Date().toInstant()), "Unban", sender.getId(), false);
event.reply("Erfolgreich " + target.getUserName() + " entbannt").setEphemeral(true).complete(); event.reply("Erfolgreich " + target.getUserName() + " entbannt").setEphemeral(true).queue();
} }
} }

Datei anzeigen

@ -89,6 +89,6 @@ public class WhoisCommand extends BasicDiscordCommand {
embedBuilder.addField(punishment.getType().name() + " von " + SteamwarUser.get(punishment.getPunisher()).getUserName(), "Von: " + punishment.getBantime(punishment.getStartTime(), false) + "\nBis: " + punishment.getBantime(punishment.getEndTime(), punishment.isPerma()) + "\nGrund: " + punishment.getReason(), true); embedBuilder.addField(punishment.getType().name() + " von " + SteamwarUser.get(punishment.getPunisher()).getUserName(), "Von: " + punishment.getBantime(punishment.getStartTime(), false) + "\nBis: " + punishment.getBantime(punishment.getEndTime(), punishment.isPerma()) + "\nGrund: " + punishment.getReason(), true);
} }
event.replyEmbeds(embedBuilder.build()).setEphemeral(true).complete(); event.replyEmbeds(embedBuilder.build()).setEphemeral(true).queue();
} }
} }

Datei anzeigen

@ -28,13 +28,17 @@ import de.steamwar.bungeecore.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.MessageBuilder;
import net.dv8tion.jda.api.entities.Emoji;
import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.TextChannel; import net.dv8tion.jda.api.entities.TextChannel;
import net.dv8tion.jda.api.interactions.components.ActionRow;
import net.dv8tion.jda.api.interactions.components.selections.SelectionMenu;
import java.awt.*; import java.awt.*;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.time.Instant; import java.time.Instant;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@UtilityClass @UtilityClass
@ -66,7 +70,12 @@ public class EventManager {
embedBuilder.setAuthor("SteamWar", "https://www.steamwar.de"); embedBuilder.setAuthor("SteamWar", "https://www.steamwar.de");
Timestamp now = Timestamp.from(Instant.now()); Timestamp now = Timestamp.from(Instant.now());
Event.getComing().forEach(event -> { SelectionMenu.Builder menuBuilder = SelectionMenu.create("eventName");
menuBuilder.setPlaceholder("Wähle ein Event aus!")
.setMinValues(1)
.setMaxValues(1);
List<Event> events = Event.getComing();
events.forEach(event -> {
StringBuilder st = new StringBuilder(); StringBuilder st = new StringBuilder();
if (event.getDeadline().after(now)) { if (event.getDeadline().after(now)) {
st.append("Deadline: <t:").append(event.getDeadline().getTime() / 1000).append(":R>\n"); st.append("Deadline: <t:").append(event.getDeadline().getTime() / 1000).append(":R>\n");
@ -77,10 +86,16 @@ public class EventManager {
st.append("\nAngemeldete Teams: ").append(teilname); st.append("\nAngemeldete Teams: ").append(teilname);
} }
embedBuilder.addField(event.getEventName(), st.toString(), false); embedBuilder.addField(event.getEventName(), st.toString(), false);
if(event.getDeadline().after(Timestamp.from(Instant.now()))) {
menuBuilder.addOption(event.getEventName(), event.getEventID() + "", "An " + event.getEventName() + " teilnehmen", Emoji.fromUnicode("U+1F4DD"));
}
}); });
MessageBuilder messageBuilder = new MessageBuilder(); MessageBuilder messageBuilder = new MessageBuilder();
messageBuilder.setEmbeds(embedBuilder.build()); messageBuilder.setEmbeds(embedBuilder.build());
if(!events.isEmpty()) {
messageBuilder.setActionRows(ActionRow.of(menuBuilder.build()));
}
if (message == null) { if (message == null) {
message = textChannel.sendMessage(messageBuilder.build()).complete(); message = textChannel.sendMessage(messageBuilder.build()).complete();
} else { } else {
@ -119,7 +134,7 @@ public class EventManager {
MessageBuilder messageBuilder = new MessageBuilder(); MessageBuilder messageBuilder = new MessageBuilder();
messageBuilder.setEmbeds(embedBuilder.build()); messageBuilder.setEmbeds(embedBuilder.build());
if (message == null) { if (message == null) {
message = textChannel.sendMessage(messageBuilder.build()).complete(); textChannel.sendMessage(messageBuilder.build()).queue(message1 -> message = message1);
} else { } else {
message.editMessage(messageBuilder.build()).complete(); message.editMessage(messageBuilder.build()).complete();
} }

Datei anzeigen

@ -65,7 +65,7 @@ public class SchematicsManager {
MessageBuilder messageBuilder = new MessageBuilder(); MessageBuilder messageBuilder = new MessageBuilder();
messageBuilder.setEmbeds(embedBuilder.build()); messageBuilder.setEmbeds(embedBuilder.build());
if (message == null) { if (message == null) {
message = textChannel.sendMessage(messageBuilder.build()).complete(); textChannel.sendMessage(messageBuilder.build()).queue(message1 -> message = message1);
} else { } else {
message.editMessage(messageBuilder.build()).queue(); message.editMessage(messageBuilder.build()).queue();
} }

Datei anzeigen

@ -45,6 +45,6 @@ public class AnnouncementListener extends BasicDiscordListener {
assert textChannel != null; assert textChannel != null;
MessageBuilder messageBuilder = new MessageBuilder(); MessageBuilder messageBuilder = new MessageBuilder();
messageBuilder.append(message.replace("&", "")); messageBuilder.append(message.replace("&", ""));
textChannel.sendMessage(messageBuilder.build()).complete(); textChannel.sendMessage(messageBuilder.build()).queue();
} }
} }

Datei anzeigen

@ -35,23 +35,23 @@ public class DiscordAuthListener extends BasicDiscordListener {
if(event.getChannel().getId().equals(SteamwarDiscordBotConfig.RULES_CHANNEL) && event.getComponentId().equals("auth")) { if(event.getChannel().getId().equals(SteamwarDiscordBotConfig.RULES_CHANNEL) && event.getComponentId().equals("auth")) {
String authMessage = AuthManager.createDiscordAuthToken(event.getMember()); String authMessage = AuthManager.createDiscordAuthToken(event.getMember());
if(authMessage != null) { if(authMessage != null) {
event.reply("Gebe innerhalb der nächsten 10 Minuten ``/verify " + authMessage + "`` auf dem Minecraft Server ein").setEphemeral(true).complete(); event.reply("Gebe innerhalb der nächsten 10 Minuten ``/verify " + authMessage + "`` auf dem Minecraft Server ein").setEphemeral(true).queue();
} else { } else {
event.reply("Du hast bereits einen Code am laufen").setEphemeral(true).complete(); event.reply("Du hast bereits einen Code am laufen").setEphemeral(true).queue();
} }
} }
if(event.getComponentId().equals("tada") && event.getChannelType() == ChannelType.PRIVATE) { if(event.getComponentId().equals("tada") && event.getChannelType() == ChannelType.PRIVATE) {
event.reply(":tada:").setEphemeral(false).complete(); event.reply(":tada:").setEphemeral(false).queue();
} }
if(event.getComponentId().equals("invalid") && event.getChannelType() == ChannelType.PRIVATE) { if(event.getComponentId().equals("invalid") && event.getChannelType() == ChannelType.PRIVATE) {
SteamwarUser user = SteamwarUser.get(event.getUser().getIdLong()); SteamwarUser user = SteamwarUser.get(event.getUser().getIdLong());
if(user == null) { if(user == null) {
event.reply(":question: Da ist keine verknüpfung?").setEphemeral(false).complete(); event.reply(":question: Da ist keine verknüpfung?").setEphemeral(false).queue();
} else { } else {
user.setDiscordId(null); user.setDiscordId(null);
event.reply(":x: Die Verknüpfung wurde beendet").setEphemeral(false).complete(); event.reply(":x: Die Verknüpfung wurde beendet").setEphemeral(false).queue();
} }
} }
} }

Datei anzeigen

@ -0,0 +1,93 @@
/*
This file is a part of the SteamWar software.
Copyright (C) 2020 SteamWar.de-Serverteam
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.steamwar.bungeecore.bot.listeners;
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
import de.steamwar.bungeecore.bot.events.EventManager;
import de.steamwar.bungeecore.sql.Event;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.bungeecore.sql.Team;
import de.steamwar.bungeecore.sql.TeamTeilnahme;
import net.dv8tion.jda.api.events.interaction.SelectionMenuEvent;
import net.dv8tion.jda.api.interactions.components.Component;
import org.jetbrains.annotations.NotNull;
import java.time.Instant;
public class DiscordEventListener extends BasicDiscordListener {
@Override
public void onSelectionMenu(@NotNull SelectionMenuEvent event) {
if(event.getChannel().getId().equals(SteamwarDiscordBotConfig.EVENTS_CHANNEL) && event.getComponentType() == Component.Type.SELECTION_MENU) {
if(event.getSelectedOptions().isEmpty()) {
event.deferReply(true).queue();
return;
}
if(event.getSelectedOptions().get(0).getValue().matches("([0-9]+)")) {
SteamwarUser user = SteamwarUser.get(event.getUser().getIdLong());
if(user == null) {
event.reply("Du hast dein Minecraft nicht verknüpft").setEphemeral(true).queue();
return;
}
if(user.getTeam() == 0) {
event.reply("Du bist in keinem Team").setEphemeral(true).queue();
return;
}
if(!user.isLeader()) {
event.reply("Du bist kein Leader in deinem Team").setEphemeral(true).queue();
return;
}
if(Event.get() != null) {
event.reply("Du kannst dich nicht während einem Event an einem Event anmelden").setEphemeral(true).queue();
return;
}
Event swEvent = Event.get(Integer.decode(event.getSelectedOptions().get(0).getValue()));
if(swEvent == null){
event.reply("Das Event gibt es nicht").setEphemeral(true).queue();
return;
}
if(Instant.now().isAfter(swEvent.getDeadline().toInstant())){
event.reply("Du kannst dich nicht mehr an diesen Event anmelden").setEphemeral(true).queue();
return;
}
Team team = Team.get(user.getTeam());
if(TeamTeilnahme.nimmtTeil(team.getTeamId(), swEvent.getEventID())){
TeamTeilnahme.notTeilnehmen(team.getTeamId(), swEvent.getEventID());
event.reply("Dein Team **" + team.getTeamName() + "** nimmt nun nicht mehr an **" + swEvent.getEventName() + "** teil!").setEphemeral(true).queue();
}else{
TeamTeilnahme.teilnehmen(team.getTeamId(), swEvent.getEventID());
event.reply("Dein Team **" + team.getTeamName() + "** nimmt nun an **" + swEvent.getEventName() + "** teil!").setEphemeral(true).queue();
}
EventManager.update();
} else {
event.reply("Lefuq?").setEphemeral(true).queue();
}
}
}
}

Datei anzeigen

@ -75,29 +75,40 @@ public class DiscordTicketListener extends BasicDiscordListener {
} else if(event.getComponentId().startsWith("close-")) { } else if(event.getComponentId().startsWith("close-")) {
TextChannel logChannel = event.getGuild().getTextChannelById(SteamwarDiscordBotConfig.TICKET_LOG); TextChannel logChannel = event.getGuild().getTextChannelById(SteamwarDiscordBotConfig.TICKET_LOG);
MessageBuilder builder = new MessageBuilder(); LinkedList<StringBuilder> stringBuilders = new LinkedList<>();
StringBuilder stringBuilder = new StringBuilder(); stringBuilders.add(new StringBuilder());
new LinkedList<>(event.getTextChannel().getIterableHistory().complete()).descendingIterator().forEachRemaining(message -> { new LinkedList<>(event.getTextChannel().getIterableHistory().complete()).descendingIterator().forEachRemaining(message -> {
if(message.getAuthor().isSystem() || message.getAuthor().isBot()) return; if(message.getAuthor().isSystem() || message.getAuthor().isBot()) return;
stringBuilder.append("<t:").append(message.getTimeCreated().toInstant().getEpochSecond()).append("> ") StringBuilder currentBuilder = new StringBuilder();
currentBuilder.append("<t:").append(message.getTimeCreated().toInstant().getEpochSecond()).append("> ")
.append("**") .append("**")
.append(message.getAuthor().getName()) .append(message.getAuthor().getName())
.append("**: ") .append("**: ")
.append(message.getContentRaw()); .append(message.getContentRaw());
if(!message.getAttachments().isEmpty()) { if(!message.getAttachments().isEmpty()) {
stringBuilder.append("\n") currentBuilder.append("\n")
.append("Files: ").append("\n"); .append("Files: ").append("\n");
message.getAttachments().forEach(attachment -> stringBuilder.append(attachment.getUrl()).append("\n")); message.getAttachments().forEach(attachment -> currentBuilder.append(attachment.getUrl()).append("\n"));
} }
stringBuilder.append("\n"); currentBuilder.append("\n");
if(currentBuilder.length() >= 4096) {
stringBuilders.getLast().append(currentBuilder.substring(0, 4090));
stringBuilders.add(new StringBuilder(currentBuilder.substring(4090, currentBuilder.length() - 1)));
} else if (currentBuilder.length() + stringBuilders.getLast().length() >= 4096) {
stringBuilders.add(new StringBuilder(currentBuilder.toString()));
} else {
stringBuilders.getLast().append(currentBuilder);
}
}); });
stringBuilder.append("\n"); String footer = "<t:" + Instant.now().getEpochSecond() + "> **" + event.getUser().getName() + "**: Ticket geschlossen";
stringBuilder.append("<t:").append(Instant.now().getEpochSecond()).append("> ") if(stringBuilders.getLast().length() + footer.length() > 4090) {
.append("**").append(event.getUser().getName()).append("**: ") stringBuilders.add(new StringBuilder(footer));
.append("Ticket geschlossen"); } else {
stringBuilders.getLast().append(footer);
}
EmbedBuilder embedBuilder = new EmbedBuilder(); EmbedBuilder embedBuilder = new EmbedBuilder();
embedBuilder.setColor(Color.GREEN); embedBuilder.setColor(Color.GREEN);
@ -107,14 +118,16 @@ public class DiscordTicketListener extends BasicDiscordListener {
embedBuilder.setAuthor(user.getName(), swuser==null?"https://steamwar.de/":("https://steamwar.de/users/" + swuser.getUserName().toLowerCase() + "/"), user.getAvatarUrl()); embedBuilder.setAuthor(user.getName(), swuser==null?"https://steamwar.de/":("https://steamwar.de/users/" + swuser.getUserName().toLowerCase() + "/"), user.getAvatarUrl());
embedBuilder.setTimestamp(Instant.now()); embedBuilder.setTimestamp(Instant.now());
embedBuilder.setTitle(event.getTextChannel().getName()); embedBuilder.setTitle(event.getTextChannel().getName());
embedBuilder.setDescription(stringBuilder); stringBuilders.forEach(stringBuilder -> {
embedBuilder.setDescription(stringBuilder.toString());
MessageBuilder builder = new MessageBuilder();
builder.setEmbeds(embedBuilder.build()); builder.setEmbeds(embedBuilder.build());
logChannel.sendMessage(builder.build()).complete(); logChannel.sendMessage(builder.build()).queue();
});
Message.team("DISCORD_TICKET_CLOSED", event.getTextChannel().getName()); Message.team("DISCORD_TICKET_CLOSED", event.getTextChannel().getName());
event.getTextChannel().delete().reason("Closed").complete(); event.getTextChannel().delete().reason("Closed").queue();
} }
} }
} }
@ -126,16 +139,15 @@ public class DiscordTicketListener extends BasicDiscordListener {
BungeeCore.get().getProxy().getPlayers().forEach(player -> { BungeeCore.get().getProxy().getPlayers().forEach(player -> {
if(event.getAuthor().isBot() || event.getAuthor().isSystem()) return; if(event.getAuthor().isBot() || event.getAuthor().isSystem()) return;
SteamwarUser user = SteamwarUser.get(player); SteamwarUser user = SteamwarUser.get(player);
boolean sendMessage;
if(user.getDiscordId() == null) { if(user.getDiscordId() == null) {
if(user.getUserGroup().isTeamGroup()) { sendMessage = user.getUserGroup().isCheckSchematics();
Message.sendPrefixless("DISCORD_TICKET_MESSAGE", player, "Zur nachricht", new ClickEvent(ClickEvent.Action.OPEN_URL, event.getMessage().getJumpUrl()), event.getChannel().getName(), event.getAuthor().getName(), event.getMessage().getContentRaw());
}
} else { } else {
if(event.getAuthor().getId().equals(user.getDiscordId())) return; if(event.getAuthor().getId().equals(user.getDiscordId())) return;
Member member = event.getGuild().retrieveMemberById(user.getDiscordId()).complete(); sendMessage = user.getDiscordId().equals(event.getChannel().getTopic()) || user.getUserGroup().isCheckSchematics();
if(member.hasPermission(event.getChannel().getManager().getChannel(), Permission.MESSAGE_WRITE)) {
Message.sendPrefixless("DISCORD_TICKET_MESSAGE", player, "Zur nachricht", new ClickEvent(ClickEvent.Action.OPEN_URL, event.getMessage().getJumpUrl()), event.getChannel().getName(), event.getAuthor().getName(), event.getMessage().getContentRaw());
} }
if(sendMessage) {
Message.sendPrefixless("DISCORD_TICKET_MESSAGE", player, "Zur nachricht", new ClickEvent(ClickEvent.Action.OPEN_URL, event.getMessage().getJumpUrl()), event.getChannel().getName(), event.getAuthor().getName(), event.getMessage().getContentRaw());
} }
}); });
} }

Datei anzeigen

@ -43,15 +43,15 @@ public class IngameChatListener extends BasicDiscordListener {
Member member = event.getMember(); Member member = event.getMember();
SteamwarUser steamwarUser = SteamwarUser.get(member.getIdLong()); SteamwarUser steamwarUser = SteamwarUser.get(member.getIdLong());
if (steamwarUser == null || event.getMessage().getContentRaw().length() > 250) { if (steamwarUser == null || event.getMessage().getContentRaw().length() > 250) {
event.getMessage().delete().complete(); event.getMessage().delete().queue();
} else { } else {
String s = event.getMessage().getContentDisplay(); String s = event.getMessage().getContentDisplay();
if (steamwarUser.getUserGroup() == UserGroup.Member && (s.contains("http") || s.contains("www"))) { if (steamwarUser.getUserGroup() == UserGroup.Member && (s.contains("http") || s.contains("www"))) {
event.getMessage().delete().complete(); event.getMessage().delete().queue();
return; return;
} }
if (steamwarUser.isMuted() || steamwarUser.isBanned()) { if (steamwarUser.isMuted() || steamwarUser.isBanned()) {
event.getMessage().delete().complete(); event.getMessage().delete().queue();
return; return;
} }
ChatListener.discordChat(steamwarUser, event.getMessage().getContentDisplay().replaceAll("§[a-f0-9]", "").replace('\n', ' ')); ChatListener.discordChat(steamwarUser, event.getMessage().getContentDisplay().replaceAll("§[a-f0-9]", "").replace('\n', ' '));

Datei anzeigen

@ -32,10 +32,10 @@ public class RolesInteractionButtonListener extends BasicDiscordListener {
if(event.getType() == InteractionType.COMPONENT && event.getChannelType() == ChannelType.TEXT && event.getTextChannel().getId().equals(SteamwarDiscordBotConfig.ROLES_CHANNEL) && SteamwarDiscordBotConfig.ROLES.stream().anyMatch(discordRole -> discordRole.getRoleId().equals(event.getComponentId()))) { if(event.getType() == InteractionType.COMPONENT && event.getChannelType() == ChannelType.TEXT && event.getTextChannel().getId().equals(SteamwarDiscordBotConfig.ROLES_CHANNEL) && SteamwarDiscordBotConfig.ROLES.stream().anyMatch(discordRole -> discordRole.getRoleId().equals(event.getComponentId()))) {
if (event.getMember().getRoles().stream().anyMatch(role -> role.getId().equals(event.getComponentId()))) { if (event.getMember().getRoles().stream().anyMatch(role -> role.getId().equals(event.getComponentId()))) {
event.getGuild().removeRoleFromMember(event.getMember(), event.getGuild().getRoleById(event.getComponentId())).complete(); event.getGuild().removeRoleFromMember(event.getMember(), event.getGuild().getRoleById(event.getComponentId())).complete();
event.reply(SteamwarDiscordBotConfig.ROLES_REMOVED.replace("%role%", event.getGuild().getRoleById(event.getComponentId()).getAsMention())).setEphemeral(true).complete(); event.reply(SteamwarDiscordBotConfig.ROLES_REMOVED.replace("%role%", event.getGuild().getRoleById(event.getComponentId()).getAsMention())).setEphemeral(true).queue();
} else { } else {
event.getGuild().addRoleToMember(event.getMember(), event.getGuild().getRoleById(event.getComponentId())).complete(); event.getGuild().addRoleToMember(event.getMember(), event.getGuild().getRoleById(event.getComponentId())).complete();
event.reply(SteamwarDiscordBotConfig.ROLES_ADDED.replace("%role%", event.getGuild().getRoleById(event.getComponentId()).getAsMention())).setEphemeral(true).complete(); event.reply(SteamwarDiscordBotConfig.ROLES_ADDED.replace("%role%", event.getGuild().getRoleById(event.getComponentId()).getAsMention())).setEphemeral(true).queue();
} }
} }
} }

Datei anzeigen

@ -22,7 +22,6 @@ package de.steamwar.bungeecore.bot.listeners;
import de.steamwar.bungeecore.bot.SteamwarDiscordBot; import de.steamwar.bungeecore.bot.SteamwarDiscordBot;
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig; import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
import de.steamwar.bungeecore.commands.ServerTeamchatCommand; import de.steamwar.bungeecore.commands.ServerTeamchatCommand;
import de.steamwar.bungeecore.listeners.ChatListener;
import de.steamwar.bungeecore.sql.SteamwarUser; import de.steamwar.bungeecore.sql.SteamwarUser;
import net.dv8tion.jda.api.MessageBuilder; import net.dv8tion.jda.api.MessageBuilder;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;

Datei anzeigen

@ -22,13 +22,11 @@ package de.steamwar.bungeecore.bot.util;
import de.steamwar.bungeecore.bot.SteamwarDiscordBot; import de.steamwar.bungeecore.bot.SteamwarDiscordBot;
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig; import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
import de.steamwar.bungeecore.sql.SteamwarUser; import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.bungeecore.sql.UserGroup;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Role; import net.dv8tion.jda.api.entities.Role;
import net.dv8tion.jda.api.exceptions.ErrorResponseException;
import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@ -41,11 +39,7 @@ public class DiscordRanks {
return; return;
} }
Guild guild = SteamwarDiscordBot.instance().getJda().getGuildById(SteamwarDiscordBotConfig.GUILD); Guild guild = SteamwarDiscordBot.instance().getJda().getGuildById(SteamwarDiscordBotConfig.GUILD);
Member member = guild.retrieveMemberById(steamwarUser.getDiscordId()).complete(); guild.retrieveMemberById(steamwarUser.getDiscordId()).queue(member -> {
if (member == null) {
return;
}
List<Role> roleList = member.getRoles(); List<Role> roleList = member.getRoles();
Set<String> strings = new HashSet<>(SteamwarDiscordBotConfig.RANKS.values()); Set<String> strings = new HashSet<>(SteamwarDiscordBotConfig.RANKS.values());
String needed = SteamwarDiscordBotConfig.RANKS.get(steamwarUser.getUserGroup()); String needed = SteamwarDiscordBotConfig.RANKS.get(steamwarUser.getUserGroup());
@ -63,5 +57,13 @@ public class DiscordRanks {
if (needed != null && !needed.isEmpty()) { if (needed != null && !needed.isEmpty()) {
guild.addRoleToMember(member, guild.getRoleById(needed)).complete(); guild.addRoleToMember(member, guild.getRoleById(needed)).complete();
} }
}, throwable -> {
if(throwable instanceof ErrorResponseException) {
ErrorResponseException e = (ErrorResponseException) throwable;
if(e.getErrorCode() == 10007) {
steamwarUser.setDiscordId(null);
}
}
});
} }
} }

Datei anzeigen

@ -38,10 +38,6 @@ public class DiscordRolesMessage {
public void sendMessage() { public void sendMessage() {
TextChannel channel = SteamwarDiscordBot.instance().getJda().getGuildById(SteamwarDiscordBotConfig.GUILD).getTextChannelById(SteamwarDiscordBotConfig.ROLES_CHANNEL); TextChannel channel = SteamwarDiscordBot.instance().getJda().getGuildById(SteamwarDiscordBotConfig.GUILD).getTextChannelById(SteamwarDiscordBotConfig.ROLES_CHANNEL);
assert channel != null; assert channel != null;
Message message = null;
if(channel.hasLatestMessage()) {
message = channel.getIterableHistory().complete().stream().filter(m -> m.getAuthor().isBot()).findFirst().orElse(null);
}
MessageBuilder builder = new MessageBuilder(); MessageBuilder builder = new MessageBuilder();
builder.setContent(SteamwarDiscordBotConfig.ROLES_BASE_MESSAGE); builder.setContent(SteamwarDiscordBotConfig.ROLES_BASE_MESSAGE);
@ -49,10 +45,17 @@ public class DiscordRolesMessage {
SteamwarDiscordBotConfig.ROLES.forEach(discordRole -> buttons.add(discordRole.toButton())); SteamwarDiscordBotConfig.ROLES.forEach(discordRole -> buttons.add(discordRole.toButton()));
builder.setActionRows(ActionRow.of(buttons)); builder.setActionRows(ActionRow.of(buttons));
if(channel.hasLatestMessage()) {
channel.getIterableHistory().queue(messages -> {
Message message = messages.stream().filter(m -> m.getAuthor().isBot()).findFirst().orElse(null);
if (message != null) { if (message != null) {
message.editMessage(builder.build()).complete(); message.editMessage(builder.build()).queue();
} else { } else {
channel.sendMessage(builder.build()).complete(); channel.sendMessage(builder.build()).queue();
}
});
} else {
channel.sendMessage(builder.build()).queue();
} }
} }
} }

Datei anzeigen

@ -60,9 +60,9 @@ public class DiscordRulesMessage {
messageBuilder.setEmbeds(builder.build()); messageBuilder.setEmbeds(builder.build());
messageBuilder.setActionRows(ActionRow.of(buttons), ActionRow.of(authButton)); messageBuilder.setActionRows(ActionRow.of(buttons), ActionRow.of(authButton));
if (message != null) { if (message != null) {
message.editMessage(messageBuilder.build()).complete(); message.editMessage(messageBuilder.build()).queue();
} else { } else {
channel.sendMessage(messageBuilder.build()).complete(); channel.sendMessage(messageBuilder.build()).queue();
} }
} }
} }

Datei anzeigen

@ -56,9 +56,9 @@ public class DiscordTicketMessage {
messageBuilder.setEmbeds(builder.build()); messageBuilder.setEmbeds(builder.build());
messageBuilder.setActionRows(ActionRow.of(buttons)); messageBuilder.setActionRows(ActionRow.of(buttons));
if (message != null) { if (message != null) {
message.editMessage(messageBuilder.build()).complete(); message.editMessage(messageBuilder.build()).queue();
} else { } else {
channel.sendMessage(messageBuilder.build()).complete(); channel.sendMessage(messageBuilder.build()).queue();
} }
} }
} }

Datei anzeigen

@ -20,38 +20,38 @@
package de.steamwar.bungeecore.commands; package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.*; import de.steamwar.bungeecore.*;
import de.steamwar.bungeecore.comms.packets.BaumemberUpdatePacket;
import de.steamwar.bungeecore.inventory.SWInventory; import de.steamwar.bungeecore.inventory.SWInventory;
import de.steamwar.bungeecore.inventory.SWItem; import de.steamwar.bungeecore.inventory.SWItem;
import de.steamwar.bungeecore.sql.BauweltMember; import de.steamwar.bungeecore.sql.BauweltMember;
import de.steamwar.bungeecore.sql.SteamwarUser; import de.steamwar.bungeecore.sql.SteamwarUser;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.config.ServerInfo;
import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.ChatEvent;
public class BauCommand { public class BauCommand extends BasicCommand {
private BauCommand(){} public BauCommand(){
super("bau", null, "b", "gs");
}
public static void onBau(ChatEvent e, String[] command){ @Override
if(BungeeCore.EVENT_MODE) public void execute(CommandSender sender, String[] args) {
if(!(sender instanceof ProxiedPlayer))
return; return;
ProxiedPlayer p = (ProxiedPlayer) e.getSender(); ProxiedPlayer p = (ProxiedPlayer) sender;
Subserver server = Subserver.getSubserver(p);
Bauserver bau = (server != null && server.getType() == Servertype.BAUSERVER) ? (Bauserver)server : null;
boolean ownBau = bau != null && bau.getOwner().equals(p.getUniqueId());
e.setCancelled(true);
BungeeCore.log(p, e.getMessage());
if(command.length == 1){ if(args.length == 0){
if(bau15(p, command, 1)) if(bau15(p, args, 0))
SubserverSystem.sendToBau15(p, p.getUniqueId()); SubserverSystem.sendToBau15(p, p.getUniqueId());
else else
SubserverSystem.sendToBauServer(p, p.getUniqueId()); SubserverSystem.sendToBauServer(p, p.getUniqueId());
return; return;
} }
switch(command[1].toLowerCase()){ switch(args[0].toLowerCase()){
case "ws": case "ws":
case "warship": case "warship":
case "12": case "12":
@ -72,52 +72,44 @@ public class BauCommand {
SubserverSystem.sendToBau15paper(p, p.getUniqueId()); SubserverSystem.sendToBau15paper(p, p.getUniqueId());
break; break;
case "addmember": case "addmember":
addmember(p, command); addmember(p, args);
break; break;
case "tp": case "tp":
case "teleport": case "teleport":
teleport(p, command); teleport(p, args);
break; break;
case "info": case "info":
if (bau != null) { p.chat("/bauinfo");
e.setCancelled(false);
}
break; break;
case "togglewe": case "togglewe":
if(ownBau && command.length > 2) togglewe(p, args);
e.setCancelled(false);
else
togglewe(p, command);
break; break;
case "toggleworld": case "toggleworld":
if(ownBau && command.length > 2) toggleworld(p, args);
e.setCancelled(false);
else
toggleworld(p, command);
break; break;
case "delmember": case "delmember":
delmember(p, command); delmember(p, args);
break; break;
case "resetall": case "resetall":
case "delete": case "delete":
delete(p, command); delete(p, args);
break; break;
case "testarena": case "testarena":
case "test": case "test":
testarena(p, command); testarena(p, args);
break; break;
default: default:
HelpCommand.sendBauHelp(p); HelpCommand.sendBauHelp(p);
} }
} }
private static void addmember(ProxiedPlayer p, String[] command){ private static void addmember(ProxiedPlayer p, String[] args){
if (command.length == 2) { if (args.length == 1) {
Message.send("BAU_ADDMEMBER_USAGE", p); Message.send("BAU_ADDMEMBER_USAGE", p);
return; return;
} }
SteamwarUser target = SteamwarUser.get(command[2]); SteamwarUser target = SteamwarUser.get(args[1]);
if (target == null) { if (target == null) {
Message.send("UNKNOWN_PLAYER", p); Message.send("UNKNOWN_PLAYER", p);
return; return;
@ -137,13 +129,13 @@ public class BauCommand {
Message.send("BAU_ADDMEMBER_ADDED_TARGET", z, p.getName()); Message.send("BAU_ADDMEMBER_ADDED_TARGET", z, p.getName());
} }
private static void teleport(ProxiedPlayer p, String[] command){ private static void teleport(ProxiedPlayer p, String[] args){
if (command.length == 2) { if (args.length == 1) {
Message.send("BAU_TP_USAGE", p); Message.send("BAU_TP_USAGE", p);
return; return;
} }
SteamwarUser worldOwner = SteamwarUser.get(command[2]); SteamwarUser worldOwner = SteamwarUser.get(args[1]);
if (worldOwner == null) { if (worldOwner == null) {
Message.send("UNKNOWN_PLAYER", p); Message.send("UNKNOWN_PLAYER", p);
return; return;
@ -153,7 +145,7 @@ public class BauCommand {
return; return;
} }
if(bau15(p, command, 3)) if(bau15(p, args, 2))
SubserverSystem.sendToBau15(p, worldOwner.getUuid()); SubserverSystem.sendToBau15(p, worldOwner.getUuid());
else else
SubserverSystem.sendToBauServer(p, worldOwner.getUuid()); SubserverSystem.sendToBauServer(p, worldOwner.getUuid());
@ -183,31 +175,43 @@ public class BauCommand {
} }
} }
private static void togglewe(ProxiedPlayer p, String[] command){ private static void togglewe(ProxiedPlayer p, String[] args){
BauweltMember target = toggle(p, command, "togglewe"); BauweltMember target = toggle(p, args, "togglewe");
if(target == null) if(target == null)
return; return;
target.setWorldEdit(!target.isWorldEdit()); target.setWorldEdit(!target.isWorldEdit());
clearMembercache(p);
isAllowedTo(target.isWorldEdit(), p, target, "WorldEdit verwenden"); isAllowedTo(target.isWorldEdit(), p, target, "WorldEdit verwenden");
} }
private static void toggleworld(ProxiedPlayer p, String[] command){ private static void toggleworld(ProxiedPlayer p, String[] args){
BauweltMember target = toggle(p, command, "toggleworld"); BauweltMember target = toggle(p, args, "toggleworld");
if(target == null) if(target == null)
return; return;
target.setWorld(!target.isWorld()); target.setWorld(!target.isWorld());
clearMembercache(p);
isAllowedTo(target.isWorld(), p, target, "Einstellungen vornehmen"); isAllowedTo(target.isWorld(), p, target, "Einstellungen vornehmen");
} }
private static void delmember(ProxiedPlayer p, String[] command){ private static void clearMembercache(ProxiedPlayer p){
if (command.length == 2) { for(ServerInfo info : ProxyServer.getInstance().getServers().values()){
Subserver server = Subserver.getSubserver(info);
if(server != null && server.getType() == Servertype.BAUSERVER && ((Bauserver)server).getOwner().equals(p.getUniqueId())){
info.getPlayers().stream().findAny().ifPresent(player -> new BaumemberUpdatePacket().send(player));
break;
}
}
}
private static void delmember(ProxiedPlayer p, String[] args){
if (args.length == 1) {
Message.send("BAU_DELMEMBER_USAGE", p); Message.send("BAU_DELMEMBER_USAGE", p);
return; return;
} }
BauweltMember target = member(p, SteamwarUser.get(command[2])); BauweltMember target = member(p, SteamwarUser.get(args[1]));
if(target == null) if(target == null)
return; return;
@ -228,13 +232,13 @@ public class BauCommand {
Message.send("BAU_DELMEMBER_DELETED", p); Message.send("BAU_DELMEMBER_DELETED", p);
} }
private static void delete(ProxiedPlayer p, String[] command){ private static void delete(ProxiedPlayer p, String[] args){
SWInventory inventory = new SWInventory(p, 9, Message.parse("BAU_DELETE_GUI_NAME", p)); SWInventory inventory = new SWInventory(p, 9, Message.parse("BAU_DELETE_GUI_NAME", p));
inventory.addItem(8, new SWItem(Message.parse("BAU_DELETE_GUI_CANCEL", p), 1), click -> inventory.addItem(8, new SWItem(Message.parse("BAU_DELETE_GUI_CANCEL", p), 1), click ->
inventory.close() inventory.close()
); );
inventory.addItem(0, new SWItem(Message.parse("BAU_DELETE_GUI_DELETE", p), 10), click -> { inventory.addItem(0, new SWItem(Message.parse("BAU_DELETE_GUI_DELETE", p), 10), click -> {
if(bau15(p, command, 2)){ if(bau15(p, args, 1)){
SteamwarUser user = SteamwarUser.get(p.getUniqueId()); SteamwarUser user = SteamwarUser.get(p.getUniqueId());
deleteWorld(p, BungeeCore.USERWORLDS15 + user.getId()); deleteWorld(p, BungeeCore.USERWORLDS15 + user.getId());
}else{ }else{
@ -257,12 +261,12 @@ public class BauCommand {
}); });
} }
public static void stopBauserver(ProxiedPlayer p){ public static boolean stopBauserver(ProxiedPlayer p){
for (Subserver subserver : Subserver.getServerList()) { for (Subserver subserver : Subserver.getServerList()) {
if (subserver.getType() == Servertype.BAUSERVER && ((Bauserver) subserver).getOwner().equals(p.getUniqueId())) { if (subserver.getType() == Servertype.BAUSERVER && ((Bauserver) subserver).getOwner().equals(p.getUniqueId())) {
if(subserver.getServer().getPlayers().isEmpty()){ if(!subserver.hasStarted()){
Message.send("BAU_START_ALREADY", p); Message.send("BAU_START_ALREADY", p);
return; return false;
} }
subserver.stop(); subserver.stop();
try { try {
@ -273,11 +277,12 @@ public class BauCommand {
break; break;
} }
} }
return true;
} }
private static void testarena(ProxiedPlayer p, String[] command){ private static void testarena(ProxiedPlayer p, String[] args){
FightCommand.createArena(p, "/bau testarena ", command, 2, false, (player, mode, map) -> ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> { FightCommand.createArena(p, "/bau testarena ", args, 1, false, (player, mode, map) -> ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> {
stopBauserver(p); if(stopBauserver(p))
SubserverSystem.startTestServer(p, mode, map, 0, 0); SubserverSystem.startTestServer(p, mode, map, 0, 0);
})); }));
} }
@ -296,13 +301,13 @@ public class BauCommand {
return target; return target;
} }
private static BauweltMember toggle(ProxiedPlayer p, String[] command, String subcommand){ private static BauweltMember toggle(ProxiedPlayer p, String[] args, String subcommand){
if (command.length == 2) { if (args.length == 1) {
Message.send("BAU_MEMBER_TOGGLE_USAGE", p, subcommand); Message.send("BAU_MEMBER_TOGGLE_USAGE", p, subcommand);
return null; return null;
} }
SteamwarUser member = SteamwarUser.get(command[2]); SteamwarUser member = SteamwarUser.get(args[1]);
return member(p, member); return member(p, member);
} }

Datei anzeigen

@ -234,7 +234,10 @@ public class CheckCommand extends BasicCommand {
this.checkList = checkQuestions.get(schematic.getSchemType()).listIterator(); this.checkList = checkQuestions.get(schematic.getSchemType()).listIterator();
ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> { ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> {
BauCommand.stopBauserver(checker); if(!BauCommand.stopBauserver(checker)){
remove();
return;
}
ArenaMode mode = ArenaMode.getBySchemType(schematic.getSchemType().fightType()); ArenaMode mode = ArenaMode.getBySchemType(schematic.getSchemType().fightType());
SubserverSystem.startTestServer(checker, mode, FightCommand.getMap(checker, mode, "Random"), schematic.getSchemID(), 0); SubserverSystem.startTestServer(checker, mode, FightCommand.getMap(checker, mode, "Random"), schematic.getSchemID(), 0);
@ -323,8 +326,7 @@ public class CheckCommand extends BasicCommand {
} }
private void stop(){ private void stop(){
currentCheckers.remove(checker.getUniqueId()); remove();
currentSchems.remove(schematic.getSchemID());
ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> { ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> {
for (Subserver subserver : Subserver.getServerList()) { for (Subserver subserver : Subserver.getServerList()) {
if (subserver.getType() == Servertype.BAUSERVER && ((Bauserver) subserver).getOwner().equals(checker.getUniqueId())) { if (subserver.getType() == Servertype.BAUSERVER && ((Bauserver) subserver).getOwner().equals(checker.getUniqueId())) {
@ -334,5 +336,10 @@ public class CheckCommand extends BasicCommand {
} }
}); });
} }
private void remove() {
currentCheckers.remove(checker.getUniqueId());
currentSchems.remove(schematic.getSchemID());
}
} }
} }

Datei anzeigen

@ -46,7 +46,7 @@ public class PollresultCommand extends BasicCommand {
ProxiedPlayer player = (ProxiedPlayer) sender; ProxiedPlayer player = (ProxiedPlayer) sender;
Map<String, Integer> voted = PollAnswer.getCurrentResults(); Map<String, Integer> voted = PollAnswer.getCurrentResults();
Message.send("POLLRESULT_HEADER", player, PollAnswer.getAllAnswered(), PollSystem.getQuestion()); Message.send("POLLRESULT_HEADER", player, voted.values().stream().reduce(Integer::sum), PollSystem.getQuestion());
for (Map.Entry<String, Integer> e: voted.entrySet()) { for (Map.Entry<String, Integer> e: voted.entrySet()) {
Message.send("POLLRESULT_LIST", sender, e.getKey(), e.getValue()); Message.send("POLLRESULT_LIST", sender, e.getKey(), e.getValue());
} }

Datei anzeigen

@ -177,7 +177,7 @@ public class TeamCommand extends BasicCommand {
if(checkTeamName(player, team, args[2])) if(checkTeamName(player, team, args[2]))
return; return;
Team.create(args[1], args[2], user); Team.create(args[1], args[2]);
user.setTeam(Team.get(args[1]).getTeamId()); user.setTeam(Team.get(args[1]).getTeamId());
user.setLeader(true); user.setLeader(true);
Message.send("TEAM_CREATE_CREATED", player, args[2]); Message.send("TEAM_CREATE_CREATED", player, args[2]);

Datei anzeigen

@ -25,6 +25,7 @@ public class PacketIdManager {
public static final byte PING_PACKET = 0x01; public static final byte PING_PACKET = 0x01;
public static final byte TABLIST_NAME = 0x02; public static final byte TABLIST_NAME = 0x02;
public static final byte PREPARE_SCHEM = 0x03; public static final byte PREPARE_SCHEM = 0x03;
public static final byte BAUMEMBER_UPDATE = 0x04;
//0x1(X) Bungee Inventory //0x1(X) Bungee Inventory
public static final byte INVENTORY_PACKET = 0x10; public static final byte INVENTORY_PACKET = 0x10;

Datei anzeigen

@ -0,0 +1,36 @@
/*
This file is a part of the SteamWar software.
Copyright (C) 2020 SteamWar.de-Serverteam
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.steamwar.bungeecore.comms.packets;
import com.google.common.io.ByteArrayDataOutput;
import de.steamwar.bungeecore.comms.BungeePacket;
import de.steamwar.bungeecore.comms.PacketIdManager;
public class BaumemberUpdatePacket extends BungeePacket {
@Override
public int getId() {
return PacketIdManager.BAUMEMBER_UPDATE;
}
@Override
public void writeVars(ByteArrayDataOutput byteArrayDataOutput) {
// empty
}
}

Datei anzeigen

@ -22,7 +22,6 @@ package de.steamwar.bungeecore.listeners;
import de.steamwar.bungeecore.*; import de.steamwar.bungeecore.*;
import de.steamwar.bungeecore.bot.SteamwarDiscordBot; import de.steamwar.bungeecore.bot.SteamwarDiscordBot;
import de.steamwar.bungeecore.bot.listeners.IngameChatListener; import de.steamwar.bungeecore.bot.listeners.IngameChatListener;
import de.steamwar.bungeecore.commands.BauCommand;
import de.steamwar.bungeecore.commands.TpCommand; import de.steamwar.bungeecore.commands.TpCommand;
import de.steamwar.bungeecore.comms.packets.PingPacket; import de.steamwar.bungeecore.comms.packets.PingPacket;
import de.steamwar.bungeecore.sql.SteamwarUser; import de.steamwar.bungeecore.sql.SteamwarUser;
@ -82,11 +81,6 @@ public class ChatListener extends BasicListener {
} }
switch(command[0].toLowerCase()){ switch(command[0].toLowerCase()){
case "/bau":
case "/b":
case "/gs":
BauCommand.onBau(e, command);
break;
case "/bc": case "/bc":
case "/bauchat": case "/bauchat":
case "/local": case "/local":

Datei anzeigen

@ -19,18 +19,18 @@
package de.steamwar.bungeecore.sql; package de.steamwar.bungeecore.sql;
import de.steamwar.bungeecore.BungeeCore;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class BannedUserIPs { public class BannedUserIPs {
private int userID; private static final Statement getByID = new Statement("SELECT * FROM BannedUserIPs WHERE UserID = ? ORDER BY Timestamp ASC");
private Timestamp timestamp; private static final Statement getByIP = new Statement("SELECT * FROM BannedUserIPs WHERE IP = ? ORDER BY Timestamp DESC");
private static final Statement banIP = new Statement("INSERT INTO BannedUserIPs (UserID, Timestamp, IP) VALUES (?, NOW(), ?) ON DUPLICATE KEY UPDATE Timestamp=NOW()");
private final int userID;
private final Timestamp timestamp;
private BannedUserIPs(int userID, Timestamp timestamp){ private BannedUserIPs(int userID, Timestamp timestamp){
this.userID = userID; this.userID = userID;
@ -38,37 +38,31 @@ public class BannedUserIPs {
} }
public static List<BannedUserIPs> get(int userID){ public static List<BannedUserIPs> get(int userID){
return getByID.select(rs -> {
List<BannedUserIPs> userIPs = new ArrayList<>(); List<BannedUserIPs> userIPs = new ArrayList<>();
ResultSet dbentry = SQL.select("SELECT * FROM BannedUserIPs WHERE UserID = ? ORDER BY Timestamp ASC", userID); while(rs.next()) {
try {
while(dbentry.next()){
userIPs.add(new BannedUserIPs( userIPs.add(new BannedUserIPs(
userID, userID,
dbentry.getTimestamp("Timestamp"))); rs.getTimestamp("Timestamp")));
}
} catch (SQLException e) {
BungeeCore.log("Get BannedUserIPs failed", e);
} }
return userIPs; return userIPs;
}, userID);
} }
public static List<BannedUserIPs> get(String ip){ public static List<BannedUserIPs> get(String ip){
return getByIP.select(rs -> {
List<BannedUserIPs> userIDs = new ArrayList<>(); List<BannedUserIPs> userIDs = new ArrayList<>();
ResultSet dbentry = SQL.select("SELECT * FROM BannedUserIPs WHERE IP = ? ORDER BY Timestamp DESC", ip); while(rs.next()) {
try {
while(dbentry.next()){
userIDs.add(new BannedUserIPs( userIDs.add(new BannedUserIPs(
dbentry.getInt("UserID"), rs.getInt("UserID"),
dbentry.getTimestamp("Timestamp"))); rs.getTimestamp("Timestamp")));
}
} catch (SQLException e) {
BungeeCore.log("Get BannedUserIPs failed", e);
} }
return userIDs; return userIDs;
}, ip);
} }
static void banIP(SteamwarUser user, String ip){ static void banIP(SteamwarUser user, String ip){
SQL.update("INSERT INTO BannedUserIPs (UserID, Timestamp, IP) VALUES (?, NOW(), ?) ON DUPLICATE KEY UPDATE Timestamp=NOW()", user.getId(), ip); banIP.update(user.getId(), ip);
} }
public int getUserID() { public int getUserID() {

Datei anzeigen

@ -19,15 +19,17 @@
package de.steamwar.bungeecore.sql; package de.steamwar.bungeecore.sql;
import de.steamwar.bungeecore.BungeeCore;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
public class BauweltMember{ public class BauweltMember{
private static final Statement delete = new Statement("DELETE FROM BauweltMember WHERE BauweltID = ? AND MemberID = ?");
private static final Statement update = new Statement("INSERT INTO BauweltMember (BauweltID, MemberID, WorldEdit, World) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE WorldEdit = VALUES(WorldEdit), World = VALUES(World)");
private static final Statement getMember = new Statement("SELECT * FROM BauweltMember WHERE BauweltID = ? AND MemberID = ?");
private static final Statement getMembers = new Statement("SELECT * FROM BauweltMember WHERE BauweltID = ?");
private final int bauweltID; private final int bauweltID;
private final int memberID; private final int memberID;
private boolean worldEdit; private boolean worldEdit;
@ -52,12 +54,11 @@ public class BauweltMember{
} }
public void remove(){ public void remove(){
SQL.update("DELETE FROM BauweltMember WHERE BauweltID = " + bauweltID + " AND MemberID = " + memberID); delete.update(bauweltID, memberID);
} }
private void updateDB(){ private void updateDB(){
SQL.update("INSERT INTO BauweltMember (BauweltID, MemberID, WorldEdit, World) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE WorldEdit = VALUES(WorldEdit), World = VALUES(World)", update.update(bauweltID, memberID, worldEdit, world);
bauweltID, memberID, worldEdit, world);
} }
public static BauweltMember getBauMember(UUID ownerID, UUID memberID){ public static BauweltMember getBauMember(UUID ownerID, UUID memberID){
@ -65,18 +66,12 @@ public class BauweltMember{
} }
public static BauweltMember getBauMember(int ownerID, int memberID){ public static BauweltMember getBauMember(int ownerID, int memberID){
ResultSet member = SQL.select("SELECT * FROM BauweltMember WHERE BauweltID = ? AND MemberID = ?", ownerID, memberID); return getMember.select(rs -> {
try { if(!rs.next())
if(member == null || !member.next()){
return null;
}
boolean worldEdit = member.getBoolean("WorldEdit");
boolean world = member.getBoolean("World");
return new BauweltMember(ownerID, memberID, worldEdit, world, false);
} catch (SQLException e) {
BungeeCore.log("Could not load BauweltMember", e);
}
return null; return null;
return new BauweltMember(ownerID, memberID, rs.getBoolean("WorldEdit"), rs.getBoolean("World"), false);
}, ownerID, memberID);
} }
public static List<BauweltMember> getMembers(UUID bauweltID){ public static List<BauweltMember> getMembers(UUID bauweltID){
@ -84,20 +79,13 @@ public class BauweltMember{
} }
public static List<BauweltMember> getMembers(int bauweltID){ public static List<BauweltMember> getMembers(int bauweltID){
try{ return getMembers.select(rs -> {
ResultSet memberlist = SQL.select("SELECT * FROM BauweltMember WHERE BauweltID = ?", bauweltID);
List<BauweltMember> members = new ArrayList<>(); List<BauweltMember> members = new ArrayList<>();
while(memberlist.next()){ while(rs.next()){
int memberID = memberlist.getInt("MemberID"); members.add(new BauweltMember(bauweltID, rs.getInt("MemberID"), rs.getBoolean("WorldEdit"), rs.getBoolean("World"), false));
boolean worldEdit = memberlist.getBoolean("WorldEdit");
boolean world = memberlist.getBoolean("World");
members.add(new BauweltMember(bauweltID, memberID, worldEdit, world, false));
} }
return members; return members;
}catch(SQLException e){ }, bauweltID);
BungeeCore.log("Could not load BauweltMembers", e);
}
return new ArrayList<>();
} }
public int getBauweltID() { public int getBauweltID() {

Datei anzeigen

@ -27,6 +27,9 @@ import java.util.List;
public class CheckedSchematic { public class CheckedSchematic {
private static final Statement create = new Statement("INSERT INTO CheckedSchematic (SchemName, SchemOwner, Validator, StartTime, EndTime, DeclineReason) VALUES (?, ?, ?, ?, ?, ?)");
private static final Statement previous = new Statement("SELECT * FROM CheckedSchematic WHERE SchemName = ? AND SchemOwner = ? ORDER BY EndTime ASC");
private final String schemName; private final String schemName;
private final int schemOwner; private final int schemOwner;
@ -45,20 +48,16 @@ public class CheckedSchematic {
} }
public static void create(String schemName, int schemOwner, int validator, Timestamp startTime, Timestamp endTime, String reason){ public static void create(String schemName, int schemOwner, int validator, Timestamp startTime, Timestamp endTime, String reason){
SQL.update("INSERT INTO CheckedSchematic (SchemName, SchemOwner, Validator, StartTime, EndTime, DeclineReason) VALUES (?, ?, ?, ?, ?, ?)", create.update(schemName, schemOwner, validator, startTime, endTime, reason);
schemName, schemOwner, validator, startTime, endTime, reason);
} }
public static List<CheckedSchematic> previousChecks(String schemName, int schemOwner){ public static List<CheckedSchematic> previousChecks(String schemName, int schemOwner){
ResultSet rs = SQL.select("SELECT * FROM CheckedSchematic WHERE SchemName = ? AND SchemOwner = ? ORDER BY EndTime ASC", schemName, schemOwner); return previous.select(rs -> {
List<CheckedSchematic> schematics = new ArrayList<>(); List<CheckedSchematic> schematics = new ArrayList<>();
try {
while(rs.next()) while(rs.next())
schematics.add(new CheckedSchematic(rs)); schematics.add(new CheckedSchematic(rs));
} catch (SQLException e) {
throw new SecurityException("Could not load previous checks", e);
}
return schematics; return schematics;
}, schemName, schemOwner);
} }
public int getValidator() { public int getValidator() {

Datei anzeigen

@ -19,33 +19,26 @@
package de.steamwar.bungeecore.sql; package de.steamwar.bungeecore.sql;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Elo { public class Elo {
private static final Statement elo = new Statement("SELECT Elo FROM Elo WHERE UserID = ? AND GameMode = ?");
private static final Statement place = new Statement("SELECT COUNT(*) AS Place FROM Elo WHERE GameMode = ? AND Elo > ?");
private Elo(){} private Elo(){}
public static int getElo(int userID, String gameMode){ public static int getElo(int userID, String gameMode){
ResultSet rs = SQL.select("SELECT Elo FROM Elo WHERE UserID = ? AND GameMode = ?", userID, gameMode); return elo.select(rs -> {
int elo = 1000;
try {
if(rs.next()) if(rs.next())
elo = rs.getInt("Elo"); return rs.getInt("Elo");
} catch (SQLException e) { return 1000;
throw new SecurityException("Could not get Elo", e); }, userID, gameMode);
}
return elo;
} }
public static int getPlacement(int elo, String gameMode){ public static int getPlacement(int elo, String gameMode){
ResultSet rs = SQL.select("SELECT COUNT(*) AS Place FROM Elo WHERE GameMode = ? AND Elo > ?", gameMode, elo); return place.select(rs -> {
try{ if(rs.next())
if(!rs.next())
return -1;
return rs.getInt("Place"); return rs.getInt("Place");
}catch(SQLException e){ return -1;
throw new SecurityException("Could not get place", e); }, gameMode, elo);
}
} }
} }

Datei anzeigen

@ -19,17 +19,20 @@
package de.steamwar.bungeecore.sql; package de.steamwar.bungeecore.sql;
import de.steamwar.bungeecore.BungeeCore;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.time.Instant; import java.time.Instant;
import java.util.LinkedList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class Event { public class Event {
private static final Statement byCurrent = new Statement("SELECT * FROM Event WHERE Start < now() AND End > now()");
private static final Statement byId = new Statement("SELECT * FROM Event WHERE EventID = ?");
private static final Statement byName = new Statement("SELECT * FROM Event WHERE lower(EventName) = ?");
private static final Statement byComing = new Statement("SELECT * FROM Event WHERE Start > now()");
private final int eventID; private final int eventID;
private final String eventName; private final String eventName;
private final Timestamp start; private final Timestamp start;
@ -56,57 +59,39 @@ public class Event {
if(current != null && current.now()) if(current != null && current.now())
return current; return current;
ResultSet rs = SQL.select("SELECT * FROM Event WHERE Start < now() AND End > now()"); return byCurrent.select(rs -> {
try{ if(rs.next())
if(!rs.next()){
current = null;
return null;
}
current = new Event(rs); current = new Event(rs);
else
current = null;
return current; return current;
}catch (SQLException e){ });
BungeeCore.log("Failed to load current Event", e);
throw new SecurityException();
}
} }
public static Event get(int eventID){ public static Event get(int eventID){
ResultSet rs = SQL.select("SELECT * FROM Event WHERE EventID = " + eventID); return byId.select(rs -> {
try{
if(!rs.next()) if(!rs.next())
throw new IllegalArgumentException(); throw new SQLException("Couldn't find event " + eventID);
return new Event(rs); return new Event(rs);
}catch (SQLException e){ }, eventID);
BungeeCore.log("Failed to load Event", e);
throw new SecurityException();
}
} }
public static Event get(String eventName){ public static Event get(String eventName){
ResultSet rs = SQL.select("SELECT * FROM Event WHERE lower(EventName) = ?", eventName.toLowerCase()); return byName.select(rs -> {
try{
if(!rs.next()) if(!rs.next())
return null; return null;
return new Event(rs); return new Event(rs);
}catch (SQLException e){ }, eventName.toLowerCase());
BungeeCore.log("Failed to load Event by name", e);
throw new SecurityException();
}
} }
public static List<Event> getComing(){ public static List<Event> getComing(){
List<Event> events = new LinkedList<>(); return byComing.select(rs -> {
ResultSet rs = SQL.select("SELECT * FROM Event WHERE Start > now()"); List<Event> events = new ArrayList<>();
try{
while(rs.next()) while(rs.next())
events.add(new Event(rs)); events.add(new Event(rs));
}catch (SQLException e){
BungeeCore.log("Failed to load Events", e);
}
return events; return events;
});
} }
private boolean now(){ private boolean now(){

Datei anzeigen

@ -20,7 +20,6 @@
package de.steamwar.bungeecore.sql; package de.steamwar.bungeecore.sql;
import de.steamwar.bungeecore.ArenaMode; import de.steamwar.bungeecore.ArenaMode;
import de.steamwar.bungeecore.BungeeCore;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
@ -31,7 +30,11 @@ import static java.time.temporal.ChronoUnit.SECONDS;
public class EventFight implements Comparable<EventFight> { public class EventFight implements Comparable<EventFight> {
private static Queue<EventFight> fights = new PriorityQueue<>(); private static final Statement reschedule = new Statement("UPDATE EventFight SET StartTime = ? WHERE EventID = ? AND FightID = ?");
private static final Statement allComing = new Statement("SELECT * FROM EventFight WHERE StartTime > now() ORDER BY `StartTime` ASC");
private static final Statement event = new Statement("SELECT * FROM EventFight WHERE EventID = ? ORDER BY `StartTime` ASC");
private static final Queue<EventFight> fights = new PriorityQueue<>();
private final int eventID; private final int eventID;
private final int fightID; private final int fightID;
@ -57,31 +60,26 @@ public class EventFight implements Comparable<EventFight> {
public void reschedule(){ public void reschedule(){
startTime = Timestamp.from(new Date().toInstant().plus(30, SECONDS)); startTime = Timestamp.from(new Date().toInstant().plus(30, SECONDS));
SQL.update("UPDATE EventFight SET StartTime = ? WHERE EventID = ? AND FightID = ?", startTime, eventID, fightID); reschedule.update(startTime, eventID, fightID);
} }
public static void loadAllComingFights(){ public static void loadAllComingFights(){
ResultSet rs = SQL.select("SELECT * FROM EventFight WHERE StartTime > now() ORDER BY `StartTime` ASC"); allComing.select(rs -> {
fights.clear(); fights.clear();
try{
while(rs.next()){ while(rs.next()){
fights.add(new EventFight(rs)); fights.add(new EventFight(rs));
} }
}catch (SQLException e){ return null;
BungeeCore.log("Failed to load EventFights", e); });
}
} }
public static List<EventFight> getEvent(int eventID){ public static List<EventFight> getEvent(int eventID){
ResultSet rs = SQL.select("SELECT * FROM EventFight WHERE EventID = ? ORDER BY `StartTime` ASC", eventID); return event.select(rs -> {
List<EventFight> fights = new LinkedList<>(); List<EventFight> fights = new LinkedList<>();
try{
while(rs.next()) while(rs.next())
fights.add(new EventFight(rs)); fights.add(new EventFight(rs));
}catch (SQLException e){
BungeeCore.log("Failed to load EventFights", e);
}
return fights; return fights;
}, eventID);
} }
public static Queue<EventFight> getFights() { public static Queue<EventFight> getFights() {

Datei anzeigen

@ -22,9 +22,13 @@ package de.steamwar.bungeecore.sql;
import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException;
public class IgnoreSystem{ public class IgnoreSystem{
private static final Statement select = new Statement("SELECT * FROM IgnoredPlayers WHERE Ignorer = ? AND Ignored = ?");
private static final Statement insert = new Statement("INSERT INTO IgnoredPlayers (Ignorer, Ignored) VALUES (?, ?)");
private static final Statement delete = new Statement("DELETE FROM IgnoredPlayers WHERE Ignorer = ? AND Ignored = ?");
private IgnoreSystem(){} private IgnoreSystem(){}
public static boolean isIgnored(ProxiedPlayer ignorer, ProxiedPlayer ignored){ public static boolean isIgnored(ProxiedPlayer ignorer, ProxiedPlayer ignored){
@ -34,22 +38,14 @@ public class IgnoreSystem{
} }
public static boolean isIgnored(SteamwarUser ignorer, SteamwarUser ignored) { public static boolean isIgnored(SteamwarUser ignorer, SteamwarUser ignored) {
try { return select.select(ResultSet::next, ignorer.getId(), ignored.getId());
ResultSet rs = SQL.select("SELECT COUNT(*) AS blocked FROM IgnoredPlayers WHERE Ignorer = ? AND Ignored = ?", ignorer.getId(), ignored.getId());
if(!rs.next())
return false;
return rs.getInt("blocked") > 0;
} catch (SQLException e) {
throw new SecurityException("Could not check if ignored", e);
}
} }
public static void ignore(SteamwarUser ignorer, SteamwarUser ignored) { public static void ignore(SteamwarUser ignorer, SteamwarUser ignored) {
SQL.update("INSERT INTO IgnoredPlayers (Ignorer, Ignored) VALUES (?, ?)", ignorer.getId(), ignored.getId()); insert.update(ignorer.getId(), ignored.getId());
} }
public static void unIgnore(SteamwarUser ignorer, SteamwarUser ignored) { public static void unIgnore(SteamwarUser ignorer, SteamwarUser ignored) {
SQL.update("DELETE FROM IgnoredPlayers WHERE Ignorer = ? AND Ignored = ?", ignorer.getId(), ignored.getId()); delete.update(ignorer.getId(), ignored.getId());
} }
} }

Datei anzeigen

@ -19,12 +19,11 @@
package de.steamwar.bungeecore.sql; package de.steamwar.bungeecore.sql;
import de.steamwar.bungeecore.BungeeCore;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Mod { public class Mod {
private static final Statement get = new Statement("SELECT * FROM Mods WHERE ModName = ? AND Platform = ?");
private static final Statement insert = new Statement("INSERT INTO Mods (ModName, Platform) VALUES (?, ?)");
private final String modName; private final String modName;
private final Platform platform; private final Platform platform;
private final ModType modType; private final ModType modType;
@ -36,15 +35,15 @@ public class Mod {
} }
public static Mod get(String modName, Platform platform){ public static Mod get(String modName, Platform platform){
ResultSet rs = SQL.select("SELECT * FROM Mods WHERE ModName = ? AND Platform = ?", modName, platform.value); Mod mod = get.select(rs -> {
try{
if(rs.next()) if(rs.next())
return new Mod(modName, platform, ModType.valueOf(rs.getInt("ModType"))); return new Mod(modName, platform, ModType.valueOf(rs.getInt("ModType")));
}catch (SQLException e){ return null;
BungeeCore.log("Failed to load Mod", e); }, modName, platform.value);
throw new SecurityException(); if(mod != null)
} return mod;
SQL.update("INSERT INTO Mods (ModName, Platform) VALUES (?, ?)", modName, platform.value);
insert.update(modName, platform.value);
return new Mod(modName, platform, ModType.UNKLASSIFIED); return new Mod(modName, platform, ModType.UNKLASSIFIED);
} }

Datei anzeigen

@ -19,7 +19,6 @@
package de.steamwar.bungeecore.sql; package de.steamwar.bungeecore.sql;
import de.steamwar.bungeecore.BungeeCore;
import de.steamwar.bungeecore.listeners.PollSystem; import de.steamwar.bungeecore.listeners.PollSystem;
import java.sql.ResultSet; import java.sql.ResultSet;
@ -29,6 +28,10 @@ import java.util.Map;
public class PollAnswer { public class PollAnswer {
private static final Statement get = new Statement("SELECT * FROM PollAnswer WHERE UserID = ? AND Question = ?");
private static final Statement getResults = new Statement("SELECT Count(UserID) AS Times, Answer FROM PollAnswer WHERE Question = ? GROUP BY Answer ORDER BY `Times` ASC");
private static final Statement insert = new Statement("INSERT INTO PollAnswer (UserID, Question, Answer) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE Answer = VALUES(Answer)");
private final int userID; private final int userID;
private final String question; private final String question;
private int answer; private int answer;
@ -44,38 +47,20 @@ public class PollAnswer {
} }
public static PollAnswer get(int userID){ public static PollAnswer get(int userID){
ResultSet rs = SQL.select("SELECT * FROM PollAnswer WHERE UserID = ? AND Question = ?", userID, PollSystem.getQuestion()); return get.select(rs -> {
try { if(rs.next())
if(!rs.next())
return new PollAnswer(userID, PollSystem.getQuestion());
return new PollAnswer(rs); return new PollAnswer(rs);
} catch (SQLException e) { return new PollAnswer(userID, PollSystem.getQuestion());
throw new SecurityException("Unable to get PollAnswer", e); }, userID, PollSystem.getQuestion());
}
} }
public static Map<String, Integer> getCurrentResults() { public static Map<String, Integer> getCurrentResults() {
ResultSet set = SQL.select("SELECT Count(UserID) AS Times, Answer FROM PollAnswer WHERE Question = ? GROUP BY Answer ORDER BY `Times` ASC", PollSystem.getQuestion()); return getResults.select(rs -> {
try {
Map<String, Integer> retMap = new HashMap<>(); Map<String, Integer> retMap = new HashMap<>();
while (set.next()) { while (rs.next())
retMap.put(PollSystem.getAnswer(set.getInt("Answer")), set.getInt("Times")); retMap.put(PollSystem.getAnswer(rs.getInt("Answer")), rs.getInt("Times"));
}
return retMap; return retMap;
}catch (SQLException e) { }, PollSystem.getQuestion());
throw new SecurityException("Unable to get PollAnswer", e);
}
}
public static Integer getAllAnswered() {
ResultSet set = SQL.select("SELECT Count(UserID) AS Times FROM PollAnswer WHERE Question = ?", PollSystem.getQuestion());
try {
if(!set.next())
throw new SecurityException("Could not get PollAnswers");
return set.getInt("Times");
}catch (SQLException e) {
throw new SecurityException("Unable to get PollAnswer", e);
}
} }
public boolean hasAnswered(){ public boolean hasAnswered(){
@ -84,6 +69,6 @@ public class PollAnswer {
public void setAnswer(int answer){ public void setAnswer(int answer){
this.answer = answer; this.answer = answer;
SQL.update("INSERT INTO PollAnswer (UserID, Question, Answer) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE Answer = VALUES(Answer)", userID, question, answer); insert.update(userID, question, answer);
} }
} }

Datei anzeigen

@ -31,45 +31,40 @@ import java.util.*;
public class Punishment { public class Punishment {
private static final Statement getPunishment = new Statement("SELECT * FROM Punishments WHERE UserId = ? AND Type = ? ORDER BY PunishmentId DESC LIMIT 1");
private static final Statement getPunishments = new Statement("SELECT * FROM Punishments WHERE PunishmentId IN (SELECT MAX(PunishmentId) FROM Punishments WHERE UserId = ? GROUP BY Type)");
private static final Statement getAllPunishments = new Statement("SELECT * FROM Punishments WHERE UserId = ? ORDER BY `PunishmentId` DESC");
private static final Statement insert = new Statement("INSERT INTO Punishments (UserId, Punisher, Type, Reason, EndTime, Perma) VALUES (?, ?, ?, ?, ?, ?)");
private static final Statement update = new Statement("UPDATE Punishments SET EndTime = ?, Reason = ?, Perma = ? WHERE PunishmentId = ?");
public static Punishment getPunishmentOfPlayer(int user, PunishmentType type) { public static Punishment getPunishmentOfPlayer(int user, PunishmentType type) {
ResultSet set = SQL.select("SELECT * FROM Punishments WHERE UserId = ? AND Type = ? ORDER BY PunishmentId DESC LIMIT 1", user, type.name()); return getPunishment.select(rs -> {
try { if(rs.next())
if(!set.next()) return new Punishment(rs);
return null; return null;
return new Punishment(set); }, user, type.name());
} catch (SQLException e) {
throw new SecurityException("Could not Load Punishments", e);
}
} }
public static Map<PunishmentType, Punishment> getPunishmentsOfPlayer(int user) { public static Map<PunishmentType, Punishment> getPunishmentsOfPlayer(int user) {
ResultSet set = SQL.select("SELECT * FROM Punishments WHERE PunishmentId IN (SELECT MAX(PunishmentId) FROM Punishments WHERE UserId = ? GROUP BY Type)", user); return getPunishments.select(rs -> {
try {
Map<PunishmentType, Punishment> punishments = new HashMap<>(); Map<PunishmentType, Punishment> punishments = new HashMap<>();
while (set.next()) while (rs.next())
punishments.put(PunishmentType.valueOf(set.getString("Type")), new Punishment(set)); punishments.put(PunishmentType.valueOf(rs.getString("Type")), new Punishment(rs));
return punishments; return punishments;
} catch (SQLException e) { }, user);
throw new SecurityException("Could not Load Punishments", e);
}
} }
public static List<Punishment> getAllPunishmentsOfPlayer(int user) { public static List<Punishment> getAllPunishmentsOfPlayer(int user) {
ResultSet set = SQL.select("SELECT * FROM Punishments WHERE UserId = ? ORDER BY `PunishmentId` DESC", user); return getAllPunishments.select(rs -> {
try {
List<Punishment> punishments = new ArrayList<>(); List<Punishment> punishments = new ArrayList<>();
while (set.next()) { while (rs.next())
punishments.add(new Punishment(set)); punishments.add(new Punishment(rs));
}
return punishments; return punishments;
} catch (SQLException e) { }, user);
throw new SecurityException("Could not Load all Punishments", e);
}
} }
public static Punishment createPunishment(int user, int executor, PunishmentType type, String reason, Timestamp endTime, boolean perma) { public static Punishment createPunishment(int user, int executor, PunishmentType type, String reason, Timestamp endTime, boolean perma) {
SQL.update("INSERT INTO Punishments (UserId, Punisher, Type, Reason, EndTime, Perma) VALUES (?, ?, ?, ?, ?, ?)", insert.update(user, executor, type.name(), reason, endTime, perma);
user, executor, type.name(), reason, endTime, perma);
return getPunishmentOfPlayer(user, type); return getPunishmentOfPlayer(user, type);
} }
@ -122,7 +117,7 @@ public class Punishment {
} }
public void updateEndTime(int from, String newreason, Timestamp newUpdate, boolean perma) { public void updateEndTime(int from, String newreason, Timestamp newUpdate, boolean perma) {
if(newreason.equals(reason) && newUpdate.equals(endTime) && perma == perma) if(newreason.equals(reason) && newUpdate.equals(endTime) && this.perma == perma)
return; return;
ProxiedPlayer player = BungeeCore.get().getProxy().getPlayer(SteamwarUser.get(from).getUuid()); ProxiedPlayer player = BungeeCore.get().getProxy().getPlayer(SteamwarUser.get(from).getUuid());
String newReason = Message.parse("BAN_CHANGED", player, reason, String newReason = Message.parse("BAN_CHANGED", player, reason,
@ -131,7 +126,7 @@ public class Punishment {
getBantime(newUpdate, perma), getBantime(newUpdate, perma),
newreason); newreason);
SQL.update("UPDATE Punishments SET EndTime = ?, Reason = ?, Perma = ? WHERE PunishmentId = ?", newUpdate, newReason, perma, id); update.update(newUpdate, newReason, perma, id);
this.reason = newReason; this.reason = newReason;
this.perma = perma; this.perma = perma;
this.endTime = newUpdate; this.endTime = newUpdate;

Datei anzeigen

@ -1,95 +0,0 @@
/*
This file is a part of the SteamWar software.
Copyright (C) 2020 SteamWar.de-Serverteam
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.steamwar.bungeecore.sql;
import de.steamwar.bungeecore.BungeeCore;
import net.md_5.bungee.api.ProxyServer;
import java.sql.*;
public class SQL {
private SQL(){}
private static Connection con;
private static String url;
private static String user;
private static String password;
public static void connect(String url, String user, String password) {
SQL.url = url;
SQL.user = user;
SQL.password = password;
try {
con = DriverManager.getConnection(url + "?autoreconnect=true", user, password);
}catch (SQLException e) {
ProxyServer.getInstance().stop();
throw new SecurityException("Could not start SQL-Exception", e);
}
}
public static void close() {
try {
if(con != null)
con.close();
}catch (SQLException e) {
BungeeCore.log("Could not close SQL-Connection", e);
}
}
static void update(String qry, Object... objects) {
try {
prepare(con, qry, objects).executeUpdate();
} catch (SQLException e) {
sqlException();
try (PreparedStatement st = con.prepareStatement(qry)) {
st.executeUpdate();
} catch (SQLException ex) {
throw new SecurityException("Could not execute update statement", ex);
}
}
}
static ResultSet select(String qry, Object... objects){
try{
return prepare(con, qry, objects).executeQuery();
} catch (SQLException e) {
sqlException();
try {
return prepare(con, qry, objects).executeQuery();
} catch (SQLException ex) {
throw new SecurityException("Could not run Select-Statement", ex);
}
}
}
private static PreparedStatement prepare(Connection connection, String qry, Object... objects) throws SQLException{
PreparedStatement st = connection.prepareStatement(qry);
for(int i = 0; i < objects.length; i++){
st.setObject(i+1, objects[i]);
}
return st;
}
private static void sqlException(){
close();
connect(url, user, password);
}
}

Datei anzeigen

@ -22,7 +22,9 @@ package de.steamwar.bungeecore.sql;
public class SWException { public class SWException {
private SWException(){} private SWException(){}
private static final Statement insert = new Statement("INSERT INTO Exception (server, message, stacktrace) VALUES (?, ?, ?)");
public static void log(String server, String message, String stacktrace){ public static void log(String server, String message, String stacktrace){
SQL.update("INSERT INTO Exception (server, message, stacktrace) VALUES (?, ?, ?)", server, message, stacktrace); insert.update(server, message, stacktrace);
} }
} }

Datei anzeigen

@ -23,14 +23,22 @@ import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.UUID;
public class Schematic { public class Schematic {
private static final Statement schemByName = new Statement("SELECT SchemID, SchemName, SchemOwner, SchemType, Item FROM Schematic WHERE SchemName = ? AND SchemOwner = ?");
private static final Statement schemById = new Statement("SELECT SchemID, SchemName, SchemOwner, SchemType, Item FROM Schematic WHERE SchemID = ?");
private static final Statement schemsByType = new Statement("SELECT SchemID, SchemName, SchemOwner, SchemType, Item FROM Schematic WHERE SchemType = ?");
private static final Statement schemsByUserType = new Statement("SELECT SchemID, SchemName, SchemOwner, SchemType, Item FROM Schematic WHERE SchemType = ? AND SchemOwner = ?");
private static final Statement schemsOfUser = new Statement("SELECT SchemID, SchemName, SchemOwner, Item, SchemType, Rank, SchemFormat, Item FROM Schematic WHERE SchemOwner = ? ORDER BY SchemName");
private static final Statement updateType = new Statement("UPDATE Schematic SET SchemType = ? WHERE SchemID = ?");
private static final Statement updateRank = new Statement("UPDATE Schematic SET Rank = ? WHERE SchemID = ?");
private final int schemID; private final int schemID;
private final String schemName; private final String schemName;
private final int schemOwner; private final int schemOwner;
private SchematicType schemType; private SchematicType schemType;
private String schemItem; private final String schemItem;
private Schematic(ResultSet rs) throws SQLException { private Schematic(ResultSet rs) throws SQLException {
this.schemID = rs.getInt("SchemID"); this.schemID = rs.getInt("SchemID");
@ -40,74 +48,52 @@ public class Schematic {
this.schemItem = rs.getString("Item"); this.schemItem = rs.getString("Item");
} }
public static Schematic getSchemFromDB(String schemName, UUID schemOwner){
return getSchemFromDB(schemName, SteamwarUser.get(schemOwner).getId());
}
public static Schematic getSchemFromDB(String schemName, int schemOwner){ public static Schematic getSchemFromDB(String schemName, int schemOwner){
ResultSet schematic = SQL.select("SELECT SchemID, SchemName, SchemOwner, SchemType, Item FROM Schematic WHERE SchemName = ? AND SchemOwner = ?", schemName, schemOwner); return schemByName.select(rs -> {
try { if(!rs.next())
if(schematic == null || !schematic.next()){ return new Schematic(rs);
return null; return null;
} }, schemName, schemOwner);
return new Schematic(schematic);
} catch (SQLException e) {
throw new SecurityException("Failed loading schematic", e);
}
} }
public static Schematic getSchemFromDB(int schemID){ public static Schematic getSchemFromDB(int schemID){
ResultSet schematic = SQL.select("SELECT SchemID, SchemName, SchemOwner, SchemType, Item FROM Schematic WHERE SchemID = ?", schemID); return schemById.select(rs -> {
try { if(!rs.next())
if(!schematic.next())
throw new SecurityException("Failed loading schematic " + schemID); throw new SecurityException("Failed loading schematic " + schemID);
return new Schematic(schematic); return new Schematic(rs);
} catch (SQLException e) { }, schemID);
throw new SecurityException("Failed loading schematic", e);
}
} }
public static List<Schematic> getAllSchemsOfType(SchematicType schemType){ public static List<Schematic> getAllSchemsOfType(SchematicType schemType){
try{ return schemsByType.select(rs -> {
ResultSet schematic = SQL.select("SELECT SchemID, SchemName, SchemOwner, SchemType, Item FROM Schematic WHERE SchemType = ?", schemType.toDB());
List<Schematic> schematics = new ArrayList<>(); List<Schematic> schematics = new ArrayList<>();
while(schematic.next()){ while(rs.next())
schematics.add(new Schematic(schematic)); schematics.add(new Schematic(rs));
}
return schematics; return schematics;
}catch(SQLException e){ }, schemType.toDB());
throw new SecurityException("Failed loading all schems of type", e);
}
} }
public static List<Schematic> getSchemsOfType(int userId, SchematicType schemType){ public static List<Schematic> getSchemsOfType(int userId, SchematicType schemType){
try{ return schemsByUserType.select(rs -> {
ResultSet schematic = SQL.select("SELECT SchemID, SchemName, SchemOwner, SchemType, Item FROM Schematic WHERE SchemType = ? AND SchemOwner = ?", schemType.toDB(), userId);
List<Schematic> schematics = new ArrayList<>(); List<Schematic> schematics = new ArrayList<>();
while(schematic.next()){ while(rs.next())
schematics.add(new Schematic(schematic)); schematics.add(new Schematic(rs));
}
return schematics; return schematics;
}catch(SQLException e){ }, schemType.toDB(), userId);
throw new SecurityException("Failed loading schems of type", e);
}
} }
public static List<Schematic> getSchemsAccessibleByUser(int schemOwner){ public static List<Schematic> getSchemsAccessibleByUser(int schemOwner){
try{ return schemsOfUser.select(rs -> {
ResultSet schematic = SQL.select("SELECT SchemID, SchemName, SchemOwner, Item, SchemType, Rank, SchemFormat, Item FROM Schematic WHERE SchemOwner = ? ORDER BY SchemName", schemOwner);
List<Schematic> schematics = new ArrayList<>(); List<Schematic> schematics = new ArrayList<>();
while(schematic.next()){ while(rs.next()){
schematics.add(new Schematic(schematic)); schematics.add(new Schematic(rs));
} }
List<SchematicMember> addedSchems = SchematicMember.getAccessibleSchems(schemOwner); List<SchematicMember> addedSchems = SchematicMember.getAccessibleSchems(schemOwner);
for(SchematicMember schem : addedSchems){ for(SchematicMember schem : addedSchems){
schematics.add(getSchemFromDB(schem.getSchemName(), schem.getSchemOwner())); schematics.add(getSchemFromDB(schem.getSchemName(), schem.getSchemOwner()));
} }
return schematics; return schematics;
}catch(SQLException e){ }, schemOwner);
throw new SecurityException("Failed listing schematics", e);
}
} }
public int getSchemID() { public int getSchemID() {
@ -132,10 +118,10 @@ public class Schematic {
public void setSchemType(SchematicType schemType) { public void setSchemType(SchematicType schemType) {
this.schemType = schemType; this.schemType = schemType;
SQL.update("UPDATE Schematic SET SchemType = ? WHERE SchemID = ?", schemType.toDB(), schemID); updateType.update(schemType.toDB(), schemID);
} }
public void setRank(int rank) { public void setRank(int rank) {
SQL.update("UPDATE Schematic SET Rank = ? WHERE SchemID = ?", rank, schemID); updateRank.update(rank, schemID);
} }
} }

Datei anzeigen

@ -19,13 +19,15 @@
package de.steamwar.bungeecore.sql; package de.steamwar.bungeecore.sql;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.UUID;
public class SchematicMember { public class SchematicMember {
private static final Statement insert = new Statement("INSERT INTO SchemMember (SchemName, SchemOwner, Member) VALUES (?, ?, ?)");
private static final Statement selectSchems = new Statement("SELECT * FROM SchemMember WHERE Member = ?");
private static final Statement delete = new Statement("DELETE FROM SchemMember WHERE SchemOwner = ? AND SchemName = ? AND Member = ?");
private final int schemOwner; private final int schemOwner;
private final String schemName; private final String schemName;
private final int member; private final int member;
@ -38,82 +40,17 @@ public class SchematicMember {
updateDB(); updateDB();
} }
public SchematicMember(String schemName, int schemOwner, int schemMember){
this(schemName, schemOwner, schemMember, true);
}
public SchematicMember(String schemName, UUID schemOwner, UUID schemMember){
this(schemName, SteamwarUser.get(schemOwner).getId(), SteamwarUser.get(schemMember).getId(), true);
}
private void updateDB(){ private void updateDB(){
SQL.update("INSERT INTO SchemMember (SchemName, SchemOwner, Member) VALUES (?, ?, ?)", schemName, schemOwner, member); insert.update(schemName, schemOwner, member);
}
public static SchematicMember getSchemMemberFromDB(String schemName, UUID schemOwner, UUID schemMember){
return getSchemMemberFromDB(schemName, SteamwarUser.get(schemOwner).getId(), SteamwarUser.get(schemMember).getId());
}
public static SchematicMember getSchemMemberFromDB(String schemName, int schemOwner, int schemMember){
ResultSet schematicMember = SQL.select("SELECT * FROM SchemMember WHERE SchemName = ? AND SchemOwner = ? AND Member = ?", schemName, schemOwner, schemMember);
try {
if(schematicMember == null || !schematicMember.next()){
return null;
}
return new SchematicMember(schemName, schemOwner, schemMember, false);
} catch (SQLException e) {
throw new SecurityException("Could not get schemmember", e);
}
}
public static SchematicMember getMemberBySchematic(String schemName, int schemMember){
ResultSet schematicMember = SQL.select("SELECT * FROM SchemMember WHERE SchemName = ? AND Member = ?", schemName, schemMember);
try {
if(schematicMember == null || !schematicMember.next()){
return null;
}
int schemOwner = schematicMember.getInt("SchemOwner");
return new SchematicMember(schemName, schemOwner, schemMember, false);
} catch (SQLException e) {
throw new SecurityException("Could not get member", e);
}
}
public static List<SchematicMember> getSchemMembers(String schemName, UUID schemOwner){
return getSchemMembers(schemName, SteamwarUser.get(schemOwner).getId());
}
public static List<SchematicMember> getSchemMembers(String schemName, int schemOwner){
ResultSet schematicMember = SQL.select("SELECT * FROM SchemMember WHERE SchemName = ? AND SchemOwner = ?", schemName, schemOwner);
try {
List<SchematicMember> schematicMembers = new ArrayList<>();
while(schematicMember.next()){
int schemMember = schematicMember.getInt("Member");
schematicMembers.add(new SchematicMember(schemName, schemOwner, schemMember, false));
}
return schematicMembers;
} catch (SQLException e) {
throw new SecurityException("Could not get schemmembers", e);
}
}
public static List<SchematicMember> getAccessibleSchems(UUID schemMember){
return getAccessibleSchems(SteamwarUser.get(schemMember).getId());
} }
public static List<SchematicMember> getAccessibleSchems(int schemMember){ public static List<SchematicMember> getAccessibleSchems(int schemMember){
ResultSet schematicMember = SQL.select("SELECT * FROM SchemMember WHERE Member = ?", schemMember); return selectSchems.select(rs -> {
try {
List<SchematicMember> schematicMembers = new ArrayList<>(); List<SchematicMember> schematicMembers = new ArrayList<>();
while(schematicMember.next()){ while(rs.next())
String schemName = schematicMember.getString("SchemName"); schematicMembers.add(new SchematicMember(rs.getString("SchemName"), rs.getInt("SchemOwner"), schemMember, false));
int schemOwner = schematicMember.getInt("SchemOwner");
schematicMembers.add(new SchematicMember(schemName, schemOwner, schemMember, false));
}
return schematicMembers; return schematicMembers;
} catch (SQLException e) { }, schemMember);
throw new SecurityException("Could not get accessible schems", e);
}
} }
public int getSchemOwner() { public int getSchemOwner() {
@ -129,6 +66,6 @@ public class SchematicMember {
} }
public void remove(){ public void remove(){
SQL.update("DELETE FROM SchemMember WHERE SchemOwner = ? AND SchemName = ? AND Member = ?", schemOwner, schemName, member); delete.update(schemOwner, schemName, member);
} }
} }

Datei anzeigen

@ -22,9 +22,12 @@ package de.steamwar.bungeecore.sql;
import java.sql.Timestamp; import java.sql.Timestamp;
public class Session { public class Session {
private static final Statement insert = new Statement("INSERT INTO Session (UserID, StartTime, EndTime) VALUES (?, ?, NOW())");
private Session(){} private Session(){}
public static void insertSession(int userID, Timestamp startTime){ public static void insertSession(int userID, Timestamp startTime){
SQL.update("INSERT INTO Session (UserID, StartTime, EndTime) VALUES (?, ?, NOW())", userID, startTime); insert.update(userID, startTime);
} }
} }

Datei anzeigen

@ -0,0 +1,137 @@
/*
This file is a part of the SteamWar software.
Copyright (C) 2020 SteamWar.de-Serverteam
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.steamwar.bungeecore.sql;
import de.steamwar.bungeecore.BungeeCore;
import net.md_5.bungee.api.ProxyServer;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
public class Statement {
private static final List<Statement> statements = new ArrayList<>();
private static Connection con;
private static String url;
private static String user;
private static String password;
public static void connect(String url, String user, String password) {
Statement.url = url;
Statement.user = user;
Statement.password = password;
try {
con = DriverManager.getConnection(url + "?autoreconnect=true", user, password);
} catch (SQLException e) {
ProxyServer.getInstance().stop();
throw new SecurityException("Could not start SQL-Connection", e);
}
}
private static void reset(SQLException e) {
BungeeCore.get().getLogger().log(Level.WARNING, "SQL Exception thrown", e);
close();
connect(url, user, password);
try {
for (Statement statement : statements) {
statement.init();
}
} catch (SQLException ex) {
throw new SecurityException("Could not reprepare SQL Statements", ex);
}
}
public static void close() {
for (Statement statement : statements) {
try {
statement.st.close();
} catch (SQLException e) {
BungeeCore.get().getLogger().log(Level.INFO, "Could not close statement", e);
}
}
try {
con.close();
} catch (SQLException e) {
BungeeCore.log("Could not close SQL-Connection", e);
}
}
private final String sql;
private PreparedStatement st;
Statement(String sql) {
this.sql = sql;
statements.add(this);
try {
init();
} catch (SQLException e) {
reset(e);
}
}
private synchronized void init() throws SQLException {
st = con.prepareStatement(sql);
}
<T> T select(ResultSetUser<T> user, Object... objects) {
return prepare(() -> {
ResultSet rs = st.executeQuery();
T result = user.use(rs);
rs.close();
return result;
}, objects);
}
void update(Object... objects) {
prepare(st::executeUpdate, objects);
}
private synchronized <T> T prepare(SQLRunnable<T> runnable, Object... objects) {
try {
setObjects(objects);
return runnable.run();
} catch (SQLException e) {
reset(e);
try {
setObjects(objects);
return runnable.run();
} catch (SQLException ex) {
throw new SecurityException("Could not execute SQL statement", ex);
}
}
}
private void setObjects(Object... objects) throws SQLException {
for (int i = 0; i < objects.length; i++) {
st.setObject(i + 1, objects[i]);
}
}
interface ResultSetUser<T> {
T use(ResultSet rs) throws SQLException;
}
private interface SQLRunnable<T> {
T run() throws SQLException;
}
}

Datei anzeigen

@ -31,26 +31,34 @@ import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.io.IOException; import java.io.IOException;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.*; import java.util.HashMap;
import java.util.stream.Collectors; import java.util.Map;
import java.util.Scanner;
import java.util.UUID;
import java.util.logging.Level;
public class SteamwarUser { public class SteamwarUser {
private final int id;
private final UUID uuid; private static final Statement updateName = new Statement("UPDATE UserData SET UserName = ? WHERE id = ?");
private String userName; private static final Statement updateBedrock = new Statement("UPDATE UserData SET Bedrock = ? WHERE id = ?");
private UserGroup userGroup; private static final Statement insert = new Statement("INSERT INTO UserData (UUID, UserName, UserGroup) VALUES (?, ?, 'Member')");
private int team; private static final Statement byUUID = new Statement("SELECT * FROM UserData WHERE UUID = ?");
private boolean leader; private static final Statement byName = new Statement("SELECT * FROM UserData WHERE lower(UserName) = ?");
private Map<Punishment.PunishmentType, Punishment> punishments; private static final Statement byID = new Statement("SELECT * FROM UserData WHERE id = ?");
private String discordId; private static final Statement byDiscord = new Statement("SELECT * FROM UserData WHERE DiscordId = ?");
private static final Statement updateTeam = new Statement("Update UserData SET Team = ? WHERE id = ?");
private static final Statement updateDiscord = new Statement("Update UserData SET DiscordId = ? WHERE id = ?");
private static final Statement deleteIPs = new Statement("DELETE FROM BannedUserIPs WHERE UserID = ?");
private static final Statement updateLeader = new Statement("Update UserData SET Leader = ? WHERE id = ?");
private static final Statement getPlaytime = new Statement("SELECT SUM(UNIX_TIMESTAMP(EndTime) - UNIX_TIMESTAMP(StartTime)) as Playtime FROM Session WHERE UserID = ?");
private static final Statement getFirstjoin = new Statement("SELECT MIN(StartTime) AS FirstJoin FROM Session WHERE UserID = ?");
private static final Map<String, SteamwarUser> usersByName = new HashMap<>(); private static final Map<String, SteamwarUser> usersByName = new HashMap<>();
private static final Map<UUID, SteamwarUser> usersByUUID = new HashMap<>(); private static final Map<UUID, SteamwarUser> usersByUUID = new HashMap<>();
@ -60,6 +68,15 @@ public class SteamwarUser {
private static final String API_URL = "https://api.mojang.com/users/profiles/minecraft/"; private static final String API_URL = "https://api.mojang.com/users/profiles/minecraft/";
private static final JsonParser jsonParser = new JsonParser(); private static final JsonParser jsonParser = new JsonParser();
private final int id;
private final UUID uuid;
private String userName;
private final UserGroup userGroup;
private int team;
private boolean leader;
private final Map<Punishment.PunishmentType, Punishment> punishments;
private String discordId;
static { static {
try { try {
LIXFEL_DE = InetAddress.getByAddress(new byte[]{(byte) 195, (byte) 201, (byte) 242, 43}); LIXFEL_DE = InetAddress.getByAddress(new byte[]{(byte) 195, (byte) 201, (byte) 242, 43});
@ -91,7 +108,7 @@ public class SteamwarUser {
if(user != null){ if(user != null){
String userName = connection.getName(); String userName = connection.getName();
if(!user.userName.equals(userName)){ if(!user.userName.equals(userName)){
SQL.update("UPDATE UserData SET UserName = ? WHERE id = ?", userName, user.id); updateName.update(userName, user.id);
WebregisterCommand.changeUsername(user.userName, userName); WebregisterCommand.changeUsername(user.userName, userName);
user.userName = userName; user.userName = userName;
} }
@ -103,7 +120,7 @@ public class SteamwarUser {
} }
boolean bedrock = connection.getAddress().getAddress().equals(LIXFEL_DE); boolean bedrock = connection.getAddress().getAddress().equals(LIXFEL_DE);
SQL.update("UPDATE UserData SET Bedrock = ? WHERE id = ?", bedrock, user.id); updateBedrock.update(bedrock, user.id);
return user; return user;
} }
@ -113,7 +130,7 @@ public class SteamwarUser {
return user; return user;
} }
UUID uuid = SteamwarUser.loadUUID(name); UUID uuid = SteamwarUser.getUUIDofOfflinePlayer(name);
if (uuid == null) { if (uuid == null) {
return null; return null;
} }
@ -122,21 +139,29 @@ public class SteamwarUser {
} }
private static SteamwarUser createUserInDatabase(UUID uuid, String name) { private static SteamwarUser createUserInDatabase(UUID uuid, String name) {
SQL.update("INSERT INTO UserData (UUID, UserName, UserGroup) VALUES (?, ?, 'Member')", uuid.toString(), name); insert.update(uuid.toString(), name);
return dbInit(SQL.select("SELECT * FROM UserData WHERE UUID = ?", uuid.toString())); return get(uuid);
} }
public static SteamwarUser get(String userName){ public static SteamwarUser get(String userName){
userName = userName.toLowerCase(); userName = userName.toLowerCase();
if(usersByName.containsKey(userName)) if(usersByName.containsKey(userName))
return usersByName.get(userName); return usersByName.get(userName);
return dbInit(SQL.select("SELECT * FROM UserData WHERE lower(UserName) = ?", userName)); return byName.select(rs -> {
if(rs.next())
return new SteamwarUser(rs);
return null;
}, userName);
} }
public static SteamwarUser get(UUID uuid){ public static SteamwarUser get(UUID uuid){
if(usersByUUID.containsKey(uuid)) if(usersByUUID.containsKey(uuid))
return usersByUUID.get(uuid); return usersByUUID.get(uuid);
return dbInit(SQL.select("SELECT * FROM UserData WHERE UUID = ?", uuid.toString())); return byUUID.select(rs -> {
if(rs.next())
return new SteamwarUser(rs);
return null;
}, uuid.toString());
} }
public static SteamwarUser get(ProxiedPlayer player){ public static SteamwarUser get(ProxiedPlayer player){
@ -146,7 +171,10 @@ public class SteamwarUser {
public static SteamwarUser get(int id){ public static SteamwarUser get(int id){
if(usersById.containsKey(id)) if(usersById.containsKey(id))
return usersById.get(id); return usersById.get(id);
return dbInit(SQL.select("SELECT * FROM UserData WHERE id = ?", id)); return byID.select(rs -> {
rs.next();
return new SteamwarUser(rs);
}, id);
} }
public static void batchCache(Set<Integer> ids) { public static void batchCache(Set<Integer> ids) {
@ -163,7 +191,11 @@ public class SteamwarUser {
public static SteamwarUser get(Long discordId) { public static SteamwarUser get(Long discordId) {
if(usersByDiscord.containsKey(discordId.toString())) if(usersByDiscord.containsKey(discordId.toString()))
return usersByDiscord.get(discordId.toString()); return usersByDiscord.get(discordId.toString());
return dbInit(SQL.select("SELECT * FROM UserData WHERE DiscordId = ?", discordId)); return byDiscord.select(rs -> {
if(rs.next())
return new SteamwarUser(rs);
return null;
}, discordId);
} }
public static void clearCache(){ public static void clearCache(){
@ -173,25 +205,20 @@ public class SteamwarUser {
usersByDiscord.clear(); usersByDiscord.clear();
} }
public static UUID loadUUID(String playerName) { private static UUID getUUIDofOfflinePlayer(String playerName) {
try { try {
final URL url = new URL(API_URL + playerName); final URL url = new URL(API_URL + playerName);
return getUniqueIdFromString(jsonParser.parse(new Scanner(url.openConnection().getInputStream()).nextLine()).getAsJsonObject().get("id").getAsString()); String uuid = jsonParser.parse(new Scanner(url.openConnection().getInputStream()).nextLine()).getAsJsonObject().get("id").getAsString();
} catch (MalformedURLException e) { return UUID.fromString(uuid.replaceFirst("(\\w{8})(\\w{4})(\\w{4})(\\w{4})(\\w{12})", "$1-$2-$3-$4-$5"));
e.printStackTrace();
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); BungeeCore.get().getLogger().log(Level.SEVERE, "Could not get offline player UUID", e);
}
return null; return null;
} }
private static UUID getUniqueIdFromString(String uuid) {
return UUID.fromString(uuid.replaceFirst("(\\w{8})(\\w{4})(\\w{4})(\\w{4})(\\w{12})", "$1-$2-$3-$4-$5"));
} }
public void setTeam(int team){ public void setTeam(int team){
this.team = team; this.team = team;
SQL.update("Update UserData SET Team = ? WHERE id = ?", team, id); updateTeam.update(team, id);
setLeader(false); setLeader(false);
} }
@ -226,7 +253,7 @@ public class SteamwarUser {
public void setDiscordId(String discordId) { public void setDiscordId(String discordId) {
usersByDiscord.remove(this.discordId); usersByDiscord.remove(this.discordId);
this.discordId = discordId; this.discordId = discordId;
SQL.update("Update UserData SET DiscordId = ? WHERE id = ?", discordId, id); updateDiscord.update(discordId, id);
if(discordId != null) { if(discordId != null) {
usersByDiscord.put(discordId, this); usersByDiscord.put(discordId, this);
} }
@ -236,7 +263,7 @@ public class SteamwarUser {
if(!punishments.containsKey(Punishment.PunishmentType.Ban)) if(!punishments.containsKey(Punishment.PunishmentType.Ban))
return false; return false;
if(!punishments.get(Punishment.PunishmentType.Ban).isCurrent()) { if(!punishments.get(Punishment.PunishmentType.Ban).isCurrent()) {
SQL.update("DELETE FROM BannedUserIPs WHERE UserID = ?", id); deleteIPs.update(id);
punishments.remove(Punishment.PunishmentType.Ban); punishments.remove(Punishment.PunishmentType.Ban);
return false; return false;
} }
@ -307,38 +334,20 @@ public class SteamwarUser {
punishments.put(Punishment.PunishmentType.Mute, Punishment.createPunishment(id, from, Punishment.PunishmentType.Mute, muteReason, time, perma)); punishments.put(Punishment.PunishmentType.Mute, Punishment.createPunishment(id, from, Punishment.PunishmentType.Mute, muteReason, time, perma));
} }
private static SteamwarUser dbInit(ResultSet rs){
try {
if(!rs.next())
return null;
return new SteamwarUser(rs);
} catch (SQLException e) {
throw new SecurityException(e);
}
}
public double getOnlinetime() { public double getOnlinetime() {
ResultSet set = SQL.select("SELECT SUM(UNIX_TIMESTAMP(EndTime) - UNIX_TIMESTAMP(StartTime)) as Playtime FROM Session WHERE UserID = ?", id); return getPlaytime.select(rs -> {
try { if(rs.next())
if(!set.next()) return rs.getBigDecimal("Playtime").doubleValue();
return 0; return 0.0;
return set.getBigDecimal("Playtime").doubleValue(); }, id);
} catch (SQLException throwables) {
throw new SecurityException("Could not load Online Time", throwables);
} catch (NullPointerException e) { //When no Sessions are recorded
return 0;
}
} }
public Timestamp getFirstjoin() { public Timestamp getFirstjoin() {
ResultSet set = SQL.select("SELECT MIN(StartTime) AS FirstJoin FROM Session WHERE UserID = ?", id); return getFirstjoin.select(rs -> {
try { if(rs.next())
if(!set.next()) return rs.getTimestamp("FirstJoin");
return null; return null;
return set.getTimestamp("FirstJoin"); }, id);
} catch (SQLException throwables) {
throw new SecurityException("Could not load First Join");
}
} }
public boolean isLeader() { public boolean isLeader() {
@ -347,6 +356,6 @@ public class SteamwarUser {
public void setLeader(boolean leader) { public void setLeader(boolean leader) {
this.leader = leader; this.leader = leader;
SQL.update("Update UserData SET Leader = ? WHERE id = ?", leader, id); updateLeader.update(leader, id);
} }
} }

Datei anzeigen

@ -19,25 +19,31 @@
package de.steamwar.bungeecore.sql; package de.steamwar.bungeecore.sql;
import de.steamwar.bungeecore.BungeeCore;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import static de.steamwar.bungeecore.sql.SQL.select;
public class Team { public class Team {
private static final Statement insert = new Statement("INSERT INTO Team (TeamKuerzel, TeamName) VALUES (?, ?)");
private static final Statement delete = new Statement("UPDATE Team SET TeamDeleted = 1 WHERE TeamID = ?");
private static final Statement update = new Statement("INSERT INTO Team (TeamID, TeamKuerzel, TeamName, TeamColor) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE TeamName = VALUES(TeamName), TeamKuerzel = VALUES(TeamKuerzel), TeamColor = VALUES(TeamColor)");
private static final Statement getSize = new Statement("SELECT COUNT(id) FROM UserData WHERE Team = ?");
private static final Statement getMembers = new Statement("SELECT id FROM UserData WHERE Team = ?");
private static final Statement byId = new Statement("SELECT * FROM Team WHERE TeamID = ?");
private static final Statement byName = new Statement("SELECT * FROM Team WHERE (lower(TeamName) = ? OR lower(TeamKuerzel) = ?) AND NOT TeamDeleted");
private static final Statement all = new Statement("SELECT * FROM Team WHERE NOT TeamDeleted");
private static final List<Team> teamCache = new LinkedList<>();
private static final Team pub = new Team(0, "PUB", "Öffentlich", "8");
private final int teamId; private final int teamId;
private String teamKuerzel; private String teamKuerzel;
private String teamName; private String teamName;
private String teamColor; private String teamColor;
private static final List<Team> teamCache = new LinkedList<>();
private static final Team pub = new Team(0, "PUB", "Öffentlich", "8");
private Team(int id, String kuerzel, String name, String color){ private Team(int id, String kuerzel, String name, String color){
teamId = id; teamId = id;
teamKuerzel = kuerzel; teamKuerzel = kuerzel;
@ -52,8 +58,8 @@ public class Team {
this(rs.getInt("TeamID"), rs.getString("TeamKuerzel"), rs.getString("TeamName"), rs.getString("TeamColor")); this(rs.getInt("TeamID"), rs.getString("TeamKuerzel"), rs.getString("TeamName"), rs.getString("TeamColor"));
} }
public static void create(String kuerzel, String name, SteamwarUser user){ public static void create(String kuerzel, String name){
SQL.update("INSERT INTO Team (TeamKuerzel, TeamName) VALUES (?, ?)", kuerzel, name); insert.update(kuerzel, name);
} }
public static Team get(int id){ public static Team get(int id){
@ -64,51 +70,38 @@ public class Team {
for(Team team : teamCache) for(Team team : teamCache)
if(team.teamId == id) if(team.teamId == id)
return team; return team;
return load(select("SELECT * FROM Team WHERE TeamID = ?", id)); return byId.select(rs -> {
rs.next();
return new Team(rs);
}, id);
} }
public static Team get(String name){ public static Team get(String name){
for(Team team : teamCache) for(Team team : teamCache)
if(team.teamName.equalsIgnoreCase(name)) if(team.teamName.equalsIgnoreCase(name) || team.teamKuerzel.equalsIgnoreCase(name))
return team; return team;
for(Team team : teamCache) return byName.select(rs -> {
if(team.teamKuerzel.equalsIgnoreCase(name)) if(rs.next())
return team; return new Team(rs);
return load(select("SELECT * FROM Team WHERE (lower(TeamName) = ? OR lower(TeamKuerzel) = ?) AND NOT TeamDeleted", name.toLowerCase(), name.toLowerCase())); return null;
}, name.toLowerCase(), name.toLowerCase());
} }
public static List<Team> getAll(){ public static List<Team> getAll(){
clearCache(); clearCache();
try{ return all.select(rs -> {
ResultSet rs = select("SELECT * FROM Team WHERE NOT TeamDeleted");
if(rs == null)
return teamCache;
while(rs.next()) while(rs.next())
new Team(rs); new Team(rs);
} catch (SQLException e) {
BungeeCore.log("Could not get all Teams", e);
}
return teamCache; return teamCache;
});
} }
public static void clearCache(){ public static void clearCache(){
teamCache.clear(); teamCache.clear();
} }
private static Team load(ResultSet dbteam){
try {
if(!dbteam.next())
return null;
return new Team(dbteam);
} catch (SQLException e) {
BungeeCore.log("Could not load Team", e);
return null;
}
}
private void updateDB(){ private void updateDB(){
SQL.update("INSERT INTO Team (TeamID, TeamKuerzel, TeamName, TeamColor) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE TeamName = VALUES(TeamName), TeamKuerzel = VALUES(TeamKuerzel), TeamColor = VALUES(TeamColor)", teamId, teamKuerzel, teamName, teamColor); update.update(teamId, teamKuerzel, teamName, teamColor);
} }
public int getTeamId() { public int getTeamId() {
@ -143,33 +136,24 @@ public class Team {
} }
public int size(){ public int size(){
ResultSet rs = select("SELECT COUNT(id) FROM UserData WHERE Team = ?", teamId); return getSize.select(rs -> {
try {
rs.next(); rs.next();
return rs.getInt("COUNT(id)"); return rs.getInt("COUNT(id)");
}catch (SQLException e) { }, teamId);
BungeeCore.log("Could not get Teamsize", e);
return 1000;
}
} }
public void disband(SteamwarUser user){ public void disband(SteamwarUser user){
user.setLeader(false); user.setLeader(false);
SQL.update("UPDATE Team SET TeamDeleted = 1 WHERE TeamID = ?", teamId); delete.update(teamId);
teamCache.remove(this); teamCache.remove(this);
} }
public List<Integer> getMembers(){ public List<Integer> getMembers(){
try{ return getMembers.select(rs -> {
ResultSet memberlist = select("SELECT id FROM UserData WHERE Team = ?", teamId);
List<Integer> members = new ArrayList<>(); List<Integer> members = new ArrayList<>();
while(memberlist.next()){ while(rs.next())
members.add(memberlist.getInt("id")); members.add(rs.getInt("id"));
}
return members; return members;
}catch(SQLException e){ }, teamId);
BungeeCore.log("Could not get Teammembers", e);
}
return new ArrayList<>();
} }
} }

Datei anzeigen

@ -19,55 +19,46 @@
package de.steamwar.bungeecore.sql; package de.steamwar.bungeecore.sql;
import de.steamwar.bungeecore.BungeeCore;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
public class TeamTeilnahme { public class TeamTeilnahme {
private TeamTeilnahme(){} private TeamTeilnahme(){}
private static final Statement insert = new Statement("INSERT INTO TeamTeilnahme (TeamID, EventID) VALUES (?, ?)");
private static final Statement delete = new Statement("DELETE FROM TeamTeilnahme WHERE TeamID = ? AND EventID = ?");
private static final Statement byEventTeam = new Statement("SELECT * FROM TeamTeilnahme WHERE TeamID = ? AND EventID = ?");
private static final Statement byEvent = new Statement("SELECT * FROM TeamTeilnahme WHERE EventID = ?");
private static final Statement byTeam = new Statement("SELECT * FROM TeamTeilnahme WHERE TeamID = ?");
public static void teilnehmen(int teamID, int eventID){ public static void teilnehmen(int teamID, int eventID){
SQL.update("INSERT INTO TeamTeilnahme (TeamID, EventID) VALUES (?, ?)", teamID, eventID); insert.update(teamID, eventID);
} }
public static void notTeilnehmen(int teamID, int eventID){ public static void notTeilnehmen(int teamID, int eventID){
SQL.update("DELETE FROM TeamTeilnahme WHERE TeamID = ? AND EventID = ?", teamID, eventID); delete.update(teamID, eventID);
} }
public static boolean nimmtTeil(int teamID, int eventID){ public static boolean nimmtTeil(int teamID, int eventID){
ResultSet rs = SQL.select("SELECT * FROM TeamTeilnahme WHERE TeamID = ? AND EventID = ?", teamID, eventID); return byEventTeam.select(ResultSet::next, teamID, eventID);
try{
return rs.next();
}catch (SQLException e){
BungeeCore.log("Failed to load TeamTeilnahme", e);
throw new SecurityException();
}
} }
public static Set<Team> getTeams(int eventID){ public static Set<Team> getTeams(int eventID){
return byEvent.select(rs -> {
Set<Team> teams = new HashSet<>(); Set<Team> teams = new HashSet<>();
ResultSet rs = SQL.select("SELECT * FROM TeamTeilnahme WHERE EventID = ?", eventID);
try{
while(rs.next()) while(rs.next())
teams.add(Team.get(rs.getInt("TeamID"))); teams.add(Team.get(rs.getInt("TeamID")));
}catch (SQLException e){
BungeeCore.log("Failed to load TeamTeilnahmen", e);
}
return teams; return teams;
}, eventID);
} }
public static Set<Event> getEvents(int teamID){ public static Set<Event> getEvents(int teamID){
return byTeam.select(rs -> {
Set<Event> events = new HashSet<>(); Set<Event> events = new HashSet<>();
ResultSet rs = SQL.select("SELECT * FROM TeamTeilnahme WHERE TeamID = ?", teamID);
try{
while(rs.next()) while(rs.next())
events.add(Event.get(rs.getInt("EventID"))); events.add(Event.get(rs.getInt("EventID")));
}catch (SQLException e){
BungeeCore.log("Failed to load TeamTeilnahmen", e);
}
return events; return events;
}, teamID);
} }
} }