mirror of
https://github.com/AtlasMediaGroup/TotalFreedomMod.git
synced 2025-06-28 19:26:42 +00:00
2023.03 update 2 / 2
I think we're done!!!
This commit is contained in:
@ -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";
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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())
|
||||
|
@ -1,6 +1,6 @@
|
||||
name: TFD4J
|
||||
main: me.totalfreedom.discord.TFD4J
|
||||
version: 1.0
|
||||
version: 2023.03
|
||||
api-version: 1.19
|
||||
depend: [TotalFreedomMod]
|
||||
libraries:
|
||||
|
Reference in New Issue
Block a user