Totoro
-
Публикации
1 950 -
Зарегистрирован
-
Посещение
-
Победитель дней
289
Сообщения, опубликованные пользователем Totoro
-
-
Некоторое время назад я публиковал программку - интернет-мост Stem.
Он очень простой в использовании, но к сожалению пока не лишен некоторых глюков.
А кроме того, у него есть недокументированные возможности.
Предлагаю сейчас поиграться с одной такой тайной фичей. Это будет интересно тем, кто немного знаком с HTML/CSS/JavaScript.
В чём суть?
Всё просто.
У Stem есть веб-клиент. То есть если вы зайдете по адресу https://stem.fomalhaut.me (например), вы увидите окно, которое пригласит вас ввести ID канала и початиться прямо с сайта.
После ввода ID канала, вас перекинет на страничку с "чатом", где вы сможете посылать сообщения вашему компьютеру/роботу в майнкрафте.
Адрес этой странички будет выглядеть примерно так:
https://stem.fomalhaut.me/channel?id=testГде test это ID вашего канала.
Когда робот будет вам отвечать, это будет видно в логе. Примерно так:
А теперь - тайная фича.
Находясь на страничке канала, как на скриншоте, вы можете приписать к адресу дополнительный флаг: &render=true.
Полный адрес станет выглядеть примерно так:
https://stem.fomalhaut.me/channel?id=test&render=trueИ начиная с этого момента, все входящие сообщения от компьютера в OpenComputers будут не отрисовываться в лог, а попадать в JS функцию eval(...).
Что это значит?
Те кто имел дело с JS уже наверное поняли все последствия.
Но я поясню.
Это значит, что компьютер OpenComputers может прислать сообщение с JS кодом, и сайт Stem этот код выполнит.
А это значит, что вы можете творить на сайте вообще всё что угодно. Вы можете удалить интерфейс, показать вместо него новый, скачать что-то с инета, запустить игрушку... да хоть майнить крипту.
Поиграем
Ничего вредоносного мы делать конечно сейчас не будем.
Вместо этого, традиционно, попробуем сделать так, что сайт Stem превратится в сайт для управления светом в нашем доме в Майнкрафте.
Шаг первый. Подготовим дом.
Тут всё просто - стандартный компьютер, с интернет картой, от него кабель к I/O блоку, а на блоке - подопытная лампа.
На компьютер ставим Stem.
Например, ставим HPM такой командой,
pastebin run vf6upeANИ потом пишем:
hpm install stemНажимаем Enter и готово.
Шаг второй. Нам нужен сайт.
Усложнять не будем, и наш революционный дизайн будет выглядеть так:
Что нам нужно сделать, чтобы сайт Stem превратился в то что нам надо?
Методом тыка, через консоль браузера определяем, что достаточно выполнить такой код:
document.body.innerHTML = " <style>button:active { background: #fac700; }</style> <button onclick=\"sendMessage(\'toggle\')\">Toggle Light</button> "; document.body.style.alignItems = "center";
Первой строкой мы просто заменяем всё содержимое тега <body> на то что нам надо. Я добавил еще немного косметики в виде стиля для кнопки. Вторая строка - тоже косметика, я просто поправил стиль на теге <body> чтобы кнопочка была посередине.
Один важный ньюанс - на кнопке повешено свойство onclick с кодом sendMessage("toggle").
Таким образом, когда пользователь тыкнет по кнопке, мы отправим сообщение обратно в OpenComputers.
Функцию sendMessage нам дает веб-клиент Stem. Ей можно безвозмездно пользоваться в своих целях.
Шаг третий. Соединяем это все вместе.
Теперь надо набросать программку для нашего компьютера в Майнкрафте, чтобы он выслал подготовленную JS-"бомбу" по нашему сигналу.
Эники, беники... выходит что-то такое:
local event = require('event') local stem = require('stem') local side = require('sides') local com = require('component') local redstone = com.isAvailable('redstone') and com.redstone or nil local channel = "test" local layout = [===[ document.body.innerHTML = "\ <style>button:active { background: #fac700; }</style>\ <button onclick=\"sendMessage(\'toggle\')\">Toggle Light</button>\ "; document.body.style.alignItems = "center"; ]===] local lampSide = side.top local lampTurnedOn = false print("Connecting to the #" .. channel .. " STEM channel...") local server = stem.connect('stem.fomalhaut.me') server:subscribe(channel) print("Done.") print("Press [q] to quit.") while true do local name, a, b = event.pull() if name == "stem_message" then local message = b if message == "connect" then print("Someone wants to connect - sending the layout...") server:send(channel, layout) elseif message == "toggle" then if redstone ~= nil then if not lampTurnedOn then redstone.setOutput(lampSide, 16) lampTurnedOn = true else redstone.setOutput(lampSide, 0) lampTurnedOn = false end end end elseif name == "key_down" then local char = b if char == 113 then break end end end server:disconnect()
Я думаю тут большая часть очевидна и понятна.
Мы подключаемся к серверу Stem, подписываемся на нужный канал и внимательно слушаем входящие сообщения.
Когда пользователь присылает сообщение connect, мы отправляем ему подготовленный код, который мирно лежит в переменной layout.
Этот код прилетит к пользователю, и, если пользователь смотрит страницу с включенной опцией render=true, код сработает и перерисует страницу.
Если опция будет отключена - он просто увидит код в логе, как простое сообщение.
Шаг четвертый. Тестируем.
Откроем наш канал по ссылке:
https://stem.fomalhaut.me/channel?id=test&render=trueПоявится пустой лог.
Запустим программу в OpenComputers.
Она отрисует наше приветствие, что-то вроде:
Сonnecting to the #test STEM channel... Done. Press [q] to quit.Теперь пишем на сайте команду connect.
Если мы все сделали правильно, и Stem не заглючил, интерфейс сайта исчез, и вместо него появилась наша кнопка.
Нажимаем её.
Вуаля! Дома зажегся свет.
Постскриптум
Это конечно же недокументированная хакерская фича, которую можно считать альфа-версией.
Кроме того в Stem сейчас есть неуловимый баг, из за которого сообщения иногда не доходят. Не пугайтесь.
Если кто-нибудь предоставит мне сценарий (прямо по шагам), при котором 100% срабатывает баг - буду очень рад и пофиксить его будет легче.
С помощью описанной фишки можно придумать много хрени. Я показал самое простое что пришло в голову.
Уверен, ваша фантазия будет покруче моей )
Пишите баг-репорты или пожелания по фиче, да и просто комменты в эту тему, либо мне в любой канал связи, где я онлайн.
-
14
-
2
-
-
У терминалов OC нет графического режима.
Используй символы-блоки и полублоки из Юникода. Или символы алфавита Брайля.
-
7 часов назад, anton3312578859 сказал:Так возможно ли сделать папку proc?
Если ты пишешь свою ОС - ты пишешь и свой API к файловым системам.
Ничего не мешает тебе сделать сколько угодно и каких угодно виртуальных ФС, или папок, или файлов.
Для примера - тут где-то валялась программа, которая позволяла объединять жесткие диски в один, с тем чтобы обойти лимит на максимальный размер диска, и иметь возможность работать с файлами по 4+ мегабайт. Она как раз создает виртуальную ФС над стандартной.
В реальности файл разбит на множество частей - а программы которые с ним работают этого не замечают.
Так же этого файла в принципе может не существовать, и он может генериться системой на лету - и программы тоже не заметят.
Короче не вижу препятствий.
-
Анимации клевые.
-
2
-
-
С небольшим запозданием, но я таки обновил сервер снова, и исправил все баги.
Итак, теперь сервер постоянно обменивается с клиентами пингами. Это позволяет поддерживать соединение "в тонусе" и не давать ему отвалиться, как на TCP подключениях, так и на веб-клиенте.
Для теста я держал соединение между веб-клиентом и программкой в эмуляторе OC открытым примерно два часа. Ничего не сломалось.
Кроме того я добавил больше контроля над состоянием соединения.
В веб клиенте фон будет загораться красным в случае проблем с соединением, так что это будет легко заметить и обновить страничку.
В библиотеке для OpenOS добавились новые методы:
server:ping(content[, timeout]), boolean - позволяет послать серверу Stem пинг. В качестве контента указываете любой кусок данных. Сервер должен будет его вернуть в точности чтобы подтвердить пинг. Метод блокирующий, ждет ответа от сервера вплоть до таймаута (который по дефолту 5 секунд). Возвращает true или false.
server:isConnected(): boolean, error - проверка того, установлено ли подключение к серверу Stem. Если установлено, вернет true. Если не установлено - вернет nil и сообщение об ошибке.
server:reconnect(): server, error - если что, этой командой можно переподключиться к серверу. Вернет ссылку на самого себя (объект server) в случае успеха. В случае ошибки, как водится, nil и строку с сообщением об ошибке.
Подробный список команд можно полистать тут.
Установить новую версию библиотеки можно по прежнему из Hel:
hpm install stem
Если библиотека уже была устанвлена, можно только обновить:
hpm upgrade stem
Если вы не пользуетесь Hel, то качайте по прямой ссылке:
wget https://gitlab.com/UnicornFreedom/stem/raw/master/stem.lua
-
4
-
2
-
-
6 минут назад, Alex сказал:п.с. каналы пока так сами по себе и отваливаются. И даже если чисто с вебки его криэйтить. Через несколько минут канал на сервере умирает судя по мониторилке каналов и сессий
Угу, проблема есть.
Но я знаю как это поправить, во всяком случае для веба. Сейчас нафигачу пинг-пакеты и буду их слать каждые N секунд или минут.
Вечером будет фикс. -
ВНИМАНИЕ!!! ОБНОВЛЕНИЕ.
Сервер STEM ночью был обновлен и перезагружен, всё что было к нему подключено - отключилось.
Что нового?
Новая веб-страничка. Теперь там появился веб-клиент. Мы можете подключиться к любому каналу и почитать, что там пишут. И даже написать самому.Конечно свободы там меньше чем если работать через OC напрямую - послать любые данные не получится, только UTF-8 текст. Но зато не надо писать код, а можно просто с сайтика всё отправлять.
Кроме того, я отрефакторил внутреннюю структуру сервера, поменялось довольно много кода.
Всё пока еще сырое, активное тестирование и сообщение о багах приветствуется.
В ближайшие несколько дней буду фиксить баги и добавлять остальные обещаные плюшки, типа ping пакета.
Скрытый текст
-
6
-
-
-
35 минут назад, Alex сказал:@Totoro Стоп, а у Рида же не закрывалось ничего вроде на его мосте? Или ты не помнишь?
Не помню. Надо отыскать тех кто им более активно пользовался.
-
Только что, Alex сказал:@Totoro а может это фишечка оски? Не может она по таймауту сама закрывать коннекты?
Тоже такая идея в голову пришла.
Но интересно, что закрывается только одна сессия - приемник. А вторая живет.
-
@Alex буду смотреть, что там такое. Надо понять кто именно убивает соединение - OC, Stem или ещё кто-то.
Если окажется, что соединение гасится по бездействию Явой или OpenComputers - придется делать какой-то периодический пинг, чтобы поддерживать контакт.
-
14 минуты назад, Alex сказал:По истечении этого времени канал сдох, о чем сообщила мониторилка сервера и известила, что активных каналов 0.
По идее, это означает, что сдох коннект от того компа, который был подписан на канал. Приемник-то есть.
Канал считается сдохшим, если на него никто не подписан.
-
3 минуты назад, Alex сказал:@Totoro всё работает. Даже не знаю, в чем проблема была. Поставил имя канала "test" - все заработало
Может быть оно некорректно обрабатывает какие-нибудь символы в названии канала. Если что-то такое появится - пиши.
-
4 минуты назад, Alex сказал:Это и радостно и печально одновременно. А почему у меня не работает?) Может точно нужно было выключить и снова включить. А может я комп не так скрафтил. Хотя всё есть, ось установил, карту запихал, нетворк проинсталлил, питание есть. Что не так-то? Что ему нужно?:)
А ххрен его знает, что ему нужно.
Надо как-то дебажить. Ты откуда подключаешься? С домашнего компа или с сервера? Там в сетью все нормально на этом компе?
Файрвол какой-нибудь не озорует?
UPD: ID канала точно совпадает на приемнике и передатчике?
Каждый подключившийся к серверу компьютер должен увеличивать счетчик на веб-панели.
Сейчас она показывает 1 канал и две сессии. Это канал test который я использую и мои два компьютера.
Попробуй подключиться и посмотреть как изменяются счетчики.
-
-
Только что, Alex сказал:@Totoro а кстати, а на наш не коннектился?
Не, не пробовал. Щас протестирую.
-
@Alex только что протестировал работу в майнкрафте.
Скопировал твои проги для приема-передачи, только заменил канал на test и сервер на stem.fomalhaut.me.
Всё работает нормально.
Скрытый текст
Единственный глюк который нашел - это если закрыть приложение-приемник на Ctrl + Alt + C, то OpenComputers не закрывает корректно соединение. После четырех раз соединения забиваются и надо рестартнуть компьютер.
Но это как бы ситуация внештатная, и по хорошему надо закрывать соединение в конце выполнения программы, при помощи server:disconnect().
-
Меня тут товарищ @BrightYC пихает в чате уже месяца два, чтобы я фичи обещаные запилил

Мотивация появилась, пилю понемногу. Получается не быстро, т.к. времени мало, и Rust у меня заржавел и запылился. Но надеюсь доведу до версии 0.2.0.-
1
-
-
Только что, Alex сказал:ага, круто! а обратная связь будет в этом "чатике"? То есть если мне робот ответил в канал, сообщение прилетит? Или только отправка?
Обратная будет. Будет и получать и отправлять.
Я для этого делаю поддержку сервером веб-сокетов. Разобрал на гайки весь сервер сейчас, меняю архитектуру немного.Кстати, можно будет и свои веб-клиенты делать, наверное. То есть стучать на web-socket Стема с каких-то своих сайтиков.
Или не клиенты, а типа виджеты делать, выводить в реальном времени какую-нибудь инфу с роботов.
-
Только что, Alex сказал:а как ты хочешь это реализовать? Какой-то просто инпут, в который можно ввести канал и сообщение? Или будет регистрация и вход в каналы и прочее? Это же сложно все наверно?
Не, регистрация и вход - это всё лишнее. Просто вводишь ID канала и попадаешь в интерфейс типа чата, который тут у нас на форуме.
То есть лента сообщений, показано кто подписан, и можно самому что-то писать-отправлять.1 минуту назад, Alex сказал:И кстати, так и не понятно пока, почему сообщения не доходят в майне? Или уже все норм?
А это я в процессе дебага пока. Вчера успел только в эмуляторе погонять, потом меня отвлекли.
В эмуляторе вроде отправляет все.
Сегодня домой приду - зафигачу в креативе тестовый мир и буду там тестировать.-
1
-
-
2 минуты назад, Alex сказал:А уже чатики, логи и прочее можно на доп страничках каких-то выводить и принтить
Я думал немного потеснить инфу на главной странице и сделать там поцентру или снизу окно для ввода ID канала, и рядом кнопку "Join".
А вот когда уже тыкаешь кнопку - попадаешь на отдельную страницу, где "чатик" занимает все пространство, а логотип сдвинут в навбар. -
@Alex во, спасибо.
Я сейчас работаю над веб-клиентом для стема, собираюсь как раз поменять дизайн странички немного.Надо будет как-то туда органично встроить формочку типа чатика - лог сообщений и поле для ввода текста, чтобы можно было прямо с сайта общаться с роботами. Ну и позывные всех, кто подписан на твой канал - роботы не роботы - тоже как-то отображать культурно.
-
15 часов назад, Alex сказал:Это происходит, если 4 раза подряд подключиться ресивером. (код выше) На пятый запуск ошибка. У оски какие-то ограничения есть на кол-во тсp подключений?
Да, там в конфиге мода есть флажок:
maxTcpConnections: 4Чтобы сбросить все подписки и подключения, нужно сделать
server:disconnect()
Это закроет сокет и сотрет все подписки.
Команда unsubscribe никак не влияет на сокет (подключение), она только убирает одну подписку.
Я добавлю проверку количества подключений в клиентскую библиотеку, чтобы не происходило повторных подключений.
Плюс можно еще запилить команду типа unsubscribeAll() - чтобы отписаться от всех каналов не переподключаясь.
Или сделать чтобы команда unsubscribe() отписывала от всех каналов, если вызвать её с пустыми скобками.
-
1
-
-
Провел быстрый тест на дефолтном сервере. Вроде работает.
Сейчас проверю в майнкрафте.

Stem - мультиканальный интернет мост
в Сетевые технологии
Опубликовано:
Так.
Тут мне долго жаловались на непонятные глюки и проблемы с тем, что сообщения не доходят.
Я немного покопался в исходном коде, и нашел один занятный баг.
Оказывается, каждый раз, когда кто-то отключался от сервера, со всех каналов, на которые он был подписан, дропались все подписчики.
Я этот баг исправил, и накатил новую версию (0.2.1) на сервер.
Кроме того коммиты с фиксами доступны в репозитории, если кто-то держит локальную копию stem'а.
Приглашаю всех, у кого наблюдались косяки со связью, повторно протестировать и отписаться.