Fingercomp 4 409 Опубликовано: 8 апреля, 2016 (изменено) Я, кажется, эдак годик (ну ладно-ладно, меньше) назад фигачил чатик и вроде был доволен (нет).Вот тута хранится сей артефакт: http://computercraft.ru/topic/758-chat-dlia-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], когда отдельных получателей не задано (всем на канале отослано), и [il]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) и пишем oppm install opg-chat. Вуаля. Кроме того, программа требует OpenOS 1.6 и Lua 5.3. Исходники доступны тут: https://github.com/OpenPrograms/Fingercomp-Programs/tree/master/opg-chatАх, да, собственно, пикчи этого безобразия: Изменено 24 апреля, 2016 пользователем Fingercomp Oppm \o/ 9 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
hot9rot 2 Опубликовано: 18 сентября, 2021 тема мертва? 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
hot9rot 2 Опубликовано: 18 сентября, 2021 (изменено) ? Изменено 18 сентября, 2021 пользователем hot9rot случайно отпрвил 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp Автор темы 4 409 Опубликовано: 19 сентября, 2021 17 часов назад, hot9rot сказал: тема мертва? Тема мертва! 17 часов назад, hot9rot сказал: ? Ура! 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 154 Опубликовано: 19 сентября, 2021 22 часа назад, hot9rot сказал: тема мертва? Часто встречаю подобный этому вопрос, но не понимаю его смысла. О чём он? В этой теме нет обсуждения. Может быть, она мертва и никому не интересна. Может быть, она просто спит. Бывает, автор составит настолько хорошее описание, что ни у кого из читателей не возникает каких-либо вопросов, им остаётся лишь молчать в восхищении. Или молчат в недоумении, настолько текст показался бессмысленным для них. Поэтому я предлагаю вместо общефилософских вопросов на тему жизни и смерти сразу перейти к конкретике. Что именно интересует по предложенной автором теме? Удалось ли запустить программу? Если не удалось, то какие именно возникли сложности? 1 1 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах