YoutubeCrawler/src/de/mrbesen/youtubecrawler/Main.java

239 lines
6.2 KiB
Java

package de.mrbesen.youtubecrawler;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
import org.apache.log4j.Logger;
import de.mrbesen.telegram.MessageBuilder;
import de.mrbesen.telegram.TelegramAPI;
import de.mrbesen.telegram.commands.JSONCommandHandler;
import de.mrbesen.telegram.event.events.UserSendMessageEvent;
import de.mrbesen.telegram.log.Log4JLog;
import de.mrbesen.telegram.objects.TMessage;
import de.mrbesen.telegram.objects.TUser;
public class Main implements JSONCommandHandler {
private ArrayList<Long> admins = new ArrayList<>();//userids of admins
private String adminstr = null;
private long setadminstr = -1;
private static final 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 maincrawlerthread;
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();
maincrawlerthread = new Thread(cra, "Crawler");
if(startcrawler) {
maincrawlerthread.start();
}
//starting BOT API
tapi = new TelegramAPI(Config.prop.getProperty("telegramapi.key"));
tapi.getCommandManager().registerCommand( this);
tapi.getEventManager().registerEvent(UserSendMessageEvent.class, this::onAdmin);
tapi.setHelpText("Send the command /random to get a random video.");
tapi.setUpdateInterval(60);
tapi.setLongpolling(true);
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()) {
try {
admins.add(Long.parseLong(line));
} catch(NumberFormatException e) {
e.printStackTrace();
}
}
}
scan.close();
} catch (IOException | NumberFormatException | ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
}
//CLI
Scanner s = new Scanner(System.in);
String in;
while((in = s.nextLine()) != null && maincrawlerthread.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");
startcrawler = false;
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) {//crawler not running
cra.getDB().stop();
tapi.stop();
}
}
void stopcallback() {
if(startcrawler) {//crawler should run
tapi.stop();
cra.getDB().stop();
mainthread.interrupt();
}
}
@Override
public boolean onCommand(TUser sender, String cmd, String[] args, TMessage json) {
if(cmd.startsWith("random")) {
String ytid = cra.getDB().getRandom();
long chatid = json.getChatID();
tapi.sendMessage(new MessageBuilder().setAsync().setText("https://youtube.com/watch?v=" + ytid).setReciver(chatid).build());
return true;
} else if(cmd.equals("admin")) {
if(admins.contains(sender.getID())) {
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.getID())) {
sender.sendMessage(cra.getStats());
return true;
}
} else if(cmd.equals("profiler")) {
if(admins.contains(sender.getID())) {
StringBuilder sb = new StringBuilder();
for(String s : cra.getProfiling()) {
sb.append(s).append('\n');
}
if(sb.length() == 0)
sb.append("No Data.");
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(long admin : admins) {
if(admin != 0) {
MessageBuilder mb = new MessageBuilder().setAsync().setText(msg).setReciver(admin);
tapi.sendMessage(mb.build());
}
}
}
private static 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;
}
public void onAdmin(Object event) {
UserSendMessageEvent e = (UserSendMessageEvent) event;
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().getID());
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!");
}
}
}
}
}
}