2023.03 update 2 / 2

I think we're done!!!
This commit is contained in:
Paul Reilly
2023-03-09 03:50:47 -06:00
parent 2265783afb
commit b7ea1b8b3e
101 changed files with 534 additions and 380 deletions

View File

@ -5,7 +5,8 @@ import discord4j.core.DiscordClientBuilder;
import discord4j.core.GatewayDiscordClient;
import discord4j.core.event.domain.interaction.ChatInputInteractionEvent;
import discord4j.core.object.entity.Guild;
import discord4j.core.object.entity.Message;
import discord4j.core.object.entity.Member;
import discord4j.core.object.entity.Role;
import discord4j.core.object.entity.channel.TextChannel;
import me.totalfreedom.discord.command.HelpCommand;
import me.totalfreedom.discord.command.ListCommand;
@ -13,19 +14,19 @@ import me.totalfreedom.discord.command.TPSCommand;
import me.totalfreedom.discord.handling.CommandHandler;
import me.totalfreedom.discord.util.SnowflakeEntry;
import me.totalfreedom.discord.util.TFM_Bridge;
import me.totalfreedom.totalfreedommod.admin.Admin;
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.player.PlayerData;
import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.util.FLog;
import net.dv8tion.jda.internal.utils.concurrent.CountingThreadFactory;
import org.apache.commons.lang.RandomStringUtils;
import org.bukkit.Bukkit;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
public class Bot
@ -45,6 +46,10 @@ public class Bot
.login()
.block();
this.tfm = new TFM_Bridge(this);
}
public void initialize() {
if (client == null) throw new IllegalStateException();
final CommandHandler handler = new CommandHandler(client.getRestClient());
@ -71,12 +76,125 @@ public class Bot
.then(client.onDisconnect())
.block(); // We use .block() as there is not another non-daemon thread and the jvm would close otherwise.
this.tfm = new TFM_Bridge(this);
RATELIMIT_EXECUTOR = new ScheduledThreadPoolExecutor(5, new CountingThreadFactory(this::poolIdentifier, "RateLimit"));
RATELIMIT_EXECUTOR.setRemoveOnCancelPolicy(true);
}
public String getCode(PlayerData playerData) {
for (String code : LINK_CODES.keySet())
{
if (LINK_CODES.get(code).equals(playerData))
{
return code;
}
}
return "";
}
public String generateCode(int size)
{
return RandomStringUtils.randomNumeric(size);
}
public String formatBotTag() {
return client.getSelf()
.blockOptional()
.orElseThrow()
.getUsername() + "#" + client.getSelf()
.blockOptional()
.orElseThrow()
.getDiscriminator();
}
public boolean syncRoles(Admin admin, String discordID)
{
if (discordID == null)
{
return false;
}
Guild server = client.getGuildById(SnowflakeEntry.serverID)
.blockOptional()
.orElseThrow();
Member member = server.getMemberById(Snowflake.of(discordID))
.blockOptional()
.orElseThrow();
Role adminRole = server.getRoleById(SnowflakeEntry.adminRoleID)
.blockOptional()
.orElseThrow();
Role senioradminRole = server.getRoleById(SnowflakeEntry.seniorRoleID)
.blockOptional()
.orElseThrow();
if (!admin.isActive())
{
syncRolesActivityCheck(member, adminRole, senioradminRole);
return true;
}
if (admin.getRank().equals(Rank.ADMIN))
{
syncRolesAdminAssignment(member, adminRole, senioradminRole);
return true;
}
else if (admin.getRank().equals(Rank.SENIOR_ADMIN))
{
syncRolesSeniorAssignment(member, adminRole, senioradminRole);
return true;
}
return false;
}
private void syncRolesAdminAssignment(Member member, Role adminRole, Role senioradminRole) {
member.getRoles().doFirst(() -> {
if (!member.getRoles().collectList().blockOptional().orElseThrow().contains(adminRole))
{
member.addRole(adminRole.getId()).block();
}
}).doOnEach(r -> {
Role role = r.get();
if (role == null) return;
if (role.equals(senioradminRole))
{
member.removeRole(role.getId()).block();
}
}).subscribe();
}
private void syncRolesActivityCheck(Member member, Role adminRole, Role senioradminRole) {
member.getRoles().doOnEach(r -> {
Role role = r.get();
if (role == null) return;
if (role.equals(adminRole) || role.equals(senioradminRole))
{
member.removeRole(role.getId()).block();
}
}).subscribe();
}
private void syncRolesSeniorAssignment(Member member, Role adminRole, Role senioradminRole) {
member.getRoles().doFirst(() -> {
if (!member.getRoles().collectList().blockOptional().orElseThrow().contains(senioradminRole))
{
member.addRole(senioradminRole.getId()).block();
}
}).doOnEach(r -> {
Role role = r.get();
if (role == null) return;
if (role.equals(adminRole))
{
member.removeRole(role.getId()).block();
}
}).subscribe();
}
private String poolIdentifier()
{
return "TFD4J";

View File

@ -60,85 +60,6 @@ public class TFM_Bridge
}).blockFirst();
}
public String getCode(PlayerData playerData)
{
for (String code : bot.getLinkCodes().keySet())
{
if (bot.getLinkCodes().get(code).equals(playerData))
{
return code;
}
}
return null;
}
public boolean syncRoles(Admin admin, String discordID)
{
if (discordID == null)
{
return false;
}
Guild server = bot.getGuildById().block();
if (server == null)
{
FLog.severe("The Discord server ID specified is invalid, or the bot is not on the server.");
return false;
}
Member member = server.getMemberById(Snowflake.of(discordID)).block();
if (member == null)
{
return false;
}
Role adminRole = server.getRoleById(SnowflakeEntry.adminRoleID).block();
if (adminRole == null)
{
FLog.severe("The specified Admin role does not exist!");
return false;
}
Role senioradminRole = server.getRoleById(SnowflakeEntry.seniorRoleID).block();
if (senioradminRole == null)
{
FLog.severe("The specified Senior Admin role does not exist!");
return false;
}
if (!admin.isActive())
{
member.getRoles()
.filter(role -> role.equals(adminRole) || role.equals(senioradminRole))
.subscribe(r -> member.removeRole(r.getId()).block());
return true;
}
if (admin.getRank().equals(Rank.ADMIN))
{
member.getRoles()
.filter(role -> !role.equals(adminRole))
.subscribe(r -> member.addRole(r.getId()).block());
member.getRoles()
.filter(role -> role.equals(senioradminRole))
.subscribe(r -> member.removeRole(r.getId()).block());
return true;
}
else if (admin.getRank().equals(Rank.SENIOR_ADMIN))
{
member.getRoles()
.filter(role -> !role.equals(senioradminRole))
.subscribe(r -> member.addRole(r.getId()).block());
member.getRoles()
.filter(role -> role.equals(adminRole))
.subscribe(r -> member.removeRole(r.getId()).block());
return true;
}
return false;
}
public TotalFreedomMod getCommons() {
return commons;
}

