Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -------------------------------------------------------
- -- Программа --
- -- передатчик файлов через мост Рида --
- -- для компьютеров из мода OpenComputers --
- -- проект http://computercraft.ru --
- -- Version 0.1 --
- -- 2018, © Asior --
- -------------------------------------------------------
- local br = dofile("bridge.lua")
- local KEY = "qwerty"
- local unicode = require('unicode')
- local c = require('component')
- local gpu = c.gpu
- local msg, pair, vr
- local Tfile = '/home/getBridgeFileTemp.lua'
- local put, get = false, false
- local lenS = 0
- local function scanLenFile() --сканер длины файла
- local i=0
- local vr = ''
- local file = io.open(Tfile, 'r')
- repeat
- vr = file:read()
- i = i+1
- until not vr
- file:close()
- return i-1
- end
- local function unFind(s,ch) --аналог strind.find() поиск в строке только 1 символа
- for i=1,unicode.len(s) do
- if unicode.sub(s,i,i)==ch then
- return i
- end
- end
- return 0
- end
- local x,y = gpu.getResolution()
- settingCmd = {1,2,x,y-2}
- sms = {'Bridge start!'}
- local function printCmd(text) --статус строка
- gpu.fill(settingCmd[1], settingCmd[2], settingCmd[3], settingCmd[4], ' ')
- local flood = true --скрывает флуд в виде "[20] TEST" не использовать в начале скобки!
- local vr = ''
- if text ~= nil then
- text = tostring(text)
- if flood then
- if unicode.sub(sms[#sms],1,1) == '[' then
- vr = unFind(sms[#sms], ']')+2
- else
- vr = 1
- end
- if text == unicode.sub(sms[#sms],vr) then
- RP = RP+1
- sms[#sms] = '['..RP..'] '..unicode.sub(sms[#sms],vr)
- else
- sms[#sms+1] = text
- RP = 1
- end
- else
- sms[#sms+1] = text
- end
- end
- while #sms>settingCmd[4] do
- table.remove(sms, 1)
- end
- for i = 1, #sms do
- if sms[i] ~= nil then
- gpu.set(2, settingCmd[2]-1+i, tostring(unicode.sub(sms[i], 1, settingCmd[3])))
- end
- end
- os.sleep(0)
- end
- local function gpuInfo(tp,ln) --отрисовка полосы коннекта или полосы загрузки(коннект/загрузка, процент)
- gpu.set(1,1,string.rep(' ',settingCmd[3]))
- gpu.set(1,1,'[')
- gpu.set(settingCmd[3],1,']')
- if tp then
- gpu.set(2,1, string.rep('>', math.floor((settingCmd[3]-2)*ln/100)))
- else
- gpu.set(2,1, string.rep('■', math.floor((settingCmd[3]-2)*ln/100)))
- end
- os.sleep(0)
- end
- a = {...}
- if a[1] == 'put' then --передача
- if a[2] then
- put = true
- get = false
- Tfile = a[2]
- else
- print('Нет имени передаваемого файла!')
- os.exit()
- end
- elseif a[1] == 'get' then --если есть команда на загрузку, то должен быть и файл
- if a[2] then
- Tfile = a[2]
- get = true
- else
- printCmd('Нет имени сохраняемого файла!\nФайл сохранен по временному пути '..Tfile)
- end
- else
- print('Передача файлов через мост Bridge\n Получить файл: <get> [fileName]\n Передать файл: <put> <fileName>')
- os.exit()
- end
- printCmd('Подключение ...')
- printCmd(br.init(KEY))
- printCmd('Ожидание подключения второго устройства ...')
- tm = 0
- while true do
- msg, pair = br.receive()
- if msg == nil then --соединение с мостом оборвано или отсутствует
- br.init(KEY)
- end
- if msg then
- if put then --передача файла
- if msg == "" and tm then
- tm = tm+1
- gpuInfo(true, tm*100/10)
- if tm > 10 then
- tm = 0
- br.send("PING")
- end
- else
- tm = false
- end
- if msg == 'PONG' then
- printCmd('Соединение установлено!')
- printCmd('Передача адреса файла...')
- f = io.open(Tfile, 'r')
- vr = ''
- br.send('☻'..Tfile) --передача имени файла
- printCmd('true')
- elseif msg == '♦' then
- printCmd('Рассчет длины файла ...')
- len = scanLenFile()-1
- printCmd('Длина файла: '..len)
- printCmd('Передача длины файла...')
- br.send('♦'..len)
- printCmd('Передача файла...')
- elseif msg == '♣' then
- if not vr then
- br.send('♥')
- f:close()
- put = false
- printCmd('Передача завершена')
- else
- br.send('☺'..tostring(vr))
- lenS = lenS+1
- gpuInfo(false, lenS*100/len)
- printCmd(vr)
- vr = f:read()
- end
- end
- else --прием файла
- if msg == "" and tm then
- tm = tm+1
- gpuInfo(true, tm*100/30)
- if tm > 30 then
- tm = 0
- br.init(KEY)
- printCmd('Переподключение')
- end
- else
- tm = false
- end
- if msg == 'PING' then
- printCmd('Соединение установлено!')
- br.send("PONG")
- end
- com = unicode.sub(msg, 1, 1)
- if com == '☺' then --получение строки
- f = io.open(Tfile, 'a')
- f:write(unicode.sub(msg, 2, unicode.len(msg))..'\n')
- f:close()
- lenS = lenS+1
- gpuInfo(false, lenS*100/len)
- printCmd(unicode.sub(msg, 2, unicode.len(msg)))
- br.send('♣') --ответ о приеме
- elseif com == '☻' then --получение имени файла
- if not get then
- Tfile = unicode.sub(msg, 2, unicode.len(msg))
- end
- printCmd('Имя файла получено')
- br.send('♦') --ответ о приеме и запрос длины
- elseif com == '♥' then --получение информации о выходе
- br.send('♥') --ответ о выходе
- printCmd('Загрузка завершена')
- printCmd('Остановка программы')
- os.exit()
- elseif com == '♦' then --получение информации о длине файла
- len = tonumber(unicode.sub(msg, 2, unicode.len(msg)))
- printCmd('Длина файла: '..len)
- br.send('♣') --ответ о приеме
- end
- end
- end
- os.sleep(0.5)
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement