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

AlexCatze

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

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

  • Посещение

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

    7

Все публикации пользователя AlexCatze

  1. Так? local url = "https://github.com/AlexCatze/racoon-dev/" local internet = require("internet") local html = "" local result, response = pcall(internet.request, url) if result then local result = pcall(function() for chunk in response do html = html .. chunk end end) end if result then html:gsub( 'data%-pjax="#repo%-content%-pjax%-container" href="(.-)">', function(s) os.sleep(0) print(s)end ) end Только что попробовал, эффект тот же.
  2. Попробовал на эмуляторе ocelot, получил TLWY. Видимо ответ слишком большой для gsub.
  3. На элементы форм моих нервов не хватило. Весь день занимался интимными делами с своей сетью, пытался заставить её разбивать пакеты более 8 килобайт на несколько, со всеми вытекающими. Так что единственное, что я сделал с библиотекой - дописал одну строчку, позволяющую задать функцию, которая будет вызвана после отрисовки элемента. function TComponent:draw() if self.parent then self.X=self.parent.X+self.left-1 self.Y=self.parent.Y+self.top-1 else self.X=self.left self.Y=self.top end gpu.setBackground(self.color) gpu.setForeground(self.fontColor) local brd=nil if self.border==1 then brd={"┌","─","┐","└","│","┘"} elseif self.border==2 then brd={"╔","═","╗","╚","║","╝"} end if brd then gpu.set(self.X,self.Y, brd[1]..string.rep(brd[2],self.W-2)..brd[3]) for i=self.Y+1,self.Y+self.H-2 do gpu.set(self.X,i, brd[5]..string.rep(" ",self.W-2)..brd[5]) end gpu.set(self.X,self.Y+self.H-1, brd[4]..string.rep(brd[2],self.W-2)..brd[6]) else gpu.fill(self.X,self.Y,self.W,self.H," ") end self:paint() if self.elements then for i=1,#self.elements do if self.elements[i].visible then self.elements[i]:draw() end end end if self.onDraw then self.onDraw() end -- Вот эта строчка end Остальным займусь, когда приду в себя.
  4. Опыт есть. Сегодня попробую, взяв за основу элемент кнопки. Вечером отпишусь. Спасибо. Как-то сразу не заметил.
  5. Библиотека очень спасает, вот пытаюсь опровергнуть утверждение, что браузер на ней не построить. Правда не хватает некоторого функционала. Самое желанное, это возможность указать функцию, которая будет вызываться каждый раз после отрисовки формы. Не хватает таких элементов как CheckBox, Selector и ScrollBar. Первые два можно реализовать используя кнопки, но хотелось бы иметь отдельные элементы. По поводу кнопок, в монохромных интерфейсах, выделять большие кнопки, меняя местами цвет фона и текста не всегда получается. Хотелось бы иметь возможность делать вокруг кнопки обводку. Буду очень благодарен, если вышеизложенные функции будут реализованы.
  6. Меня от этого слова уже тошнит. Я пока пару дней отдохну от расчленения гитхаба. Как будет апдейт сети, которую я пишу, к нему сделаю такой инсталятор.
  7. Тогда есть смысл использовать старый инсталятор. Чуть позже сделаю по нему нормальный гайд.
  8. Можно в последней строке между "/contents/" и "?ref=" вписать путь к папке, которую нужно скачать. Изначально инсталятор делался "под себя". Т.е. у меня была задача одной командой скачивать репозиторий, и этот инсталятор решает её. Мне оказалось проще сделать такой инсталятор, чем список файлов, который к тому же, нужно будет вручную обновлять.
  9. Не хочу. По тому что: Буду строить на библиотеке forms, ибо:
  10. Ещё не встраиваются. В планах есть, но это пока не приоритетная задача.
  11. @AtomicScience Спасибо. Посмотрел я ревью. Спасибо. Сейчас пойду исправлять. По поводу названий функций(getip, sendrec), это ещё с OpenNet осталось. Библиотека racoon.lua вообще отдельный случай, изначально она предполагалась для другого проекта, и неплохо бы для неё придумать нормальное название. Насколько я понял os.date() возвращает некую дату, начиная с 1970-го года, плюс прошедшее игровое время с момента создания мира. Дублирование функций в rn_<> файлах - они похожи, но есть маленькие, но значительные отличия. Например, при отправке сообщений через тунель, не используется порт. Сейчас внесу правки, пойду разбираться с гитхабом.
  12. Спасибо. Замечания посмотрел, сейчас буду код смотреть. По поводу замечаний. 1) Упомяну, и в инсталятор добавлю ребут после установки. 2) Как по мне, любые IP адреса плохо запоминаются. На релизе будет DNS и DDNS. Проблема в том, что сделать DNS по аналогии с OpenNet нельзя. Там при установке записей, пароли от аккаунтов пользователей, передавались в открытом виде. И если для OpenNet это не проблема, то в RacoonNet, по причине лёгкой расширяемости сети, какой-то Вася может модифицировать код роутера, и сниффить все пакеты. Допустим, Петя, воспользовавшись услугами "неправильного" роутера, зарегистрирует аккаунт в DNS с логином и паролем, как в учётной записи сервера майнкрафта. Вася угонит аккаунт Пети, Петя нажалуется администрации проекта, а администрация (особенно если это будет не единичный случай), запретит ЕнотоСеть. По этому, всё, где нужна аутентификация требует шифрования. А как его сделать, у меня пока идей нет( 3) Учту. Вообще хотел привести код в порядок на релизе, и убрать костыли. Ты наверное заметил, что подразумевается возможность выбора языка интерфейса, но много где захардкожен русский. 4) Можешь, пожалуйста, объяснить как это сделать? Просто до этого я использовал гит исключительно как файлопомойку. 5) Будет подробная документация на релизе. Не вижу смысла документировать то, что может(маловероятно, но может) поменяться. Релиз будет, когда будет возможность строить межсерверные сети. Когда будет эта возможность - не знаю. Мост, который я хочу использовать, ведёт себя странно. Я пошёл смотреть код.
  13. Нет. Сеть тоже имеет древовидную структуру. Отличие от ОпенНет, "дерево" может быть любой формы, клиенту всё ровно, подключается он к первому уровню, или к сотому(если кто-то подключит 100 роутеров "последовательно"). И если "ветка" отломается(роутер не сможет связаться с вышестоящим) - связь внутри ветки нарушена не будет. Здесь очень похоже. Роутер, выдавая клиенту IP, запоминает три значения. Первое, как ключ, это выданный IP, второе - адрес карты, на которой висит клиент, и третье - адрес карты клиента. Когда на роутер приходит пакет, он проверяет, содержится ли в IP получателя, IP одного из клиентов. Например, пакет адресован "xxx.yyy.zzz.www", предположим, сеть четырёхуровневая. "xxx","yyy","zzz" - роутеры. Рассмотрим роутер "yyy", ему пришёл пакет, с вышеуказанным адресом получателя, и он передаст его на IP "xxx.yyy.zzz". Сделано это по тому, что роутер не знает, является ли его клиент, для кого то роутером. И на случай "обрыва ветки". Т.е., если связь между роутерами "xxx" и "yyy", второй начнёт выдавать адреса без префикса "xxx", и если кто-то попробует отравить пакет на "xxx.yyy.zzz.www" - пакет уйдет на "yyy.zzz.www". Сеть не безуровневая, просто жёстких требований к количеству уровней нет. Роутеру ведает IP вышестоящий роутер. Если такого нет - роутер берет себе как IP первые 3 знака от адреса компонента computer.
  14. Огромное спасибо!!! Я как бы знал, что оно есть, но найти в документации нужый метод не получилось.
  15. Понял, спасибо. Осталось только прикрутить распознавание файлов и каталогов, и будет считывалка. Завтра постараюсь сделать.
  16. Да. Вызывая getIP ты не только узнаёшь свой IP, но и даёшь роутеру понять, что ты начал работу в сети. Да, теоретически, IP может меняться, но если два раза подряд getIP, ты вряд ли получишь разные IP. IP выдается роутером, на данный момент выдаваемый IP зависит от двух факторов. Первый - IP роутера, второй - адрес карты, с которой был отправлен запрос.
  17. Собственно, с начала я это и хотел сделать, но не разобрался, как получить список всех файлов в репозитории. Можно, пожалуйста, по подробнее.
  18. Предположим, Вы написали крутую программу. И она размазана, скажем на 10 файлов. Или нет, лучше на 50. И Вам захотелось сделать инсталятор. Первая мысль - вручную заливать все файлы на pastebin, потом писать инсталятор, в нём же вручную прописывать коды файлов на pastebin, и их целевые адреса в системе. Это предложение даже читать больно, не то что совершать описанное в нём действие. Но, выход есть. И так, нам понадобятся две вещи: Github аккаунт Хостинг, на котором можно разместить серверную часть. И если с первым всё предельно понятно, то со вторым возникает вопрс: А где его, собственно, взять? Вариантов много. Можно арендовать VPS, поднять сервер на домашнем компьютере или Raspberry Pi, можно воспользоваться услугами таких сайтов как Heroku или PythonAnywhere. Последний вариант примечателен тем, что он полностью бесплатный. И так, какой из сайтов выбрать? PythonAnywhere имеет более ограниченный функционал, по сравнению с Heroku. Но, при этом он намного легче в настройке и эксплуатации, так что остановимся на нём. Далее по пунктам: 1)Заливаем программу на гитхаб. 2)Переходим по ссылке, и создаём токен. Ставим только одну галочку: После создания запоминаем копируем токен, он нам дальше пригодится. Обращаю внимание, что токен нужно держать в секрете. 3) На этом этапе нам нужен хостинг. Я рассмотрю пример с www.pythonanywhere.com . Идём на сайт, регистрируем аккаунт и создаём Flask приложение. В этом нет ничего сложного, если знать английский. Находим файл flask_app.py, и вставляем в него следующее содержимое: from flask import Flask from flask import request import requests import json def request_url(url, result): r = requests.get(url) j = json.loads(r.text) for x in j: if x["type"] == "file": result = result + "\"" + x["path"] + "\"," else: result = request_url(x["url"],result) return result app = Flask(__name__) #@app.route('/',methods=['POST']) def main(): uname = ""# Сюда нужно прописать логин аккаунта Github token = ""# А сюда полученный токен if uname != request.args["owner"]: return "{}" result = request_url("https://"+uname+":"+token+"@api.github.com/repos/"+request.args["owner"]+"/"+request.args["repo"]+"/contents"+request.args["path"]+"?ref="+request.args["ref"],"{") result = result + "}" return result app.add_url_rule("/", "main", main,methods=['GET']) Заполняем поля uname и token, и можно двигаться дальше. 4) На своём компьютере создаём Lua файл, и вставляем в него: local internet = require("internet") local fs = require("filesystem") local shell = require("shell") local ser = require("serialization") local host = ""--Хост, на котором расположена серверная часть local owner = ""--Логин аккаунта Github local repo = ""--Название репозитория local ref = "master"--Название ветки local path = "/"--Путь к папке, из которой скачивать файлы local deploy_to = "/"--Куда скачивать файлы function request(url) local data = "" local result, response = pcall(internet.request, url) if result then local result = pcall(function() for chunk in response do data = data .. chunk end end) end return data end files = ser.unserialize(request("http://"..host.."/?owner="..owner.."&repo="..repo.."&path="..path.."&ref="..ref)) for _,v in pairs(files) do local pth = deploy_to..v if not fs.exists(pth:match(".*/")) then fs.makeDirectory(pth:match(".*/")) end shell.execute("wget -f ".."https://raw.githubusercontent.com/"..owner.."/"..repo.."/"..ref.."/"..v.." "..pth) end Заполняем поля, и готово.
  19. Да. При этом такие возможности как: связь между серверами, многоуровневые сети и DNS(когда они появятся) - будут доступны. API основной либы racoonnet.lua примет свой завершённый вид на релизе. Релиз будет, как только заработает мост между серверами.
  20. Планов менять API нет. Хотя всё может быть. Если не нужен продвинутый функционал(например, работа одновременно с несколькими картами) - можно использовать либу opennet.lua. Она эмулирует OpenNet, и её API меняться точно не будет. При этом основной функционал будет работать нормально.
  21. Предисловие: Недавно, по накурке, мне пришла идея написать браузер для OC. Браузер это конечно хорошо, но для его работы нужна сеть. Первое, что вспомнилось, это OpenNet. Но у него нашлось некоторое некоторое количество серьёзных недостатков(про них позже). Не найдя альтернативы, я пришёл к выводу, что нужно сделать новую сеть, которая будет похожа на OpenNet, но в которой не будет таких недостатков, какие есть в OpenNet. Собственно, о каких недостатках я говорю: 1) Ограниченность в рамках одного сервера. Для того что бы от сети был хоть какой то минимум пользы, ей нужны пользователи. Тяжело найти сервер, где хотя бы пяти людям будет интересна тематика OC. 2) Требования к структуре сети. Три уровня, не больше, не меньше. Первые два - роутеры, третий - клиенты. Роутеры первого уровня соединены с роутерами второго посредством спаренных карт, и с клиентами только через модемы. 3) Низкая надёжность. Стоит из роутера второго уровня вынуть спаренную карту, он сразу превратится в кирпич. 4) Сложность в развёртывании. Два вида роутеров, три вида библиотек. Отсутствие документации. Захотел сеть на даче - нужно участие владельца "коренных" роутеров. Ключевые особенности: Собственно сеть должна обладать такими свойствами: 1) Возможность бесшовно соединять несколько игровых серверов. 2) Иметь максимально простую структуру. 3) При разрыве связи между двумя частями сети, сеть должна "раскалываться" на две, а не ломаться. 4) Сеть должна иметь максимально простую структуру, и иметь хорошую документацию Процесс разработки: Обозначив основные моменты, я потихоньку начал писать сеть. За основу брал OpenNet. С кодом можно ознакомится на складе грязи(тут сама сеть, и ещё несколько программ, которые я использую при разработке). Что сделано: Собственно, сама библиотека, реализующая связь между узлами. Роутер. Библиотека, позволяющая работать в сети программам, заточенным под OpenNet. Браузер и HTTP-сервер, из за которого собственно, всё и началось. Вернее первая его версия. Теоретически(на практике мост, который я хочу использовать, себя странно ведёт) есть возможность устанавливать соединения между игровыми серверами. Инсталлер Что нужно сделать: DNS Интернет-сервер, и клиент под него Чат (клиент, сервер) Нормальный интерфейс. Шифрование пакетов Как это всё безобразие выглядит: И так, допустим, мне очень нужно развернуть сеть. Что мне для этого нужно: Ставим три компьютера. Один будет роутером, и два клиента. Пусть один клиент подключается к роутеру через модем, а второй через спаренную карту. Начинка роутера: И клиентов: Теперь ставим на все компьютеры OpenOS и файлы с репозитория. Можно воспользоваться инсталятором: wget https://raw.githubusercontent.com/AlexCatze/RacoonNet/master/installer.lua installer Начнём с настройки роутера. Запускаем "routconf", и первым делом конфигуратор попросит указать, через какую карту роутер будет подключатся к сети. Так как сети у нас пока нет, пропускаем этот момент. Теперь у нас спрашивают, какие карты будут использоваться для подключения клиентов к роутеру. Отвечаем: Теперь можно и запустить роутер. Пишем "router", и видим картину: Роутер ругнулся, что не имеет выхода в сеть, ну оно и понятно. Теперь настраиваем клиентов, вводим "rnconfig" на каждом из них: Сеть настроена, но что теперь с ней делать? Запускаем на одном компьютере "chat_server", на другом "chat <ip сервера>" . И можем поговорить сами с собой. Или можно посмотреть на браузер. Поднимаем сервер, "webserver", браузер "wr" и наслаждаемся. К стати, сеть называться RacoonNet(над названием я не заморачивался). Собственно, зачем эта тема: Т.к. изначально я собирался сделать только браузер, и вообще, это мой первый проект на Lua, я сам долго не выдержу. Понимаю что сеть сейчас практически является копией OpenNet`а. Я ищу людей, которые захотят помочь мне. Как то так.
×
×
  • Создать...