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.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.objects.TUser; public class Main implements CommandHandler, EventListener{ private ArrayList admins = new ArrayList<>();//usernames of admins private String adminstr = null; private long setadminstr = -1; private static String abc = "abcdefghijklmnopqrstuvwxyz"; private Logger log = Logger.getLogger(this.getClass().getName()); private TelegramAPI tapi; private Thread mainthread; private static Main main; public static Main getMain() { return main; } public static void main(String[] args) { main = new Main(); main.run(); } private Crawler cra; 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(); Thread t = new Thread(cra, "Crawler"); t.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.getEventManager().registerEvent(this); tapi.setHelpText("Send the command /random to get a random video."); tapi.setUpdateInterval(2000); 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 && t.isAlive()) { if(in.equalsIgnoreCase("stop")) { stop(); break; } 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); } } } s.close(); log.info("Terminated."); } public void stop() { log.info("Stop."); cra.stop(); log.info("cra stopped"); try { Thread.sleep(100); } catch(InterruptedException e) { e.printStackTrace(); } tapi.stop(); log.info("tapi stopped"); mainthread.interrupt(); } @Override public boolean onCommand(TUser sender, String cmd, String[] args) { if(cmd.equals("random")) { String ytid = cra.getDB().getRandom(); 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("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!"); } } } } } }