Alex_Vergerenko

Download_FTP_server

Jan 8th, 2016
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.82 KB | None | 0 0
  1. ------------------------------------------- Библиотеки -------------------------------------------
  2.  
  3. local shell = require("shell")
  4. local component = require("component")
  5. local unicode = require("unicode")
  6. local gpu = component.gpu
  7.  
  8. ------------------------------------------- Переменные -------------------------------------------
  9.  
  10. --Массив с программами, которые необходимо загрузить. Первый элемент - ссылка на файл, второй - путь для сохранения файла.
  11. local applications = {
  12.         { "https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/ECSAPI.lua", "lib/ECSAPI.lua" },
  13.         { "https://raw.githubusercontent.com/mainsourcecode/ftp_server/master/ftp_server", "ftp_serv.lua" },
  14. }
  15.  
  16. --Получаем размеры монитора
  17. local xSize, ySize = gpu.getResolution()
  18.  
  19. ------------------------------------------- Функции -------------------------------------------
  20.  
  21. --Отрисовка квадрата указанного цвета
  22. local function square(x, y, width, height, background)
  23.         gpu.setBackground(background)
  24.         gpu.fill(x, y, width, height, " ")
  25. end
  26.  
  27. --Запомнить область пикселей и возвратить ее в виде массива
  28. local function rememberOldPixels(x, y, x2, y2)
  29.         local newPNGMassiv = { ["backgrounds"] = {} }
  30.         newPNGMassiv.x, newPNGMassiv.y = x, y
  31.         --Перебираем весь массив стандартного PNG-вида по высоте
  32.         local xCounter, yCounter = 1, 1
  33.         for j = y, y2 do
  34.                 xCounter = 1
  35.                 for i = x, x2 do
  36.                         if (i > xSize or i < 0) or (j > ySize or j < 0) then
  37.                                 error("Can't remember pixel, because it's located behind the screen: x("..i.."), y("..j..") out of xSize("..xSize.."), ySize("..ySize..")\n")
  38.                         end
  39.                         local symbol, fore, back = gpu.get(i, j)
  40.                         newPNGMassiv["backgrounds"][back] = newPNGMassiv["backgrounds"][back] or {}
  41.                         newPNGMassiv["backgrounds"][back][fore] = newPNGMassiv["backgrounds"][back][fore] or {}
  42.                         table.insert(newPNGMassiv["backgrounds"][back][fore], {xCounter, yCounter, symbol} )
  43.  
  44.                         xCounter = xCounter + 1
  45.                         back, fore, symbol = nil, nil, nil
  46.                 end
  47.                 yCounter = yCounter + 1
  48.         end
  49.         return newPNGMassiv
  50. end
  51.  
  52. --Нарисовать запомненные ранее пиксели из массива
  53. local function drawOldPixels(massivSudaPihay)
  54.         --Перебираем массив с фонами
  55.         for back, backValue in pairs(massivSudaPihay["backgrounds"]) do
  56.                 gpu.setBackground(back)
  57.                 for fore, foreValue in pairs(massivSudaPihay["backgrounds"][back]) do
  58.                         gpu.setForeground(fore)
  59.                         for pixel = 1, #massivSudaPihay["backgrounds"][back][fore] do
  60.                                 if massivSudaPihay["backgrounds"][back][fore][pixel][3] ~= transparentSymbol then
  61.                                         gpu.set(massivSudaPihay.x + massivSudaPihay["backgrounds"][back][fore][pixel][1] - 1, massivSudaPihay.y + massivSudaPihay["backgrounds"][back][fore][pixel][2] - 1, massivSudaPihay["backgrounds"][back][fore][pixel][3])
  62.                                 end
  63.                         end
  64.                 end
  65.         end
  66. end
  67.  
  68. --Шкала прогресса
  69. local function progressBar(x, y, width, height, background, foreground, percent)
  70.         local activeWidth = math.ceil(width * percent / 100)
  71.         square(x, y, width, height, background)
  72.         square(x, y, activeWidth, height, foreground)
  73. end
  74.  
  75. --Окно загрузки
  76. local function downloadWindow()
  77.         --Задаем стартовые координаты
  78.         local width, height = 60, 7
  79.         local progressBarWidth = math.floor(width * 3 / 4)
  80.         local x, y = math.floor(xSize / 2 - width / 2), math.floor(ySize / 2 - height / 2) + 1
  81.         --Запоминаем старые пиксели
  82.         local oldPixels = rememberOldPixels(x, y, x + width - 1, y + height - 1)
  83.         --Рисуем верхний тулбар
  84.         square(x, y, width, 1, 0xcccccc)
  85.         local text = "Загрузка"
  86.         local xPos, yPos = math.floor(xSize / 2 - unicode.len(text) / 2), y
  87.         gpu.setForeground( 0x000000 )
  88.         gpu.set(xPos, yPos, text)
  89.         --Рисуем само окно
  90.         square(x, y + 1, width, height - 1, 0xeeeeee)
  91.         --Загружаем файлы и рисуем шкалу прогресса
  92.         xPos, yPos = math.floor(xSize / 2 - progressBarWidth / 2), math.floor(ySize / 2)
  93.         local percent = 0
  94.         progressBar(xPos, yPos, progressBarWidth, 1, 0xcccccc, 0x3366CC, percent)
  95.         for i = 1, #applications do
  96.                 progressBar(xPos, yPos, progressBarWidth, 1, 0xcccccc, 0x3366CC, percent)
  97.                 square(xPos, yPos + 1, progressBarWidth, 1, 0xeeeeee)
  98.                 gpu.setForeground(0x262626)
  99.                 gpu.set(xPos, yPos + 1, "Устанавливаю " .. applications[i][2])
  100.                 shell.execute("wget " .. applications[i][1] .. " " .. applications[i][2] .. " -fQ")
  101.                 percent = math.floor(100 * i / #applications)
  102.         end
  103.         progressBar(xPos, yPos, progressBarWidth, 1, 0xcccccc, 0x3366CC, percent)
  104.         os.sleep(0.3)
  105.         --Выпиливаем нарисованное окно
  106.         drawOldPixels(oldPixels)
  107. end
  108.  
  109. ------------------------------------------- Программа -------------------------------------------
  110.  
  111. downloadWindow()
Add Comment
Please, Sign In to add comment