Скриптинг в JMC. Базовые методы и настройки - eJMC
Скриптинг в JMC
Автор: Brullek
Оговорюсь сразу, что я не знаю язык JS :) И все строки кода были написаны без представления работы языка JS.
В JMC3.5 в каталоге ./JMC/settings
можно создать файл commonlib.scr
поместив в него JS код, который будет исполняться при запуске скриптового движка во всех профилях.
Приведу примеры реализации своих JS скриптов:
// Начинаю с настройки путей и подгрузки FileSystemObject, который будет инклудить весь пользовательский JS код.
FileSystem = {};
// Здесь у меня лежит жаба. В windows слеши приходится экранировать, и двойные слеши тут не случайны
FileSystem.BinDir = "C:\\JMC\\JMC\\";
// Каталог, где у меня лежат файлы с текстами песен, используется в eJMC.MusicPlayer
// Стоило бы вынести в другое место, но у меня так сложилось, что все пути назначаются именно в этом скрипте,
// Что бы при переезде жабы на другой комп, править пришлось
только этот файл.
FileSystem.SongsDir = FileSystem.BinDir + "songs\\";
// Каталог с конфигами
FileSystem.SettingsDir = FileSystem.BinDir + "settings\\";
// Каталог с логами
FileSystem.LogDir = FileSystem.BinDir + "logs\\";
// Создание объекта, по работе с файловой системой.
// Возможно нужно убдет зарегистрировать какую-то dll, перед использованием.
FileSystem.File = new ActiveXObject("Scripting.FileSystemObject");
// Режимы работы с файлами: чтение, запись, дозапись
FileSystem.mode = {
"Read" : 1,
"Write" : 2,
"Append" : 8
}
// Функция include, служит для подгрузки дополнительного кода
// Имеет один входной строковый параметр sFileName - путь и имя подгружаемого файла, относительно FileSystem.SettingsDir
FileSystem.Include = function(sFileName){
// Открытие файла на чтение
var Stream = FileSystem.File.OpenTextFile(FileSystem.SettingsDir + sFileName, FileSystem.mode.Read);
// Подгрузка содержимого файла в скриптовой движок JMC
jmc.Eval(Stream.ReadAll());
// Закрытие файла
Stream.Close();
}
// Дальше я подгружаю различные хелперы и, собсвенно, eJMC.
// У меня eJMC - объект содержащий все мои `extended`
FileSystem.Include("lib\\functions.js")
FileSystem.Include("lib\\FileSystem\\FileSystem.Functions.js")
FileSystem.Include("lib\\System\\System.js")
FileSystem.Include("lib\\eJMC\\eJMC.js")
Пример lib/FileSystem/FileSystem.Functions.js
// Чтение файла в переменную
FileSystem.ReadFile = function(sFileName){
var Stream = FileSystem.File.OpenTextFile(FileSystem.SettingsDir + sFileName, FileSystem.mode.Read);
var result = Stream.ReadAll();
Stream.Close();
return result;
}
// Запись строки в файл
FileSystem.WriteLine = function(sFileName, text){
var Stream = FileSystem.File.OpenTextFile(sFileName, FileSystem.mode.Append);
Stream.Write(text + "\n");
Stream.Close();
}
// Очистка файла
FileSystem.EraseFile = function(sFileName){
var Stream = FileSystem.File.OpenTextFile(sFileName, FileSystem.mode.Write);
//Stream.Write(text + "\n");
Stream.Close();
}
// Функция возвращает массив строк, элемент с индексом 0 хранит в себе количество строк.
// Полезно, когда нам нужно иметь построчный доступ к данным файла.
// Например: одна строка = одно правило чего-либо.
FileSystem.ReadFileToArray = function(sFileName){
var Stream = FileSystem.File.OpenTextFile(sFileName, FileSystem.mode.Read);
var result = [0];
// Пока не достигнут конец файла, считываем из него данные
while (Stream.AtEndOfStream == false) {
var str = Stream.ReadLine();
//Добавляет строку в массив, а в result[0] возвращает размер получившегося массива
result[0] = result.push(str);
}
// result[0] = размерности массива, но счет в массиве начинается не с 1 а с 0 )))
result[0] = result[0]-1;
// Закрываем файл и возвращаем результат
Stream.Close();
return result;
}
Т.к. мой JS код мада находиться на вечной стадии размышлений, тестов и допилов, пример своего lib/functions.js
и lib/System/System.js
не привожу.
Пример lib/eJMC/eJMC.js
var eJMC = {}; //Создаем объект Extended JMC
// Игровой профиль, беру из жабы
CharName = jmc.Profile;
// Начинаю инклудить всевозмодный код
FileSystem.Include("lib\\eJMC\\eJMC.Functions.js")
FileSystem.Include("lib\\eJMC\\OnIncoming\\eJMC.OnIncoming.js")
FileSystem.Include("lib\\eJMC\\OnTimer\\eJMC.Timers.js")
FileSystem.Include(CharName + "\\lib\\profile.js");
FileSystem.Include("lib\\eJMC\\Bots\\eJMC.Bots.js");
FileSystem.Include("lib\\eJMC\\Logon\\eJMC.Logon.js")
FileSystem.Include("lib\\eJMC\\Log\\eJMC.Log.js")
FileSystem.Include("lib\\eJMC\\Chanel\\eJMC.Chanel.js")
FileSystem.Include("lib\\eJMC\\eJMC.Colors.js")
FileSystem.Include("lib\\eJMC\\OnInput\\eJMC.OnInput.js")
FileSystem.Include("lib\\eJMC\\Subs\\eJMC.Subs.js")
FileSystem.Include("lib\\eJMC\\Action\\eJMC.Action.js")
FileSystem.Include("lib\\eJMC\\Vars\\eJMC.Vars.js")
FileSystem.Include("lib\\eJMC\\MusicPlayer\\eJMC.MusicPlayer.js")
// Обработчик событий при срабатывании таймера
eJMC.OnTimer = function(){
// При срабатывании таймера, нам нужно знать id таймера, который сработал, т.к. можно запустить много таймеров
id_timer = jmc.Event;
// Собсвенно, исполняем код, в соответсвии с id таймера.
// Описание смотрите в файле `lib/eJMC/OnTimer/eJMC.Timers.js`
eJMC.Timers.TimerExec(id_timer);
}
// Обработчик событий при перезапуске скриптового движка жабы
eJMC.OnReLoad = function(){
// Описание смотрите в `lib\\eJMC\\eJMC.Functions.js`
eJMC.Reload();
}
Пример lib\\eJMC\\eJMC.Functions.js
// Регистратор для событий жабы
eJMC.RegisterHandler = function(event, handler){
jmc.RegisterHandler(event , "eJMC." + handler + "()");
};
// Регистрирую обработчик для события, возникающего при вводе данных с клавиаттуры или при вызове метода jmc.parce()
eJMC.RegisterHandler("Input", "OnInput");
// Регистрирую обработчик для события, возникающего при получении данных с сервера, в жабу
eJMC.RegisterHandler("Incoming", "OnIncoming");
// Регистрирую обработчик для события, возникающего срабатывание запущенных таймеров
eJMC.RegisterHandler("Timer", "OnTimer");
// eJMC.RegisterHandler("PreTimer", "OnPreTimer");
// Не помню что это за событие, но вроде бы запуск/перезапуск скриптового движка.
eJMC.RegisterHandler("Load", "OnReLoad");
// Вывод строки в дополнительное окно жабы с пометкой времени.
// Бывает нужно в отдельное окно выносить важные события и помечать когда они были
eJMC.Output = function(str){
jmc.Output(eJMC.Date.getTime() + str);
}
/*
eJMC.Showme = function(str){
echo(str);
}
*/
/*
eJMC.echo = function(str){
echo(str);
}
*/
// Показывает профиль жабы, с которым работает eJMC
eJMC.ShowProfile = function(){
echo(eJMC.Profile);
}
// Отправка строки в JMC, как будто она была введена пользователем с клавиатуры.
// В выводе мы будем видеть строку, как будто только что ввели ее сами
eJMC.Parse = function(str){
jmc.Parse(str);
}
// Отправка строки на сервер.
// Я не помню сечас явной разницы с eJMC.Parse, но она есть :)
eJMC.Send = function(command){
jmc.send(command);
}
// Дальше разные вещи на получение времени
eJMC.Date = {};
eJMC.Date.getTime = function(){
var time = new Date();
var hour = time.getHours();
var minute = time.getMinutes();
var seconds = time.getSeconds();
if (hour<10) {
hour = "0" + hour;
}
if (minute<10) {
minute = "0" + minute;
}
if (seconds<10) {
seconds = "0" + seconds;
}
var timeresult = hour +":" + minute + ":" + seconds + "> ";
//return 19:02:44>
return timeresult;
}
eJMC.Date.getDay = function(){
var time = new Date();
var day = time.getDate();
var month = time.getMonth() + 1;
var year = time.getFullYear();
if (day<10) {
day = "0" + day;
}
if (month<10) {
month = "0" + month;
}
var result = day +"-" + month + "-" + year;
//return 12-05-2012>
return result;
}
eJMC.Date.getDate = function(){
var time = eJMC.Date.getTime();
var day = eJMC.Date.getDay();
var result = day + " " + time;
return result
}
// Регулярные выражения, куда же без них )
eJMC.Regexp = {};
eJMC.Regexp.Quote = function(str) {
// Эти символы следует экранировать.
// . \ + * ? ^ $ [ ] ( ) { } < > = ! | :
var result = str.replace(/(\.|\\|\+|\*|\?|\[|\]|\(|\)|\{|\}|\<|\>|\=|\!|\||\:|\$)/g, "\\$1" );
return result;
}
// Собсвенно при перезагрузке скриптового движка, следует перечитать различные данные.
eJMC.Reload = function(){
eJMC.Actions.Load();
eJMC.Subs.Load();
eJMC.Vars.Load();
}
// Генератор чисел, полезная штука, для написания ботов и активации произвольных событий
eJMC.Random = function(id){
var rand = Math.round(Math.random() * id);
return rand;
}
Имея обработчики для различных собыйти: входящие строки, исходящие строки, срабатывания таймеров, мы вольны делать с этим все что захотим на JS.
Это пример, как я реализовал поддержу в JMC своих JS скриптов. Далее попробую описать различные частные полезные штуки. Смотрите так же - Работа с таймерами
blog comments powered by Disqus