org.manalith.ircbot.plugin.linuxpkgfinder.DebianPackageFinder.java Source code

Java tutorial

Introduction

Here is the source code for org.manalith.ircbot.plugin.linuxpkgfinder.DebianPackageFinder.java

Source

/*
org.manalith.ircbot.plugin.distopkgfinder/DebianPkgFinderRunner.java
ManalithBot - An open source IRC bot based on the PircBot Framework.
Copyright (C) 2011, 2012  Seong-ho, Cho <darkcircle.0426@gmail.com>
Copyright (C) 2012  Changwoo Ryu <cwryu@debian.org>
    
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
    
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
    
You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.manalith.ircbot.plugin.linuxpkgfinder;

import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.manalith.ircbot.annotation.Option;
import org.manalith.ircbot.common.stereotype.BotCommand;
import org.manalith.ircbot.plugin.SimplePlugin;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
public class DebianPackageFinder extends SimplePlugin {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    public String getName() {
        return "?";
    }

    @Override
    public String getDescription() {
        return " ??  ??  .";
    }

    public String parseVersionInfo(Document doc) {
        Elements exactHits = doc.select("#psearchres").select("ul").get(0).select("li");
        String result = "";

        for (Element e : exactHits) {
            String dist;
            dist = e.select("a").text();

            String version = "  ?";
            String[] versionLines = e.toString().split("<br>");

            for (String line : versionLines) {
                String v = line.split(": ")[0];
                if (v.split("\\s").length > 1)
                    continue;
                else {
                    version = v;
                    break;
                }
            }

            if (result.length() != 0)
                result += ", ";
            result += "\u0002" + dist + "\u0002: " + version;
        }

        return result;
    }

    @BotCommand("deb")
    public String findDebian(@Option(name = "", help = " ") String keyword) {
        String url = "https://packages.debian.org/search?keywords=" + keyword;
        return find(url, "Debian");
    }

    @BotCommand("ubu")
    public String findUbuntu(@Option(name = "", help = " ") String keyword) {
        String url = "http://packages.ubuntu.com/search?keywords=" + keyword;
        return find(url, "Ubuntu");
    }

    public String find(String url, String commandName) {
        String result = "";
        boolean hasExacthits = false;

        try {

            Connection conn = Jsoup.connect(url);
            conn.timeout(20000);
            Document doc = conn.get();

            if (doc.select("#psearchres").size() == 0) {
                result = "[" + commandName + "]  ";
                return result;
            }

            Elements hits = doc.select("#psearchres").select("h2");
            int hsize = hits.size();

            if (hsize == 0)
                result = "[" + commandName + "]  ";
            for (int i = 0; i < hsize; i++) {
                if (hits.get(i).text().equals("Exact hits")) {
                    hasExacthits = true;
                    break;
                }

            }
            if (!hasExacthits) {
                result = "[" + commandName + "]  ";
                return result;
            }

            String pkgname = doc.select("#psearchres").select("h3").get(0).text().split("\\s")[1];

            Elements exactHits = doc.select("#psearchres").select("ul").get(0).select("li");
            int elemCnt = exactHits.size();
            Element latestElement = exactHits.get(elemCnt - 1);
            String description = latestElement.toString().split("<br>")[0].split("\\:")[1].trim();

            result = "[" + commandName + "] \u0002" + pkgname + "\u0002 - " + description + ", ";
            result += parseVersionInfo(doc) + ".";
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
            result = ": " + e.getMessage();
        }

        return result;
    }
}