Advertisement
Asioron

bridge_file

Apr 28th, 2019
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.66 KB | None | 0 0
  1. -------------------------------------------------------
  2. --                    Программа                      --
  3. --        передатчик файлов через мост Рида          --
  4. --        для компьютеров из мода OpenComputers      --
  5. --          проект http://computercraft.ru           --
  6. --                  Version 0.1                      --
  7. --                 2018, © Asior                     --
  8. -------------------------------------------------------
  9.  
  10. local br = dofile("bridge.lua")
  11. local KEY = "qwerty"
  12. local unicode = require('unicode')
  13. local c = require('component')
  14. local gpu = c.gpu
  15. local msg, pair, vr
  16. local Tfile = '/home/getBridgeFileTemp.lua'
  17. local put, get = false, false
  18. local lenS = 0
  19.  
  20. local function scanLenFile() --сканер длины файла
  21.   local i=0
  22.   local vr = ''
  23.   local file = io.open(Tfile, 'r')
  24.   repeat
  25.     vr = file:read()
  26.     i = i+1
  27.   until not vr
  28.   file:close()
  29.   return i-1
  30. end
  31.  
  32. local function unFind(s,ch) --аналог strind.find() поиск в строке только 1 символа
  33.   for i=1,unicode.len(s) do
  34.     if unicode.sub(s,i,i)==ch then
  35.       return i
  36.     end
  37.   end
  38.   return 0
  39. end
  40.  
  41. local x,y = gpu.getResolution()
  42. settingCmd = {1,2,x,y-2}
  43. sms = {'Bridge start!'}
  44. local function printCmd(text) --статус строка
  45.   gpu.fill(settingCmd[1], settingCmd[2], settingCmd[3], settingCmd[4], ' ')
  46.   local flood = true --скрывает флуд в виде "[20] TEST" не использовать в начале скобки!
  47.   local vr = ''
  48.   if text ~= nil then
  49.     text = tostring(text)
  50.     if flood then
  51.       if unicode.sub(sms[#sms],1,1) == '[' then
  52.         vr = unFind(sms[#sms], ']')+2
  53.       else
  54.         vr = 1
  55.       end
  56.       if text == unicode.sub(sms[#sms],vr) then
  57.         RP = RP+1
  58.         sms[#sms] = '['..RP..'] '..unicode.sub(sms[#sms],vr)
  59.       else
  60.         sms[#sms+1] = text
  61.         RP = 1
  62.       end
  63.     else
  64.       sms[#sms+1] = text
  65.     end
  66.   end
  67.   while #sms>settingCmd[4] do
  68.     table.remove(sms, 1)
  69.   end
  70.   for i = 1, #sms do
  71.     if sms[i] ~= nil then
  72.       gpu.set(2, settingCmd[2]-1+i, tostring(unicode.sub(sms[i], 1, settingCmd[3])))
  73.     end
  74.   end
  75.   os.sleep(0)
  76. end
  77.  
  78. local function gpuInfo(tp,ln) --отрисовка полосы коннекта или полосы загрузки(коннект/загрузка, процент)
  79.   gpu.set(1,1,string.rep(' ',settingCmd[3]))
  80.   gpu.set(1,1,'[')
  81.   gpu.set(settingCmd[3],1,']')
  82.   if tp then
  83.     gpu.set(2,1, string.rep('>', math.floor((settingCmd[3]-2)*ln/100)))
  84.   else
  85.     gpu.set(2,1, string.rep('■', math.floor((settingCmd[3]-2)*ln/100)))
  86.   end
  87.   os.sleep(0)
  88. end
  89.  
  90. a = {...}
  91. if a[1] == 'put' then --передача
  92.   if a[2] then
  93.     put = true
  94.     get = false
  95.     Tfile = a[2]
  96.   else
  97.     print('Нет имени передаваемого файла!')
  98.     os.exit()
  99.   end
  100. elseif a[1] == 'get' then --если есть команда на загрузку, то должен быть и файл
  101.   if a[2] then
  102.     Tfile = a[2]
  103.     get = true
  104.   else
  105.     printCmd('Нет имени сохраняемого файла!\nФайл сохранен по временному пути '..Tfile)
  106.   end
  107. else
  108.   print('Передача файлов через мост Bridge\n Получить файл: <get> [fileName]\n Передать файл: <put> <fileName>')
  109.   os.exit()
  110. end
  111.  
  112. printCmd('Подключение ...')
  113. printCmd(br.init(KEY))
  114. printCmd('Ожидание подключения второго устройства ...')
  115. tm = 0
  116. while true do
  117.   msg, pair = br.receive()
  118.   if msg == nil then --соединение с мостом оборвано или отсутствует
  119.     br.init(KEY)
  120.   end
  121.   if msg then
  122.     if put then --передача файла
  123.       if msg == "" and tm then
  124.         tm = tm+1
  125.         gpuInfo(true, tm*100/10)
  126.         if tm > 10 then
  127.           tm = 0
  128.           br.send("PING")
  129.         end
  130.       else
  131.         tm = false
  132.       end
  133.       if msg == 'PONG' then
  134.         printCmd('Соединение установлено!')
  135.         printCmd('Передача адреса файла...')
  136.         f = io.open(Tfile, 'r')
  137.         vr = ''
  138.         br.send('☻'..Tfile) --передача имени файла
  139.         printCmd('true')
  140.       elseif msg == '♦' then
  141.         printCmd('Рассчет длины файла ...')
  142.         len = scanLenFile()-1
  143.         printCmd('Длина файла: '..len)
  144.         printCmd('Передача длины файла...')
  145.         br.send('♦'..len)
  146.         printCmd('Передача файла...')
  147.       elseif msg == '♣' then
  148.         if not vr then
  149.           br.send('♥')
  150.           f:close()
  151.           put = false
  152.           printCmd('Передача завершена')
  153.         else
  154.           br.send('☺'..tostring(vr))
  155.           lenS = lenS+1
  156.           gpuInfo(false, lenS*100/len)
  157.           printCmd(vr)
  158.           vr = f:read()
  159.         end
  160.       end
  161.     else --прием файла
  162.       if msg == "" and tm then
  163.         tm = tm+1
  164.         gpuInfo(true, tm*100/30)
  165.         if tm > 30 then
  166.           tm = 0
  167.           br.init(KEY)
  168.           printCmd('Переподключение')
  169.         end
  170.       else
  171.         tm = false
  172.       end
  173.       if msg == 'PING' then
  174.         printCmd('Соединение установлено!')
  175.         br.send("PONG")
  176.       end
  177.       com = unicode.sub(msg, 1, 1)
  178.       if com == '☺' then --получение строки
  179.         f = io.open(Tfile, 'a')
  180.         f:write(unicode.sub(msg, 2, unicode.len(msg))..'\n')
  181.         f:close()
  182.         lenS = lenS+1
  183.         gpuInfo(false, lenS*100/len)
  184.         printCmd(unicode.sub(msg, 2, unicode.len(msg)))
  185.         br.send('♣') --ответ о приеме
  186.       elseif com == '☻' then --получение имени файла
  187.         if not get then
  188.           Tfile = unicode.sub(msg, 2, unicode.len(msg))
  189.         end
  190.         printCmd('Имя файла получено')
  191.         br.send('♦') --ответ о приеме и запрос длины
  192.       elseif com == '♥' then --получение информации о выходе
  193.         br.send('♥') --ответ о выходе
  194.         printCmd('Загрузка завершена')
  195.         printCmd('Остановка программы')
  196.         os.exit()
  197.       elseif com == '♦' then --получение информации о длине файла
  198.         len = tonumber(unicode.sub(msg, 2, unicode.len(msg)))
  199.         printCmd('Длина файла: '..len)
  200.         br.send('♣') --ответ о приеме
  201.       end
  202.     end
  203.   end
  204.   os.sleep(0.5)
  205. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement