Добро пожаловать в гайд по luairc.
IRC (или Internet Relay Chat) - это протолок прикладного уровня для обмена сообщениями в режиме реального времени. В основном применяется для группового общения, но также позволяет общаться через личные сообщения, обмениваться данными, файлами и т.д.Сегодня же мы рассмотрим не сам IRC, а библиотеку для LUA под названием luairc.
luairc - это библиотека IRC низкого уровня для LUA. Все функции вызывают исключения при ошибках. (со слов разработчика)
Репозиторий:
GitHub - JakobOvrum/LuaIRC: IRC library for Lua
IRC library for Lua. Contribute to JakobOvrum/LuaIRC development by creating an account on GitHub.
github.com
Скачивание и установка библиотеки.
Для установки библиотеки переходим на GitHub разработчика и скачиваем весь репозиторий.Переходим в папку с игрой --> moonloader --> lib и закидываем туда следующие файлы:
1. asyncoperations.lua
2. handlers.lua
3. util.lua
4. init.lua
Закинули? Отлично. Берем файл init.lua и переименовываем в luairc.lua
Следующим этапом нам нужно установить зависимости к luairc, а именно LuaSocket.
Переходим в тему https://www.blast.hk/threads/16031/#post-140673 и скачиваем архив lua51-libs.rar
Из этого архива нас интересует папка luasocket. Открываем ее и все содержимое переносим в папку с игрой --> moonloader --> lib
Ну или загрузить прикрепленные файлы к этой статье.
На этом установка завершена.
Начинаем писать код.
Сейчас мы напишем примитивный скрипт для подключения к серверу.
Lua:
require 'luairc' -- подключаем нашу библиотеку
local connected = false -- переменная, которую мы будем устанавливать в true, когда мы подключены
local s = irc.new{nick = "Meow"} -- создаем новый IRC объект
s:connect("irc.example.net") -- подключаем наш объект к серверу "irc.example.net"
connected = true -- меняем значение переменной на true
function main() -- основная функция
-- Тут могут быть ваши действия
while true do -- обязателен бесконечный цикл
wait(1000) -- обязательна задержка не менее 500 мс (рекомендация разработчика библиотеки)
if connected then -- Проверяем подключены ли мы, иначе при вызове s:think() скрипт выдаст ошибку
s:think() --[[ функция, которая обрабатывает входящие данные и отвечает на запросы сервера (такие как PING)
Данную функцию стоит вызывать достаточно часто, чтобы не истекло время ожидания сервера]]
end
end
end
К серверу мы подключились, запросы обрабатываем, информацию применяем.
Давайте теперь подключимся к каналу и начнем принимать первые сообщения
Lua:
require 'luairc'
local connected = false
local s = irc.new{nick = "Meow"}
s:connect("irc.example.net")
s:hook("OnChat", function(user, channel, message) -- Добавляем обработчик событий. Ниже рассмотрим все виды событий.
print(string.format("[%s] %s: %s", channel, user.nick, message)) -- Готовим строку для вывода и выводим ее в лог. Немного ниже поговорим о структуре user
end)
s:join("#example") -- Подключаемся к каналу #example
connected = true
function main()
while true do
wait(1000)
if connected then
s:think()
end
end
end
Теперь мы подключились к серверу, подключились к каналу и начали принимать сообщения, которые приходят в него.
Если бы такой канал и сервер существовали, то в логе мы бы увидели:
[#example] Brightside: Hello, World!
, где - #example - наш канал
- Brightside - имя того, кто прислал сообщение
- Hello, World! - само сообщение
Сообщения принимаем, читать можем, пора бы и ответить.
Lua:
require 'luairc'
local encoding = require 'encoding' -- Подключаем библиотеку encoding для кодирования строк в UTF-8
encoding.default = 'CP1251'
u8 = encoding.UTF8
local connected = false
local s = irc.new{nick = "Meow"}
s:connect("irc.example.net")
s:hook("OnChat", function(user, channel, message)
print(string.format("[%s] %s: %s", channel, user.nick, message))
end)
s:join("#example")
connected = true
function main()
sampRegisterChatCommand("irc.send", function(params) -- Для ответа создадим команду /irc.send
if connected and params then -- Проверим, что мы подключены и ввели аргументы команды
s:sendChat("#example", u8(params)) -- отправим сообщение, которое мы ввели в аргументах в канал #example
end
end)
while true do
wait(1000)
if connected then
s:think()
end
end
end
Теперь мы смогли ответить на сообщения. Давайте подключимся в еще один чат?
Lua:
require 'luairc'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local connected = false
local s = irc.new{nick = "Meow"}
s:connect("irc.example.net")
s:hook("OnChat", function(user, channel, message)
print(string.format("[%s] %s: %s", channel, user.nick, message))
end)
s:join("#example")
s:join("#example2") -- Подключаемся к еще одному чату. Объявлять новый s:hook() не нужно, он может принимать сообщения со всех каналов одновременно.
connected = true
function main()
sampRegisterChatCommand("irc.send", function(params) -- А наша команда /irc.send по-прежнему отправит сообщение в первый канал #example
if connected and params then
s:sendChat("#example", u8(params))
end
end)
while true do
wait(1000)
if connected then
s:think()
end
end
end
Мы рассмотрели базовые методы и основы работы с этой библиотекой.
Далее я предлагаю Вам ознакомиться со всеми возможными вызываемыми методами, структурами таблиц и списком хуков.
Структура таблицы user
Lua:
user = {
nick, -- Ник пользователя (всегда предоставляется)
username, -- Имя пользователя
host, -- Имя хоста пользователя
realname, -- Реальное имя пользователя
access -- доступ пользователя внутри канала. Таблица, которая содержит поля op, halfop, voice
}
--[[
Все поля, кроме nick могу отсутствовать.
Чтобы заполнить их включите отслеживание пользователей и используйте s:whois()
--]]
Список всех методов.
Метод | Применение и описание |
local s = irc.new(data) | Создает новый IRC объект для подключения. Аргумент data является таблицей. Структура:
Lua:
|
s:hook(name, id, f) | Обработчик событий. Аргументы: name - имя события id - уникальный тег (не обязателен, по умолчанию равен названию callback функции) f - Callback функция |
s:unhook(name, id) | Удаляет обработчик событий Аргументы: name - имя события id - уникальный тег |
s:connect(host, port) | Подключается на указанный IRC сервер Аргументы: host - адрес хоста port - порт хоста (по умолчанию 6667) Аргументом host можно передать таблицу:
Lua:
|
s:disconnect(message) | Отключается от сервера Аргументы: message - сообщение при выходе |
s:think() | Обрабатывает входящие данные и вызывает callback функции (если они указаны) Используется только в бесконечном цикле. |
local info = s:whois(nick) | Показывает информацию о пользователе Аргументы: nick - ник для запроса Возвращает таблицу:
Lua:
|
s:topic(channel) | Отображает заголовок канала. Используется для вызова хуков OnTopic и OnTopicInfo в любое время. |
s:send(msg, ...) | Отправляет "сырую" строку на IRC сервер Аргументы: msg - строка для отправки ... - форматирование строки. Пример использования:
Lua:
|
s:sendChat(target, message) | Отправляет сообщение в канал или пользователю Аргументы: target - Ник или канал message - сообщение в UTF-8 |
s:join(channel, key) | Вступает в канал/чат Аргументы: channel - название канала key - пароль канала (не обязательно) |
s:part(channel) | Покидает канал. Аргументы: channel - название канала |
Список всех хуков.
Хук | Описание |
PreRegister(table connection) | Вызывается перед регистрацией. Полезно для команд CAP и SASL |
OnRaw(string line) | Вызывается при получении любой строки ("сырых") |
OnSend(string line) | Вызывается, когда клиент отправляет любое сообщение |
OnDisconnect(string message, bool errorOccurred) | Вызывается, когда клиент отключается от сервера |
OnChat(table user, string channel, string message) | Вызывается, когда приходит сообщение (в канал / в личные) |
OnJoin(table user, string channel) | Вызывается, когда кто-то подключается к чату, где состоит клиент |
OnPart(table user, string channel) | Вызывается, когда кто-то покидает канал, где состоит клиент |
OnQuit(table user, string message) | Вызывается, когда кто-то покидает сервер из списка каналов, где состоит клиент |
NickChange(table user, string newnick, string channel) | Вызывается, когда кто-то изменяет ник из списка каналов, где состоит клиент |
OnTopic(string channel, string topic) | Вызывается, когда оператор канала изменяет заголовок канала |
OnTopicInfo(string channel, string creator, string timeCreated) | Вызывается с помощью s:topic(channel) и позволяет получить заголовок канала |
OnKick(string channel, string nick, table kicker, string reason) | Вызывается, когда оператор канала кикает любого пользователя (kicker имеет структуру user) |
OnModeChange(table user, string target (channel/usernick), string modes, ...) (... - содержит аргументы параметра) | Вызывается, когда любого из пользователей изменяются параметры внутри канала (например +b - блокировка / -b - разблокировка) |
Cписок всех команд для "сырой" отправки через s:send()
Список всех команд перечислять нет смысла, так как есть уже отдельные сайты, где они перечислены.Поэтому я просто прикреплю статью с wikipedia, где перечислены все команды и их описание.
Список IRC-команд — Википедия
ru.wikipedia.org
В заключении.
Библиотека luairc легка для освоения, но с помощью нее можно придумать множество различных скриптов.Возможно я не так явно раскрыл тему, но я готов помочь вам в данной теме с освоением данной библиотеки.
Что можно сделать с этой библиотекой?
Обычный межсерверный чат, к примеру.
Тут, кстати говоря, и можете посмотреть пример реализации.
Lua - IRC Messenger - чат независимо от сервера
IRC Messenger - чат независимо от сервера. Слишком знакомое название, неправда ли? Да, это очередной IRC клиент на LUA. Но сейчас это допилено (насколько хватило моей фантазии) и выходит на всеобщее пользование. Я не знаю буду ли я поддерживать этот проект в будущем. (интересно кто-то еще...
www.blast.hk
Спасибо за внимание.
Как спастись от краша скрипта при "Ping timeout": https://www.blast.hk/threads/94258/#post-792278
Вложения
Последнее редактирование: