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

HeroBrine1st

Пользователи
  • Публикации

    134
  • Зарегистрирован

  • Посещение

  • Победитель дней

    21

HeroBrine1st стал победителем дня 11 декабря 2022

HeroBrine1st имел наиболее популярный контент!

Репутация

88 Обычный

HeroBrine1st

  • Звание
    Местный

Контакты

  • Сайт
    https://herobrine1st.ru

Посетители профиля

807 просмотров профиля
  1. Добавил поддержку заголовков и сделал пример загрузки библиотеки на EEPROM. Библиотека всё так же слабо протестирована, хоть уже и активно используется.. Буду исправлять разные баги по мере обнаружения.
  2. По идее для любой, на которой есть луа 5.3. Лично я тестировал на 1.7.10 и мод был версии 1.7.5
  3. Библиотечка является аналогом уже существующей библиотеки, но имеет нативную (если можно так выразиться) поддержку EEPROM и TLS с помощью dependency injection (банально передать методы для коннекта и остального надо). Если я всё правильно читал, то эта библиотека может быть даже эталонной реализацией, насколько это вообще возможно на OpenComputers. Внимание: библиотека слабо протестирована. Я написал её для собственных целей и выкладываю в надежде, что она может пригодиться кому-либо ещё, но без каких-либо гарантий на её работоспособность или пригодность к каким-то конкретным условиям. Реализовано: Пинг-понг Полная обработка WebSocket Closing Handshake (за исключением того, что из-за невозможности получения TCP/FIN библиотека в нарушение RFC закрывает соединение сама после завершения рукопожатия) Поддержка как бинарных, так и текстовых фреймов в обе стороны (используется один и тот же код, поскольку в луа string является одновременно и ByteArray, ну или как-то так) Поддержка фрагментированных пакетов в обе стороны (не протестировано) Куча проверок входящих данных, из-за которых в том числе исходник разбух до 13 килобайт Поддержка payload размером до 2^63 - 1 байт (очевидно, в ОЗУ не поместится, а обработки во время получения нет) Работа как с картой данных, так и без неё (код без карты не прилагается, нужно передать функцию base64.encode аргументом) Поддержка TLS (опять же, аргумент с функцией подключения) Из-за того, что в библиотеке фингера метод read не принимает количество байт для чтения, она может не подходить к данной библиотеке, поскольку она не имеет собственного буфера и читает ровно столько данных, сколько ей нужно Документация и типовые аннотации EmmyLua Библиотека живёт на гисте, хотя, может быть, куда-нибудь переедет. Использовать её очень просто: local component = require("component") local websocket = require("websocket") local socket = websocket.connect(component.internet.connect, component.data.encode64, "websocket.endpoint.com", 80, "/some/path", { protocols = {"optionalSubprotocol", "anotherSubprotocol"}, headers = {authentication = "Bearer cA9KDPgVQU2IHK7SYEvq5K3O2IUzRYJPVf6mLdWmMTKXJ2FG6VynLa3rfcHBXbHv"} }) while socket:update() do local message = socket:getMessage() -- Если передать сюда true, то функция будет отдавать ещё и незавершённые сообщения if message then -- Пришло сообщение local payload = message.payload local mType = message.type -- binary или text local fin = message.fin -- true, если сообщение завершено и все фреймы приняты if mType == "text" then print(payload) socket:sendText("Echo " .. payload) else socket:startClosingHandshake(1003, "Binary payload is not supported by this endpoint") end -- Закрываем соединение при получении бинарного сообщения end end Сервер для проверки не прилагается. Функции библиотеки: connect(connect_function: function, base64_encode_function: function, host: string, port: number, path: string, [options: table]) - подключиться к серверу по паре `host:port` к пути `path` с помощью сокета, который создаст функция connect_function. Options является таблицей дополнительных параметров. Заголовки устанавливаются как пары ключ-значение опции headers (см. пример), а параметр protocols в опциях указывает значение заголовка `Sec-WebSocket-Protocol`, который может быть полезен (RFC) в некоторых случаях. Возвращает объект WebSocket. Выкидывает ошибку при любом удобном случае (может быть переделаю на всякие nil и "Server has refused connection") Методы WebSocket: update() - вызывает чтение низлежащего сокета, отвечает на пинги, обрабатывает закрытие соединения и т.д.. Возвращает true, если соединение ещё живое (даже если вы закрыли соединение! там целое рукопожатие для этого) и false, если нет. Достаточно его вызывать с таким же периодом, с которым к вам приходят пинги. Может выкинуть ошибку, если произойдёт ошибка при чтении. startClosingHandshake([closeCode: number, [closeReason: string]]) - запускает WebSocket Closing Handshake sendText(payload: string, [fin: boolean]), sendBinary(payload: string, [fin: boolean]), sendFrame(initialOpcode, payload, [fin: boolean]) - отправляет, соответственно, текстовый, бинарный и произвольный фрейм с возможностью фрагментации (fin = false). Если вы указали fin = false, то вы должны в будущем отправить следующий фрагмент, при этом вы не можете отправлять другие сообщения. Никаких проверок там нет, отправляйте фреймы в закрытое соединение на свой страх и риск. isClosed() - true, если соединение закрыто isClosing() - true, если закрывающее рукопожатие активно getCloseCode(), getCloseReason() - возвращают код и причину закрытия соответственно getSocketId() - возвращает id низлежащего сокета для использования с ивентом internet_ready (лично у меня не завелось) getMessage([canBeFragmented: boolean]) - возвращает первое полученное сообщение из "непрочитанных". Если сообщение завершено, то удаляет его из внутреннего буфера. Если canBeFragmented=true, то может вернуть копию незавершённого сообщения, но не удалит его из буфера. Библиотека после минификации почти влезает в EEPROM, а после сжатия влезает в тысячу с чем-то байт. Код ниже вполне себе влезает в еепром (где-то 2 КБ), но в нём не поддерживаются (выкидывают ошибку) субпротоколы (поле protocols в опциях), поскольку баг я заметил слишком поздно, а минифицированная версия у меня уже была. Минифицировать ещё раз мне лень, поскольку нужно за минификатором поставить скобки, которые он убирает, так что как-нибудь в следующий раз. local data = component.proxy(component.list("data")()) local internet = component.proxy(component.list("internet")()) local websocket = load(data.inflate(data.decode64("eJyVWGtT4kgX/iupUEx1Nm2WICAiTRUoI15xuejOOr5UEzqQERI2CTrOlPPb9/QlIVzcrfeDpNPd5zn3pzvOA4fONUp+vs/FaJyOHBLFoedPLWdGwxM55658J/YCX5sghl1DTk6JrrtBqM2IjXOuNglgZmpZDnJr47eYoZnxi8kRmh3YRr5k2obB/MlJyOJV6GtTjb9sKfDQNwX/rODnAP+Noz+TZ46+oPHMCqk/CRaogIvl8gbo8z7QBZrhLOzrzJszbdYoSFgHzT5xHMt6PpmRWaNRFSCeq337RXxvrsUz5mtCKPdc/5YIFbgA36nt6E81U8sJfJ85MfJxgJf4bxziSFkSk4jFCxbTmI7nDP18xz9HI8+fsO9k/G7EtRGIQipWThyEWXFrxuiEhRGMlmEQB04wjwylPt5UP/4IZIVfjIjNXWsUBc4zi4mPYEFNOfMgYhPi0nnETtZTUBM7cwzwJ4wc2BtzIaNR4PPQqWk3pAsWQYkpnWAkoPHp6YL5caRwZVxeSdayE5kscIHxwMst3/EbebVcz/ei2akKsAH5epOpYmEI3r4ZKovf5ewYzFrnSwL9gGqAHS9yx+pR7zPn4IGN+0L3wZ2Kr/5ERJJ4Nh0aoxesYz2BX0lhXqsMNzXP15bUCyO0MsDeH+SHZSH9a/jVz0e1fKQbNdgINQyN1DQ2jWEkQB6yK4bxar2GHm8c/bw90PKR1hkM7n63LZvjdIIoBiQ+HC6nIdRC7ZWNZbT4pAoI5L+2kut8dtOxK/amIDbn76GuuKB9KFf539rkEKqH4R+GKuBW2kpJdlqkZVmvFgR6IvLRqkGOJtJ9CZVpqDQfEMRcq1HSoKdBIlqNkY1LsFPnXuuy+SxRWciQqdXPgxgC/ULn3kQLWbSEImf6VjhPSVa9row+I4mKUyCllno7NYtqvY0/k7MaeOvMkDDg9/zEzFv8JzIRPAz+tExD5w62wUq7YO81EuntXq/bG13c3jevL85GvXb/rnvbb49Ou2ftUT4aZasB1EK2lixERm3KLdI1KLGRbkh2k7adQwfxMuvIMmvVpsrOfPQbyve5ab/V1uMD6Tfk5fyxU5sHrxz9iTQTdjt/1J20VvQncEXVkw46YFFVj1hJK2x/PqSnw7vzXhN8+9y8uG6f6RnLLwjgRVBqKc7BMu0tMOUiUxe8H5ME5N3H/+GvhSfdvDD5ixgbJMPKew1JQt4ftu563UH3tHutqgNohuP/+i+EjOSo0waneqNmq9++HayrLMOyUUzD+FRyZAfKOJrRZ4Yu8RWvkQ0G1SC0WZaVNij2zhxdkpcuFbUQ17IWgFdMOOcqs3Al5DhoTTDrZ062qIptOKk32Zu36S55X+7j7qudg8Sl3hxdGTvidqFQ3IugTEqiu30uyemNE2fLvu0DRxaOtR9wtZxQYEzVxdcbZ4ggpJONVGxFXqjJxL9DaBSxMEbXqGjwJPpAOB1IXq5DSGFDVHAfl5QXhE69yJmwQzqWtcY4yHWyjXyDb0lH3o1snDBPF9/hP3AP9/EADwm6+WQXq0ajcYRhWCnBqMJHh0UYlfkIDopGo4RhAK+36W4+OuLOojvzD7NnNJS5Mhsii1td8rnXvGmPev370bDP23YnJgA2IMTO4qgkfBC+e1I00bBhF8uc1NEQhIsVwe9F3gBVA34KRhqx+92I3W9F7IEMuRkKSRgiF/7EX5JQFvGh8UDQn/V61TC/JL0uRI62RPBfeIRpAVMb0yKmh2uIYwVRrhgm+lKvlwAL/QXPAjxH9TrE30S0UK8XS3xg1+s230mLQis93Gpi6aJbf+AuinZNXXw4yLlG0tD9T9UkUfyNkGrW4kuFeMWPSrehMnFJkqu2bQjt6i1hCdhZlDuviCuOucNEHS/nTV7K5PZjEvlvxviX6pDpANeO9yuzC0JbQtPKdVoi2TukCgQtkxwtcU9oGeLGK4u7REuPtPzEL4brUP4iHzYAFP75DXB6c3DRvQV+7/YGe+tf6awQiU8r1pK+zQM6Ieuh6Z7AC2gmXTBIOCB2m/YT+ammcfy2ZKTPWwks1mP2PYajVh97Pg3fdJyAuu9bHxUpxWQJdB24Pu6mH2VDknMTe4/kITJsVMrlw7IMwpA3wwksLRBUX9IiolPT9cp6fe18lXioZKSRcBDq1utHhtk3+EcZkI85hBE90uCnCj8TRKupVfSYFNRFnh7Xc7TCuwEm6bGp2mGDruXll1ZEzcIeW96Cdk7dNAKUYhd3///DVnVCVy50SRpoaXaffPC9IgquwOEpBfrdOXwhI2KLzbcU0hba/e6R2vf4NYDaQHQMTilzhYpMs2CxuEeyJaoJUedDWSA8Z1d2yuIbFkV0CuGcQChzG59uW4cevz1lioNt9Oijza90lK37MKlj8Q0VskXwwlBWAttJKdKNJInGkUCyd2DMn2mrwLsavmf6JbEu450XnYoSQNmYpHWxdzNkas9uXla7kRPgp8CN+/AFaX4k1BPsuVdMEuseQfmxdrHtjOoeb4Ky/xGh/wDFyvdc")))() Тестировал вручную без TLS с сервером KTor на движке CIO.
  4. @Bumer_32 это должно стоять сразу после нормального лаунчера. До него это как-то странно - заморачиваться со всякими емейлами и при этом не сделать нормальный лаунчер, с которым заморачиваться с емейлами нужно уже меньше (как минимум, можно уже писать не только java код, а вообще взять готовое решение на том же nodejs)
  5. Существуют число клиентские моды (сервер их проигнорирует, но, тем не менее, они есть) Существует разделение модов (на клиенте только клиентская часть, на сервере - серверная), но это, обычно, бывает, когда: Необходимо защитить модификацию от копирования (например, на проекте есть уникальный мод UniqueFeatures9000 и он не хочет, чтобы его стащили на другие сервера) - явно не наш случай Необходимо уменьшить размер клиента - а вот в этой теме про размер клиента разговоры были Кратко - не должны, но могут. Ну и ещё на моей памяти так никто не делает, но у меня выборка слабая - всего 1 проект(
  6. @eu_tomat я точно не знаю, что там за лаунчер, но обычно сборка валяется в лаунчсервере как папка с клиентом майнкрафта без самого клиента майнкрафта. Ему можно выдать, например, FTP доступ (винда с радостью подхватит (я надеюсь)) и пусть заливает моды как обычно в папочку
  7. База данных, текстовый файл с паролями, HTTP запрос для проверки.. этих трёх методов достаточно для гибкости. Можно написать простенькую веб-страничку с регистрацией и загрузкой лаунчера, а лаунчсервер будет стучаться на бекенд с проверкой пароля. На сайте лаунчера есть описание его возможностей. Авторизация происходит до запуска майнкрафта, так что уязвимости в нём вообще не играют роли
  8. Нет смысла писать что-то самому. https://launcher.sashok724.net/ - есть вот такой классный простой лаунчер (сам настраивал по приложенной инструкции). Его немножко забросили, но он ещё неплох. Впрочем, если нужна поддержка, есть два форка (по ссылке выше есть ссылки на эти форки). Лаунчер и форки поддерживают: Автоматическое скачивание клиента, модов и конфигов - на серверной стороне лаунчер может даже скачать клиент с форжем (т.е. не надо вручную ему нести форж и майнкрафт) Проверку файлов на наличие обновлений (как защита от читов - так себе, ломается за 15 минут в случае Gravit) Настройки памяти, папки скачивания, отображения логов и т.д. А так же бонусом (этого нет в вашем установщике, либо плохо смотрел): Парольную авторизацию Проверку на то, что клиент действительно авторизован (имеется проверка UUID) Кастомизацию интерфейса (стандартный стек HTML/CSS/JS) Gravit дополнительно умеет в настройку дополнительных клиентских модов (например, оптифайна или оптимизирующих память) Единственный минус, и я думаю, что он очень важен, поскольку мне кажется, что места на вашем сервере не хватает (как я это понял - далее): все эти лаунчеры качают майнкрафт на сервер, чтобы с этого сервера отдавать их клиентам. Почему мне показалось, что места не хватает: существующий установщик вместо прямого скачивания клиента с сервера скачивает его с dropbox. Я уже писал это в Discord, но дублирую здесь, потому что меня несколько проигнорировали...
  9. Потому что данная графическая оболочка была создана под OpenOS и какого-либо навыка переписывания операционных систем под себя я не имел, хотя планы были амбициозные, например: Изоляция приложений в корутины (как библиотека для OpenOS) Системные вызовы через coroutine.yield Слой совместимости с OpenOS Изоляция приложений от системы для защиты от вирусов Установка с дискеты Обновления пакетным менеджером (как у линуксов) TabletOSNetwork какой-то (выше нашёл в топике) И т.д. Сейчас я всё это могу сделать, но мне банально лень. Так же причиной было то, что в первую очередь я делал оболочку для себя и она была больше некоторым "плацдармом" для экспериментов, чем действительно оболочкой, которая могла бы использоваться каждый день. Вот тут хочу прокомментировать: то, что описано в цитате произошло из-за того, что я не умел (и не умею до сих пор) делать UI Если бы я продолжал разработку данной графической оболочки, я бы её выделил в самостоятельную монолитную ОС (как линуксы, опять же), так что промах. Так же мне лень продолжать разработку, тоже промах. Да, тестировщик был из меня так себе... Записал, может быть когда-нибудь пофикшу.
  10. Похоже, что эта функция подходит. local function getCurrentScript() local info for runLevel = 0, math.huge do info = debug.getinfo(runLevel) if info then if info.what == "main" then return info.source:sub(2, -1) end else error("Failed to get debug info for runlevel " .. runLevel) end end end Она возвращает путь к файлу скрипта, выполняющемуся в данный момент. Нужно вызвать её и сравнить возвращаемое значение с `"/init.lua"`, если не совпадает - вернуть nil. Минус - низкая производительность (об этом написано прямо в документации на debug.getinfo). + как оказалось, поля в proxy можно создавать/изменять/удалять и они не будут пропадать. P.s. Это остаётся в силе)
  11. Сохранить оригинальную функцию open из proxy в переменной `open`, затем заменить функцию в этом proxy на function(...) local args = {...} if args[1] == "file.lua" then -- Заменить название файла return nil else return open(...) -- В случае, если оригинальная функция сохранена в переменную open, иначе нужно изменить название end end (может быть ошибся с синтасисом, давно на lua не писал) Минусом данного решения является необходимость вызывать open из переменной внутри файла init.lua, а так же недоступность io.open, fs.open и подобных функций по отношению к конкретному файлу даже изнутри init.lua. Плюсом данного решения является потрясающая производительность по сравнению с debug.getinfo. Если данного решения будет недостаточно - нужно копать в сторону debug.getinfo. Найду Ocelot Desktop на своём ПК - попробую написать функцию с ним. К слову. Я не уверен, что component.proxy для одного компонента является единственным. Возможно, API предоставляет разные экземпляры, тогда нужно будет изменить функцию component.proxy, но это уже выглядит большим костылём. Расскажите, что вы хотите сделать; может быть, существует способ проще.
  12. Да, немного я погорячился с "неограниченным" количеством. epoll тоже имеет ограничение, указанное в /proc/sys/fs/epoll/max_user_watches pi@raspberrypi:~ $ cat /proc/sys/fs/epoll/max_user_watches 269947 Но я думаю, что условно-неограниченным можно считать, пока не нужно создавать промежуточный сервер - вот там могут быть проблемы при большой нагрузке.
  13. Очередной никому не нужный мост Библиотека для Kotlin/Java с клиентом OpenComputers для интеграции в ваше приложение. Мост нестандартный. Потому что может это всё: Выполнение существующих функций на удаленном устройстве OpenComputers (без компиляции, быстрый способ) Выполнение произвольного кода на удаленном устройстве OpenComputers (с компиляцией, медленный способ) Можно комбинировать выполнение функций и кода в одном запросе, передавая в аргументы результаты предыдущих выполнений. Получение ивентов с фильтром (например, по умолчанию игнорируются множество ивентов пользовательского ввода) Возможность отправки любых сообщений через протокол из, например, event.listen (что крайне не рекомендуется, но возможность есть) Соединение с клиентом будет разорвано автоматически максимум через 10 секунд, если компьютер перестал функционировать (например, выгрузился чанк или отключился сервер), а соединение не разорвалось. И все это с условно-неограниченным количеством подключенных клиентов - лишь бы хватило ОЗУ, производительности ЦПУ и ОС хоста поддерживала что-то получше select (у него есть ограничение в 1024 сокета). Так же поддерживается аутентификация, но не поддерживается шифрование. Оно было бы возможно (в простом варианте без кучи кода и криптографии), если бы мод поддерживал вебсокеты, но пока такая возможность отсутствует. Основная цель - хранение кода подальше от опенкомпов, желательно у себя дома. Так же вы всегда знаете, подключен ли компьютер или нет. Минусы: Требуется статический белый айпи (хотя для написания промежуточного сервера нужно переписать минимум кода благодаря использованию селекторов, я пока не стал этого делать) Из-за того, что изначально OpenComputers не имеет кода для выполнения, немного снижена производительность. Присутствует Javadoc. Пример кода на стороне сервера (Kotlin) Более полный пример (тоже котлин) Репозиторий - в README есть описание работы, а в самом репозитории готовый клиент на moonscript. Да-да, я знаю, что в Lua нет компиляции, но судя по скорости это именно она и происходит.
  14. То, что я написал (совершенно не помню зачем, но я что-то хотел на этом сделать), совершенно не то, что должен делать, если решил создать защищенное ядро системы. Что бы его сделать, нужно создать собственную файловую систему (что бы работать с флагами и правами файлов, а так же получить хорошее шифрование накопителя), а дальше будет куда проще.
  15. range(a, b) итерируется как целочисленное множество от a до b-1 Например, list(range(0,2)) равен [0,1] По остальному согласен, благодарю. Не понимаю, как у меня получилось без этого возвести в степень xD Приму к сведению, пойду исправлять скрипт
×
×
  • Создать...