Перейти к содержимому


Фотография

OpenPeripheral чат а-ля IRC

OpenComputers OC чат прога программа OpenPeripheral IRC

  • Авторизуйтесь для ответа в теме
В этой теме нет ответов

#1 Оффлайн   Fingercomp

Fingercomp

    Видимый невидимый

  • Пользователи
  • PipPipPipPipPipPipPip
  • 1 863 сообщений

Награды

                                               

Отправлено 08 Апрель 2016 - 21:30

Я, кажется, эдак годик (ну ладно-ладно, меньше) назад фигачил чатик и вроде был доволен (нет).
Вот тута хранится сей артефакт: http://computercraft...-googolglasses/
Как выяснилось впоследствии, чатик был совершенно непродуман и неудобен. К тому же, я изрядно получше научился кодить на Луа. И вот, полностью задолбавшить старым чатиком, я засел писать новый.
В этом топике представляю вниманию перевод README на гитхабе.
 
 
Фичи:

  • Каналы
  • Поддержка беспроводной клавиатуры
  • Модули
  • Сетевой интерфейс
  • Разделённые буферы вывода
  • Конфиг-файл
  • ...

Требования:

  • Карта данных или блок данных (OpenSecurity) — нужен для сетевого интерфейса.
  • Соотвественно, мост и очки OpenPeripheral (TODO здесь должна быть картина, наныть у Тоторо).

 
Использование 
Установка
Вам нужны будут мост, очки, адаптер, а также карта или блок данных. Подсоедините адаптер к компьютеру (рядом поставить или кабелем соединить), поставьте мост рядом с адаптером. Вставьте карту данных в компьютер, если вы скрафтили её, или подключите блок данных.
Теперь пропишите edit /etc/chat.json и отконфигурируйте по своему желанию. Предсказываю, что наверняка вам хотелось бы сменить список админов, например, чтобы потушить чат по-нормальному.
Когда вы морально и физически готовы, пропишите opg-chat.
 
Базовое использование
Оденьте очки. Та-даам! Появится на мой взгляд довольно красивый интерфейсик. См. пикчу внизу.
Чтобы что-то туды отправить, прямо в чат пишите сообщение, добавив $$ в начало. Чтобы отправить команду, сделайте то же самое, но со / перед сообщением.
Кроме того, можно использовать беспроводную клавиатуру, тогда доллары не нужны.
 
Некоторые команды, которые желательно знать

  • stop — стопнуть прогу. Очевидно, только для админов доступно.
  • join <канал> — подключиться к каналу.
  • part [канал/номер вкладки] — покинуть канал. И да, главный канал покинуть нельзя. Приносим извинения.
  • help [команда] — попросить помощи у сервера. Можно дать команду — даст подробную инфу о ней.
  • page <строки> — скроллить историю сообщения на канале. Положительные значения двигают вверх, отрицательные — вниз.
    • На клавиатуре можно просто тыкать [PgUp]/[PgDn].

Продвинутое использование 
Модули
Если вас не устраивает стандартная поставка чата, можно дописать свои модули. Просто создайте файл с разрешением .module в директории /usr/lib/chat-modules и творите магию. Как образец можно использоваться стандартные модули.
 
