Cyclic Dependency Patch

- Fixed cyclic dependencies
- Added a TFShoppe class for effective plugin initialization
- Registered discord commands, did not before
- Added SLF4J loggers for module logging.
This commit is contained in:
Paul Reilly 2023-03-10 19:21:03 -06:00
parent b5804c7eb1
commit 3a96c853d2
38 changed files with 721 additions and 418 deletions

View File

@ -46,22 +46,6 @@
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency>
<groupId>me.totalfreedom</groupId>
<artifactId>discord</artifactId>
<version>2023.02</version>
<scope>provided</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>me.totalfreedom</groupId>
<artifactId>shop</artifactId>
<version>2023.02</version>
<scope>provided</scope>
<optional>true</optional>
</dependency>
<dependency> <dependency>
<groupId>org.reflections</groupId> <groupId>org.reflections</groupId>
<artifactId>reflections</artifactId> <artifactId>reflections</artifactId>

View File

@ -151,7 +151,7 @@ public class ChatManager extends FreedomService
FLog.info("[ADMIN] " + sender.getName() + " " + display.getTag() + ": " + message, true); FLog.info("[ADMIN] " + sender.getName() + " " + display.getTag() + ": " + message, true);
if (plugin.dc != null) { if (plugin.dc != null) {
plugin.dc.getUtils().messageAdminChatChannel(sender.getName() + " \u00BB " + message); plugin.dc.messageAdminChatChannel(sender.getName() + " \u00BB " + message);
} }
server.getOnlinePlayers().stream().filter(player -> plugin.al.isAdmin(player)).forEach(player -> server.getOnlinePlayers().stream().filter(player -> plugin.al.isAdmin(player)).forEach(player ->

View File

@ -4,9 +4,12 @@ import java.io.File;
import java.io.InputStream; import java.io.InputStream;
import java.util.Properties; import java.util.Properties;
import me.totalfreedom.discord.TFM_Accessor;
import me.totalfreedom.totalfreedommod.admin.ActivityLog; import me.totalfreedom.totalfreedommod.admin.ActivityLog;
import me.totalfreedom.totalfreedommod.admin.AdminList; import me.totalfreedom.totalfreedommod.admin.AdminList;
import me.totalfreedom.totalfreedommod.api.Aggregator;
import me.totalfreedom.totalfreedommod.api.ShoppeCommons;
import me.totalfreedom.totalfreedommod.api.TFD4JCommons;
import me.totalfreedom.totalfreedommod.api.VotifierCommons;
import me.totalfreedom.totalfreedommod.banning.BanManager; import me.totalfreedom.totalfreedommod.banning.BanManager;
import me.totalfreedom.totalfreedommod.banning.IndefiniteBanList; import me.totalfreedom.totalfreedommod.banning.IndefiniteBanList;
import me.totalfreedom.totalfreedommod.blocking.BlockBlocker; import me.totalfreedom.totalfreedommod.blocking.BlockBlocker;
@ -74,8 +77,8 @@ public class TotalFreedomMod extends JavaPlugin
public CommandLoader cl; public CommandLoader cl;
// Services // Services
public WorldManager wm; public WorldManager wm;
public AdminList al;
public ActivityLog acl; public ActivityLog acl;
public AdminList al;
public RankManager rm; public RankManager rm;
public CommandBlocker cb; public CommandBlocker cb;
public EventBlocker eb; public EventBlocker eb;
@ -87,12 +90,12 @@ public class TotalFreedomMod extends JavaPlugin
public AntiNuke nu; public AntiNuke nu;
public AntiSpam as; public AntiSpam as;
public PlayerList pl; public PlayerList pl;
public Shop sh; public ShoppeCommons sh;
public Votifier vo;
public SQLite sql; public SQLite sql;
public Announcer an; public Announcer an;
public ChatManager cm; public ChatManager cm;
public TFD4J dc; public TFD4JCommons dc;
public Aggregator ag;
public PunishmentList pul; public PunishmentList pul;
public BanManager bm; public BanManager bm;
public IndefiniteBanList im; public IndefiniteBanList im;
@ -266,6 +269,18 @@ public class TotalFreedomMod extends JavaPlugin
} }
} }
public void registerDiscord() {
if (Bukkit.getPluginManager().isPluginEnabled("TFD4J")) {
dc = ag.getDiscordContext().getValue();
}
}
public void registerShoppe() {
if (Bukkit.getPluginManager().isPluginEnabled("TF-Shoppe")) {
sh = ag.getShoppeContext().getValue();
}
}
/** /**
* This class is provided to please Codacy. * This class is provided to please Codacy.
*/ */
@ -299,18 +314,11 @@ public class TotalFreedomMod extends JavaPlugin
as = new AntiSpam(); as = new AntiSpam();
wr = new WorldRestrictions(); wr = new WorldRestrictions();
pl = new PlayerList(); pl = new PlayerList();
ag = new Aggregator();
if (Bukkit.getPluginManager().isPluginEnabled("TF-Shoppe")) {
sh = new Shop();
vo = new Votifier();
}
an = new Announcer(); an = new Announcer();
cm = new ChatManager(); cm = new ChatManager();
if (Bukkit.getPluginManager().isPluginEnabled("TFD4J")) {
dc = new TFM_Accessor().botAccessor();
}
pul = new PunishmentList(); pul = new PunishmentList();
bm = new BanManager(); bm = new BanManager();

View File

@ -0,0 +1,27 @@
package me.totalfreedom.totalfreedommod.api;
public class Aggregator
{
private Context<TFD4JCommons> discord;
private Context<ShoppeCommons> shoppe;
public Context<TFD4JCommons> getDiscordContext()
{
return discord;
}
public void setDiscordContext(Context<TFD4JCommons> discord)
{
this.discord = discord;
}
public Context<ShoppeCommons> getShoppeContext()
{
return shoppe;
}
public void setShoppeContext(Context<ShoppeCommons> shoppe)
{
this.shoppe = shoppe;
}
}

View File

@ -0,0 +1,16 @@
package me.totalfreedom.totalfreedommod.api;
public class Context<T>
{
private final T value;
public Context(T value)
{
this.value = value;
}
public T getValue()
{
return value;
}
}

View File

@ -1,4 +1,4 @@
package me.totalfreedom.shop; package me.totalfreedom.totalfreedommod.api;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;

View File

@ -0,0 +1,55 @@
package me.totalfreedom.totalfreedommod.api;
import me.totalfreedom.totalfreedommod.player.PlayerData;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
public interface ShoppeCommons
{
int getCoinsPerReactionWin();
void startReactionTimer();
void forceStartReaction();
void startReaction();
void endReaction(String winner);
String getShopPrefix();
String getShopTitle();
Inventory generateShopGUI(PlayerData playerData);
Inventory generateLoginMessageGUI(Player player);
boolean isRealItem(PlayerData data, ShopItem shopItem, PlayerInventory inventory, ItemStack realItem);
boolean isRealItem(PlayerData data, ShopItem shopItem, ItemStack givenItem, ItemStack realItem);
ItemStack getLightningRod();
ItemStack getGrapplingHook();
ItemStack getFireBall();
ItemStack getRideablePearl();
ItemStack getStackingPotato();
ItemStack getClownFish();
boolean canAfford(int price, int coins);
int amountNeeded(int price, int coins);
ItemStack shopGUIItem(ShopItem item, PlayerData data);
ShopItem getShopItem(int slot);
String getReactionString();
}

View File

@ -0,0 +1,33 @@
package me.totalfreedom.totalfreedommod.api;
import me.totalfreedom.totalfreedommod.admin.Admin;
import me.totalfreedom.totalfreedommod.player.PlayerData;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import java.util.Map;
public interface TFD4JCommons
{
void messageAdminChatChannel(String message);
void clearQueue();
void messageChatChannel(String message, boolean system);
boolean syncRoles(Admin admin, String id);
String getCode(PlayerData playerData);
String generateCode(int size);
Map<String, PlayerData> getLinkCodes();
String formatBotTag();
boolean sendReportOffline(Player reporter, OfflinePlayer reported, String reason);
boolean sendReport(Player reporter, Player reported, String reason);
boolean isEnabled();
}

View File

@ -18,7 +18,7 @@ public class Command_cleardiscordqueue extends FreedomCommand
return true; return true;
} }
plugin.dc.getUtils().clearQueue(); plugin.dc.clearQueue();
msg("Cleared the discord message queue."); msg("Cleared the discord message queue.");
return true; return true;
} }

View File

@ -1,7 +1,7 @@
package me.totalfreedom.totalfreedommod.command; package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.shop.ShopItem; import me.totalfreedom.totalfreedommod.api.ShopItem;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.Command; import org.bukkit.command.Command;

View File

@ -25,7 +25,7 @@ public class Command_consolesay extends FreedomCommand
FUtil.bcastMsg(String.format("§7[CONSOLE] §c%s §8» §f%s", sender.getName(), StringUtils.join(args, " "))); FUtil.bcastMsg(String.format("§7[CONSOLE] §c%s §8» §f%s", sender.getName(), StringUtils.join(args, " ")));
if (plugin.dc != null) { if (plugin.dc != null) {
plugin.dc.getUtils().messageChatChannel("[CONSOLE] " + sender.getName() + " \u00BB " + ChatColor.stripColor(message), true); plugin.dc.messageChatChannel("[CONSOLE] " + sender.getName() + " \u00BB " + ChatColor.stripColor(message), true);
} }

View File

@ -53,7 +53,7 @@ public class Command_doom extends FreedomCommand
plugin.al.updateTables(); plugin.al.updateTables();
if (plugin.dc != null && plugin.dc.isEnabled() && ConfigEntry.DISCORD_ROLE_SYNC.getBoolean()) if (plugin.dc != null && plugin.dc.isEnabled() && ConfigEntry.DISCORD_ROLE_SYNC.getBoolean())
{ {
plugin.dc.getBot().syncRoles(admin, plugin.pl.getData(admin.getName()).getDiscordID()); plugin.dc.syncRoles(admin, plugin.pl.getData(admin.getName()).getDiscordID());
} }
} }

View File

@ -1,7 +1,7 @@
package me.totalfreedom.totalfreedommod.command; package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.shop.ShopItem; import me.totalfreedom.totalfreedommod.api.ShopItem;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;

View File

@ -1,6 +1,6 @@
package me.totalfreedom.totalfreedommod.command; package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.shop.ShopItem; import me.totalfreedom.totalfreedommod.api.ShopItem;
import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.rank.Rank;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.Command; import org.bukkit.command.Command;

View File

@ -1,7 +1,7 @@
package me.totalfreedom.totalfreedommod.command; package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.shop.ShopItem; import me.totalfreedom.totalfreedommod.api.ShopItem;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;

View File

@ -44,16 +44,16 @@ public class Command_linkdiscord extends FreedomCommand
return true; return true;
} }
if (plugin.dc.getBot().getLinkCodes().containsValue(data)) if (plugin.dc.getLinkCodes().containsValue(data))
{ {
code = plugin.dc.getBot().getCode(data); code = plugin.dc.getCode(data);
} else } else
{ {
code = plugin.dc.getBot().generateCode(5); code = plugin.dc.generateCode(5);
plugin.dc.getBot().getLinkCodes().put(code, data); plugin.dc.getLinkCodes().put(code, data);
} }
msg("Your linking code is " + ChatColor.AQUA + code, ChatColor.GREEN); msg("Your linking code is " + ChatColor.AQUA + code, ChatColor.GREEN);
msg("Take this code and DM the server bot (" + plugin.dc.getBot().formatBotTag() + ") the code (do not put anything else in the message, only the code)"); msg("Take this code and DM the server bot (" + plugin.dc.formatBotTag() + ") the code (do not put anything else in the message, only the code)");
return true; return true;
} }
} }

View File

@ -2,7 +2,7 @@ package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.player.PlayerData; import me.totalfreedom.totalfreedommod.player.PlayerData;
import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.shop.ShopItem; import me.totalfreedom.totalfreedommod.api.ShopItem;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.Command; import org.bukkit.command.Command;

View File

@ -2,7 +2,7 @@ package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.player.PlayerData; import me.totalfreedom.totalfreedommod.player.PlayerData;
import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.shop.ShopItem; import me.totalfreedom.totalfreedommod.api.ShopItem;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;

View File

@ -173,7 +173,7 @@ public class Command_myadmin extends FreedomCommand
msg("Please run /linkdiscord first!", ChatColor.RED); msg("Please run /linkdiscord first!", ChatColor.RED);
return true; return true;
} }
boolean synced = plugin.dc.getBot().syncRoles(target, playerData.getDiscordID()); boolean synced = plugin.dc.syncRoles(target, playerData.getDiscordID());
if (synced) if (synced)
{ {
msg("Successfully synced your roles.", ChatColor.GREEN); msg("Successfully synced your roles.", ChatColor.GREEN);

View File

@ -56,7 +56,7 @@ public class Command_report extends FreedomCommand
if (plugin.dc != null && plugin.dc.isEnabled()) if (plugin.dc != null && plugin.dc.isEnabled())
{ {
logged = (player == null) ? plugin.dc.getUtils().sendReportOffline(playerSender, offlinePlayer, report) : plugin.dc.getUtils().sendReport(playerSender, player, report); logged = (player == null) ? plugin.dc.sendReportOffline(playerSender, offlinePlayer, report) : plugin.dc.sendReport(playerSender, player, report);
} }
msg(ChatColor.GREEN + "Thank you, your report has been successfully logged." msg(ChatColor.GREEN + "Thank you, your report has been successfully logged."

View File

@ -1,7 +1,7 @@
package me.totalfreedom.totalfreedommod.command; package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.shop.ShopItem; import me.totalfreedom.totalfreedommod.api.ShopItem;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;

View File

@ -108,7 +108,7 @@ public class Command_saconfig extends FreedomCommand
if (plugin.dc != null && plugin.dc.isEnabled() && ConfigEntry.DISCORD_ROLE_SYNC.getBoolean()) if (plugin.dc != null && plugin.dc.isEnabled() && ConfigEntry.DISCORD_ROLE_SYNC.getBoolean())
{ {
plugin.dc.getBot().syncRoles(admin, plugin.pl.getData(admin.getName()).getDiscordID()); plugin.dc.syncRoles(admin, plugin.pl.getData(admin.getName()).getDiscordID());
} }
msg("Set " + admin.getName() + "'s rank to " + rank.getName()); msg("Set " + admin.getName() + "'s rank to " + rank.getName());
@ -204,7 +204,7 @@ public class Command_saconfig extends FreedomCommand
if (plugin.dc != null && plugin.dc.isEnabled() && ConfigEntry.DISCORD_ROLE_SYNC.getBoolean()) if (plugin.dc != null && plugin.dc.isEnabled() && ConfigEntry.DISCORD_ROLE_SYNC.getBoolean())
{ {
plugin.dc.getBot().syncRoles(admin, plugin.pl.getData(player).getDiscordID()); plugin.dc.syncRoles(admin, plugin.pl.getData(player).getDiscordID());
} }
} }
@ -258,7 +258,7 @@ public class Command_saconfig extends FreedomCommand
if (plugin.dc != null && plugin.dc.isEnabled() && ConfigEntry.DISCORD_ROLE_SYNC.getBoolean()) if (plugin.dc != null && plugin.dc.isEnabled() && ConfigEntry.DISCORD_ROLE_SYNC.getBoolean())
{ {
plugin.dc.getBot().syncRoles(admin, plugin.pl.getData(adminName).getDiscordID()); plugin.dc.syncRoles(admin, plugin.pl.getData(adminName).getDiscordID());
} }
return true; return true;

View File

@ -43,7 +43,7 @@ public class Command_say extends FreedomCommand
FUtil.bcastMsg(String.format("[Server:%s] %s", sender.getName(), message), ChatColor.LIGHT_PURPLE); FUtil.bcastMsg(String.format("[Server:%s] %s", sender.getName(), message), ChatColor.LIGHT_PURPLE);
if (plugin.dc != null) { if (plugin.dc != null) {
plugin.dc.getUtils().messageChatChannel(String.format("[Server:%s] \u00BB %s", sender.getName(), message), true); plugin.dc.messageChatChannel(String.format("[Server:%s] \u00BB %s", sender.getName(), message), true);
} }
return true; return true;

View File

@ -1,7 +1,7 @@
package me.totalfreedom.totalfreedommod.command; package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.shop.ShopItem; import me.totalfreedom.totalfreedommod.api.ShopItem;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;

View File

@ -1,7 +1,7 @@
package me.totalfreedom.totalfreedommod.command; package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.shop.ShopItem; import me.totalfreedom.totalfreedommod.api.ShopItem;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;

View File

@ -48,7 +48,7 @@ public class Command_vanish extends FreedomCommand
.color(NamedTextColor.YELLOW)); .color(NamedTextColor.YELLOW));
if (plugin.dc != null) { if (plugin.dc != null) {
plugin.dc.getUtils().messageChatChannel("**" + playerSender.getName() + " joined the server" + "**", true); plugin.dc.messageChatChannel("**" + playerSender.getName() + " joined the server" + "**", true);
} }
} }
@ -101,7 +101,7 @@ public class Command_vanish extends FreedomCommand
server.broadcast(Component.translatable("multiplayer.player.left", Component.text(playerSender.getName())) server.broadcast(Component.translatable("multiplayer.player.left", Component.text(playerSender.getName()))
.color(NamedTextColor.YELLOW)); .color(NamedTextColor.YELLOW));
if (plugin.dc != null) { if (plugin.dc != null) {
plugin.dc.getUtils().messageChatChannel("**" + playerSender.getName() + " left the server" + "**", true); plugin.dc.messageChatChannel("**" + playerSender.getName() + " left the server" + "**", true);
} }
} }

View File

@ -1,6 +1,6 @@
package me.totalfreedom.totalfreedommod.fun; package me.totalfreedom.totalfreedommod.fun;
import me.totalfreedom.shop.ShopItem; import me.totalfreedom.totalfreedommod.api.ShopItem;
import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.FreedomService;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.player.FPlayer;

View File

@ -7,7 +7,7 @@ import java.util.SplittableRandom;
import java.util.UUID; import java.util.UUID;
import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.FreedomService;
import me.totalfreedom.shop.ShopItem; import me.totalfreedom.totalfreedommod.api.ShopItem;
import me.totalfreedom.totalfreedommod.util.Groups; import me.totalfreedom.totalfreedommod.util.Groups;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;

View File

@ -5,7 +5,7 @@ import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.*; import java.util.*;
import me.totalfreedom.shop.ShopItem; import me.totalfreedom.totalfreedommod.api.ShopItem;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;

View File

@ -80,22 +80,6 @@ public class Bot
RATELIMIT_EXECUTOR.setRemoveOnCancelPolicy(true); 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() { public String formatBotTag() {
return client.getSelf() return client.getSelf()
.blockOptional() .blockOptional()
@ -106,94 +90,6 @@ public class Bot
.getDiscriminator(); .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() private String poolIdentifier()
{ {

View File

@ -1,35 +1,77 @@
package me.totalfreedom.discord; package me.totalfreedom.discord;
import me.totalfreedom.discord.command.HelpCommand;
import me.totalfreedom.discord.command.ListCommand;
import me.totalfreedom.discord.command.TPSCommand;
import me.totalfreedom.discord.handling.CommandHandler;
import me.totalfreedom.discord.listener.AdminChatListener; import me.totalfreedom.discord.listener.AdminChatListener;
import me.totalfreedom.discord.listener.BukkitNative; import me.totalfreedom.discord.listener.BukkitNative;
import me.totalfreedom.discord.listener.MinecraftListener; import me.totalfreedom.discord.listener.MinecraftListener;
import me.totalfreedom.discord.util.Utilities; import me.totalfreedom.totalfreedommod.api.Context;
import me.totalfreedom.totalfreedommod.api.TFD4JCommons;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TFD4J extends JavaPlugin public class TFD4J extends JavaPlugin
{ {
private final Logger slf4j = LoggerFactory.getLogger("TFD4J");
private Bot bot; private Bot bot;
private Utilities utils;
private MinecraftListener mc; private MinecraftListener mc;
private AdminChatListener ac; private AdminChatListener ac;
private TFD4JCommons tfd4jcommons;
private BukkitNative bn;
private CommandHandler ch;
@Override @Override
public void onEnable() public void onEnable()
{ {
slf4j().info("Hello from TFD4J! Initializing our API implementation...");
this.tfd4jcommons = new TFD4JCommonsImpl(this);
slf4j().info("API successfully initialized! Initializing our bot...");
this.bot = new Bot(); this.bot = new Bot();
this.utils = new Utilities(this);
new BukkitNative(this); slf4j().info("Bot successfully initialized! Registering the Bukkit Native listener...");
this.bn = new BukkitNative(this);
slf4j().info("Bukkit Native listener successfully registered! Registering the Discord4J Listeners...");
this.mc = new MinecraftListener(this); this.mc = new MinecraftListener(this);
this.ac = new AdminChatListener(this); this.ac = new AdminChatListener(this);
mc.minecraftChatBound(); mc.minecraftChatBound();
ac.adminChatBound(); ac.adminChatBound();
slf4j().info("Discord4J listeners successfully registered! Registering the Command Handler...");
this.ch = new CommandHandler(bot.getClient().getRestClient());
slf4j().info("Command Handler successfully registered! Registering commands...");
this.ch.registerCommand(new HelpCommand());
this.ch.registerCommand(new ListCommand());
this.ch.registerCommand(new TPSCommand());
slf4j().info("Commands successfully registered! Providing context to TFM...");
Context<TFD4JCommons> context = new Context<>(tfd4jcommons);
bot.getTFM().getCommons().ag.setDiscordContext(context);
bot.getTFM().getCommons().registerDiscord();
slf4j().info("Context provided! TFD4J is now ready to go!");
} }
@Override @Override
public void onDisable() public void onDisable()
{ {
bot.getClient().onDisconnect().subscribe(); slf4j().info("Disconnecting the Discord bot...");
bot.getClient()
.onDisconnect()
.doOnError(th -> slf4j().error("Error disconnecting the bot!", th))
.doOnSuccess(v -> slf4j().info("Bot disconnected!"))
.subscribe();
slf4j().info("Goodbye from TFD4J!");
}
public Logger slf4j()
{
return slf4j;
} }
public Bot getBot() public Bot getBot()
@ -37,9 +79,9 @@ public class TFD4J extends JavaPlugin
return bot; return bot;
} }
public Utilities getUtils() public TFD4JCommons getImpl()
{ {
return utils; return tfd4jcommons;
} }
public MinecraftListener getMinecraftListener() public MinecraftListener getMinecraftListener()

View File

@ -0,0 +1,372 @@
package me.totalfreedom.discord;
import com.google.common.collect.ImmutableList;
import discord4j.common.util.Snowflake;
import discord4j.core.object.entity.Guild;
import discord4j.core.object.entity.Member;
import discord4j.core.object.entity.Message;
import discord4j.core.object.entity.Role;
import discord4j.core.object.entity.channel.TextChannel;
import discord4j.core.object.reaction.ReactionEmoji;
import discord4j.core.spec.EmbedCreateSpec;
import discord4j.core.spec.MessageCreateSpec;
import me.totalfreedom.discord.util.SnowflakeEntry;
import me.totalfreedom.discord.util.Utilities;
import me.totalfreedom.totalfreedommod.admin.Admin;
import me.totalfreedom.totalfreedommod.api.TFD4JCommons;
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 org.apache.commons.lang.RandomStringUtils;
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;
import java.time.Instant;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
public class TFD4JCommonsImpl implements TFD4JCommons
{
private final TFD4J tfd4J;
private final ImmutableList<String> DISCORD_SUBDOMAINS;
private Flux<Message> sentMessages;
public TFD4JCommonsImpl(TFD4J tfd4J)
{
this.tfd4J = tfd4J;
this.sentMessages = Flux.fromIterable(new ArrayList<>());
this.DISCORD_SUBDOMAINS = (ImmutableList<String>)
List.of("discordapp.com",
"discord.com",
"discord.gg");
}
@Override
public void messageAdminChatChannel(String message)
{
String chat_channel_id = ConfigEntry.DISCORD_ADMINCHAT_CHANNEL_ID.getString();
String sanitizedMessage = sanitizeChatMessage(message);
if (sanitizedMessage.isBlank()) return;
if (!chat_channel_id.isEmpty())
{
MessageCreateSpec spec = MessageCreateSpec.builder()
.content(sanitizedMessage)
.build();
Mono<Message> sentMessage = tfd4J
.getBot()
.getClient()
.getChannelById(SnowflakeEntry.adminChatChannelID)
.ofType(TextChannel.class)
.flatMap(c -> c.createMessage(spec));
insert(sentMessage);
}
}
public Flux<Message> getMessagesSent()
{
return sentMessages;
}
private void insert(Mono<Message> messageMono)
{
sentMessages.concatWith(messageMono);
}
@Override
public void clearQueue()
{
sentMessages = Flux.fromIterable(new ArrayList<>());
}
@Override
public void messageChatChannel(String message, boolean system)
{
String chat_channel_id = ConfigEntry.DISCORD_CHAT_CHANNEL_ID.getString();
String sanitizedMessage = (system) ? message : sanitizeChatMessage(message);
if (sanitizedMessage.isBlank()) return;
if (!chat_channel_id.isEmpty())
{
MessageCreateSpec spec = MessageCreateSpec.builder()
.content(sanitizedMessage)
.build();
Mono<Message> sentMessage = tfd4J
.getBot()
.getClient()
.getChannelById(SnowflakeEntry.chatChannelID)
.ofType(TextChannel.class)
.flatMap(c -> c.createMessage(spec));
insert(sentMessage);
}
}
private String sanitizeChatMessage(String message)
{
String newMessage = message;
if (message.contains("@"))
{
// \u200B is Zero Width Space, invisible on Discord
newMessage = message.replace("@", "@\u200B");
}
if (message.toLowerCase().contains("discord.gg")) // discord.gg/invite works as an invite
{
return "";
}
for (String subdomain : DISCORD_SUBDOMAINS)
{
if (message.toLowerCase().contains(subdomain + "/invite"))
{
return "";
}
}
if (message.contains("§"))
{
newMessage = message.replace("§", "");
}
return Utilities.deformat(newMessage);
}
@Override
public boolean syncRoles(Admin admin, String discordID)
{
if (discordID == null)
{
return false;
}
Guild server = tfd4J.getBot().getGuildById()
.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();
}
@Override
public String getCode(PlayerData playerData)
{
for (String code : this.getLinkCodes().keySet())
{
if (this.getLinkCodes().get(code).equals(playerData))
{
return code;
}
}
return "";
}
@Override
public String generateCode(int size)
{
return RandomStringUtils.randomNumeric(size);
}
@Override
public Map<String, PlayerData> getLinkCodes()
{
return tfd4J.getBot().getLinkCodes();
}
@Override
public String formatBotTag()
{
return tfd4J.getBot().formatBotTag();
}
@Override
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 TextChannel channel = server.getChannelById(SnowflakeEntry.reportChannelID)
.ofType(TextChannel.class)
.blockOptional()
.orElseThrow();
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 = channel.createMessage(embed).block();
if (message != null && !ConfigEntry.DISCORD_REPORT_ARCHIVE_CHANNEL_ID.getString().isEmpty())
{
message.addReaction(ReactionEmoji.unicode("\uD83D\uDCCB")).subscribe();
}
return true;
}
@Override
public boolean sendReport(Player reporter, Player reported, String reason)
{
if (!tfd4J.getBot().shouldISendReport())
{
return false;
}
final Guild server = tfd4J.getBot()
.getClient()
.getGuildById(SnowflakeEntry.serverID)
.block();
if (server == null)
{
FLog.severe("The guild ID specified in the config is invalid.");
return false;
}
final TextChannel channel = server.getChannelById(SnowflakeEntry.reportChannelID)
.ofType(TextChannel.class)
.blockOptional()
.orElseThrow();
String location = "World: " + Objects.requireNonNull(reported.getLocation().getWorld()).getName() + ", X: " + reported.getLocation().getBlockX() + ", Y: " + reported.getLocation().getBlockY() + ", Z: " + reported.getLocation().getBlockZ();
final EmbedCreateSpec spec = EmbedCreateSpec.builder()
.title("Report for " + reported.getName())
.description(reason)
.footer("Reported by " + reporter.getName(), "https://minotar.net/helm/" + reporter.getName() + ".png")
.timestamp(Instant.from(ZonedDateTime.now()))
.addField("Location", location, true)
.addField("Game Mode", WordUtils.capitalizeFully(reported.getGameMode().name()), true)
.build();
Message message = channel.createMessage(spec).block();
if (!ConfigEntry.DISCORD_REPORT_ARCHIVE_CHANNEL_ID.getString().isEmpty() && message != null)
{
ReactionEmoji emoji = ReactionEmoji.unicode("\uD83D\uDCCB");
message.addReaction(emoji);
}
return true;
}
@Override
public boolean isEnabled()
{
return tfd4J.isEnabled();
}
}

View File

@ -1,18 +0,0 @@
package me.totalfreedom.discord;
import org.bukkit.Bukkit;
public class TFM_Accessor
{
private final TFD4J accessor;
public TFM_Accessor()
{
this.accessor = (TFD4J) Bukkit.getPluginManager().getPlugin("TFD4J");
}
public TFD4J botAccessor()
{
return accessor;
}
}

View File

@ -2,6 +2,7 @@ package me.totalfreedom.discord.listener;
import me.totalfreedom.discord.Bot; import me.totalfreedom.discord.Bot;
import me.totalfreedom.discord.TFD4J; import me.totalfreedom.discord.TFD4J;
import me.totalfreedom.discord.util.Utilities;
import me.totalfreedom.totalfreedommod.TotalFreedomMod; import me.totalfreedom.totalfreedommod.TotalFreedomMod;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
@ -28,8 +29,6 @@ public class BukkitNative implements Listener
this.tfd4j = tfd4j; this.tfd4j = tfd4j;
this.bot = tfd4j.getBot(); this.bot = tfd4j.getBot();
this.commons = bot.getTFM().getCommons(); this.commons = bot.getTFM().getCommons();
tfd4j.getServer().getPluginManager().registerEvents(this, tfd4j);
} }
@EventHandler(priority = EventPriority.MONITOR) @EventHandler(priority = EventPriority.MONITOR)
@ -37,8 +36,8 @@ public class BukkitNative implements Listener
{ {
if (!commons.al.isVanished(event.getPlayer().getUniqueId())) if (!commons.al.isVanished(event.getPlayer().getUniqueId()))
{ {
tfd4j.getUtils().messageChatChannel("**" tfd4j.getImpl().messageChatChannel("**"
+ tfd4j.getUtils().deformat(event.getPlayer().getName()) + Utilities.deformat(event.getPlayer().getName())
+ " joined the server" + "**", true); + " joined the server" + "**", true);
} }
} }
@ -48,8 +47,8 @@ public class BukkitNative implements Listener
{ {
if (!commons.al.isVanished(event.getPlayer().getUniqueId())) if (!commons.al.isVanished(event.getPlayer().getUniqueId()))
{ {
tfd4j.getUtils().messageChatChannel("**" tfd4j.getImpl().messageChatChannel("**"
+ tfd4j.getUtils().deformat(event.getPlayer().getName()) + Utilities.deformat(event.getPlayer().getName())
+ " left the server" + "**", true); + " left the server" + "**", true);
} }
} }
@ -68,8 +67,8 @@ public class BukkitNative implements Listener
if (deathMessage != null) if (deathMessage != null)
{ {
tfd4j.getUtils().messageChatChannel("**" tfd4j.getImpl().messageChatChannel("**"
+ tfd4j.getUtils().deformat(PlainTextComponentSerializer.plainText().serialize(deathMessage)) + Utilities.deformat(PlainTextComponentSerializer.plainText().serialize(deathMessage))
+ "**", true); + "**", true);
} }
} }
@ -83,7 +82,7 @@ public class BukkitNative implements Listener
if (!ConfigEntry.ADMIN_ONLY_MODE.getBoolean() && !tfd4j.getServer().hasWhitelist() if (!ConfigEntry.ADMIN_ONLY_MODE.getBoolean() && !tfd4j.getServer().hasWhitelist()
&& !commons.pl.getPlayer(player).isMuted() && bot != null) && !commons.pl.getPlayer(player).isMuted() && bot != null)
{ {
tfd4j.getUtils().messageChatChannel(player.getName() tfd4j.getImpl().messageChatChannel(player.getName()
+ " \u00BB " + " \u00BB "
+ ChatColor.stripColor(message), true); + ChatColor.stripColor(message), true);
} }

