ICE | Дата: Пятница, 26.03.2010, 17:07 | Сообщение # 1 |
Программист - Разработчик
Группа: | Пользователи |
Сообщений: | 129 |
Награды: | 0 |
Репутация: | 32767 |
Статус: | Онлайн |
| В данной статье мы рассмотрим общие принципы создания скриптов для JimBot (0.4.0) [l] Одно из преимуществ JimBot - в расширяемости функционала. Делается это в настоящий момент (версия 0.4.0) посредством скриптов. Мы сейчас более подробно рассмотрим механизм расширения команд чата при помощи своих скриптов. И так, если мы заглянем в исходные тексты бота, а именно класс ChatCommandProc, то увидим следующий механизм определения команд чата: Code /** * Инициализация списка команд и полномочий */ private void init(){ authObj.put("pmsg","Отправка приватных сообщений"); authObj.put("reg","Смена ника"); authObj.put("invite","Создание приглашения"); authObj.put("kickone","Кик одного пользователя"); authObj.put("kickall","Кик всех пользователей"); authObj.put("ban","Забанить пользователя"); authObj.put("settheme","Установить тему в комнате"); authObj.put("adminsay","Разговаривать с админом"); authObj.put("adminstat","Получать статистику от админа"); authObj.put("info","Получать информацию о юзере"); authObj.put("exthelp","Расширенная помощь"); authObj.put("authread","Получение инфы о полномочиях"); authObj.put("authwrite","Изменение полномочий пользователей"); authObj.put("whouser","Просмотр инфы о смене ников юзером"); authObj.put("room","Смена комнаты"); authObj.put("whoinv","Команда !whoinvite"); authObj.put("kickhist","Команда !kickhist"); authObj.put("chgkick","Изменение времени кика"); authObj.put("dblnick","Разрешено дублировать ник"); authObj.put("anyroom","Переход в любую комнату"); authObj.put("wroom","Создавать и изменять комнаты");
commands.put("!help", new Cmd("!help","",2)); commands.put("!chat", new Cmd("!chat","",3)); commands.put("!exit", new Cmd("!exit","",4)); commands.put("!rules", new Cmd("!rules","",5)); commands.put("!stat", new Cmd("!stat","",6)); commands.put("!gofree", new Cmd("!gofree","",7)); commands.put("!go", new Cmd("!go","$n",8)); commands.put("!invite", new Cmd("!invite","",9)); commands.put("!banlist", new Cmd("!banlist","",10)); commands.put("!kicklist", new Cmd("!kicklist","",11)); commands.put("!info", new Cmd("!info","$c",12)); commands.put("!kick", new Cmd("!kick","$c $n $s",13)); commands.put("!kickall", new Cmd("!kickall","",14)); commands.put("!listauth", new Cmd("!listauth","",15)); commands.put("!who", new Cmd("!who", "$n",16)); commands.put("!listgroup", new Cmd("!listgroup","",17)); commands.put("!checkuser", new Cmd("!checkuser","$n",18)); commands.put("!setgroup", new Cmd("!setgroup","$n $c",19)); commands.put("!grant", new Cmd("!grant","$n $c",20)); commands.put("!revoke", new Cmd("!revoke","$n $c",21)); commands.put("!ban", new Cmd("!ban","$c $s",22)); commands.put("!uban", new Cmd("!uban","$c",23)); commands.put("!reg", new Cmd("!reg","$c $c",24)); commands.put("+a", new Cmd("+a","",25)); commands.put("+а", new Cmd("+а","",25)); commands.put("+f", new Cmd("+f","",25)); commands.put("+ф", new Cmd("+ф","",25)); commands.put("+p", new Cmd("+p","$n $s",26)); commands.put("+р", new Cmd("+р","$n $s",26)); commands.put("+pp", new Cmd("+pp","$s",27)); commands.put("+рр", new Cmd("+рр","$s",27)); commands.put("!settheme", new Cmd("!settheme","$s",28)); commands.put("!getinfo", new Cmd("!getinfo","$c",29)); commands.put("!room", new Cmd("!room","$n",33)); commands.put("!whoinvite", new Cmd("!whoinvite","$n",34)); commands.put("!kickhist", new Cmd("!kickhist","",35)); commands.put("!adm", new Cmd("!adm","$s",36)); commands.put("!banhist", new Cmd("!banhist","",37)); commands.put("+aa", new Cmd("+aa","",38)); commands.put("+аа", new Cmd("+аа","",38)); commands.put("!lroom", new Cmd("!lroom","",40)); commands.put("!crroom", new Cmd("!crroom","$n $s",41)); commands.put("!chroom", new Cmd("!chroom","$n $s",42)); WorkScript.getInstance(srv.getName()).installAllChatCommandScripts(this); // Здесь происходит чтение скриптов и добавление новых команд commands.put("!about", new Cmd("!about","",1)); } То есть, в переменные типа HashMap authObj и commands записываются соответственно объекты полномочий и команды. Как вы знаете, Map хранит объекты в виде пары <Ключ, Значение>, причем ключ должен быть уникальным, а при вводе нового значения по этому ключу оно заменит старое. Таким образом, открывается большой простор для расширений команд бота. Механизм добавления новых команд и скриптов работает следующим образом: 1. Читается список файлов "*.bsh" в папке скриптов соответствующего сервиса. Это происходит при инициализации класса ChatCommandProc в момент запуска бота. 2. Каждый из скриптов запускается на выполнение. При запуске в скрипт передается текстовая переменная in="install" и переменная cmd, содержащая ссылку на текущий экземпляр класса ChatCommandProc. 3. В момент запуска, скрипт должен распознать, что его запускают с целью инициализации, и добавить необходимые значения в список команд и объектов полномочий. 4. Процедура выполняется один раз, при запуске. Для добавления новых команд бота нада перезагрузить. Для определения того с какой целью запускается скрипт служит переменная in. При инициализации она принимает значение "install", при обычном запуске "run". Секция инициализации в скрипте может выглядеть следующим образом: //Установка скрипта как обработчика команды if(in.equals("install")){ // Проверка того что запущена инициализация cmd.addCommand("!chnick", new Cmd("!chnick","$n $c",39,name)); // Добавляем новую команду cmd.addAuth("chnick","команда изменения ника другого пользователя"); // Добавляем новый объект полномочий out="Ok"; // Говорим что все хорошо return; // Уходим, оставшаяся часть скрипта выполняться пока не должна } Для переименования существующих команд можно использовать скрипт start.bsh, он запускается в момент старта бота. Например, для переименования команды !help можно добавить в него такую строчку: ((ChatCommandProc)srv.cmd).addCommand("!хелп", new Cmd("!хелп","",2)); Для хранения информации о команде используется класс Cmd. В него передается название, шаблон аргументов и порядковый номер команды. Агрументы разделяются пробелом и могут принимать следующие значения: * $n - число * $c - слово, без пробелов * $s - произвольная строка символов до конца
By ICE 2008-2010©
|
|
| |