Правила: В данной теме выкладываются только готовые коды, которые прошли тест и 100% рабочие. Для тех кто выкладывает коды: - Указываем название кода - Указываем смысл его работы - Указываем процесс установки
public class RobQuiz implements Runnable { private String NICK = "Викторина"; private long TimeRange = 2; private String Question = ""; private String Answer = ""; private ChatServer srv; private long cTime = System.currentTimeMillis(); private Thread th; private int sleepAmount = 1000; private Random r = new Random(); private int oldID = 0; private int maxQuiz = 0; private int count() { return maxQuiz==0 ? (int)srv.us.db.getLastIndex("victorina") : maxQuiz; } private boolean testTime() { return (System.currentTimeMillis()-cTime)>TimeRange*60000; } private int getRND(int i) { return r.nextInt(i); } public ChatProps psp;
private String PromtGenerate(String text) { String s = "Подсказка: "; s += text.length() + " букв."; try { int t = getRND(text.length() - 2) + 1; s += ", " + t + " буква - " + text.charAt(t - 1) + "."; } catch (Exception ex) {} return s; } private String QuizQuestion(int id) { try { PreparedStatement pst = srv.us.db.getDb().prepareStatement("SELECT * FROM victorina WHERE id = ? "); pst.setInt(1,id); ResultSet rs = pst.executeQuery(); while(rs.next()){ Question = rs.getString(2); Answer = rs.getString(3); } rs.close(); pst.close(); } catch (Exception ex) {} oldID = id; return "Вопрос " + id + ":\n" + Question + "\n" + PromtGenerate(Answer); } private void timeEvent() { if(testTime()) { cTime = System.currentTimeMillis(); say(QuizQuestion(getRND((int)(maxQuiz - 2)) +1)); } } private void say(String m) { String s = NICK + "\n" + m; srv.cq.addMsg(s,"",psp.getIntProperty("vik.room")); } public RobQuiz(ChatServer s) { srv = s; maxQuiz = count(); psp = ChatProps.getInstance(srv.getName()); } public void parse(String uin, String msg, int room) { Users uss = srv.us.getUser(uin); if ( psp.getIntProperty("vik.room") == room && Answer.equalsIgnoreCase(msg) ) { say("Правильно ответил(а): " + uss.localnick + "и получает +"+psp.getIntProperty("vik.ball")+" баллов"); int reiting = uss.country+psp.getIntProperty("vik.ball"); uss.country=reiting; srv.us.updateUser(uss); say("Вопрос " + oldID + ":\n" + Question + "\nОтвет: " + Answer); cTime = System.currentTimeMillis(); say(QuizQuestion(getRND((int)(maxQuiz - 2)) +1)); } } public void start() { th = new Thread(this); th.setPriority(Thread.NORM_PRIORITY); th.start(); } public synchronized void stop() { th = null; notify(); } @SuppressWarnings("static-access") public void run() { Thread me = Thread.currentThread(); while (th == me) { timeEvent(); try { Thread.sleep(sleepAmount); } catch (InterruptedException e) { break; } } th=null; } }
RobAdmin
/** * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version.
* This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
/** * Виртуальный админ в чате * * @author Prolubnikov Dmitry */ public class RobAdmin implements Runnable { public String NICK = "Админ"; public String ALT_NICK="admin;админ"; //Определение зафлуживания админа private String lastSN=""; private long lastTime=0; public int lastCount = 0; private Thread th; int sleepAmount = 1000; long cTime=System.currentTimeMillis(); //Время последнего сообщения, для определения паузы long stTime = 0; //Время последнего вывода статистики public ChatServer srv; public ConcurrentLinkedQueue mq; public ConcurrentHashMap uins; ConcurrentHashMap test1, test2; private String[][] chg = {{"y","у"},{"Y","у"},{"k","к"},{"K","к"},{"e","е"}, {"E","е"},{"h","н"},{"H","н"},{"r","г"},{"3","з"},{"x","х"},{"X","х"}, {"b","в"},{"B", "в"},{"a","а"},{"A","а"},{"p","р"},{"P","р"},{"c","с"}, {"C","с"},{"6","б"}}; private Random r = new Random();
/** Creates a new instance of RobAdmin */ public RobAdmin(ChatServer s) { srv = s; mq = new ConcurrentLinkedQueue(); uins = new ConcurrentHashMap(); uins.put("0",0); test1 = new ConcurrentHashMap(); test2 = new ConcurrentHashMap(); }
/** * Добавление в очередь нового задания */ public void parse(IcqProtocol proc, String uin, String msg, int room){ cTime = System.currentTimeMillis(); mq.add(new MsgElement(msg,uin,proc,room)); }
/** * Замена похожих букв на русские */ public String changeChar(String s){ for(int i=0;i s = s.replace(chg[i][0],chg[i][1]); } return s; }
/** * Обработка событий по времени */ private void timeEvent(){ if(testTime()){ cTime = System.currentTimeMillis(); if(testRnd(ChatProps.getInstance(srv.getName()).getIntProperty("adm.sayAloneProbability"))){ if(srv.cq.uq.size()<=0) return; say(getAlone(), 0); } } }
public void say(String m, int room){ cTime = System.currentTimeMillis(); String s = NICK + ": " + m; Log.info(s); srv.us.db.log(0,"admin","OUT", s, room); srv.cq.addMsg(s,"",room); }
/** * Проверка на мат, вариант 1 */ public boolean testMat1(String msg){ String[] s = msg.trim().split(" "); for(int i=1;i if(!test(s[i], ChatProps.getInstance(srv.getName()).getStringProperty("adm.noMatString").split(";"))){ if(test(s[i], ChatProps.getInstance(srv.getName()).getStringProperty("adm.matString").split(";"))) return true; } } return false; }
/** * Проверка на совпадение слов в сообщении */ public boolean test(String msg, String[] testStr){ for(int i=0;i if(msg.toLowerCase().indexOf(testStr[i])>=0) return true; } return false; }
/** * Проверка на наличие имени админа */ public boolean testName(String s){ return test(s,ALT_NICK.split(";")); }
/** * Проверка на наличие приветствия */ public boolean testHi(String s){ String t = "прив;прев;здоров;здрас;здрав;хай;хой;хелл;добр;даро"; return test(s,t.split(";")); } /** * Определение времени запуска бота */ private long getTimeStart(){ long t = 0; try{ File f = new File("./state"); t = f.lastModified(); } catch (Exception ex) { ex.printStackTrace(); } return t; }
private long getUpTime(){ return System.currentTimeMillis()-getTimeStart(); }
private String getTime(long t){ Date dt = new Date(t); DateFormat df = DateFormat.getTimeInstance(DateFormat.MEDIUM); df.setTimeZone(TimeZone.getTimeZone("GMT")); return (t/86400000) + " дней " + df.format(dt); } public boolean testStat(String s){ String t = "stat;стат"; return test(s,t.split(";")); }
/** * Вывод статистики по запросу */ public void sayStat(int room){ long test = ChatProps.getInstance(srv.getName()).getIntProperty("adm.getStatTimeout")*60*1000;
if((System.currentTimeMillis()-stTime) say("Ну вас нафиг... нашли дурака... работай тут, считай... дайте передохнуть хоть немного.", room); return; } stTime = System.currentTimeMillis(); String s = "За последние сутки:\n"; s += "Всего зашло в чат: " + srv.us.statUsersCount(); s += "\nБот запущен: " + new Date(getTimeStart()); s += "\nВремя работы: " + getTime(getUpTime()); s += "\nОтправлено сообщений: " + srv.us.statMsgCount(); s += "\nКикнутых юзеров: " + srv.us.statKickUsersCount(); s += "\nЗарегистрировано пользователей: " + srv.us.statRegCount(); s += "\nВсего киков: " + srv.us.statKickCount(); s += "\nЗабанено юзеров: " + srv.us.statBanUsersCount(); s += "\nСамые болтливые пользователи:\n" + srv.us.statUsersTop(); say(s, room); }
/** * Проверка на первышение интервала ожидания */ public boolean testTime(){ return (System.currentTimeMillis()-cTime)>ChatProps.getInstance(srv.getName()).getIntProperty("adm.sayAloneTime")*60000; }
public int getRND(int i){ return r.nextInt(i); }
/** * Событие с вероятностью 1/i */ public boolean testRnd(int i){ if(i<=1) return false; else return r.nextInt(i)==1; }
/** * Приветствие */ public String getHi(String name){ String[] s = {"Привет","Хай","Приветствую","Здравствуй","Здоров"}; return s[getRND(s.length)] + " " + name + "!"; }
/** * Фразы про одиночество */ public String getAlone(){ String[] s = { "Здесь так тихо...", "Ну и чего все замолчали?", "Ну и молчите дальше, я тоже буду молчать :-\\", "Алле! тут есть кто-нибудь? А-а-а-а!!! Я что тут один?!" }; return s[getRND(s.length)]; }
/** * Фразы при упоминении админа */ public String getAdmin(){ String[] s = { "А, че?", "хр-р-р... хр-р-р...", "Опять про то же самое?", "Не о чем больше поговорить?", "А с тобой я ваще больше не разговариваю", "Ты о своем, а я о своем", "Не, я так не думаю", "Ты серьезно?", "С тобой так интересно!", "Ха-ха, очень смешно...", "Если ты высокого мения о своем интеллекте, то должен тебя разочаровать" }; return s[getRND(s.length)]; }
public void start(){ th = new Thread(this); th.setPriority(Thread.NORM_PRIORITY); th.start(); }
public synchronized void stop() { th = null; notify(); }
public void run() { Thread me = Thread.currentThread(); while (th == me) { parse(); timeEvent(); try { th.sleep(sleepAmount); } catch (InterruptedException e) { break; } } th=null; } }
Должен исключать антикик для testAdmin при длительном молчании.
/** * Проверка молчунов * @param uin */
public void testState(String uin){ if(psp.testAdmin(uin)) return; long t = floodMap.get(uin).getDeltaTime(); if(t>(psp.getIntProperty("chat.autoKickTimeWarn")*60000) && !warnFlag.contains(uin)){ Log.info("Warning to " + uin); srv.getIcqProcess(srv.us.getUser(uin).basesn).mq.add(uin,"Предупреждение!\nПредупреждение!\nПредупреждение!\n\nВы слишком долго молчите и будете удалены из чата! Не молчите!"); warnFlag.add(uin); } if(t>(psp.getIntProperty("chat.autoKickTime")*60000)){ Log.talk("Autokick to " + uin); warnFlag.remove(uin); kick(srv.getIcqProcess(srv.us.getUser(uin).basesn),uin); } }
Кстати... Должен кое-что сказать по поводу этой темы. В этой теме выкладываются только коды исходников jIMBot. Все остальные сообщения будут удаляться без предупреждения ! Есть код - выкладывайте сразу код и вкратце напишите для чего он.
За сообщения типо "А как это ставить ?" будут выдаваться предупреждения и понижаться репутация !