View File

@ -28,204 +28,13 @@ import java.util.Objects;
public class Utilities public class Utilities
{ {
private Flux<Message> sentMessages = Flux.fromIterable(new ArrayList<>()); private Utilities() {
private final TFD4J tfd4J; throw new AssertionError();
private final ImmutableList<String> DISCORD_SUBDOMAINS = (ImmutableList<String>)
List.of("discordapp.com",
"discord.com",
"discord.gg");
public Utilities(TFD4J tfd4J)
{
this.tfd4J = tfd4J;
} }
public void clearQueue() // Leaving this here so I don't need to do more work than necessary.
{ public static String deformat(String input)
sentMessages = Flux.fromIterable(new ArrayList<>());
}
public String sanitizeChatMessage(String message)
{
String newMessage = message;
if (message.contains("@"))
{
// \u200B is Zero Width Space, invisible on Discord
newMessage = message.replace("@", "@\u200B");
}
if (message.toLowerCase().contains("discord.gg")) // discord.gg/invite works as an invite
{
return "";
}
for (String subdomain : DISCORD_SUBDOMAINS)
{
if (message.toLowerCase().contains(subdomain + "/invite"))
{
return "";
}
}
if (message.contains("§"))
{
newMessage = message.replace("§", "");
}
return deformat(newMessage);
}
public void messageChatChannel(String message, boolean system)
{
String chat_channel_id = ConfigEntry.DISCORD_CHAT_CHANNEL_ID.getString();
String sanitizedMessage = (system) ? message : sanitizeChatMessage(message);
if (sanitizedMessage.isBlank()) return;
if (!chat_channel_id.isEmpty())
{
MessageCreateSpec spec = MessageCreateSpec.builder()
.content(sanitizedMessage)
.build();
Mono<Message> sentMessage = tfd4J
.getBot()
.getClient()
.getChannelById(SnowflakeEntry.chatChannelID)
.ofType(TextChannel.class)
.flatMap(c -> c.createMessage(spec));
insert(sentMessage);
}
}
public void messageAdminChatChannel(String message)
{
String chat_channel_id = ConfigEntry.DISCORD_ADMINCHAT_CHANNEL_ID.getString();
String sanitizedMessage = sanitizeChatMessage(message);
if (sanitizedMessage.isBlank()) return;
if (!chat_channel_id.isEmpty())
{
MessageCreateSpec spec = MessageCreateSpec.builder()
.content(sanitizedMessage)
.build();
Mono<Message> sentMessage = tfd4J
.getBot()
.getClient()
.getChannelById(SnowflakeEntry.adminChatChannelID)
.ofType(TextChannel.class)
.flatMap(c -> c.createMessage(spec));
insert(sentMessage);
}
}
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 TextChannel channel = server.getChannelById(SnowflakeEntry.reportChannelID)
.ofType(TextChannel.class)
.blockOptional()
.orElseThrow();
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 = channel.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())
{
return false;
}
final Guild server = tfd4J.getBot()
.getClient()
.getGuildById(SnowflakeEntry.serverID)
.block();
if (server == null)
{
FLog.severe("The guild ID specified in the config is invalid.");
return false;
}
final TextChannel channel = server.getChannelById(SnowflakeEntry.reportChannelID)
.ofType(TextChannel.class)
.blockOptional()
.orElseThrow();
String location = "World: " + Objects.requireNonNull(reported.getLocation().getWorld()).getName() + ", X: " + reported.getLocation().getBlockX() + ", Y: " + reported.getLocation().getBlockY() + ", Z: " + reported.getLocation().getBlockZ();
final EmbedCreateSpec spec = EmbedCreateSpec.builder()
.title("Report for " + reported.getName())
.description(reason)
.footer("Reported by " + reporter.getName(), "https://minotar.net/helm/" + reporter.getName() + ".png")
.timestamp(Instant.from(ZonedDateTime.now()))
.addField("Location", location, true)
.addField("Game Mode", WordUtils.capitalizeFully(reported.getGameMode().name()), true)
.build();
Message message = channel.createMessage(spec).block();
if (!ConfigEntry.DISCORD_REPORT_ARCHIVE_CHANNEL_ID.getString().isEmpty() && message != null)
{
ReactionEmoji emoji = ReactionEmoji.unicode("\uD83D\uDCCB");
message.addReaction(emoji);
}
return true;
}
public String deformat(String input)
{ {
return input.replaceAll("([_\\\\`*>|])", "\\\\$1"); return input.replaceAll("([_\\\\`*>|])", "\\\\$1");
} }
public Flux<Message> getMessagesSent()
{
return sentMessages;
}
public void insert(Mono<Message> messageMono)
{
sentMessages.concatWith(messageMono);
}
} }

