diff --git a/src/main/java/ren/taske/nativebot/MinecraftPlugin.java b/src/main/java/ren/taske/nativebot/MinecraftPlugin.java index 4ffdb67..f9cb1c3 100644 --- a/src/main/java/ren/taske/nativebot/MinecraftPlugin.java +++ b/src/main/java/ren/taske/nativebot/MinecraftPlugin.java @@ -1,23 +1,46 @@ package ren.taske.nativebot; +import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.plugin.java.JavaPlugin; +import cc.moecraft.icq.event.events.message.EventMessage; +import ren.taske.nativebot.bot.chatting.Chatting; +import ren.taske.nativebot.bot.chatting.MinecraftMessage; +import ren.taske.nativebot.bot.chatting.TencentMessage; import ren.taske.nativebot.core.NativeBot; public class MinecraftPlugin extends JavaPlugin { - protected final NativeBot core = new NativeBot(this); + protected final NativeBot nativebot = new NativeBot(this); + protected final Chatting chatting = new Chatting(this); + + protected final MinecraftMessage mcevent = new MinecraftMessage(this); + protected final TencentMessage tencentevent = new TencentMessage(this); @Override public void onEnable() { - core.onEnable(); + nativebot.onEnable(); + nativebot.getBot().register(tencentevent); + getServer().getPluginManager().registerEvents(mcevent, this); super.onEnable(); } @Override public void onDisable() { - core.onDisable(); + nativebot.onDisable(); super.onDisable(); } + public NativeBot getBot() { + return this.nativebot; + } + + public void onTencentMessage(EventMessage evt) { + chatting.onTencentMessage(evt); + } + + public void onMinecraftMessage(AsyncPlayerChatEvent evt) { + chatting.onMinecraftMessage(evt); + } + } diff --git a/src/main/java/ren/taske/nativebot/bot/Bot.java b/src/main/java/ren/taske/nativebot/bot/Bot.java index 2fe3b33..8f93126 100644 --- a/src/main/java/ren/taske/nativebot/bot/Bot.java +++ b/src/main/java/ren/taske/nativebot/bot/Bot.java @@ -7,6 +7,7 @@ import cc.moecraft.icq.PicqBotX; import cc.moecraft.icq.PicqConfig; import cc.moecraft.icq.command.CommandManager; import cc.moecraft.icq.command.interfaces.IcqCommand; +import cc.moecraft.icq.event.IcqListener; import cc.moecraft.icq.sender.IcqHttpApi; import cc.moecraft.logger.environments.ColorSupportLevel; import ren.taske.nativebot.commons.Config; @@ -49,6 +50,15 @@ public class Bot extends Thread { register(cmds.toArray(new IcqCommand[0])); } + + /** + * Add event listener for bot + * @param listeners listeners + */ + public void register(IcqListener...listeners) { + bot.getEventManager().registerListeners(listeners); + } + /** * To start the bot.
* But wait! Did you {@code register} the commands? diff --git a/src/main/java/ren/taske/nativebot/bot/chatting/Chatting.java b/src/main/java/ren/taske/nativebot/bot/chatting/Chatting.java new file mode 100644 index 0000000..0f157fe --- /dev/null +++ b/src/main/java/ren/taske/nativebot/bot/chatting/Chatting.java @@ -0,0 +1,109 @@ +package ren.taske.nativebot.bot.chatting; + +import org.bukkit.event.player.AsyncPlayerChatEvent; + +import cc.moecraft.icq.event.events.message.EventMessage; +import cc.moecraft.icq.user.User; +import cc.moecraft.icq.utils.CQUtils; +import ren.taske.nativebot.MinecraftPlugin; +import ren.taske.nativebot.commons.Config; +import ren.taske.nativebot.core.NativeBot; +import ren.taske.nativebot.core.profile.UserMinecraft; +import ren.taske.nativebot.core.profile.UserTencent; +import ren.taske.nativebot.util.MessageLib; + +public class Chatting { + + protected final MinecraftPlugin plugin; + protected final NativeBot nativebot; + + public Chatting(MinecraftPlugin plugin) { + this.plugin = plugin; + this.nativebot = plugin.getBot(); + } + + public static final String NODE_CHATTING_TENCENT = "chatting.tencent"; + public static final String NODE_CHATTING_MINECRAFT = "chatting.minecraft"; + + /** + * To handle messages from Tencent + * @param evt PicqBotX message event + */ + public void onTencentMessage(EventMessage evt) { + User user = evt.getSender(); + long userid = user.getId(); + UserTencent ut = UserTencent.of(userid); + String message = evt.getMessage(); + String username = user.getInfo().getNickname(); + + if(!isPrefixed(message)) { + return; + } + + if(!ut.hasPermission(NODE_CHATTING_TENCENT, true)) { + evt.respond(MessageLib.getUnauthorizedMessage(user)); + return; + } + + if(isPrefixed(message)) { + + message = removePrefix(message); + message = CQUtils.removeCqCode(message); + + StringBuffer sb = new StringBuffer(); + sb.append("<").append(username).append("> ").append("\u00a7r"); + sb.append(message); + + plugin.getServer().broadcastMessage(sb.toString()); + + } + + } + + /** + * To handle messages from Minecraft + * @param evt Minecraft chatting event + */ + public void onMinecraftMessage(AsyncPlayerChatEvent evt) { + + String message = evt.getMessage(); + String username = evt.getPlayer().getName(); + UserMinecraft um = UserMinecraft.of(username); + + if(!isPrefixed(message)) { + return; + } + + if(!um.hasPermission(NODE_CHATTING_MINECRAFT, true)) { + evt.getPlayer().sendMessage("You're Unauthorized!"); + return; + } + + if(isPrefixed(message)) { + + message = removePrefix(message); + + evt.setMessage(message); + + StringBuffer sb = new StringBuffer(); + sb.append("\uff3b").append(username).append("\uff3d "); + sb.append(message); + + plugin.getBot().getBot().sendGroupMessage(Config.group_id, sb.toString()); + + } + + } + + public static boolean isPrefixed(String message) { + for(String prefix : Config.chatting_prefixes) { + if(message.startsWith(prefix)) return true; + } + return false; + } + + public static String removePrefix(String message) { + return message.length() < 1 ? "" : message.substring(1); + } + +} diff --git a/src/main/java/ren/taske/nativebot/bot/chatting/MinecraftMessage.java b/src/main/java/ren/taske/nativebot/bot/chatting/MinecraftMessage.java new file mode 100644 index 0000000..436c25b --- /dev/null +++ b/src/main/java/ren/taske/nativebot/bot/chatting/MinecraftMessage.java @@ -0,0 +1,22 @@ +package ren.taske.nativebot.bot.chatting; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; + +import ren.taske.nativebot.MinecraftPlugin; + +public class MinecraftMessage implements Listener { + + protected final MinecraftPlugin plugin; + + public MinecraftMessage(MinecraftPlugin plugin) { + this.plugin = plugin; + } + + @EventHandler + public void message(AsyncPlayerChatEvent evt) { + plugin.onMinecraftMessage(evt); + } + +} diff --git a/src/main/java/ren/taske/nativebot/bot/chatting/TencentMessage.java b/src/main/java/ren/taske/nativebot/bot/chatting/TencentMessage.java new file mode 100644 index 0000000..5396a37 --- /dev/null +++ b/src/main/java/ren/taske/nativebot/bot/chatting/TencentMessage.java @@ -0,0 +1,21 @@ +package ren.taske.nativebot.bot.chatting; + +import cc.moecraft.icq.event.EventHandler; +import cc.moecraft.icq.event.IcqListener; +import cc.moecraft.icq.event.events.message.EventMessage; +import ren.taske.nativebot.MinecraftPlugin; + +public class TencentMessage extends IcqListener { + + protected final MinecraftPlugin plugin; + + public TencentMessage(MinecraftPlugin plugin) { + this.plugin = plugin; + } + + @EventHandler + public void message(EventMessage evt) { + plugin.onTencentMessage(evt); + } + +} diff --git a/src/main/java/ren/taske/nativebot/bot/command/CommandAbout.java b/src/main/java/ren/taske/nativebot/bot/command/CommandAbout.java index d5b5b16..a72d41a 100644 --- a/src/main/java/ren/taske/nativebot/bot/command/CommandAbout.java +++ b/src/main/java/ren/taske/nativebot/bot/command/CommandAbout.java @@ -18,7 +18,9 @@ public class CommandAbout extends CommandBase { "(command with * requires OP_PERMISSION_NODE)", "/about[/bot|/help] - show this notice", "/op - query if you're operator", - "/op* [userid] - set user as operator"); + "/op* [uid] - set user as operator", + "/perm* [uid] [node] - get the value of the node", + "/perm* [uid] [node] [true/false] - set the value of the node"); } } diff --git a/src/main/java/ren/taske/nativebot/bot/command/CommandPermission.java b/src/main/java/ren/taske/nativebot/bot/command/CommandPermission.java new file mode 100644 index 0000000..0d5cee1 --- /dev/null +++ b/src/main/java/ren/taske/nativebot/bot/command/CommandPermission.java @@ -0,0 +1,57 @@ +package ren.taske.nativebot.bot.command; + +import java.util.ArrayList; + +import cc.moecraft.icq.event.events.message.EventMessage; +import cc.moecraft.icq.user.User; +import ren.taske.data.util.ParseUtil; +import ren.taske.nativebot.commons.Reference; +import ren.taske.nativebot.core.profile.UserTencent; +import ren.taske.nativebot.util.MessageUtils; + +public class CommandPermission extends CommandBase { + + public CommandPermission() { + super("perm", Reference.NODE_OP, "permission"); + } + + @Override + public String execute(EventMessage evt, User user, long userid, String command, ArrayList args) { + String message = ""; + if(args.size() < 2) { + message = "Wrong Arguments!"; + } + if(args.size() >= 2) { + String username = args.get(0); + String nodename = args.get(1); + + Long uid = ParseUtil.parseLong(username); + + if(uid != null) { + + UserTencent u = UserTencent.of(userid); + + if(args.size() == 2) { + message = nodename + " = " + u.hasPermission(nodename); + } + + if(args.size() > 2) { + boolean value = ParseUtil.parseBoolean(args.get(2)); + u.setPermission(nodename, value); + + StringBuffer sb = new StringBuffer(); + sb.append(nodename).append("(").append(uid).append(")"); + sb.append(" set to ").append(value); + + message = sb.toString(); + } + + } else { + message = "NumberFormatException!"; + } + + } + return MessageUtils.retAt(userid, message); + } + +} diff --git a/src/main/java/ren/taske/nativebot/commons/Config.java b/src/main/java/ren/taske/nativebot/commons/Config.java index cf1c189..7b95ca7 100644 --- a/src/main/java/ren/taske/nativebot/commons/Config.java +++ b/src/main/java/ren/taske/nativebot/commons/Config.java @@ -17,6 +17,10 @@ public class Config { public static String url_out; public static String[] prefixes; + // The Chatting Settings + public static long group_id; + public static String[] chatting_prefixes; + public static void refresh() { port_in = cfg.getInt("in", "constructor", 25560, 0, 65535, "The port for receiving messages"); @@ -24,6 +28,9 @@ public class Config { url_out = cfg.getString("url", "constructor", "127.0.0.1", "The url for sending message to HttpApi"); prefixes = cfg.getStringList("prefixes", "constructor", new String[] {"/"}, "The prefixes of commands in Tencent"); + group_id = cfg.get("chatting", "group", "139971220").getLong(0L); + chatting_prefixes = cfg.getStringList("prefixes", "chatting", new String[] {"!", "\uff01"}, "The prefixes of chatting"); + cfg.save(); } diff --git a/src/main/java/ren/taske/nativebot/core/NativeBot.java b/src/main/java/ren/taske/nativebot/core/NativeBot.java index a0bb697..fb53d29 100644 --- a/src/main/java/ren/taske/nativebot/core/NativeBot.java +++ b/src/main/java/ren/taske/nativebot/core/NativeBot.java @@ -8,6 +8,7 @@ import cc.moecraft.icq.command.interfaces.IcqCommand; import ren.taske.nativebot.bot.Bot; import ren.taske.nativebot.bot.command.CommandAbout; import ren.taske.nativebot.bot.command.CommandOperator; +import ren.taske.nativebot.bot.command.CommandPermission; import ren.taske.nativebot.util.ClassUtils; public class NativeBot { @@ -17,13 +18,13 @@ public class NativeBot { @SuppressWarnings("unchecked") private static final Class[] COMMAND_CLASSES = new Class[] { CommandAbout.class, - CommandOperator.class + CommandOperator.class, + CommandPermission.class }; protected final JavaPlugin plugin; protected final Bot bot; - public NativeBot(JavaPlugin plugin) { this.plugin = plugin; this.bot = new Bot(); @@ -36,6 +37,10 @@ public class NativeBot { return logger; } + public Bot getBot() { + return this.bot; + } + public void onEnable() { bot.register(ClassUtils.instantiate(COMMAND_CLASSES)); bot.start(); diff --git a/src/main/java/ren/taske/nativebot/core/profile/UserMinecraft.java b/src/main/java/ren/taske/nativebot/core/profile/UserMinecraft.java index a7f6fd0..70fd144 100644 --- a/src/main/java/ren/taske/nativebot/core/profile/UserMinecraft.java +++ b/src/main/java/ren/taske/nativebot/core/profile/UserMinecraft.java @@ -36,7 +36,24 @@ public class UserMinecraft extends User { @Override public void reload() { - + data.save(); + } + + public boolean hasPermission(String node) { + return hasPermission(node, false); + } + + public boolean hasPermission(String node, boolean defaultVal) { + if(node != null) { + data.setDefault(node, defaultVal); + data.save(); + } + return data.getBoolean(node, false); + } + + public void setPermission(String node, boolean val) { + data.setBoolean(node, val); + data.save(); } } diff --git a/src/main/java/ren/taske/nativebot/core/profile/UserTencent.java b/src/main/java/ren/taske/nativebot/core/profile/UserTencent.java index 6d1be2c..a8ad67c 100644 --- a/src/main/java/ren/taske/nativebot/core/profile/UserTencent.java +++ b/src/main/java/ren/taske/nativebot/core/profile/UserTencent.java @@ -40,8 +40,12 @@ public class UserTencent extends User { } public boolean hasPermission(String node) { + return hasPermission(node, false); + } + + public boolean hasPermission(String node, boolean defaultVal) { if(node != null) { - data.setDefault(node, false); + data.setDefault(node, defaultVal); data.save(); } return data.getBoolean(node, false);