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 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!"); } } } } } }