import org.apello.abot.*; import java.io.*; import java.net.*; public class di3 extends PluginAdapter{ public di3(ABot ab){super(ab);} public String getPluginName(){return "di3";} public String getPluginDesc(){return ".";} public void init(String args)throws Exception{ if(args.equals("") == true) throw new Exception("Cookie value for \"rscdforums\" was not set (needed to check players online)"); else cookieValue = args; File f1 = new File(System.getProperty("user.dir") + "/admins.di3"); if(f1.exists() == false) throw new Exception(System.getProperty("user.dir") + "/admins.di3 doesn't exist"); File f2 = new File(System.getProperty("user.dir") + "/ignores.di3"); if(f2.exists() == false) throw new Exception(System.getProperty("user.dir") + "/ignores.di3 doesn't exist"); } public void process(){} public void dispose(){} public void run(){} public long iStart = System.currentTimeMillis();//ignore public long start = System.currentTimeMillis();//normal public long spamDelaySec = 10; public boolean getStats = true; public boolean oracle = false; public boolean notice = false; public boolean google = false; public String cookieValue = ""; public String channelAllowed = "#rscdaemon"; public void processCommand(String replyMethod, String nick, String ident, String host, String msg){ } public void onChatMessage(String channel, String senderNick, String senderIdent, String senderHost, String msg) { if(channel.equalsIgnoreCase(channelAllowed) == false) return; String host = senderIdent + "@" + senderHost; //System.out.println(host); if(msg.startsWith(getNick() + ", ") || msg.startsWith(getNick() + ": ") || msg.startsWith(getNick() + " ")) { if(msg.startsWith(getNick() + " ")) msg = msg.replaceAll(getNick() + " ", ""); else msg = msg.replaceAll(getNick(), "").substring(2); if(isIgnored(host)) { if(getTimeElapsed(iStart, 0) < (20 * 1000))//20sec return; iStart = System.currentTimeMillis(); sendNotice(senderNick, "You are ignored at the moment"); return; } if(isAdmin(senderNick, host) == false) { if(getTimeElapsed(start, 0) < (spamDelaySec * 1000)) { sendNotice(senderNick, "Command not processed due to spam throttling"); return; } start = System.currentTimeMillis(); if(oracle == false) { sendNotice(senderNick, "Oracle is disabled at the moment"); return; } } doMessage(senderNick, channel, askOracle(msg)); } if(msg.startsWith("!") == true) { msg = msg.substring(1); if(isIgnored(host)) { if(getTimeElapsed(iStart, 0) < (spamDelaySec * 1000)) { return; } iStart = System.currentTimeMillis(); sendNotice(senderNick, "You are ignored at the moment"); return; } if(isAdmin(senderNick, host) == false) { if(getTimeElapsed(start, 0) < (spamDelaySec * 1000)) { sendNotice(senderNick, "Command not processed due to spam throttling"); return; } start = System.currentTimeMillis(); } String nick = senderNick; String from = channel; if(getStats == true || isAdmin(senderNick, host)) { if(msg.startsWith("owner ")) { doMessage(nick, from, owner(msg.substring(6), true)); } else if(msg.startsWith("status ")) { doMessage(nick, from, owner(msg.substring(7), false)); } else if(msg.startsWith("combat ")) { doMessage(nick, from, charInfo(msg.substring(7), "combat")); } else if(msg.startsWith("ranged ")) { doMessage(nick, from, charInfo(msg.substring(7), "ranged")); } else if(msg.startsWith("prayer ")) { doMessage(nick, from, charInfo(msg.substring(7), "prayer")); } else if(msg.startsWith("magic ")) { doMessage(nick, from, charInfo(msg.substring(6), "magic")); } else if(msg.startsWith("cooking ")) { doMessage(nick, from, charInfo(msg.substring(8), "cooking")); } else if(msg.startsWith("woodcut ")) { doMessage(nick, from, charInfo(msg.substring(8), "woodcut")); } else if(msg.startsWith("fletching ")) { doMessage(nick, from, charInfo(msg.substring(10), "fletching")); } else if(msg.startsWith("fishing ")) { doMessage(nick, from, charInfo(msg.substring(8), "fishing")); } else if(msg.startsWith("firemaking ")) { doMessage(nick, from, charInfo(msg.substring(11), "firemaking")); } else if(msg.startsWith("crafting ")) { doMessage(nick, from, charInfo(msg.substring(9), "crafting")); } else if(msg.startsWith("smithing ")) { doMessage(nick, from, charInfo(msg.substring(9), "smithing")); } else if(msg.startsWith("mining ")) { doMessage(nick, from, charInfo(msg.substring(7), "mining")); } else if(msg.startsWith("herblaw ")) { doMessage(nick, from, charInfo(msg.substring(8), "herblaw")); } else if(msg.startsWith("agility ")) { doMessage(nick, from, charInfo(msg.substring(8), "agility")); } else if(msg.startsWith("thieving ")) { doMessage(nick, from, charInfo(msg.substring(9), "thieving")); } else if(msg.startsWith("kpd ")) { doMessage(nick, from, charInfo(msg.substring(4), "kpd")); } else if(msg.startsWith("stats ")) { String[] array = charInfo(msg.substring(6), "stats").split("\n"); for(int x = 0; x < array.length; x++) { if(contains(array[x], "null") == true) { doMessage(nick, from, nick + ": No such player"); break; } doMessage(nick, nick, array[x]); } } else if(msg.equalsIgnoreCase("online")) { int onlinei = online(); String online = ""; if(onlinei == -3) online = "Connection timed out, rscdaemon.org down?"; else if(onlinei == -1) online = "Unknown error"; else online = String.valueOf(onlinei); doMessage(nick, from, "There are " + online + " players online"); } else if(msg.startsWith("top5 ")) { String tmp = msg.substring(5); if(tmp.equals("")) doMessage(nick, from, nick + ": Wrong syntax"); else doMessage(nick, from, getTop5(tmp)); } else if(msg.equalsIgnoreCase("top5")) { doMessage(nick, from, getTop5()); } } if(google == true || isAdmin(senderNick, host)) { if(msg.startsWith("google ")) { String query = msg.substring(7); String result = google(query); doMessage(nick, from, result); } } } } public void onPrivateMessage(String senderNick, String senderIdent, String senderHost, String msg) { if(isAdmin(senderNick, senderIdent + "@" + senderHost)) adminCommand(senderNick, msg); } public void adminCommand(String nick, String msg) { if(msg.startsWith("msg ")) { msg = msg.substring(4); String[] array = msg.split(" "); String whoto = array[0]; msg = msg.replaceAll(whoto + " ", ""); sendMessage(whoto, msg); } else if(msg.equalsIgnoreCase("notice")) { notice = notice ? false : true; sendMessage(nick, "Noticing: " + toStr(notice)); } else if(msg.equalsIgnoreCase("stats")) { getStats = getStats ? false : true; sendMessage(nick, "Stats: " + toStr(getStats)); } else if(msg.equalsIgnoreCase("oracle")) { oracle = oracle ? false : true; sendMessage(nick, "Oracle: " + toStr(oracle)); } else if(msg.equalsIgnoreCase("google")) { google = google ? false : true; sendMessage(nick, "Google: " + toStr(google)); } else if(msg.startsWith("spam ")) { long delay = Long.parseLong(msg.substring(5)); spamDelaySec = delay; sendMessage(nick, "Spam delay: " + toStr(spamDelaySec) + " seconds"); } else if(msg.equalsIgnoreCase("status")) { sendMessage(nick, "Noticing: " + toStr(notice)); sendMessage(nick, "Oracle: " + toStr(oracle)); sendMessage(nick, "Google: " + toStr(google)); sendMessage(nick, "Stats: " + toStr(getStats)); sendMessage(nick, "Spam delay: " + toStr(spamDelaySec)); } else if(msg.startsWith("ignore ")) { msg = msg.substring(7); if(msg.startsWith("add ")) { msg = msg.substring(4); addIgnore(msg); sendMessage(nick, msg + " added to ignore"); } else if(msg.startsWith("del ")) { msg = msg.substring(4); removeIgnore(msg); sendMessage(nick, msg + " removed from ignore"); } } else if(msg.startsWith("is ")) { msg = msg.substring(3); if(msg.startsWith("ignored ")) { msg = msg.substring(8); if(isIgnored(msg) == true) sendMessage(nick, msg + " is ignored"); else sendMessage(nick, msg + " is not ignored"); } } } /**/ public void doMessage(String nick, String channel, String msg) { if(notice == true) sendNotice(nick, msg); else sendMessage(channel, msg); } public boolean contains(String str, String toContain) { if(str.indexOf(toContain) >= 0) return true; return false; } public void updateLong(long l) { l = System.currentTimeMillis(); } public boolean toBoolean(String s) { return s.equalsIgnoreCase("true") == false ? false : true; } public String toStr(long l) { try { String x = String.valueOf(l); return x; } catch(Exception e) { return null; } } public String toStr(boolean b) { return b ? "on" : "off"; } public String toStr(int number) { try { String x = String.valueOf(number); return x; } catch(Exception e) { return null; } } public int toInt(String value) { try { int x = Integer.parseInt(value); return x; } catch(Exception e) { return -1; } } public boolean isInt(String value) { try { Integer.parseInt(value); return true; } catch(Exception e) { return false; } } public int random(int one, int two) { return new java.util.Random().nextInt(two - one + 1) + one; } public String underline() { return ""; } public String u() { return underline(); } public String bold() { return ""; } public String b() { return bold(); } public String getTop5(String skill) { try { URLConnection connection; connection = new URL("http://www.rscdaemon.org/highscores.php?skill=" + skill).openConnection(); connection.setRequestProperty("Cookie", "rscdforums=" + cookieValue); BufferedReader input = new BufferedReader(new InputStreamReader(connection.getInputStream())); String str; String return_ = "Top 5 players for " + skill + " (by level): "; int getcounter = 1; int getcounter2 = 1; int arraycounter = 0; int arraycounter2 = 0; String[] names = new String[5]; int[] levels = new int[5]; boolean gotlevel = false; while ((str = input.readLine()) != null) { if(str.contains("") && getcounter2 <= 5 && gotlevel == false) { String s = str; s = s.replaceAll("", ""); s = s.replaceAll("", ""); s = s.substring(s.indexOf("\">") + 2); if(isInt(s)) { levels[arraycounter2] = Integer.parseInt(s); gotlevel = true; arraycounter2 ++; getcounter2 ++; } } if(str.contains("", ""); s = s.replaceAll("", ""); s = s.substring(s.indexOf("\">") + 2); names[arraycounter] = s; arraycounter ++; getcounter ++; gotlevel = false; } } for(int i = 0; i < names.length; i++) return_ += b() + names[i] + "(" + levels[i] + ")" + b() + ", "; input.close(); if(return_.contains("null")) return "Invalid skill \"" + skill + "\""; return return_.substring(0, (return_.length() - 2)); } catch(Exception e) { e.printStackTrace(); return null; } } public String getTop5() { try { URLConnection connection; connection = new URL("http://www.rscdaemon.org/highscores.php").openConnection(); connection.setRequestProperty("Cookie", "rscdforums=" + cookieValue); BufferedReader input = new BufferedReader(new InputStreamReader(connection.getInputStream())); String str; String return_ = "Top 5 players (by skilltotal): "; int getcounter = 1; int getcounter2 = 1; int arraycounter = 0; int arraycounter2 = 0; String[] names = new String[5]; int[] levels = new int[5]; int gotlevel = 0; while ((str = input.readLine()) != null) { if(str.contains("") && getcounter2 <= 5) { String s = str; s = s.replaceAll("", ""); s = s.replaceAll("", ""); s = s.substring(s.indexOf("\">") + 2); if(isInt(s) && gotlevel == 2) { levels[arraycounter2] = Integer.parseInt(s); gotlevel = 0; arraycounter2 ++; getcounter2 ++; } else gotlevel ++; } if(str.contains("", ""); s = s.replaceAll("", ""); s = s.substring(s.indexOf("\">") + 2); names[arraycounter] = s; arraycounter ++; getcounter ++; } } for(int i = 0; i < names.length; i++) return_ += b() + names[i] + "(" + levels[i] + ")" + b() + ", "; input.close(); return return_.substring(0, (return_.length() - 2)); } catch(Exception e) { e.printStackTrace(); return null; } } public int online() { try { URLConnection connection; connection = new URL("http://rscdaemon.org/status.php").openConnection(); connection.setRequestProperty("Cookie", "rscdforums=" + cookieValue); BufferedReader input = new BufferedReader(new InputStreamReader(connection.getInputStream())); String str; int return_ = 0; boolean hax = false; while ((str = input.readLine()) != null) { if(contains(str, "Players Online:")) hax = true; if(contains(str, "") && contains(str, "") && hax == true) return_ = Integer.parseInt(str.substring(str.indexOf("") + 4, str.lastIndexOf(""))); if(contains(str, "Start Time:")) hax = false; } input.close(); return return_; } catch(Exception e) { if(contains(e.toString(), "Connection timed out")) return -3; return -1; } } public String google(String query) { try { URLConnection connection; connection = new URL("http://www.google.com/search?q=" + URLEncoder.encode(query)).openConnection(); connection.setRequestProperty("User-agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; fi; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"); BufferedReader input = new BufferedReader(new InputStreamReader(connection.getInputStream())); String str; boolean hax = false; while ((str = input.readLine()) != null) { if(contains(str, "

")) username = str.replaceAll(" ", "").replaceAll("", "").replaceAll("", ""); if(contains(str, "")) owner = str.replaceAll(" ", "").replaceAll("", "").replaceAll("", ""); if(contains(str, "status")) status = str.replaceAll(" ", "").replaceAll("", "").replaceAll("", ""); } in.close(); String returned = null; username = username.replaceAll(" ", ""); owner = owner.replaceAll(" ", ""); status = status.replaceAll(" ", ""); if(owner.equals("") == false && username.equals("") == false && Bowner == true) returned = username + "'s owner is " + owner; if(status.equals("") == false && username.equals("") == false && Bowner == false) returned = username + "'s status is " + status; if(returned == null) returned = "Player \"" + who + "\" wasn't found"; return returned; } catch(Exception e) { e.printStackTrace(); return e.toString(); } } public String[] infoNames = { "Username", "Combat", "Skilltotal", "Kills", "Deaths", "Attack", "Defense", "Strength", "Hits", "Ranged", "Prayer", "Magic", "Cooking", "Woodcut", "Fletching", "Fishing", "Firemaking", "Crafting", "Smithing", "Mining", "Herblaw", "Agility", "Thieving"}; public String[] infoDetails = new String[infoNames.length]; public String charInfo(String who, String what) { try { URL url = new URL("http://rscdaemon.org/char.php?user=" + usernameToHash(who) + "&display=xml"); BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); String str; boolean found = false; while ((str = in.readLine()) != null) { if(contains(str, "")) found = true; if(found == true) { for(int i = 0; i < infoNames.length; i++) { if(contains(str, "<" + infoNames[i].toLowerCase() + ">") && contains(str, "")) if(infoNames[i].equals("Username") || infoNames[i].equals("Combat") || infoNames[i].equals("Kills") || infoNames[i].equals("Deaths")) infoDetails[i] = str.substring(("<" + infoNames[i].toLowerCase() + ">").length() + 1, str.lastIndexOf("")); else infoDetails[i] = str.substring(("<" + infoNames[i].toLowerCase() + ">").length() + 2, str.lastIndexOf("")); } } } in.close(); String returned = null; for(int x = 0; x < infoDetails.length; x++) if(infoNames[x].equalsIgnoreCase(what) && infoDetails[x] != null) returned = infoDetails[0] + "'s " + infoNames[x] + " level: " + infoDetails[x]; else if(what.equalsIgnoreCase("combat") && infoDetails[x] != null) { returned = infoDetails[0] + "'s combat stats: " + infoDetails[5] + " " + infoDetails[6] + " " + infoDetails[7] + " " + infoDetails[8] + " (level-" + infoDetails[1] + ")"; } else if(what.equalsIgnoreCase("kpd") && infoDetails[x] != null) { double kills = Double.parseDouble(infoDetails[3]); double deaths = Double.parseDouble(infoDetails[4]); double kpd = kills / deaths; return infoDetails[0] + "'s kpd: " + String.valueOf(kpd); } else if(what.equalsIgnoreCase("stats")) { returned = infoDetails[0] + "'s stats are:\n"; for(int a = 0; a < infoNames.length; a++) { if(a >= 5) returned += infoNames[a] + ": " + infoDetails[a] + "\n"; } } if(returned == null) returned = "Player \"" + who + "\" wasn't found"; for(int l = 0; l < infoDetails.length; l++) infoDetails[l] = null; return returned; } catch(Exception e) { e.printStackTrace(); return e.toString(); } } public long usernameToHash(String s) { s = s.toLowerCase(); String s1 = ""; for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c >= 'a' && c <= 'z') s1 = s1 + c; else if (c >= '0' && c <= '9') s1 = s1 + c; else s1 = s1 + ' '; } s1 = s1.trim(); if (s1.length() > 12) s1 = s1.substring(0, 12); long l = 0L; for (int j = 0; j < s1.length(); j++) { char c1 = s1.charAt(j); l *= 37L; if (c1 >= 'a' && c1 <= 'z') l += (1 + c1) - 97; else if (c1 >= '0' && c1 <= '9') l += (27 + c1) - 48; } return l; } public long getTimeElapsed(long since, int type) { long elapsedTimeMillis = System.currentTimeMillis() - since; long elapsedTime = elapsedTimeMillis; if(type == 0) elapsedTime = elapsedTimeMillis;//milliseconds if(type == 1) elapsedTime = elapsedTimeMillis / 1000;//seconds if(type == 2) elapsedTime = elapsedTimeMillis / (60 * 1000);//minutes if(type == 3) elapsedTime = elapsedTimeMillis / (60 * 60 * 1000);//hours if(type == 4) elapsedTime = elapsedTimeMillis / (24 * 60 * 60 * 1000);//days return elapsedTime; } public String askOracle(String question) { try { URL url = new URL("http://www.askoracle.net/index.php?q=" + URLEncoder.encode(question) + "&skiphtml=TRUE"); BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); String str; while ((str = in.readLine()) != null) { in.close(); return str; } return null; } catch(Exception e) { e.printStackTrace(); return e.toString(); } } public boolean isIgnored(String identhost) { try { BufferedReader in = new BufferedReader(new FileReader(System.getProperty("user.dir") + "/ignores.di3")); String s; String[] s1 = new String[20]; int c = 0; while((s = in.readLine()) != null) { if(s.equalsIgnoreCase(identhost)) return true; } in.close(); return false; } catch(Exception e) { System.out.println(e + "\nStacktrace:"); e.printStackTrace(); return false; } } public void addIgnore(String identhost) { try { BufferedWriter out = new BufferedWriter(new FileWriter(System.getProperty("user.dir") + "/ignores.di3", true)); out.write(identhost + "\n"); out.close(); } catch(Exception e) { System.out.println(e + "\nStacktrace:"); e.printStackTrace(); } } public void removeIgnore(String identhost) { try { BufferedReader in = new BufferedReader(new FileReader(System.getProperty("user.dir") + "/ignores.di3")); String s; String[] s1 = new String[20]; int c = 0; while((s = in.readLine()) != null) { s1[c] = s; c++; } in.close(); for(int i = 0; i < s1.length; i++) if(s1[i] != null) if(s1[i].equalsIgnoreCase(identhost)) s1[i] = null; BufferedWriter out = new BufferedWriter(new FileWriter(System.getProperty("user.dir") + "/ignores.di3")); for(int i = 0; i < s1.length; i++) if(s1[i] != null) out.write(s1[i] + "\n"); out.close(); } catch(Exception e) { System.out.println(e + "\nStacktrace:"); e.printStackTrace(); } } public boolean isAdmin(String nick, String identhost) { try { String[] tmp = identhost.split("@"); if(isAdmin(nick, tmp[0], tmp[1])) return true; return false; } catch(Exception e) { System.out.println(e + "\nStacktrace:"); e.printStackTrace(); return false; } } public void addAdmin(String identhost) { try { BufferedWriter out = new BufferedWriter(new FileWriter(System.getProperty("user.dir") + "/admins.di3", true)); out.write(identhost + "\n"); out.close(); } catch(Exception e) { System.out.println(e + "\nStacktrace:"); e.printStackTrace(); } } public void removeAdmin(String identhost) { try { BufferedReader in = new BufferedReader(new FileReader(System.getProperty("user.dir") + "/admins.di3")); String s; String[] s1 = new String[20]; int c = 0; while((s = in.readLine()) != null) { s1[c] = s; c++; } in.close(); for(int i = 0; i < s1.length; i++) if(s1[i] != null) if(s1[i].equalsIgnoreCase(identhost)) s1[i] = null; BufferedWriter out = new BufferedWriter(new FileWriter(System.getProperty("user.dir") + "/admins.di3")); for(int i = 0; i < s1.length; i++) if(s1[i] != null) out.write(s1[i] + "\n"); out.close(); } catch(Exception e) { System.out.println(e + "\nStacktrace:"); e.printStackTrace(); } } }