linking system

This commit is contained in:
Taah 2024-02-08 19:13:00 -08:00
parent 7db66d0813
commit 3ded7993e9
5 changed files with 134 additions and 1 deletions

View File

@ -1,6 +1,8 @@
package dev.plex.futura; package dev.plex.futura;
import dev.plex.futura.bot.BotHandler; import dev.plex.futura.bot.BotHandler;
import dev.plex.futura.bot.linking.LinkingManager;
import dev.plex.futura.bot.listener.LinkingListener;
import dev.plex.futura.config.Config; import dev.plex.futura.config.Config;
import dev.plex.futura.listener.ChatListener; import dev.plex.futura.listener.ChatListener;
import org.bstats.bukkit.Metrics; import org.bstats.bukkit.Metrics;
@ -13,6 +15,7 @@ public final class Futura extends JavaPlugin
private static Futura plugin; private static Futura plugin;
private BotHandler botHandler; private BotHandler botHandler;
private LinkingManager linkingManager;
public Config config; public Config config;
public Config messages; public Config messages;
@ -31,6 +34,7 @@ public final class Futura extends JavaPlugin
this.saveResource("messages.yml", false); this.saveResource("messages.yml", false);
} }
botHandler = new BotHandler(); botHandler = new BotHandler();
linkingManager = new LinkingManager();
} }
@Override @Override
@ -43,6 +47,7 @@ public final class Futura extends JavaPlugin
if (this.botHandler.ready()) if (this.botHandler.ready())
{ {
this.botHandler.jda().addEventListener(chatListener); this.botHandler.jda().addEventListener(chatListener);
this.botHandler.jda().addEventListener(new LinkingListener());
} }
// Metrics @ https://bstats.org/plugin/bukkit/Futura/20848 // Metrics @ https://bstats.org/plugin/bukkit/Futura/20848
@ -63,4 +68,9 @@ public final class Futura extends JavaPlugin
{ {
return this.botHandler; return this.botHandler;
} }
public LinkingManager linkingManager()
{
return this.linkingManager;
}
} }

View File

@ -0,0 +1,74 @@
package dev.plex.futura.bot.linking;
import com.google.common.collect.Maps;
import dev.plex.futura.Futura;
import net.kyori.adventure.text.minimessage.MiniMessage;
import org.apache.commons.lang3.RandomStringUtils;
import org.bukkit.entity.Player;
import java.util.Map;
import java.util.UUID;
/**
* @author Taah
* @since 6:51 PM [02-08-2024]
*/
public class LinkingManager
{
private static final Map<UUID, String> CODES = Maps.newHashMap();
private final boolean enabled;
public LinkingManager()
{
this.enabled = Futura.plugin().config.getBoolean("discord.linking.enabled", false);
}
public void requestCode(Player player)
{
if (!Futura.plugin().botHandler().ready())
{
player.sendMessage("<red>The bot is not connected / online. Please contact an administrator.");
return;
}
if (!this.enabled)
{
player.sendMessage(MiniMessage.miniMessage().deserialize(Futura.plugin().messages.getString("linkingDisabled", "<red>Discord to Minecraft account linking is currently disabled.")));
return;
}
//TODO: Check if user is already linked on cache loaded from database
final UUID uuid = player.getUniqueId();
if (CODES.containsKey(uuid))
{
player.sendMessage(MiniMessage.miniMessage().deserialize(Futura.plugin().messages.getString("accountLinkingInProgress", "<red>Can't request a new code currently, user has already requested a code. Please try again in a minute.")));
return;
}
final String code = RandomStringUtils.randomAlphanumeric(8).toLowerCase();
CODES.put(uuid, code);
final int expirationTime = Futura.plugin().config.getInt("discord.linking.expirationTime", 60);
final String codeRequested = Futura.plugin().messages.getString("codeRequested", "<green>The code you have requested is %code%. Please do not share this. In order to link your account, message the %bot-name% bot with your code. This code will expire in %expirationTime% seconds.")
.replace("%code%", code)
.replace("%bot-name%", Futura.plugin().botHandler().jda().getSelfUser().getName())
.replace("%expiration-time%", String.valueOf(expirationTime));
player.sendMessage(MiniMessage.miniMessage().deserialize(codeRequested));
Futura.plugin().getServer().getScheduler().runTaskLater(Futura.plugin(), () ->
{
CODES.remove(uuid);
}, 20L * expirationTime);
}
public UUID matchCode(String code)
{
final Map.Entry<UUID, String> uuidStringEntry = CODES.entrySet().stream().filter(entry -> entry.getValue().equals(code)).findFirst().orElse(null);
if (uuidStringEntry == null)
{
return null;
}
return uuidStringEntry.getKey();
}
}

View File

@ -0,0 +1,32 @@
package dev.plex.futura.bot.listener;
import dev.plex.futura.Futura;
import net.dv8tion.jda.api.entities.channel.ChannelType;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import org.jetbrains.annotations.NotNull;
import java.util.UUID;
/**
* @author Taah
* @since 7:05 PM [02-08-2024]
*/
public class LinkingListener extends ListenerAdapter
{
@Override
public void onMessageReceived(@NotNull MessageReceivedEvent event)
{
if (event.getAuthor().isBot()) return;
if (event.getChannelType() != ChannelType.PRIVATE) return;
final String messageContent = event.getMessage().getContentRaw().toLowerCase();
final UUID uuid = Futura.plugin().linkingManager().matchCode(messageContent);
if (uuid == null)
{
// Invalid Code
return;
}
//TODO: Code was valid, link user, store user in cache and future database
}
}

View File

@ -9,6 +9,8 @@ discord:
# #
linking: linking:
enabled: false enabled: false
# Time in seconds the code will be valid for until it expires and a new one will have to be requested for
expirationTime: 60
# You can leave this blank for no role to be given on linking # You can leave this blank for no role to be given on linking
role: "" role: ""
# Roles sync if LuckPerms is on the server only # Roles sync if LuckPerms is on the server only
@ -18,3 +20,13 @@ discord:
# luckpermsGroupName: "discordRoleId" # luckpermsGroupName: "discordRoleId"
roles: roles:
sync: false sync: false
database:
# sqlite, mysql
type: sqlite
auth:
user: ""
password: ""
host: ""
port: 3306
database: ""

View File

@ -6,3 +6,8 @@ leftServer: "**%player% has left the server!"
serverOffline: ":octagonal_sign: **Server is now offline!**" serverOffline: ":octagonal_sign: **Server is now offline!**"
serverOnline: ":white_check_mark: **Server is now online!**" serverOnline: ":white_check_mark: **Server is now online!**"
linkingDisabled: "<red>Discord to Minecraft account linking is currently disabled."
accountLinkingInProgress: "<red>Can't request a new code currently, user has already requested a code. Please try again in a minute."
codeRequested: "<green>The code you have requested is %code%. Please do not share this. In order to link your account, message the %bot-name% bot with your code. This code will expire in %expiration-time% seconds."