Advertisement
Ewgeniy

Untitled

Sep 22nd, 2021 (edited)
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 13.52 KB | None | 0 0
  1. local component = require("component")
  2. local computer = require("computer")
  3. local unicode = require("unicode")
  4. local event = require("event")
  5. local fs = require("filesystem")
  6. local serialization = require("serialization")
  7. local shell = require("shell")
  8. local args, options = shell.parse( ... )
  9.  
  10. ------------------------------------- Проверка компа на соответствие сис. требованиям -------------------------------------
  11.  
  12. shell.execute("cd ..")
  13. shell.setWorkingDirectory("")
  14.  
  15. -- Создаем массив говна
  16. local govno = {}
  17.  
  18. print(" ")
  19. print("Analyzing computer for matching system requirements...")
  20.  
  21.  
  22. -- Проверяем, не флоппи-диск ли это
  23. if fs.get("/bin/edit.lua") == nil or fs.get("/bin/edit.lua").isReadOnly() then table.insert(govno, "You can't install MineOS on floppy disk. Run \"install\" in command line and install OpenOS from floppy to HDD first. After that you're be able to install MineOS from Pastebin.") end
  24.  
  25. --Если нашло какое-то несоответствие сис. требованиям, то написать, что именно не так
  26. if #govno > 0 and not options.skipcheck then
  27.   print(" ")
  28.   for i = 1, #govno do print(govno[i]) end
  29.   print(" ")
  30.   return
  31. else
  32.   print("Done, everything's good. Proceed to downloading.")
  33.   print(" ")
  34. end
  35.  
  36. ------------------------------------- Создание базового дерьмища -------------------------------------
  37.  
  38. local lang
  39. local applications
  40. local padColor = 0x262626
  41. local installerScale = 1
  42. local timing = 0.2
  43. local GitHubUserUrl = "https://raw.githubusercontent.com/"
  44.  
  45. local function internetRequest(url)
  46.   local success, response = pcall(component.internet.request, url)
  47.   if success then
  48.     local responseData = ""
  49.     while true do
  50.       local data, responseChunk = response.read()
  51.       if data then
  52.         responseData = responseData .. data
  53.       else
  54.         if responseChunk then
  55.           return false, responseChunk
  56.         else
  57.           return true, responseData
  58.         end
  59.       end
  60.     end
  61.   else
  62.     return false, reason
  63.   end
  64. end
  65.  
  66. --БЕЗОПАСНАЯ ЗАГРУЗОЧКА
  67. local function getFromGitHubSafely(url, path)
  68.   local success, reason = internetRequest(url)
  69.   if success then
  70.     fs.makeDirectory(fs.path(path) or "")
  71.     fs.remove(path)
  72.     local file = io.open(path, "w")
  73.     file:write(reason)
  74.     file:close()
  75.     return reason
  76.   else
  77.     error("Can't download \"" .. url .. "\"!\n")
  78.   end
  79. end
  80.  
  81. -- Прошивочка биоса на более пиздатый, нашенский
  82. local function flashEFI()
  83.   local oldBootAddress = component.eeprom.getData()
  84.   local data; local file = io.open("/MineOS/System/OS/EFI.lua", "r"); data = file:read("*a"); file:close()
  85.   component.eeprom.set(data)
  86.   component.eeprom.setLabel("EEPROM (MineOS EFI)")
  87.   component.eeprom.setData(oldBootAddress)
  88.   pcall(component.proxy(oldBootAddress).setLabel, "MineOS")
  89. end
  90.  
  91. ------------------------------------- Стадия стартовой загрузки всего необходимого -------------------------------------
  92.  
  93. print("Downloading file list")
  94. applications = serialization.unserialize(getFromGitHubSafely(GitHubUserUrl .. "IgorTimofeev/OpenComputers/master/Applications.txt", "/MineOS/System/OS/Applications.txt"))
  95. print(" ")
  96.  
  97. for i = 1, #applications do
  98.   if applications[i].preLoadFile then
  99.     print("Downloading \"" .. fs.name(applications[i].name) .. "\"")
  100.     getFromGitHubSafely(GitHubUserUrl .. applications[i].url, applications[i].name)
  101.   end
  102. end
  103.  
  104. print(" ")
  105.  
  106. ------------------------------------- Стадия инициализации загруженных библиотек -------------------------------------
  107.  
  108. package.loaded.ecs = nil
  109. package.loaded.ECSAPI = nil
  110. _G.ecs = require("ECSAPI")
  111. _G.image = require("image")
  112.  
  113. local imageOS = image.load("/MineOS/System/OS/Icons/OS_Logo.pic")
  114. local imageLanguages = image.load("/MineOS/System/OS/Icons/Languages.pic")
  115. local imageDownloading = image.load("/MineOS/System/OS/Icons/Downloading.pic")
  116. local imageOK = image.load("/MineOS/System/OS/Icons/OK.pic")
  117.  
  118. ecs.setScale(installerScale)
  119.  
  120. local xSize, ySize = component.gpu.getResolution()
  121. local windowWidth, windowHeight = 80, 25
  122. local xWindow, yWindow = math.floor(xSize / 2 - windowWidth / 2), math.ceil(ySize / 2 - windowHeight / 2)
  123. local xWindowEnd, yWindowEnd = xWindow + windowWidth - 1, yWindow + windowHeight - 1
  124.  
  125. ------------------------------------- Базовые функции для работы с будущим окном -------------------------------------
  126.  
  127. local function clear()
  128.   ecs.blankWindow(xWindow, yWindow, windowWidth, windowHeight)
  129. end
  130.  
  131. local obj = {}
  132. local function newObj(class, name, ...)
  133.   obj[class] = obj[class] or {}
  134.   obj[class][name] = {...}
  135. end
  136.  
  137. local function drawButton(name, isPressed)
  138.   local buttonColor = 0x888888
  139.   if isPressed then buttonColor = ecs.colors.blue end
  140.   local d = { ecs.drawAdaptiveButton("auto", yWindowEnd - 3, 2, 1, name, buttonColor, 0xffffff) }
  141.   newObj("buttons", name, d[1], d[2], d[3], d[4])
  142. end
  143.  
  144. local function waitForClickOnButton(buttonName)
  145.   while true do
  146.     local e = { event.pull() }
  147.     if e[1] == "touch" then
  148.       if ecs.clickedAtArea(e[3], e[4], obj["buttons"][buttonName][1], obj["buttons"][buttonName][2], obj["buttons"][buttonName][3], obj["buttons"][buttonName][4]) then
  149.         drawButton(buttonName, true)
  150.         os.sleep(timing)
  151.         break
  152.       end
  153.     end
  154.   end
  155. end
  156.  
  157. ------------------------------------- Стадия выбора языка и настройки системы -------------------------------------
  158.  
  159. ecs.prepareToExit()
  160.  
  161. local installOption, downloadWallpapers, showHelpTips
  162.  
  163. do
  164.   clear()
  165.   image.draw(math.ceil(xSize / 2 - 30), yWindow + 2, imageLanguages)
  166.  
  167.   drawButton("Select language",false)
  168.   waitForClickOnButton("Select language")
  169.  
  170.   local data = ecs.universalWindow("auto", "auto", 36, 0x262626, true,
  171.     {"EmptyLine"},
  172.     {"CenterText", ecs.colors.orange, "Select language"},
  173.     {"EmptyLine"},
  174.     {"Select", 0xFFFFFF, ecs.colors.green, "Russian", "English"},
  175.     {"EmptyLine"},
  176.     {"CenterText", ecs.colors.orange, "Change some OS properties"},
  177.     {"EmptyLine"},
  178.     {"Selector", 0xFFFFFF, 0xF2B233, "Full installation", "Install only must-have apps", "Install only libraries"},
  179.     {"EmptyLine"},
  180.     {"Switch", 0xF2B233, 0xFFFFFF, 0xFFFFFF, "Download wallpapers", true},
  181.     {"EmptyLine"},
  182.     {"Switch", 0xF2B233, 0xffffff, 0xFFFFFF, "Show help tips in OS", true},
  183.     {"EmptyLine"},
  184.     {"Button", {ecs.colors.orange, 0x262626, "OK"}}
  185.   )
  186.   installOptions, downloadWallpapers, showHelpTips = data[2], data[3], data[4]
  187.  
  188.   -- Устанавливаем базовую конфигурацию системы
  189.   _G.OSSettings = {
  190.     showHelpOnApplicationStart = showHelpTips,
  191.     language = data[1],
  192.     dockShortcuts = {
  193.       {path = "/MineOS/Applications/AppMarket.app"},
  194.       {path = "/MineOS/Applications/Finder.app"},
  195.       {path = "/MineOS/Applications/Photoshop.app"},
  196.       {path = "/MineOS/Applications/VK.app"},
  197.     }
  198.   }
  199.  
  200.   ecs.saveOSSettings()
  201.  
  202.   -- Загружаем локализацию инсталлера
  203.   ecs.info("auto", "auto", " ", " Installing language packages...")
  204.   local pathToLang = "/MineOS/System/OS/Installer/Language.lang"
  205.   getFromGitHubSafely(GitHubUserUrl .. "IgorTimofeev/OpenComputers/master/Installer/" .. _G.OSSettings.language .. ".lang", pathToLang)
  206.   getFromGitHubSafely(GitHubUserUrl .. "IgorTimofeev/OpenComputers/master/MineOS/License/" .. _G.OSSettings.language .. ".txt", "/MineOS/System/OS/License.txt")
  207.  
  208.   local file = io.open(pathToLang, "r"); lang = serialization.unserialize(file:read("*a")); file:close()
  209. end
  210.  
  211.  
  212. ------------------------------------- Проверка, желаем ли мы вообще ставить ось -------------------------------------
  213.  
  214. do
  215.   clear()
  216.  
  217.   image.draw(math.ceil(xSize / 2 - 15), yWindow + 2, imageOS)
  218.  
  219.   --Текстик по центру
  220.   component.gpu.setBackground(ecs.windowColors.background)
  221.   component.gpu.setForeground(ecs.colors.gray)
  222.   ecs.centerText("x", yWindowEnd - 5 , lang.beginOsInstall)
  223.  
  224.   --кнопа
  225.   drawButton("->",false)
  226.  
  227.   waitForClickOnButton("->")
  228.  
  229. end
  230.  
  231. ------------------------------ЛИЦ СОГЛАЩЕНЬКА------------------------------------------
  232.  
  233. do
  234.   clear()
  235.  
  236.   --Откуда рисовать условия согл
  237.   local from = 1
  238.   local xText, yText, TextWidth, TextHeight = xWindow + 4, yWindow + 2, windowWidth - 8, windowHeight - 7
  239.  
  240.   --Читаем файл с лиц соглл
  241.   local lines = {}
  242.   local file = io.open("/MineOS/System/OS/License.txt", "r")
  243.   for line in file:lines() do
  244.     table.insert(lines, line)
  245.   end
  246.   file:close()
  247.  
  248.   --Штуку рисуем
  249.   ecs.textField(xText, yText, TextWidth, TextHeight, lines, from, 0xffffff, 0x262626, 0x888888, ecs.colors.blue)
  250.   --кнопа
  251.   drawButton(lang.acceptLicense, false)
  252.  
  253.   while true do
  254.     local e = { event.pull() }
  255.     if e[1] == "touch" then
  256.       if ecs.clickedAtArea(e[3], e[4], obj["buttons"][lang.acceptLicense][1], obj["buttons"][lang.acceptLicense][2], obj["buttons"][lang.acceptLicense][3], obj["buttons"][lang.acceptLicense][4]) then
  257.         drawButton(lang.acceptLicense, true)
  258.         os.sleep(timing)
  259.         break
  260.       end
  261.     elseif e[1] == "scroll" then
  262.       if e[5] == -1 then
  263.         if from < #lines then from = from + 1; ecs.textField(xText, yText, TextWidth, TextHeight, lines, from, 0xffffff, 0x262626, 0x888888, ecs.colors.blue) end
  264.       else
  265.         if from > 1 then from = from - 1; ecs.textField(xText, yText, TextWidth, TextHeight, lines, from, 0xffffff, 0x262626, 0x888888, ecs.colors.blue) end
  266.       end
  267.     end
  268.   end
  269. end
  270.  
  271. -------------------------- Подготавливаем файловую систему ----------------------------------
  272.  
  273. --Создаем стартовые пути и прочие мелочи чисто для эстетики
  274. local desktopPath = "/MineOS/Desktop/"
  275. local dockPath = "/MineOS/System/OS/Dock/"
  276. local applicationsPath = "/MineOS/Applications/"
  277. local picturesPath = "/MineOS/Pictures/"
  278.  
  279. fs.remove(desktopPath)
  280. fs.remove(dockPath)
  281.  
  282. -- fs.makeDirectory(desktopPath .. "My files")
  283. -- fs.makeDirectory(picturesPath)
  284. fs.makeDirectory(dockPath)
  285.  
  286. ------------------------------ Загрузка всего ------------------------------------------
  287.  
  288. do
  289.   local barWidth = math.floor(windowWidth * 2 / 3)
  290.   local xBar = math.floor(xSize/2-barWidth/2)
  291.   local yBar = yWindowEnd - 3
  292.  
  293.   local function drawInfo(x, y, info)
  294.     ecs.square(x, y, barWidth, 1, ecs.windowColors.background)
  295.     ecs.colorText(x, y, ecs.colors.gray, info)
  296.   end
  297.  
  298.   ecs.blankWindow(xWindow,yWindow,windowWidth,windowHeight)
  299.  
  300.   image.draw(math.floor(xSize / 2 - 33), yWindow + 2, imageDownloading)
  301.  
  302.   ecs.colorTextWithBack(xBar, yBar - 1, ecs.colors.gray, ecs.windowColors.background, lang.osInstallation)
  303.   ecs.progressBar(xBar, yBar, barWidth, 1, 0xcccccc, ecs.colors.blue, 0)
  304.   os.sleep(timing)
  305.  
  306.   -- Создаем список того, что будем загружать, в зависимости от выбранных ранее опций
  307.   local thingsToDownload = {}
  308.   for i = 1, #applications do
  309.     if
  310.       (applications[i].type == "Library" or applications[i].type == "Icon")
  311.       or
  312.       (
  313.         (installOptions ~= "Install only libraries")
  314.         and
  315.         (
  316.           (applications[i].forceDownload)
  317.           or
  318.           (applications[i].type == "Wallpaper" and downloadWallpapers)
  319.           or
  320.           (applications[i].type == "Application" and installOptions == "Full installation")
  321.         )
  322.       )
  323.     then
  324.       table.insert(thingsToDownload, applications[i])
  325.     end
  326.     --Подчищаем за собой, а то мусора нынче много
  327.     applications[i] = nil
  328.   end
  329.  
  330.   -- Загружаем все из списка
  331.   for app = 1, #thingsToDownload do
  332.     drawInfo(xBar, yBar + 1, lang.downloading .. " " .. thingsToDownload[app]["name"])
  333.     local percent = app / #thingsToDownload * 100
  334.     ecs.progressBar(xBar, yBar, barWidth, 1, 0xcccccc, ecs.colors.blue, percent)
  335.  
  336.     ecs.getOSApplication(thingsToDownload[app])
  337.   end
  338.  
  339.   os.sleep(timing)
  340.   if installOptions == "Install only libraries" then flashEFI(); ecs.prepareToExit(); computer.shutdown(true) end
  341. end
  342.  
  343. -- Создаем базовые обои рабочего стола
  344. if downloadWallpapers then
  345.   ecs.createShortCut(desktopPath .. "Pictures.lnk", picturesPath)
  346.   ecs.createShortCut("/MineOS/System/OS/Wallpaper.lnk", picturesPath .. "Sunbeams.pic")
  347. end
  348.  
  349. -- Создаем файл автозагрузки
  350. local file = io.open("autorun.lua", "w")
  351. file:write("local success, reason = pcall(loadfile(\"OS.lua\")); if not success then print(\"Ошибка: \" .. tostring(reason)) end")
  352. file:close()
  353.  
  354. -- Биосик
  355. flashEFI()
  356.  
  357. ------------------------------ Стадия перезагрузки ------------------------------------------
  358.  
  359. ecs.blankWindow(xWindow,yWindow,windowWidth,windowHeight)
  360.  
  361. image.draw(math.floor(xSize/2 - 16), math.floor(ySize/2 - 11), imageOK)
  362.  
  363. --Текстик по центру
  364. component.gpu.setBackground(ecs.windowColors.background)
  365. component.gpu.setForeground(ecs.colors.gray)
  366. ecs.centerText("x",yWindowEnd - 5, lang.needToRestart)
  367.  
  368. --Кнопа
  369. drawButton(lang.restart, false)
  370. waitForClickOnButton(lang.restart)
  371.  
  372. --Перезагружаем компик
  373. ecs.prepareToExit()
  374. computer.shutdown(true)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement