/*
org.manalith.ircbot.plugin.distopkgfinder/ArchPkgFinderRunner.java
ManalithBot - An open source IRC bot based on the PircBot Framework.
Copyright (C) 2012 Seong-ho, Cho <darkcircle.0426@gmail.com>
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 java.io.IOException;
import java.util.Iterator;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.jsoup.Jsoup;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
public class ArchPackageFinder extends PackageFinder {
private Logger logger = LoggerFactory.getLogger(getClass());
private String pkgname;
private String description;
@Override
public String getName() {
return "아치";
}
@Override
public String getDescription() {
return "지정한 이름을 가진 아치의 패키지를 검색합니다.";
}
@BotCommand("ar")
public String getResult(@Option(name = "키워드", help = "검색할 단어") String arg)
throws IOException {
pkgname = "";
description = "";
String resultMain = getResultFromMainPkgDB(arg);
String resultExtra = getResultFromAUR(arg);
String result = "[Arch] ";
if (resultMain.length() == 0 && resultExtra.length() == 0)
result += "결과가 없습니다";
else {
result += "\u0002" + pkgname + "\u0002 - " + description + ", ";
if (resultMain != null)
if (!resultMain.isEmpty() || resultMain.length() > 0)
result += resultMain;
if (resultExtra != null)
if (!resultExtra.isEmpty() || resultExtra.length() > 0) {
if (resultMain != null)
if (!resultMain.isEmpty() || resultMain.length() > 0)
result += ", ";
result += resultExtra;
}
}
return result;
}
public String getResultFromMainPkgDB(String arg) throws IOException {
String[] arch_keywords = { "any", "i686", "x86_64" };
int len = arch_keywords.length;
int pages = 100000000;
String infostr = "";
String url = "";
for (int i = 0; i < len; i++) {
for (int j = 0; j < pages; j++) {
url = "http://www.archlinux.org/packages/?page="
+ (new Integer(j + 1)).toString() + "&arch="
+ arch_keywords[i] + "&q=" + arg;
String pageinfo = "";
try {
pageinfo = Jsoup.connect(url).get()
.select("div#pkglist-results>div.pkglist-stats>p")
.get(0).text();
} catch (Exception e) {
pages = 1;
}
if (j == 0 && pages == 100000000) {
if (StringUtils.countMatches(pageinfo, ".") == 1)
pages = 1;
else {
if (pageinfo.charAt(pageinfo.length() - 1) == '.')
pageinfo = pageinfo.substring(0,
pageinfo.length() - 1);
String[] piarray = pageinfo.split("\\s");
pages = NumberUtils.toInt(piarray[piarray.length - 1]);
}
}
Iterator<Element> e = Jsoup.connect(url).get()
.select("table.results>tbody>tr").iterator();
while (e.hasNext()) {
Elements ee = e.next().select("td");
if (ee.get(2).select("a").get(0).text().equals(arg)) {
if (!infostr.equals(""))
infostr += ", ";
infostr += "\u0002(main-" + ee.get(0).text() + " "
+ ee.get(1).text() + ")\u0002 ";
if (pkgname.length() == 0)
pkgname = ee.get(2).select("a").get(0).text();
if (description.length() == 0)
description = ee.get(4).text();
if (ee.get(3).select("span.flagged").size() > 0)
infostr += ee.get(3).select("span.flagged").get(0)
.text();
else
infostr += ee.get(3).text();
break;
}
}
}
pages = 100000000;
}
return infostr;
}
private String getResultFromAUR(String arg) throws IOException {
String infostr = "";
String pageinfo = "";
String url = "";
int pages = 100000000;
for (int i = 0; i < pages; i++) {
url = "http://aur.archlinux.org/packages.php?SeB=x&K=" + arg
+ "&PP=50&O=" + (i * 50);
try {
pageinfo = Jsoup.connect(url).get()
.select("div#pkglist-results>div.pkglist-stats>p")
.get(0).text();
} catch (IndexOutOfBoundsException e) {
return "";
}
if (i == 0 && pages == 100000000) {
if (StringUtils.countMatches(pageinfo, ".") == 1)
pages = 1;
else {
if (pageinfo.charAt(pageinfo.length() - 1) == '.')
pageinfo = pageinfo.substring(0, pageinfo.length() - 1);
String[] piarray = pageinfo.split("\\s");
pages = NumberUtils.toInt(piarray[piarray.length - 1]);
}
}
Iterator<Element> e = Jsoup.connect(url).get()
.select("table>tbody>tr").iterator();
while (e.hasNext()) {
Elements ee = e.next().select("td");
if (ee.get(1).select("td").get(0).text().equals(arg)) {
if (!infostr.equals(""))
infostr += " | ";
if (pkgname.length() == 0)
pkgname = ee.get(1).select("a").text();
if (description.length() == 0)
description = ee.get(4).text();
infostr += "\u0002(AUR-" + ee.get(0).text() + ")\u0002 ";
infostr += ee.get(2).text();
break;
}
}
}
return infostr;
}
@Override
public String find(String arg) {
String result = "";
try {
result += getResultFromMainPkgDB(arg);
result += getResultFromAUR(arg);
if (result.equals(""))
result = "[Arch] 결과가 없습니다";
} catch (IOException e) {
logger.error(e.getMessage(), e);
result = "오류: " + e.getMessage();
}
return result;
}
}