diff --git a/api/src/main/java/com/alttd/chat/config/Config.java b/api/src/main/java/com/alttd/chat/config/Config.java index ca1e55a..c67349d 100755 --- a/api/src/main/java/com/alttd/chat/config/Config.java +++ b/api/src/main/java/com/alttd/chat/config/Config.java @@ -296,4 +296,16 @@ public final class Config { NOTIFICATIONFORMAT = getString("settings.blockedmessage-notification", NOTIFICATIONFORMAT); } + public static String mailHeader = "===== List Mails ====='"; + public static String mailBody = "From: on:\n"; + public static String mailFooter = "======================"; + public static String mailNoUser = "A player with this name hasn't logged in recently."; + public static List mailCommandAlias = new ArrayList<>(); + private static void mailSettings() { + mailHeader = getString("settings.mail.header", mailHeader); + mailBody = getString("settings.mail.message", mailBody); + mailFooter = getString("settings.mail.footer", mailFooter); + mailCommandAlias = getList("settings.mail.command-aliases", Lists.newArrayList("gmail")); + } + } diff --git a/api/src/main/java/com/alttd/chat/database/Queries.java b/api/src/main/java/com/alttd/chat/database/Queries.java index 2dc67dc..75d39ac 100755 --- a/api/src/main/java/com/alttd/chat/database/Queries.java +++ b/api/src/main/java/com/alttd/chat/database/Queries.java @@ -9,10 +9,7 @@ import com.alttd.chat.objects.PartyUser; import com.alttd.chat.objects.channels.Channel; import com.alttd.chat.util.ALogger; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; +import java.sql.*; import java.util.*; import java.util.List; @@ -25,7 +22,7 @@ public class Queries { tables.add("CREATE TABLE IF NOT EXISTS ignored_users (`uuid` VARCHAR(36) NOT NULL, `ignored_uuid` VARCHAR(36) NOT NULL, PRIMARY KEY (`uuid`, `ignored_uuid`))"); tables.add("CREATE TABLE IF NOT EXISTS parties (`id` INT NOT NULL AUTO_INCREMENT, `owner_uuid` VARCHAR(36) NOT NULL, `party_name` VARCHAR(36) NOT NULL, `password` VARCHAR(36), PRIMARY KEY (`id`))"); tables.add("CREATE TABLE IF NOT EXISTS chat_users (`uuid` VARCHAR(36) NOT NULL, `party_id` INT NOT NULL, `toggled_channel` VARCHAR(36) NULL DEFAULT NULL, PRIMARY KEY (`uuid`))"); - tables.add("CREATE TABLE IF NOT EXISTS mails (`id` INT NOT NULL AUTO_INCREMENT, `uuid` VARCHAR(36) NOT NULL, `from` VARCHAR(36) NOT NULL, `message` VARCHAR(256) NOT NULL, `sendtime` BIGINT default 0, `readtime` BIGINT default 0, PRIMARY KEY (`id`))"); + tables.add("CREATE TABLE IF NOT EXISTS mails (`id` INT NOT NULL AUTO_INCREMENT, `uuid` VARCHAR(36) NOT NULL, `sender` VARCHAR(36) NOT NULL, `message` VARCHAR(256) NOT NULL, `sendtime` BIGINT default 0, `readtime` BIGINT default 0, PRIMARY KEY (`id`))"); try { Connection connection = DatabaseConnection.getConnection(); @@ -412,11 +409,12 @@ public class Queries { ResultSet resultSet = statement.executeQuery(); while (resultSet.next()) { - UUID fromUUID = UUID.fromString(resultSet.getString("from")); + int id = resultSet.getInt("id"); + UUID fromUUID = UUID.fromString(resultSet.getString("sender")); String message = resultSet.getString("message"); long sendTime = resultSet.getLong("sendtime"); long readTime = resultSet.getLong("readtime"); - mails.add(new Mail(uuid, fromUUID, sendTime, readTime, message)); + mails.add(new Mail(id, uuid, fromUUID, sendTime, readTime, message)); } } catch (SQLException e) { e.printStackTrace(); @@ -504,4 +502,47 @@ public class Queries { } return uuid; } + + public static int insertMail(Mail mail) { + String query = "INSERT INTO mails (uuid , sender, message, sendtime, readtime) VALUES (?, ?, ?, ?, ?)"; + int id = 0; + try { + Connection connection = DatabaseConnection.getConnection(); + PreparedStatement statement = connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS); + statement.setString(1, mail.getUuid().toString()); + statement.setString(2, mail.getSender().toString()); + statement.setString(3, mail.getMessage()); + statement.setLong(4, mail.getSendTime()); + statement.setLong(5, mail.getReadTime()); + + statement.execute(); + + ResultSet rs = statement.getGeneratedKeys(); + if (rs.next()) { + id = rs.getInt(1); + } + } catch (SQLException e) { + e.printStackTrace(); + } + return id; + } + + public static void markMailRead(Mail mail) { + String query = "INSERT INTO mails (Id, uuid , sender, message, sendtime, readtime) VALUES (?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE readtime = ?"; + try { + Connection connection = DatabaseConnection.getConnection(); + PreparedStatement statement = connection.prepareStatement(query); + statement.setInt(1, mail.getId()); + statement.setString(2, mail.getUuid().toString()); + statement.setString(3, mail.getSender().toString()); + statement.setString(4, mail.getMessage()); + statement.setLong(5, mail.getSendTime()); + statement.setLong(6, mail.getReadTime()); + statement.setLong(7, mail.getReadTime()); + + statement.execute(); + } catch (SQLException e) { + e.printStackTrace(); + } + } } diff --git a/api/src/main/java/com/alttd/chat/managers/ChatUserManager.java b/api/src/main/java/com/alttd/chat/managers/ChatUserManager.java index a0bc1f7..e41728c 100755 --- a/api/src/main/java/com/alttd/chat/managers/ChatUserManager.java +++ b/api/src/main/java/com/alttd/chat/managers/ChatUserManager.java @@ -27,10 +27,4 @@ public final class ChatUserManager { return chatUsers.computeIfAbsent(uuid, k -> Queries.loadChatUser(uuid)); } - public List getUnReadMail(ChatUser user) { - return user.getMails().stream() - .filter(Mail::isUnRead) - .collect(Collectors.toList()); - } - } diff --git a/api/src/main/java/com/alttd/chat/objects/ChatUser.java b/api/src/main/java/com/alttd/chat/objects/ChatUser.java index c9d853c..b48def5 100755 --- a/api/src/main/java/com/alttd/chat/objects/ChatUser.java +++ b/api/src/main/java/com/alttd/chat/objects/ChatUser.java @@ -8,6 +8,7 @@ import net.kyori.adventure.text.Component; import java.util.ArrayList; import java.util.List; import java.util.UUID; +import java.util.stream.Collectors; public class ChatUser { private final UUID uuid; // player uuid @@ -108,6 +109,12 @@ public class ChatUser { return mails; } + public List getUnReadMail() { + return getMails().stream() + .filter(Mail::isUnRead) + .collect(Collectors.toList()); + } + public void addMail(Mail mail) { mails.add(mail); } diff --git a/api/src/main/java/com/alttd/chat/objects/Mail.java b/api/src/main/java/com/alttd/chat/objects/Mail.java index d90f177..8c2b1a1 100755 --- a/api/src/main/java/com/alttd/chat/objects/Mail.java +++ b/api/src/main/java/com/alttd/chat/objects/Mail.java @@ -1,16 +1,20 @@ package com.alttd.chat.objects; +import com.alttd.chat.database.Queries; + import java.util.UUID; public class Mail { + private final int id; private final UUID uuid; private final UUID sender; private final long sendTime; private long readTime; private final String message; - public Mail(UUID player, UUID sender, long sendTime, long readTime, String message) { + public Mail(int id, UUID player, UUID sender, long sendTime, long readTime, String message) { + this.id = id; this.uuid = player; this.sender = sender; this.sendTime = sendTime; @@ -21,9 +25,15 @@ public class Mail { public Mail(UUID player, UUID sender, String message) { this.uuid = player; this.sender = sender; - this.sendTime = System.currentTimeMillis(); - this.readTime = System.currentTimeMillis(); + long time = System.currentTimeMillis(); + this.sendTime = time; + this.readTime = time; this.message = message; + this.id = Queries.insertMail(this); + } + + public int getId() { + return id; } public UUID getUuid() { @@ -35,7 +45,7 @@ public class Mail { } public boolean isUnRead() { - return getSendTime() != getReadTime(); + return getSendTime() == getReadTime(); } public long getSendTime() { diff --git a/velocity/src/main/java/com/alttd/velocitychat/VelocityChat.java b/velocity/src/main/java/com/alttd/velocitychat/VelocityChat.java index 169b9d9..eccbf32 100755 --- a/velocity/src/main/java/com/alttd/velocitychat/VelocityChat.java +++ b/velocity/src/main/java/com/alttd/velocitychat/VelocityChat.java @@ -2,7 +2,11 @@ package com.alttd.velocitychat; import com.alttd.chat.ChatAPI; import com.alttd.chat.ChatImplementation; +import com.alttd.chat.managers.ChatUserManager; +import com.alttd.chat.objects.ChatUser; +import com.alttd.chat.util.Utility; import com.alttd.velocitychat.commands.GlobalAdminChat; +import com.alttd.velocitychat.commands.MailCommand; import com.alttd.velocitychat.commands.Reload; import com.alttd.chat.config.Config; import com.alttd.chat.database.DatabaseConnection; @@ -71,8 +75,11 @@ public class VelocityChat { channelIdentifier = MinecraftChannelIdentifier.create(channels[0], channels[1]); server.getChannelRegistrar().register(channelIdentifier); server.getEventManager().register(this, new PluginMessageListener(channelIdentifier)); - loadCommands(); + // setup console chatuser + ChatUser console = new ChatUser(Config.CONSOLEUUID, -1, null); + console.setDisplayName(Config.CONSOLENAME); + ChatUserManager.addUser(console); } public void ReloadConfig() { @@ -104,6 +111,7 @@ public class VelocityChat { public void loadCommands() { new GlobalAdminChat(server); new Reload(server); + new MailCommand(server); // all (proxy)commands go here } diff --git a/velocity/src/main/java/com/alttd/velocitychat/commands/MailCommand.java b/velocity/src/main/java/com/alttd/velocitychat/commands/MailCommand.java index 61f6f57..7559983 100755 --- a/velocity/src/main/java/com/alttd/velocitychat/commands/MailCommand.java +++ b/velocity/src/main/java/com/alttd/velocitychat/commands/MailCommand.java @@ -1,5 +1,6 @@ package com.alttd.velocitychat.commands; +import com.alttd.chat.config.Config; import com.alttd.velocitychat.VelocityChat; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; @@ -77,20 +78,9 @@ public class MailCommand { }) ) .then(playerNode - .then(LiteralArgumentBuilder.literal("unread") - .executes(context -> { - VelocityChat.getPlugin().getChatHandler().readMail(context.getSource(), context.getArgument("player", String.class), true); - return 1; - }) - ) - .then(LiteralArgumentBuilder.literal("all") - .executes(context -> { - VelocityChat.getPlugin().getChatHandler().readMail(context.getSource(), context.getArgument("player", String.class), false); - return 1; - }) - ) + .requires(ctx -> ctx.hasPermission("command.chat.mail.list.other"))// TODO permission .executes(context -> { - sendHelpMessage(context.getSource()); + VelocityChat.getPlugin().getChatHandler().readMail(context.getSource(), context.getArgument("player", String.class)); return 1; }) ) @@ -113,9 +103,9 @@ public class MailCommand { CommandMeta.Builder metaBuilder = proxyServer.getCommandManager().metaBuilder(brigadierCommand); - /*for (String alias : Config.MAILCOMMANDALIASES) { + for (String alias : Config.mailCommandAlias) { metaBuilder.aliases(alias); - }*/ + } CommandMeta meta = metaBuilder.build(); diff --git a/velocity/src/main/java/com/alttd/velocitychat/handlers/ChatHandler.java b/velocity/src/main/java/com/alttd/velocitychat/handlers/ChatHandler.java index 702afd0..eb8df44 100755 --- a/velocity/src/main/java/com/alttd/velocitychat/handlers/ChatHandler.java +++ b/velocity/src/main/java/com/alttd/velocitychat/handlers/ChatHandler.java @@ -1,6 +1,7 @@ package com.alttd.velocitychat.handlers; import com.alttd.chat.config.Config; +import com.alttd.chat.database.Queries; import com.alttd.chat.managers.ChatUserManager; import com.alttd.chat.managers.PartyManager; import com.alttd.chat.objects.ChatUser; @@ -139,37 +140,41 @@ public class ChatHandler { optionalPlayer.ifPresent(player -> player.sendMessage(Utility.parseMiniMessage("New mail from " + finalSenderName))); } - public void readMail(CommandSource commandSource, String targetPlayer, boolean unread) { + public void readMail(CommandSource commandSource, String targetPlayer) { UUID uuid = ServerHandler.getPlayerUUID(targetPlayer); if (uuid == null) { - commandSource.sendMessage(Utility.parseMiniMessage("A player with this name hasn't logged in recently.")); // TOOD load from config + commandSource.sendMessage(Utility.parseMiniMessage(Config.mailNoUser)); return; } ChatUser chatUser = ChatUserManager.getChatUser(uuid); - commandSource.sendMessage(getMails(chatUser.getMails(), false)); + commandSource.sendMessage(parseMails(chatUser.getMails(), false)); } public void readMail(CommandSource commandSource, boolean unread) { if (commandSource instanceof Player player) { ChatUser chatUser = ChatUserManager.getChatUser(player.getUniqueId()); - commandSource.sendMessage(getMails(chatUser.getMails(), unread)); + commandSource.sendMessage(parseMails(unread ? chatUser.getUnReadMail() : chatUser.getMails(), unread)); } } - private Component getMails(List mails, boolean mark) { - Component component = Component.empty(); + private Component parseMails(List mails, boolean mark) { + Component component = Utility.parseMiniMessage(Config.mailHeader); for (Mail mail : mails) { - if (mail.isUnRead() && mark) mail.setReadTime(System.currentTimeMillis()); + if (mail.isUnRead() && mark) { + mail.setReadTime(System.currentTimeMillis()); + Queries.markMailRead(mail); + } ChatUser chatUser = ChatUserManager.getChatUser(mail.getSender()); List