Скриптинг в 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