Окружение (доступные функции)

  • storage — таблица, временная память для всякого. Может быть использована для общения между модулями.
  • apcall(func, args...)advanced pcall — вырезает всякую ненужную фигню типа номера строчки и пр., оставляя только причину. Использована для показа ошибки пользователям (так как там ошибки для простоты assert'ом гонятся).
  • createChannel — внутренняя функция.
  • addUser(user) — создать пользователя с данным именем.
  • join — рекомендую не использовать функцию.
  • joinN(chan, user) — затаскивает пользователя на канал. Отсылает всякие оповещения, делает события и создаёт канал, если не существует.
  • part — внутрення функция.
  • partN(chan, user[, partMsg]) — заставляет пользователя выйти с канала с опциональной причиной.
  • quitN(user[, quitMsg]) — заставляет его же покинуть вообще все каналы.
  • sendMsgChan(chan, user, msg[, recipients]) — отослать сообщение на канал от имени пользователя. Можно дать таблицу тех, кому будет видно сообщение.
  • sendMsgChanN(chan, user, msg) — то же самое, в принципе, но сделать дополнительные проверки (модерируемый ли канал там, достаточно ли прав). Не всегда полезно может быть — потому используйте функцию выше, если никаких проверок правовых не надо.
  • addObject(surface, objName, funcKey, args...) — рекомендуемый способ для рисования объектов на поверхности (surface). Первым нужно дать таблицу из surfaces, потом задать имя объекту, указать название функции (строкой!) и дать аргументы функции. Нужно, чтобы можно было обратиться к объекту позже. Кроме того, хранит в userdata объекта его имя — если захочется использовать поддержку мыши без напряга.
  • getActiveChannel(user) — вернуть "активный" канал. Т. е. у пользователя открыт возвращаемый канал (вкладка).
  • bridge — прокси моста.
  • surfaces — таблица, содержащая поверхности пользователей.
    surfaces[user] = {
      surface = {...}, -- Сама поверхность
      objects = {...} -- объекты на поверхности, созданные функцией `addObject`
    }
    
  • users — список пользователей, созданных функцией addUser.
  • commands — список зарегистрированных команд.
  • isin(tbl, value) — маленькая, но очень полезная функция, которая кочует из одной моей проги в другую. Проходится по таблице и ищет указанное значение. Возвращает true, первый найденный ключ таблицы при успехе и false при неудаче.
  • cfg — таблица с конфигурацией. В неё можно записывать — конфиг сохраняется каждую минуту и при выходе.
  • setMode(chan, user, mode[, arg]) — выставить mode. mode — это параметр типа ±<буква mode>, например, +o, -h. Почти как в IRC.
  • modes — таблица всех доступных modes.
  • getLevel(chan, user) — возвращает маску уровня доступа пользователя.
  • checkLevel(chan, user, levels, any) — проверяет, достаточно ли прав у пользователя. levels — таблица, содержащая уровни ({OP, ADMIN, SERVER}). Если any == true, то пользователя достаточно иметь один из перечисленных уровней для успеха. Иначе, все.
  • reqcom(componentName, required[, msg]) — возвращает прокси компонента. Если его нет, а required ~= true, то вернуть пустой компонент (при его индексации возвращает всегда function() end), если же required == true, то создаст ошибку. Напишет ещё сообщение msg, если дано, а компонента нет.
  • copy(tbl) — тоже очень полезная небольшая рекурсивная функция. Копирует таблицу. Напомню, что в Луа при передачи таблицы в функцию, та не копируется, а даётся той же самой (ну как & в Си-языках), что иногда чрезвычайно полезно, не иногда совсем не нужно.
  • _FILE — строка с именем файла модуля.
  • _MODULE — строка с названием модуля (ну то есть то же имя файла его, но без разрешения)
  • NORMAL, VOICE, HALFOP, OP, ADMIN, SERVER — уровни доступа.
  • PREFIXES — таблица уровень-префикс для вывода на очки. всякие там @, %.
  • addListener(eventName, name, func) — добавить слушатель с данным именем, работающий как event.listen, но игнорирующийся при завершении программы.
  • delListener(eventName, name) — удалить слушатель.
  • command {args} — создать новую команду. Лично я опускаю скобки, так как не люблю их.
    args = {
      name = "название команды, которую надо писать через /",
      level = NORMAL, -- кому позволено писать команду
      help = "Краткое описание команды  в списке /help",
      doc = [[Длинная документация для команды,
    можно на несколько строк делать]],
      func = function(eventName, chan, user, raw, cmd, args...)
        -- eventName — название события
        -- chan — канал, откуда отправлено событие
        -- user — пользователь, запустивший команду
        -- raw — необработанная команда без / в начале
        -- cmd — название команды
        -- args... — аргументы, разделённые пробелом (пробелами)
      end
    }
    

Сетевой интерфейс (network.module)
Этот модуль позволяет вам создавать своих чат-ботов через сеть. Поддерживает оба типа модемов. Однако, советую знать о Spoofing Card из Computronics — она позволяет указывать адрес отправителя (не только проводная сеть, но и беспроводная).
 
Конфигурация
В конфиг-файле (/etc/chat.json) есть секция "net". Пример:



"net": {
  "enabled": true,
  "modemStrength": 400,
  "ports": {
    "6667": true,
    "6666": ["519187"]
 }
}
  • "enabled" задаёт, загружать ли модуль вообще.
  • Если модем беспроводной, его сила будет установлена в значение параметра "modemStrength".
  • "ports" — список портов, которые программа будет слушать.
    • Левая часть ("6667"), очевидно, порт.
    • Правая часть можно быть или true — тогда программа не будет фильтровать порт, или белый список адресов (или их частей). В моём примере, программа будет принимать соединения на порту 6667 только от адресов, которые начинаются на "519187".

Команды

  • <имя пользователя>, "auth", <пароль> — подключиться к серверу.
    • true, "keep", "auth", <сессия><сессия> — это временный пароль, требуемый для других команд.
  • <имя пользователя>, "msg", <сессия>, <сообщение> — отправить сообщение или команду на сервер.
    • true, "keep", "ok" — сообщение успешно отправлено.
  • <имя пользователя>, "quit", <сессия>[, причина] — закрыть соединение.
    • true, "close" — успешно закрыто.
  • <имя пользователя>, "chaninfo", <сессия>, <канал> — получить инфу о канале.
    • false, "keep", "you are not on channel" — не на канале.
    • true, "keep", <data><data> — это сериализованная таблица со всей информацией.
  • <имя пользователя>, "userinfo", <сессия>, <пользователь> — получить инфу о пользователе.
    • false, "keep", "no such user" — запрошена инфа о несуществующем пользователе.
    • true, "keep", <data><data> — это вериализованная таблица, соедржащая инфу о пользователе.

 

Ошибки

  • false, "error", "there is already an open connection for this address" — соединение для данного адреса уже установлено.
  • false, "error", "nickname is already in use" — данное имя пользователя уже используется.
  • false, "error", "no password given" — не дан пароль.
  • false, "error", "could not auth: <причина>" — не смог авторизоваться, неизвестная причина.
  • false, "error", "wrong auth" — нет соединения для авдреса, не тот пользователь или неверная сессия.
  • false, "error", "no message given" — не дано сообщение (3 аргумент).

 

События

  • "event", "chat", <канал>, <пользователь>, <сообщение>, <все>, <получатели> — это собтие создаётся, когда пользователь пишет сообщение на канале. Здесь и ниже, <all> — это булева переменная, которая равна true[/i], когда отдельных получателей не задано (всем на канале отослано), и false в противном случае. Если <all> == true, то <recipients> — сериализованная таблица получателей, иначе — сериализованная строка "all".
  • "event", "notice", <канал>, <типУведомления>, <строкаУведомления>, <получатели> — событие создаётся при уведомлениях.
  • "event", "pm", <пользователь>, <получатель>, <сообщение> — событие создаётся при отправке ЛС.
  • "event", "join", <канал>, <пользователь> — пользователь вошёл на канал.
  • "event", "part", <канал>, <пользователь>, <причина> — пользователь покинул канал.
  • "event", "quit", <пользователь>, <причина> — пользователь вышел с сервера.
  • false, "close", "server is stopping" — сервер завершает работу, соединение закрыто.

 

Пароли
Как вы могли заметить, нужен пароль для подключения. Где его взять?

  • Если для пользователя нет пароля (или это имя не было использовано), следует отправлять "" в качестве пароля.
  • Если же он есть, его и нужно отправлять в аргументе.
  • Для установки пароля используйте команду /pass [пароль]. Если аргумент опустить, он будет снят с имени.
  • Пароли хранятся в виде MD5-хешей. Для небольшой программки сойдёт, думаю, и этого.

 

Сессии

После небольшого раздумья ко мне пришло решение проблемы со Spoofing card из Computronics. Было решено усложнить жизнь ботам и клиентам, добавив сессию — временный пароль длиной в 16 символов, который даётся при авторизации. Он требуется для большинства других команд.

 

 
Фуух. А теперь о том, как скачивать. Всё очень просто: устанавливаем OPPM (OpenPrograms Package Manager) и пишем [il]oppm install opg-chat. Вуаля.
 
Кроме того, программа требует OpenOS 1.6 и Lua 5.3.
 
Исходники доступны тут: https://github.com/O...master/opg-chat

Ах, да, собственно, пикчи этого безобразия:

Спойлер

:)


Сообщение отредактировал Fingercomp: 24 Апрель 2016 - 19:19
Oppm \o/






Темы с аналогичным тегами OpenComputers, OC, чат, прога, программа, OpenPeripheral, IRC

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных


Яндекс.Метрика