View File

@ -1,12 +1,9 @@
package me.totalfreedom.shop; package me.totalfreedom.shop;
import java.util.ArrayList; import io.papermc.paper.event.player.AsyncChatEvent;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.FreedomService;
import me.totalfreedom.totalfreedommod.api.ShopItem;
import me.totalfreedom.totalfreedommod.api.ShoppeCommons;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.player.PlayerData; import me.totalfreedom.totalfreedommod.player.PlayerData;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FLog;
@ -21,7 +18,6 @@ import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory; import org.bukkit.inventory.PlayerInventory;
@ -29,10 +25,12 @@ import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask; import org.bukkit.scheduler.BukkitTask;
public class Shop extends FreedomService import java.util.*;
public class Shop extends FreedomService implements ShoppeCommons
{ {
public final int coinsPerReactionWin = ConfigEntry.SHOP_REACTIONS_COINS_PER_WIN.getInteger(); private final int coinsPerReactionWin = ConfigEntry.SHOP_REACTIONS_COINS_PER_WIN.getInteger();
public final String prefix = ChatColor.DARK_GRAY + "[" + ChatColor.YELLOW + "Reaction" + ChatColor.DARK_GRAY + "] "; private final String prefix = ChatColor.DARK_GRAY + "[" + ChatColor.YELLOW + "Reaction" + ChatColor.DARK_GRAY + "] ";
private final String LOGIN_MESSAGE_GUI_TITLE = ChatColor.DARK_GREEN + ChatColor.BOLD.toString() + "Login Messages"; private final String LOGIN_MESSAGE_GUI_TITLE = ChatColor.DARK_GREEN + ChatColor.BOLD.toString() + "Login Messages";
public String reactionString = ""; public String reactionString = "";
public Date reactionStartTime; public Date reactionStartTime;
@ -49,6 +47,13 @@ public class Shop extends FreedomService
} }
} }
@Override
public int getCoinsPerReactionWin()
{
return coinsPerReactionWin;
}
@Override
public void startReactionTimer() public void startReactionTimer()
{ {
long interval = ConfigEntry.SHOP_REACTIONS_INTERVAL.getInteger() * 20L; long interval = ConfigEntry.SHOP_REACTIONS_INTERVAL.getInteger() * 20L;
@ -64,12 +69,14 @@ public class Shop extends FreedomService
}.runTaskLater(plugin, interval); }.runTaskLater(plugin, interval);
} }
@Override
public void forceStartReaction() public void forceStartReaction()
{ {
reactions.cancel(); reactions.cancel();
startReaction(); startReaction();
} }
@Override
public void startReaction() public void startReaction()
{ {
if (!ConfigEntry.SHOP_ENABLED.getBoolean()) if (!ConfigEntry.SHOP_ENABLED.getBoolean())
@ -101,8 +108,7 @@ public class Shop extends FreedomService
if ((seconds -= 1) == 0) if ((seconds -= 1) == 0)
{ {
endReaction(null); endReaction(null);
} } else
else
{ {
countdownBar.setProgress(seconds / max); countdownBar.setProgress(seconds / max);
if (!countdownBar.getColor().equals(BarColor.YELLOW) && seconds / max <= 0.25) if (!countdownBar.getColor().equals(BarColor.YELLOW) && seconds / max <= 0.25)
@ -114,6 +120,7 @@ public class Shop extends FreedomService
}.runTaskTimer(plugin, 0, 20); }.runTaskTimer(plugin, 0, 20);
} }
@Override
public void endReaction(String winner) public void endReaction(String winner)
{ {
countdownTask.cancel(); countdownTask.cancel();
@ -143,16 +150,19 @@ public class Shop extends FreedomService
} }
} }
@Override
public String getShopPrefix() public String getShopPrefix()
{ {
return FUtil.colorize(ConfigEntry.SHOP_PREFIX.getString()); return FUtil.colorize(ConfigEntry.SHOP_PREFIX.getString());
} }
@Override
public String getShopTitle() public String getShopTitle()
{ {
return FUtil.colorize(ConfigEntry.SHOP_TITLE.getString()); return FUtil.colorize(ConfigEntry.SHOP_TITLE.getString());
} }
@Override
public Inventory generateShopGUI(PlayerData playerData) public Inventory generateShopGUI(PlayerData playerData)
{ {
Inventory gui = server.createInventory(null, 36, getShopTitle()); Inventory gui = server.createInventory(null, 36, getShopTitle());
@ -180,6 +190,7 @@ public class Shop extends FreedomService
return gui; return gui;
} }
@Override
public Inventory generateLoginMessageGUI(Player player) public Inventory generateLoginMessageGUI(Player player)
{ {
Inventory gui = server.createInventory(null, 36, LOGIN_MESSAGE_GUI_TITLE); Inventory gui = server.createInventory(null, 36, LOGIN_MESSAGE_GUI_TITLE);
@ -203,11 +214,13 @@ public class Shop extends FreedomService
return gui; return gui;
} }
@Override
public boolean isRealItem(PlayerData data, ShopItem shopItem, PlayerInventory inventory, ItemStack realItem) public boolean isRealItem(PlayerData data, ShopItem shopItem, PlayerInventory inventory, ItemStack realItem)
{ {
return isRealItem(data, shopItem, inventory.getItemInMainHand(), realItem) || isRealItem(data, shopItem, inventory.getItemInOffHand(), realItem); return isRealItem(data, shopItem, inventory.getItemInMainHand(), realItem) || isRealItem(data, shopItem, inventory.getItemInOffHand(), realItem);
} }
@Override
public boolean isRealItem(PlayerData data, ShopItem shopItem, ItemStack givenItem, ItemStack realItem) public boolean isRealItem(PlayerData data, ShopItem shopItem, ItemStack givenItem, ItemStack realItem)
{ {
if (!data.hasItem(shopItem) || !givenItem.getType().equals(realItem.getType())) if (!data.hasItem(shopItem) || !givenItem.getType().equals(realItem.getType()))
@ -223,6 +236,7 @@ public class Shop extends FreedomService
return givenMeta.getDisplayName().equals(realMeta.getDisplayName()) && Objects.equals(givenMeta.getLore(), realMeta.getLore()); return givenMeta.getDisplayName().equals(realMeta.getDisplayName()) && Objects.equals(givenMeta.getLore(), realMeta.getLore());
} }
@Override
public ItemStack getLightningRod() public ItemStack getLightningRod()
{ {
ItemStack itemStack = new ItemStack(Material.BLAZE_ROD); ItemStack itemStack = new ItemStack(Material.BLAZE_ROD);
@ -235,6 +249,7 @@ public class Shop extends FreedomService
return itemStack; return itemStack;
} }
@Override
public ItemStack getGrapplingHook() public ItemStack getGrapplingHook()
{ {
ItemStack itemStack = new ItemStack(Material.FISHING_ROD); ItemStack itemStack = new ItemStack(Material.FISHING_ROD);
@ -246,6 +261,7 @@ public class Shop extends FreedomService
return itemStack; return itemStack;
} }
@Override
public ItemStack getFireBall() public ItemStack getFireBall()
{ {
ItemStack itemStack = new ItemStack(Material.FIRE_CHARGE); ItemStack itemStack = new ItemStack(Material.FIRE_CHARGE);
@ -257,6 +273,7 @@ public class Shop extends FreedomService
return itemStack; return itemStack;
} }
@Override
public ItemStack getRideablePearl() public ItemStack getRideablePearl()
{ {
ItemStack itemStack = new ItemStack(Material.ENDER_PEARL); ItemStack itemStack = new ItemStack(Material.ENDER_PEARL);
@ -269,6 +286,7 @@ public class Shop extends FreedomService
return itemStack; return itemStack;
} }
@Override
public ItemStack getStackingPotato() public ItemStack getStackingPotato()
{ {
ItemStack itemStack = new ItemStack(Material.POTATO); ItemStack itemStack = new ItemStack(Material.POTATO);
@ -280,6 +298,7 @@ public class Shop extends FreedomService
return itemStack; return itemStack;
} }
@Override
public ItemStack getClownFish() public ItemStack getClownFish()
{ {
ItemStack itemStack = new ItemStack(Material.TROPICAL_FISH); ItemStack itemStack = new ItemStack(Material.TROPICAL_FISH);
@ -291,16 +310,19 @@ public class Shop extends FreedomService
return itemStack; return itemStack;
} }
@Override
public boolean canAfford(int price, int coins) public boolean canAfford(int price, int coins)
{ {
return coins >= price; return coins >= price;
} }
@Override
public int amountNeeded(int price, int coins) public int amountNeeded(int price, int coins)
{ {
return price - coins; return price - coins;
} }
@Override
public ItemStack shopGUIItem(ShopItem item, PlayerData data) public ItemStack shopGUIItem(ShopItem item, PlayerData data)
{ {
ItemStack itemStack = new ItemStack(item.getIcon()); ItemStack itemStack = new ItemStack(item.getIcon());
@ -319,8 +341,7 @@ public class Shop extends FreedomService
lore.add(ChatColor.RED + "You can not afford this item!"); lore.add(ChatColor.RED + "You can not afford this item!");
lore.add(ChatColor.RED + "You need " + amountNeeded(price, coins) + " more coins to buy this item."); lore.add(ChatColor.RED + "You need " + amountNeeded(price, coins) + " more coins to buy this item.");
} }
} } else
else
{ {
lore.add(ChatColor.RED + "You already purchased this item."); lore.add(ChatColor.RED + "You already purchased this item.");
} }
@ -332,7 +353,7 @@ public class Shop extends FreedomService
@EventHandler(priority = EventPriority.HIGH) @EventHandler(priority = EventPriority.HIGH)
public void onShopGUIClick(InventoryClickEvent event) public void onShopGUIClick(InventoryClickEvent event)
{ {
if (!(event.getWhoClicked() instanceof Player)) if (!(event.getWhoClicked() instanceof Player player))
{ {
return; return;
} }
@ -350,7 +371,6 @@ public class Shop extends FreedomService
return; return;
} }
Player player = (Player)event.getWhoClicked();
PlayerData playerData = plugin.pl.getData(player); PlayerData playerData = plugin.pl.getData(player);
int price = shopItem.getCost(); int price = shopItem.getCost();
int coins = playerData.getCoins(); int coins = playerData.getCoins();
@ -377,7 +397,7 @@ public class Shop extends FreedomService
@EventHandler(priority = EventPriority.HIGH) @EventHandler(priority = EventPriority.HIGH)
public void onLoginMessageGUIClick(InventoryClickEvent event) public void onLoginMessageGUIClick(InventoryClickEvent event)
{ {
if (!(event.getWhoClicked() instanceof Player)) if (!(event.getWhoClicked() instanceof Player player))
{ {
return; return;
} }
@ -391,7 +411,6 @@ public class Shop extends FreedomService
int slot = event.getSlot(); int slot = event.getSlot();
Player player = (Player)event.getWhoClicked();
PlayerData data = plugin.pl.getData(player); PlayerData data = plugin.pl.getData(player);
if (slot == 35) if (slot == 35)
@ -399,8 +418,7 @@ public class Shop extends FreedomService
data.setLoginMessage(null); data.setLoginMessage(null);
plugin.pl.save(data); plugin.pl.save(data);
player.sendMessage(ChatColor.GREEN + "Removed your login message"); player.sendMessage(ChatColor.GREEN + "Removed your login message");
} } else
else
{ {
String message = ConfigEntry.SHOP_LOGIN_MESSAGES.getStringList().get(slot); String message = ConfigEntry.SHOP_LOGIN_MESSAGES.getStringList().get(slot);
data.setLoginMessage(message); data.setLoginMessage(message);
@ -413,24 +431,25 @@ public class Shop extends FreedomService
} }
@EventHandler @EventHandler
public void onPlayerChat(AsyncPlayerChatEvent event) public void onPlayerChat(AsyncChatEvent event)
{ {
String message = event.getMessage(); String message = event.message().toString();
Player player = event.getPlayer(); Player player = event.getPlayer();
if (ConfigEntry.SHOP_ENABLED.getBoolean() && ConfigEntry.SHOP_REACTIONS_ENABLED.getBoolean() if (ConfigEntry.SHOP_ENABLED.getBoolean() && ConfigEntry.SHOP_REACTIONS_ENABLED.getBoolean()
&& !plugin.sh.reactionString.isEmpty() && message.equals(plugin.sh.reactionString)) && !plugin.sh.getReactionString().isEmpty() && message.equals(plugin.sh.getReactionString()))
{ {
event.setCancelled(true); event.setCancelled(true);
PlayerData data = plugin.pl.getData(player); PlayerData data = plugin.pl.getData(player);
data.setCoins(data.getCoins() + plugin.sh.coinsPerReactionWin); data.setCoins(data.getCoins() + plugin.sh.getCoinsPerReactionWin());
plugin.pl.save(data); plugin.pl.save(data);
plugin.sh.endReaction(player.getName()); plugin.sh.endReaction(player.getName());
player.sendMessage(ChatColor.GREEN + "You have been given " + ChatColor.GOLD player.sendMessage(ChatColor.GREEN + "You have been given " + ChatColor.GOLD
+ plugin.sh.coinsPerReactionWin + ChatColor.GREEN + " coins!"); + plugin.sh.getCoinsPerReactionWin() + ChatColor.GREEN + " coins!");
} }
} }
@Override
public ShopItem getShopItem(int slot) public ShopItem getShopItem(int slot)
{ {
for (ShopItem shopItem : ShopItem.values()) for (ShopItem shopItem : ShopItem.values())
@ -442,4 +461,10 @@ public class Shop extends FreedomService
} }
return null; return null;
} }
@Override
public String getReactionString()
{
return reactionString;
}
} }

