Лидеры
Популярный контент
Показан контент с высокой репутацией 17.07.2020 в Сообщения
-
1 баллПомню @@1Ridav разрабатывал мост для связи игры и ПК, чтобы можно было получать уведомления от роботов и компьютеров. Чуть посидев (а как вы помните я Lua не знаю) получилось вот это: https://pastebin.com/rZC8BZMs Что позволяет? Вы можете или запускать эту "штуку" просто с аргументом или вырезать те 2 строчки, которые принимают аргументы и просто включить этот код в код вашей программы и получать уведомления в телеграмм. Назвал я эту штуку TGInformer. Что нужно для работы? Со стороны Telegram: Добавить вот этого бота: https://t.me/ShowJsonBot, написать ему и в секции from найти id и записать его Добавить бота https://t.me/OC_InformerBot и написать ему любое сообщение. Со стороны OpenComputers: Компьютер с сетевой картой Загрузить код информера и открыть его для редактирования. Вверху в поле chatid впишите ID, который получили пунктами выше. Выполните tginformer test В результате в телеграм должно прийти test, а в игре код ответа: ОК Теперь осталось вписать это в свою программу и робот будет присылать уведомления типа я покакаль я выкопал ту большую яму P.S. Спасибо @@Alex за правки
-
1 баллВнутри песочницы coroutine.yield переопределён: yield = function(...) -- custom yield part for bubbling sysyields return coroutine.yield(nil, ...) end Также переопределён и coroutine.resume. resume = function(co, ...) -- custom resume part for bubbling sysyields checkArg(1, co, "thread") local args = table.pack(...) while true do -- for consecutive sysyields debug.sethook(co, checkDeadline, "", hookInterval) local result = table.pack( coroutine.resume(co, table.unpack(args, 1, args.n))) debug.sethook(co) -- avoid gc issues checkDeadline() if result[1] then -- success: (true, sysval?, ...?) if coroutine.status(co) == "dead" then -- return: (true, ...) return true, table.unpack(result, 2, result.n) elseif result[2] ~= nil then -- yield: (true, sysval) args = table.pack(coroutine.yield(result[2])) else -- yield: (true, nil, ...) return true, table.unpack(result, 3, result.n) end else -- error: result = (false, string) return false, result[2] end end end Работает это так: Если корутина вернула true, nil, ... — отдать true, ... (поэтому внутри песочницы разница между обычными и переопределёнными функциями не видна). Если корутина йелднулась без нила в начале, то это "системный вызов". Потому что доступ к непереопределённой функции coroutine.yield есть только внутри machine.lua. В таком случае йелдится и текущая корутина вверх по цепочке. EEPROM запускается в корутине. Если корутина эта йелдится, случается следующее: yield(false) — это выключить компьютер; yield(true) — ребутнуть его; yield(n), где type(n) == "number", — спать n секунд; yield(f), где type(f) == "function", — это вызвать непрямую функцию. yield с любым другим аргументом — спать до скончания века. Дополнительно обрабатывается умирание корутины: return посреди еепрома — это error("computer halted", 0); другие ошибки прокидываются. А теперь смотрим на наш вызов. В EEPROM вызвана coroutine.yield(0). Эта функция переопределена, чтобы вызвать нативный coroutine.yield(nil, 0). Корутина тогда йелдится и отдаёт nil, 0. В списке выше это пункт 3.5. Компьютер уйдёт в вечный сон. Ну, конечно, я преувеличиваю. Компьютер спит до момента получения сигнала и, получив, продолжит работу. Но вообще, незачем звать coroutine.yield напрямую. Есть computer.pullSignal, computer.shutdown, component.invoke(addr, nonDirectMethod, ...).
-
1 баллНу я буду в этом вопросе параноиком. Ещё проблема с этим в том, что на одного бота несколько юзеров: в любом канале, где он доступен, можно устроить флуд (и, вероятно, заблочить всего бота с апи).
-
1 баллОтсылать сообщения на сторонний, закрытый сервер, а не в телеграм напрямую, — очень интересная затея. Как-то мне неприятно осознавать, что на стороне сервера-моста все сообщения могут логироваться. У телеграма же несложный API. Всё можно сделать на стороне луа. Я даже пробовал портировать какую-то луа-либу для телеграма под OC — протестить не смог, правда. До сих пор где-то на гисте валяется. Но там всё очень просто, просто функций в апи дофига. Код написан с каким-то странным стилем кодирования. Ну и лучше было это либой оформить, а не standalone программой.
-
0 балловОтважно постим мимо Программы новичков Наверняка за такое долгое время развития экосистемы OpenComputers кто-то уже писал свои обработчики аргументов. Я даже видел какую-то на репе hpm (помянем). Для истории: https://gitlab.com/oc-programs/libxargs/raw/master/libxargs.lua Но в основном всех устраивает shell.parse(...). Ну а меня нет. Установка Pastebin: https://pastebin.com/nSgXWHtp Для ленивых: # pastebin get nSgXWHtp /usr/lib/parg.lua На всякий случай: https://gist.github.com/IS2511/96847fe185278b457505218b1c141f9d Органический продукт! Разработан полностью на ocelot-desktop! API parg.parse(a: table): table: Принимает {...}, возвращает таблицу аргументов. Alias: parg(a: table): table. parg.register(argument: string or table, argType: string, callback: function): nil: В argument название аргумента или список названий одного и того же аргумента (Например {"timeout", "t"}). В argType либо "flag", либо "value". В callback функция с 1 аргументом, это будет либо кол-во флагов, либо значение. Последний аргумент необязательный. parg.unregister(argument: string or table, clearSame: boolean): nil: В argument название аргумента или список названий аргументов (Например {"timeout", "verbose"}). Если clearSame = true, то родственные аргументы также будут удалены. Последний аргумент необязательный, по умолчанию false. Я не знаю зачем эта функция, она просто есть. Базовое использование Механика библиотеки схожа c shell.parse. Для быстроты приведу примеры. Программа для тестов будет такая (далее prog.lua): local ser = require("serialization") local parg = require("parg") local arg = parg({...}) -- same as parg.parse({...}) print(ser.serialize(arg)) Попробуем вызвать с набором разных аргументов: /home # prog test1 test2=test3 --test4 --test5=test6 -test7 -89=10 {"test1","test2=test3",[0]="/home/prog.lua",["9"]="10",test5="test6",["8"]=1,["7"]=1,t=2,s=1,e=1,test4=1} Тут в принципе есть все основные варианты аргументов и их поведение. Самые простые аргументы типа "test1" и "test2=test3" далее не будут рассматриваться. Как можно заметить появился также аргумент [0]="/home/prog.lua", это путь к файлу, который вызвал parg(), бывает иногда удобно. Этот аргумент так же далее не будет рассматриваться. (TODO: Есть мысли, что вызов debug.getinfo(3, "S") самый затратный из всей либы. Так ли это?) Регистрация аргуметов Типы В библиотеке есть 2 типа аргументов: "flag" и "value". Первый всегда number, второй всегда string или nil. По умолчанию (без регистрации аргументов) все аргументы считаются "flag", если не используется =, тогда аргумент считается "value". "flag" в значении имеют количество своих появлений. Например prog -xxx => {x=3}. "value" в значении имеют строку со значением, указанным пользователем. Например prog -x=123, prog --x=123 => {x="123"}; prog --test=123 => {test="123"}. Далее переходим к регистрации типов аргументов. Отредактируем prog.lua: local ser = require("serialization") local parg = require("parg") parg.register({"timeout", "t"}, "value") parg.register({"verbose", "v"}, "flag") local arg = parg({...}) print(ser.serialize(arg)) Теперь некоторые аргументы имеют явный тип, а также родственников (Получается "--timeout" = "-t" = "--t"). Поскольку у "timeout" теперь явно тип "value", аргумент может принимать значения через пробел prog -t 10 => {t="10",verbose=0,v=0,timeout="10"}. Обратим внимание! Отсутсвие "flag" дает 0 в таблице аргументов. "verbose" явно "flag", значит любые = больше не сработают prog -v=abc --verbose=def => {v=2,verbose=2}. Каллбэки Последняя фича - каллбэки. Добавим в prog.lua последние штрихи: local ser = require("serialization") local parg = require("parg") local timeout, verbose parg.register({"timeout", "t"}, "value", function (value) timeout = tonumber(value) or 10 end) parg.register({"verbose", "v"}, "flag", function (count) verbose = count > 0 end) parg({...}) print(ser.serialize({timeout,verbose})) Попробуем. prog => {10,false}; prog -t abc => {10,false}; prog -t 20 -v => {20,true}; prog --verbose => {10,true} Ну вот и все, библиотека работает. TODO: Добавить порядок обработки? Взаимосвязанные каллбэки? Конец Остался только один вопрос. Зачем? Почему у меня не используются регулярки? А нужны ли они? На самом деле я просто забыл о них, не знаю есть ли смысл переделывать. Комментарии и критика приветствуются :з Первый пост, критика по оформлению также велком
Эта таблица лидеров рассчитана в Москва/GMT+03:00
