0. Скрипты. Введение

spec аватар

Одно из преимуществ JimBot - в расширяемости функционала. Делается это в настоящий момент (версия 0.4.0) посредством скриптов.

Неомного о скриптах уже было написано в ответах на вопросы: здесь и здесь. Мы же сейчас более подробно рассмотрим механизм расширения команд чата при помощи своих скриптов.

И так, если мы заглянем в исходные тексты бота, а именно класс ChatCommandProc, то увидим следующий механизм определения команд чата:

    /**
     * Инициализация списка команд и полномочий
     */
    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 - произвольная строка символов до конца

Подробно о том как создавать свои скрипты мы поговорим в следующих статьях.

5
Your rating: Нет Average: 5 (3 votes)

Комментарии

По-чаще бы таких статей... Интересно...
Вот как то так...
ПАВЕЛ 77796 аватар
а существует ли скрипт что бы изменить при неверном вводе команды ответ Для входа в чат используйте команду !chat. Для помощи пошлите команду !help Не посылайте ваши сообщения слишком часто. ????
spec аватар
Нет, нельзя.
С уважением, Spec.
BosZZZ аватар
Нормально всё *ok*