org.royaldev.royalcommands.rcommands.pluginmanager.SCmdDownload.java Source code

Java tutorial

Introduction

Here is the source code for org.royaldev.royalcommands.rcommands.pluginmanager.SCmdDownload.java

Source

/*
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */
package org.royaldev.royalcommands.rcommands.pluginmanager;

import org.apache.commons.lang.StringUtils;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.royaldev.royalcommands.MessageColor;
import org.royaldev.royalcommands.RoyalCommands;
import org.royaldev.royalcommands.rcommands.CmdPluginManager;
import org.royaldev.royalcommands.rcommands.SubCommand;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilderFactory;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;

public class SCmdDownload extends SubCommand<CmdPluginManager> {

    public SCmdDownload(final RoyalCommands instance, final CmdPluginManager parent) {
        super(instance, parent, "download", true,
                "Attempts to download a plugin from BukkitDev using its tag - recursive can be \"true\" if you would like the plugin to search for jars in all subdirectories of an archive downloaded",
                "<command> [tag] (recursive)", new String[0], new Short[0]);
    }

    @Override
    public boolean runCommand(final CommandSender cs, Command cmd, String label, String[] eargs,
            CommandArguments ca) {
        if (eargs.length < 1) {
            cs.sendMessage(MessageColor.NEGATIVE + "Please provide plugin tag!");
            cs.sendMessage(MessageColor.NEGATIVE + "http://dev.bukkit.org/server-mods/" + MessageColor.NEUTRAL
                    + "royalcommands" + MessageColor.NEGATIVE + "/");
            return true;
        }
        final boolean recursive = eargs.length > 1 && eargs[1].equalsIgnoreCase("true");
        final String customTag = this.getParent().getCustomTag(eargs[0]);
        final String tag = (customTag == null) ? eargs[0].toLowerCase() : customTag;
        final String commandUsed = label;
        final Runnable r = new Runnable() {
            @Override
            public void run() {
                cs.sendMessage(MessageColor.POSITIVE + "Getting download link...");
                String pluginUrlString = "http://dev.bukkit.org/server-mods/" + tag + "/files.rss";
                String file;
                try {
                    final URL url = new URL(pluginUrlString);
                    final Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder()
                            .parse(url.openConnection().getInputStream());
                    doc.getDocumentElement().normalize();
                    final NodeList nodes = doc.getElementsByTagName("item");
                    final Node firstNode = nodes.item(0);
                    if (firstNode.getNodeType() == 1) {
                        final Element firstElement = (Element) firstNode;
                        final NodeList firstElementTagName = firstElement.getElementsByTagName("link");
                        final Element firstNameElement = (Element) firstElementTagName.item(0);
                        final NodeList firstNodes = firstNameElement.getChildNodes();
                        final String link = firstNodes.item(0).getNodeValue();
                        final URL dpage = new URL(link);
                        final BufferedReader br = new BufferedReader(new InputStreamReader(dpage.openStream()));
                        final StringBuilder content = new StringBuilder();
                        String inputLine;
                        while ((inputLine = br.readLine()) != null)
                            content.append(inputLine);
                        br.close();
                        file = StringUtils.substringBetween(content.toString(),
                                "<li class=\"user-action user-action-download\"><span><a href=\"",
                                "\">Download</a></span></li>");
                    } else
                        throw new Exception();
                } catch (Exception e) {
                    cs.sendMessage(MessageColor.NEGATIVE
                            + "Could not fetch download link! Either this plugin has no downloads, or you specified an invalid tag.");
                    cs.sendMessage(MessageColor.NEGATIVE + "Tag: http://dev.bukkit.org/server-mods/"
                            + MessageColor.NEUTRAL + "plugin-name" + MessageColor.NEGATIVE + "/");
                    return;
                }
                if (SCmdDownload.this.getParent().downloadAndMovePlugin(file, null, recursive, cs)) {
                    cs.sendMessage(MessageColor.POSITIVE + "Downloaded plugin. Use " + MessageColor.NEUTRAL + "/"
                            + commandUsed + " load" + MessageColor.POSITIVE + " to enable it.");
                } else
                    cs.sendMessage(MessageColor.NEGATIVE + "Could not download that plugin. Please try again.");
            }
        };
        this.plugin.getServer().getScheduler().runTaskAsynchronously(this.plugin, r);
        return true;
    }
}