From 1604d7a239ac910be9574f8bae76ed981e255426 Mon Sep 17 00:00:00 2001 From: Andrew Williams Date: Tue, 26 Apr 2011 16:18:57 +0100 Subject: [PATCH] Initial code import --- MANIFEST.MF | 2 + build.sh | 8 + resources/plugin.yml | 6 + .../pleaseignore/BukkitXMPP/BukkitXMPP.java | 166 ++++++++++++++++++ .../BukkitXMPP/BukkitXMPPPlayerListener.java | 34 ++++ 5 files changed, 216 insertions(+) create mode 100644 MANIFEST.MF create mode 100755 build.sh create mode 100644 resources/plugin.yml create mode 100644 src/com/pleaseignore/BukkitXMPP/BukkitXMPP.java create mode 100644 src/com/pleaseignore/BukkitXMPP/BukkitXMPPPlayerListener.java diff --git a/MANIFEST.MF b/MANIFEST.MF new file mode 100644 index 0000000..e6a9845 --- /dev/null +++ b/MANIFEST.MF @@ -0,0 +1,2 @@ +Manifest-Version: 1.0 +Class-Path: ../lib/smack.jar ../lib/smackx.jar diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..d26ccbe --- /dev/null +++ b/build.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +rm -rf out; mkdir out; +rm bukkitxmpp.jar + +export CLASSPATH=$CLASSPATH:./libs/ +javac -cp ./lib/bukkit-0.0.1-SNAPSHOT.jar:./lib/smack.jar:./lib/smackx.jar -d ./out/ ./src/com/pleaseignore/BukkitXMPP/*.java +jar -cvfm bukkitxmpp.jar MANIFEST.MF -C out/ . -C resources/ . diff --git a/resources/plugin.yml b/resources/plugin.yml new file mode 100644 index 0000000..da664f2 --- /dev/null +++ b/resources/plugin.yml @@ -0,0 +1,6 @@ +name: BukkitXMPP +main: com.pleaseignore.BukkitXMPP.BukkitXMPP +version: 0.1 +author: Matalok +description: Links Minecraft chat and a XMPP/Jabber MUC room. +website: https://github.com/nikdoof/bukkitxmpp diff --git a/src/com/pleaseignore/BukkitXMPP/BukkitXMPP.java b/src/com/pleaseignore/BukkitXMPP/BukkitXMPP.java new file mode 100644 index 0000000..a546c03 --- /dev/null +++ b/src/com/pleaseignore/BukkitXMPP/BukkitXMPP.java @@ -0,0 +1,166 @@ +package com.pleaseignore.BukkitXMPP; + +import java.io.File; +import java.util.logging.Logger; +import java.util.List; + +import org.bukkit.entity.Player; +import org.bukkit.World; +import org.bukkit.Server; +import org.bukkit.event.Event.Priority; +import org.bukkit.event.Event; +import org.bukkit.plugin.PluginDescriptionFile; +import org.bukkit.plugin.PluginLoader; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.plugin.PluginManager; +import org.bukkit.ChatColor; +import org.bukkit.util.config.Configuration; + +import org.jivesoftware.smack.XMPPConnection; +import org.jivesoftware.smack.packet.Packet; +import org.jivesoftware.smack.packet.Message; +import org.jivesoftware.smack.PacketListener; +import org.jivesoftware.smackx.muc.MultiUserChat; +import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smack.Chat; +import org.jivesoftware.smack.util.StringUtils; +import org.jivesoftware.smackx.muc.DiscussionHistory; + +/** + * BukkitXMPP for Bukkit + * + * @author Matalok + */ +public class BukkitXMPP extends JavaPlugin implements PacketListener { + private final BukkitXMPPPlayerListener playerListener = new BukkitXMPPPlayerListener(this); + + private Logger log; + + public XMPPConnection xmppconn; + public MultiUserChat muc; + + private String nickname; + private Configuration conf; + + private void loadConfig(File yamlfile) { + conf = new Configuration(yamlfile); + if(yamlfile.exists()) { + conf.load(); + } else { + conf.setProperty("connection.server", "example.org"); + conf.setProperty("connection.username", "exampleuser"); + conf.setProperty("connection.password", "examplepass"); + conf.setProperty("connection.channel", "examplechannel@talk.example.org"); + conf.setProperty("connection.nickname", "MinecraftBot"); + conf.getBoolean("general.autoconnect", false); + conf.save(); + } + } + + private void connectAndJoin() { + + String server = conf.getString("connection.server", ""); + String username = conf.getString("connection.username", ""); + String password = conf.getString("connection.password", ""); + String channel = conf.getString("connection.channel", ""); + String nickname = conf.getString("connection.nickname", "MinecraftBot"); + + if (!server.equals("") && !username.equals("") && !password.equals("") && !channel.equals("")) { + try { + log.info("Connecting to XMPP"); + xmppconn = new XMPPConnection(server); + xmppconn.connect(); + xmppconn.login(username, password); + + log.info("Joining Room"); + muc = new MultiUserChat(xmppconn, channel); + + DiscussionHistory history = new DiscussionHistory(); + history.setMaxStanzas(0); + + muc.join(nickname, "", history, 2000); + muc.addMessageListener(this); + } catch (Exception e) { + log.warning("Error connecting to XMPP server " + server); + } + } else { + log.warning("Incomplete configration for XMPP server"); + } + } + + private void disconnect() { + + if (muc instanceof MultiUserChat) { + muc.leave(); + muc = null; + } + + if (xmppconn instanceof XMPPConnection) { + xmppconn.disconnect(); + xmppconn = null; + } + + } + + public void onEnable() { + + log = getServer().getLogger(); + + final File yml = new File(getDataFolder(), "BukkitXMPP.yml"); + log.info("Path to BukkitXMLPP.yml: " + yml.getPath()); + loadConfig(yml); + + // Register our events + PluginManager pm = getServer().getPluginManager(); + pm.registerEvent(Event.Type.PLAYER_CHAT, playerListener, Event.Priority.Normal, this); + + // EXAMPLE: Custom code, here we just output some info so we can check all is well + PluginDescriptionFile pdfFile = this.getDescription(); + log.info( pdfFile.getName() + " v" + pdfFile.getVersion() + " loaded" ); + + // Connect to XMPP + if (conf.getBoolean("general.autoconnect", true)) + connectAndJoin(); + } + + public void onDisable() { + disconnect(); + PluginDescriptionFile pdfFile = this.getDescription(); + log.info( pdfFile.getName() + " version " + pdfFile.getVersion() + " disabled"); + } + + public List getListeners() { + List list = null; + for(World world: getServer().getWorlds()) { + if (list == null) { + list = world.getPlayers(); + } else { + list.addAll(world.getPlayers()); + } + } + + return list; + } + + public void sendMCMessage(String msg) { + for(Player p: getListeners()) { + p.sendMessage(msg); + } + } + + public void processPacket(Packet p) + { + if (p instanceof Message) { + final Message message = (Message) p; + if(message.getType() == Message.Type.groupchat) { + if(!StringUtils.parseResource(message.getFrom()).equalsIgnoreCase(nickname)) { + String outmsg = ChatColor.GRAY + "[" + ChatColor.DARK_GREEN + "XMPP" + ChatColor.GRAY + "] " + ChatColor.WHITE + StringUtils.parseResource(message.getFrom()) + ": " + message.getBody(); + sendMCMessage(outmsg); + log.info(outmsg); + } + } + } + } + +} + diff --git a/src/com/pleaseignore/BukkitXMPP/BukkitXMPPPlayerListener.java b/src/com/pleaseignore/BukkitXMPP/BukkitXMPPPlayerListener.java new file mode 100644 index 0000000..59182cd --- /dev/null +++ b/src/com/pleaseignore/BukkitXMPP/BukkitXMPPPlayerListener.java @@ -0,0 +1,34 @@ +package com.pleaseignore.BukkitXMPP; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChatEvent; +import org.bukkit.event.player.PlayerEvent; +import org.bukkit.event.player.PlayerListener; +import org.bukkit.event.player.PlayerMoveEvent; + +/** + * Handle events for all Player related events + * @author Matalok + */ +public class BukkitXMPPPlayerListener extends PlayerListener { + private final BukkitXMPP plugin; + + public BukkitXMPPPlayerListener(BukkitXMPP instance) { + plugin = instance; + } + + @Override + public void onPlayerChat(PlayerChatEvent event) { + Player p = event.getPlayer(); + String msg = event.getMessage(); + try { + plugin.muc.sendMessage("[" + p.getDisplayName() + "] " + msg); + } catch (Exception e) { + // TODO: Error handling + } + + } + //Insert Player related code here +} +