View File

@ -3,14 +3,18 @@ package me.totalfreedom.discord.util;
import com.google.common.collect.ImmutableList;
import discord4j.core.object.entity.Guild;
import discord4j.core.object.entity.Message;
import discord4j.core.object.entity.channel.Channel;
import discord4j.core.object.entity.channel.TextChannel;
import discord4j.core.object.reaction.ReactionEmoji;
import discord4j.core.spec.EmbedCreateSpec;
import discord4j.core.spec.MessageCreateSpec;
import discord4j.discordjson.json.EmojiData;
import discord4j.discordjson.json.ReactionData;
import me.totalfreedom.discord.TFD4J;
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.util.FLog;
import org.apache.commons.lang.WordUtils;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@ -23,7 +27,7 @@ import java.util.Objects;
public class Utilities
{
private final Flux<Message> sentMessages = Flux.fromIterable(new ArrayList<>());
private Flux<Message> sentMessages = Flux.fromIterable(new ArrayList<>());
private final TFD4J tfd4J;
private final ImmutableList<String> DISCORD_SUBDOMAINS = (ImmutableList<String>)
List.of("discordapp.com",
@ -35,6 +39,11 @@ public class Utilities
this.tfd4J = tfd4J;
}
public void clearQueue()
{
sentMessages = Flux.fromIterable(new ArrayList<>());
}
public String sanitizeChatMessage(String message)
{
String newMessage = message;
@ -116,6 +125,48 @@ public class Utilities
}
}
public boolean sendReportOffline(Player reporter, OfflinePlayer reported, String reason)
{
if (!tfd4J.getBot().shouldISendReport())
{
return false;
}
final Guild server = tfd4J.getBot().getGuildById().block();
if (server == null) return false;
final Channel channel = server.getChannelById(SnowflakeEntry.reportChannelID).block();
if (!(channel instanceof TextChannel tch)) return false;
final EmbedCreateSpec.Builder builder = EmbedCreateSpec.builder()
.title("Report for " + reported.getName() + " (offline)")
.description(reason)
.footer("Reported by " + reporter.getName(), "https://minotar.net/helm/" + reporter.getName() + ".png")
.timestamp(Instant.from(ZonedDateTime.now()));
if (tfd4J.getBot().getTFM().getCommons().esb.isEnabled())
{
com.earth2me.essentials.User user = tfd4J.getBot().getTFM().getCommons().esb.getEssentialsUser(reported.getName());
String location = "World: " + Objects.requireNonNull(user.getLastLocation().getWorld()).getName() + ", X: " + user.getLastLocation().getBlockX() + ", Y: " + user.getLastLocation().getBlockY() + ", Z: " + user.getLastLocation().getBlockZ();
builder.addField("Location", location, true);
builder.addField("God Mode", WordUtils.capitalizeFully(String.valueOf(user.isGodModeEnabled())), true);
if (user.getNickname() != null)
{
builder.addField("Nickname", user.getNickname(), true);
}
}
EmbedCreateSpec embed = builder.build();
Message message = tch.createMessage(embed).block();
if (message != null && !ConfigEntry.DISCORD_REPORT_ARCHIVE_CHANNEL_ID.getString().isEmpty())
{
message.addReaction(ReactionEmoji.unicode("\uD83D\uDCCB")).subscribe();
}
return true;
}
public boolean sendReport(Player reporter, Player reported, String reason)
{
if (!tfd4J.getBot().shouldISendReport())

View File

@ -1,6 +1,6 @@
name: TFD4J
main: me.totalfreedom.discord.TFD4J
version: 1.0
version: 2023.03
api-version: 1.19
depend: [TotalFreedomMod]
libraries: