<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="../style.xsl"?>

<doc path="../" style="styles.css" toc="tocmain">

<name>Lua-интерфейс для PtokaX. Как работают скрипты и что они могут делать</name>
<body>

<p>Скрипты позволяют расширить или изменить стандартный функционал, предоставляемый хабом.
Чтобы понять, как его можно изменить, надо немного разобраться с самим протоколом DC++.
Мы не будем вдаваться в тонкости самого протокола и форматы сообщений, заметим лишь только, что 
по сути дела работа хаба состоит в следующем:
</p>

<ul>
<li>Прием сообщений (как чатовых, так и служебных) от юзеров;</li>
<li>Рассылка юзерам ответов на эти сообщения;</li>
<li>Обработка входов/выходов юзеров (контроль паролей по базе для зарегистрированных)</li>
<li>Обработка команд хаба, посылаемых пользователями (встроенных и пользовательских);</li>
<li>Обработка банов, контроль IP-адресов, размера шары, слотов и тд, и т.п. (короче, правил хаба).</li>
</ul>

<p>Для каждого вида сообщений у хаба существует стандартный обработчик -- те действия, которые он выполняет сам
без всяких скриптов. Так вот скрипты позволяют <i>перекрыть</i> этот обработчик и написать вместо него свой.
Можно сказать хабу, чтобы он (например) при входе юзера выдавал ему сообщение, а потом выполнял
стандартный обработчик события "вход юзера". А можно сделать и так, чтобы он просто выполнял какие-то действия
и больше ничего не делал.
</p>

<sm><b>Комментарий:</b> обработка событий на хабе очень напоминает обработку сообщений в различных оконных
системах (Windows, X Window System). Отличие пожалуй в том, что вместо одной большой
оконной процедуры (WindowProc) имеется много различных функций,
каждая из которых реализует отдельный обработчик.
</sm>

<p>Чтобы перекрыть какое-либо событие хаба, нам нужно сделать скрипт, в котором есть функция со специальным именем
и специальными параметрами. Список этих спец-функций известен и содержится в документации по PtokaX.
Мы не будем разбирать абсолютно все, так как их до фига, а разберем основные, наиболее часто используемые.
</p>


<p>Итак, начнем с примера, в котором пользователю (незарегистрированному) при входе на хаб
выдаётся сообщение "Привет".</p>

<code open="Пример 1">
function UserConnected(user)
	Core.SendToUser(user, "Привет");
end
</code>

<p>Назовем наш файлик <b>example.lua</b>, положим его в папку <b>scripts</b> у PtokaX. Теперь жмем кнопку <b>Scripts</b>,
и там кнопку <b>Refresh scripts</b>. Хаб увидит наш файлик и покажет его в списке.
Ставим на файлике галочку (это значит, что скрипт активирован). Если вы набрали его без ошибок, хаб напишет внизу,
что всё зашибись. Теперь заходим на хаб с каким-нибудь ником и -- о чудо -- видим сообщение "Привет".
Заметьте, что оно будет даже без указания ника, от которого оно послано.
Мы сами такое сообщение послать не сможем, оно будет проигнорировано хабом как имеющее неверный формат.
</p>

<nav/>
</body>
</doc>