View File

@ -0,0 +1,53 @@
package me.totalfreedom.shop;
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
import me.totalfreedom.totalfreedommod.api.Context;
import me.totalfreedom.totalfreedommod.api.ShoppeCommons;
import org.bukkit.plugin.java.JavaPlugin;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TFShoppe extends JavaPlugin
{
private final Logger slf4j = LoggerFactory.getLogger("TF-Shoppe");
private Shop shop;
private Votifier votifier;
public Logger slf4j()
{
return slf4j;
}
@Override
public void onEnable()
{
slf4j().info("Hello from the TF-Shoppe! Attempting to resolve TotalFreedomMod...");
TotalFreedomMod plugin = (TotalFreedomMod) getServer().getPluginManager().getPlugin("TotalFreedomMod");
if (plugin == null)
{
slf4j().error("TotalFreedomMod not found! Disabling...");
onDisable();
return;
}
slf4j().info("TotalFreedomMod found! Registering the shop...");
shop = new Shop();
slf4j().info("Shop registered! Registering the Votifier listener...");
votifier = new Votifier();
slf4j().info("Votifier listener registered! Providing context to TFM...");
Context<ShoppeCommons> context = new Context<>(shop);
plugin.ag.setShoppeContext(context);
plugin.registerShoppe();
slf4j().info("Context provided! TF-Shoppe is now ready to go!");
}
@Override
public void onDisable()
{
slf4j().info("Goodbye from the TF-Shoppe!");
}
}

View File

@ -16,11 +16,13 @@ public class Votifier extends FreedomService
@Override @Override
public void onStart() public void onStart()
{ {
// This is here to please SonarLint.
} }
@Override @Override
public void onStop() public void onStop()
{ {
// This is here to please SonarLint.
} }
@EventHandler(priority = EventPriority.NORMAL) @EventHandler(priority = EventPriority.NORMAL)