262 lines
6.9 KiB
Java
262 lines
6.9 KiB
Java
package de.mrbesen.youtubecrawler;
|
|
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import java.lang.Thread.State;
|
|
import java.util.ArrayList;
|
|
import java.util.Random;
|
|
import java.util.Scanner;
|
|
|
|
import org.apache.log4j.Logger;
|
|
import org.json.JSONObject;
|
|
|
|
import de.mrbesen.telegram.MessageBuilder;
|
|
import de.mrbesen.telegram.TelegramAPI;
|
|
import de.mrbesen.telegram.commands.CommandHandler;
|
|
import de.mrbesen.telegram.event.EventHandler;
|
|
import de.mrbesen.telegram.event.EventListener;
|
|
import de.mrbesen.telegram.event.events.UserSendMessageEvent;
|
|
import de.mrbesen.telegram.log.Log4JLog;
|
|
import de.mrbesen.telegram.objects.TUser;
|
|
|
|
public class Main implements CommandHandler, EventListener{
|
|
|
|
private ArrayList<String> admins = new ArrayList<>();//usernames of admins
|
|
private String adminstr = null;
|
|
private long setadminstr = -1;
|
|
private static String abc = "abcdefghijklmnopqrstuvwxyz";//used for random string generation
|
|
private Logger log = Logger.getLogger(this.getClass().getName());
|
|
private TelegramAPI tapi;
|
|
private Thread mainthread;
|
|
private static Main main;
|
|
private boolean startcrawler = true;
|
|
private Crawler cra;
|
|
private Thread crawlerthread;
|
|
|
|
public static Main getMain() {
|
|
return main;
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
boolean startcrawl = true;
|
|
for(String arg : args) {
|
|
if(arg.equalsIgnoreCase("--nocrawl")) {
|
|
startcrawl = false;
|
|
}
|
|
}
|
|
|
|
main = new Main(startcrawl);
|
|
main.run();
|
|
}
|
|
|
|
public Main(boolean startcra) {
|
|
startcrawler = startcra;
|
|
}
|
|
|
|
|
|
private void run() {
|
|
mainthread = Thread.currentThread();
|
|
|
|
//init Logger
|
|
new Log(); // init logging, set format etc
|
|
Logger log = Logger.getLogger(Main.class.getName());
|
|
|
|
//loading config
|
|
new Config(new File("crawl.conf"));
|
|
|
|
//starting crawler
|
|
cra = new Crawler();
|
|
crawlerthread = new Thread(cra, "Crawler");
|
|
if(startcrawler) {
|
|
crawlerthread.start();
|
|
}
|
|
|
|
//starting BOT API
|
|
tapi = new TelegramAPI(Config.prop.getProperty("telegramapi.key"));
|
|
tapi.getCommandManager().registerCommand("random", this);
|
|
tapi.getCommandManager().registerCommand("admin", this);
|
|
tapi.getCommandManager().registerCommand("stats", this);
|
|
tapi.getCommandManager().registerCommand("stop", this);
|
|
tapi.getCommandManager().registerCommand("profiler", this);
|
|
tapi.getEventManager().registerEvent(this);
|
|
tapi.setHelpText("Send the command /random to get a random video.");
|
|
tapi.setUpdateInterval(2000);
|
|
tapi.setLog(new Log4JLog());
|
|
tapi.start();
|
|
|
|
//load admins
|
|
Log.l.info("Loading admins.");
|
|
try {
|
|
Scanner scan = new Scanner(new File("admins"));
|
|
while(scan.hasNext()) {
|
|
String line = scan.nextLine().trim();
|
|
if(!line.isEmpty()) {
|
|
admins.add(line);
|
|
}
|
|
}
|
|
scan.close();
|
|
} catch (IOException | NumberFormatException | ArrayIndexOutOfBoundsException e) {
|
|
e.printStackTrace();
|
|
}
|
|
//CLI
|
|
Scanner s = new Scanner(System.in);
|
|
String in;
|
|
while((in= s.nextLine()) != null && crawlerthread.isAlive()) {
|
|
if(in.equalsIgnoreCase("stop")) {
|
|
stop();
|
|
} else if(in.equalsIgnoreCase("add")) {
|
|
log.info("please enter ytid:");
|
|
String id = s.nextLine().trim();
|
|
if(id.length() > 9 && id.length() < 13) {
|
|
cra.addtoCrawl(id);
|
|
log.info("added.");
|
|
}
|
|
} else if(in.equalsIgnoreCase("stats")) {
|
|
log.info("Getting Stats");
|
|
for(String line : cra.getStats().split("\n")) {
|
|
log.info(line);
|
|
}
|
|
} else if(in.equalsIgnoreCase("crastop")) {
|
|
log.info("Stop crawler");
|
|
cra.stop();
|
|
} else if(in.equalsIgnoreCase("profiler")) {
|
|
for(String profline : cra.getProfiling()) {
|
|
log.info(profline);
|
|
}
|
|
}
|
|
}
|
|
s.close();
|
|
log.info("Terminated.");
|
|
}
|
|
|
|
private String format(String in, int length) {
|
|
while(in.length() < length) {
|
|
in += ' ';
|
|
}
|
|
|
|
if(in.length() > length) {
|
|
in = in.substring(0, length);
|
|
}
|
|
return in;
|
|
}
|
|
|
|
public void stop() {
|
|
log.info("Stop.");
|
|
cra.stop();
|
|
if(startcrawler) {
|
|
new Thread(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
int count = 0;
|
|
while(crawlerthread.isAlive()) {
|
|
try {
|
|
Thread.sleep(20000);
|
|
} catch(InterruptedException ignored) {}
|
|
count = 0;
|
|
for(Thread t : Thread.getAllStackTraces().keySet()) {
|
|
String name = format(t.getName(), 15);
|
|
log.info(name + ":\t" + t.getState().name());
|
|
if(t.getState() == State.RUNNABLE) {
|
|
count ++;
|
|
}
|
|
}
|
|
log.info("count: " + count);
|
|
}
|
|
log.info("Stoped Shutdown Watchdog");
|
|
}
|
|
}, "Shutdown Watchdog").start();
|
|
}
|
|
}
|
|
|
|
void stopcallback() {
|
|
tapi.stop();
|
|
log.info("tapi stopped");
|
|
mainthread.interrupt();
|
|
}
|
|
|
|
@Override
|
|
public boolean onCommand(TUser sender, String cmd, String[] args, JSONObject j) {
|
|
if(cmd.startsWith("random")) {
|
|
String ytid = cra.getDB().getRandom();
|
|
int chatid = 0;
|
|
try {
|
|
//log.debug(j.toString());
|
|
chatid = j.getJSONObject("chat").getInt("id");
|
|
} catch(Throwable t) { t.printStackTrace(); }
|
|
//log.info("chatid: " + chatid);
|
|
if(chatid != 0) {
|
|
tapi.sendMessage(new MessageBuilder().setText("https://youtube.com/watch?v=" + ytid).setReciver(chatid).build());
|
|
} else {
|
|
sender.sendMessage("https://youtube.com/watch?v=" + ytid);
|
|
}
|
|
return true;
|
|
} else if(cmd.equals("admin")) {
|
|
if(admins.contains(sender.getName())) {
|
|
sender.sendMessage("You are admin.");
|
|
return true;
|
|
} else {
|
|
adminstr = getRandomStr(8);
|
|
setadminstr = System.currentTimeMillis();
|
|
log.info("Adminstr: " + adminstr);
|
|
}
|
|
} else if(cmd.equals("stats")) {
|
|
if(admins.contains(sender.getName())) {
|
|
sender.sendMessage(cra.getStats());
|
|
return true;
|
|
}
|
|
} else if(cmd.equals("profiler")) {
|
|
if(admins.contains(sender.getName())) {
|
|
StringBuilder sb = new StringBuilder();
|
|
for(String s : cra.getProfiling()) {
|
|
sb.append(s).append('\n');
|
|
}
|
|
sender.sendMessage(sb.toString());
|
|
return true;
|
|
}
|
|
}
|
|
|
|
/*else if(cmd.equals("stop")) {
|
|
if(admins.contains(sender.getName())) {
|
|
stop();
|
|
sender.sendMessage("Stop.");
|
|
log.info("Stopped via Telegram by " + sender.getFirstName());
|
|
return true;
|
|
}
|
|
}*/
|
|
return false;
|
|
}
|
|
|
|
public void broadcastAdmin(String msg) {
|
|
for(String admin : admins) {
|
|
TUser adm = tapi.getUser(admin);
|
|
if(adm != null)
|
|
adm.sendMessage(msg);
|
|
}
|
|
}
|
|
|
|
private String getRandomStr(int length) {
|
|
Random rand = new Random();
|
|
String out = "";
|
|
for(int i = 0; i < length; i++) {
|
|
out += abc.charAt(rand.nextInt(abc.length()));
|
|
}
|
|
return out;
|
|
}
|
|
|
|
@EventHandler
|
|
public void onAdmin(UserSendMessageEvent e) {
|
|
if(adminstr != null && setadminstr > 0) {
|
|
if(e.getMessage() != null && (System.currentTimeMillis() - setadminstr) / 1000 < 60) {
|
|
if(e.getMessage().getText() != null) {
|
|
if(e.getMessage().getText().equals(adminstr)) {
|
|
admins.add(e.getUser().getName());
|
|
e.getMessage().reply("You are now Admin!");
|
|
adminstr = null;
|
|
setadminstr = -1;
|
|
log.info(e.getUser().getID() + " " + e.getUser().getName() + " " + e.getUser().getFirstName() + " is now Admin!");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |