SHOW:
|
|
- or go back to the newest paste.
| 1 | local component = require ( "component") | |
| 2 | local computer = require ( "computer") | |
| 3 | local term = require ( "term") | |
| 4 | local unicode = require ( "unicode") | |
| 5 | local event = require ( "event") | |
| 6 | local fs = require ( "filesystem") | |
| 7 | local internet = require ( "internet") | |
| 8 | local seri = require ( "serialization") | |
| 9 | local gpu = component.gpu | |
| 10 | ||
| 11 | ----------------- Computer Checking for compliance with the SIS. requirements -------------------------- | |
| 12 | ||
| 13 | - | --Sozdaem Array of poop |
| 13 | + | --Sozdaem Array of shit |
| 14 | local govno = {}
| |
| 15 | ||
| 16 | print ( "") | |
| 17 | print ( "Analyzing computer for matching system requirements ...") | |
| 18 | ||
| 19 | --Proveryaem GPU | |
| 20 | if gpu.maxResolution () <150 then table.insert (govno, "Bad GPU - this OS requires Tier 1 GPU.") end | |
| 21 | ||
| 22 | --Proveryaem screen | |
| 23 | if gpu.getDepth (1) <8 and gpu.maxResolution (1) <1 then table.insert (govno, "Bad Screen - this OS requires Tier 1 screen.") end | |
| 24 | ||
| 25 | --Proveryaem operativku | |
| 26 | - | if math.floor (computer.totalMemory (1) / 1024) <2048 then table.insert (govno, "Not enough RAM - this OS requires at least 2048 KB RAM.") end |
| 26 | + | if math.floor (computer.totalMemory () / 1024) <2048 then table.insert (govno, "Not enough RAM - this OS requires at least 2048 KB RAM.") end |
| 27 | ||
| 28 | if fs.get ( "bin / edit.lua") == nil or fs.get ( "bin / edit.lua"). isReadOnly () then table.insert (govno, "You can not 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 | |
| 29 | ||
| 30 | --If Found some discrepancy ICU. requirements, then write that it is not so | |
| 31 | if #govno> 0 then | |
| 32 | print ( "") | |
| 33 | for i = 1, #govno do | |
| 34 | print (govno [i]) | |
| 35 | end | |
| 36 | print ( "") | |
| 37 | return | |
| 38 | else | |
| 39 | print ( "Done, everything's good. Proceed to downloading.") | |
| 40 | print ( "") | |
| 41 | end | |
| 42 | ||
| 43 | -------------------------------------------------- ---------------------------------------- | |
| 44 | ||
| 45 | local lang | |
| 46 | ||
| 47 | local applications | |
| 48 | ||
| 49 | local padColor = 0x262626 | |
| 50 | local installerScale = 1 | |
| 51 | ||
| 52 | local timing = 0.2 | |
| 53 | ||
| 54 | ----------------------------- ------------------- Preparation stage ------------------------ | |
| 55 | ||
| 56 | ||
| 57 | With --ZAGRUZOCHKA GITHABA | |
| 58 | local function getFromGitHub (url, path) | |
| 59 | local sContent = "" | |
| 60 | local result, response = pcall (internet.request, url) | |
| 61 | if not result then | |
| 62 | return nil | |
| 63 | end | |
| 64 | ||
| 65 | if fs.exists (path) then fs.remove (path) end | |
| 66 | fs.makeDirectory (fs.path (path)) | |
| 67 | local file = io.open (path, "w") | |
| 68 | ||
| 69 | for chunk in response do | |
| 70 | file: write (chunk) | |
| 71 | sContent = sContent .. chunk | |
| 72 | end | |
| 73 | ||
| 74 | file: close () | |
| 75 | ||
| 76 | return sContent | |
| 77 | end | |
| 78 | ||
| 79 | --Safety ZAGRUZOCHKA | |
| 80 | local function getFromGitHubSafely (url, path) | |
| 81 | local success, sRepos = pcall (getFromGitHub, url, path) | |
| 82 | if not success then | |
| 83 | io.stderr: write ( "Can not download \" ".. url .." \ "\ n"!) | |
| 84 | return -1 | |
| 85 | end | |
| 86 | return sRepos | |
| 87 | end | |
| 88 | ||
| 89 | With --ZAGRUZOCHKA PASTEBINA | |
| 90 | local function getFromPastebin (paste, filename) | |
| 91 | local cyka = "" | |
| 92 | local f, reason = io.open (filename, "w") | |
| 93 | if not f then | |
| 94 | io.stderr: write ( "Failed opening file for writing:" .. reason) | |
| 95 | return | |
| 96 | end | |
| 97 | --io.write ( "Downloading from pastebin.com ...") | |
| 98 | local url = "http://pastebin.com/raw.php?i=" .. paste | |
| 99 | local result, response = pcall (internet.request, url) | |
| 100 | if result then | |
| 101 | --io.write ( "success. \ n") | |
| 102 | for chunk in response do | |
| 103 | --if not options.k then | |
| 104 | --string.gsub (chunk, "\ r \ n", "\ n") | |
| 105 | --end | |
| 106 | f: write (chunk) | |
| 107 | cyka = cyka .. chunk | |
| 108 | end | |
| 109 | f: close () | |
| 110 | --io.write ( "Saved data to" .. filename .. "\ n") | |
| 111 | else | |
| 112 | f: close () | |
| 113 | fs.remove (filename) | |
| 114 | io.stderr: write ( "HTTP request failed:" .. response .. "\ n") | |
| 115 | end | |
| 116 | ||
| 117 | return cyka | |
| 118 | end | |
| 119 | ||
| 120 | local GitHubUserUrl = "https://raw.githubusercontent.com/" | |
| 121 | ||
| 122 | ||
| 123 | --------------------------------- Stage Homepage download all necessary ------------ --------------------- | |
| 124 | ||
| 125 | ||
| 126 | local preLoadApi = {
| |
| 127 | {Paste = "IgorTimofeev / OpenComputers / master / lib / ECSAPI.lua", path = "lib / ECSAPI.lua"},
| |
| 128 | {Paste = "IgorTimofeev / OpenComputers / master / lib / colorlib.lua", path = "lib / colorlib.lua"},
| |
| 129 | {Paste = "IgorTimofeev / OpenComputers / master / lib / image.lua", path = "lib / image.lua"},
| |
| 130 | {Paste = "IgorTimofeev / OpenComputers / master / lib / config.lua", path = "lib / config.lua"},
| |
| 131 | {Paste = "IgorTimofeev / OpenComputers / master / MineOS / Icons / Languages.pic", path = "MineOS / System / OS / Icons / Languages.pic"},
| |
| 132 | {Paste = "IgorTimofeev / OpenComputers / master / MineOS / Icons / OK.pic", path = "MineOS / System / OS / Icons / OK.pic"},
| |
| 133 | {Paste = "IgorTimofeev / OpenComputers / master / MineOS / Icons / Downloading.pic", path = "MineOS / System / OS / Icons / Downloading.pic"},
| |
| 134 | {Paste = "IgorTimofeev / OpenComputers / master / MineOS / Icons / OS_Logo.pic", path = "MineOS / System / OS / Icons / OS_Logo.pic"},
| |
| 135 | } | |
| 136 | ||
| 137 | print ( "Downloading file list") | |
| 138 | applications = seri.unserialize (getFromGitHubSafely (GitHubUserUrl .. "IgorTimofeev / OpenComputers / master / Applications.txt", "MineOS / System / OS / Applications.txt")) | |
| 139 | print ( "") | |
| 140 | ||
| 141 | for i = 1, #preLoadApi do | |
| 142 | print ( "Downloading must-have files (" .. fs.name (preLoadApi [i] .path) .. ")")
| |
| 143 | getFromGitHubSafely (GitHubUserUrl .. preLoadApi [i] .paste, preLoadApi [i] .path) | |
| 144 | end | |
| 145 | ||
| 146 | print ( "") | |
| 147 | ||
| 148 | _G.ecs = Require ( "ECSAPI") | |
| 149 | _G.image = Require ( "image") | |
| 150 | _G.config = Require ( "config") | |
| 151 | ||
| 152 | local imageOS = image.load ( "MineOS / System / OS / Icons / OS_Logo.pic") | |
| 153 | local imageLanguages = image.load ( "MineOS / System / OS / Icons / Languages.pic") | |
| 154 | local imageDownloading = image.load ( "MineOS / System / OS / Icons / Downloading.pic") | |
| 155 | local imageOK = image.load ( "MineOS / System / OS / Icons / OK.pic") | |
| 156 | ||
| 157 | ecs.setScale (installerScale) | |
| 158 | ||
| 159 | local xSize, ySize = gpu.getResolution () | |
| 160 | local windowWidth = 80 | |
| 161 | local windowHeight = 2 + 16 + 2 + 3 + 2 | |
| 162 | local xWindow, yWindow = math.floor (xSize / 2 - windowWidth / 2), math.ceil (ySize / 2 - windowHeight / 2) | |
| 163 | local xWindowEnd, yWindowEnd = xWindow + windowWidth - 1, yWindow + windowHeight - 1 | |
| 164 | ||
| 165 | ||
| 166 | -------------------------------------------------- ----------------------------------------- | |
| 167 | ||
| 168 | local function clear () | |
| 169 | ecs.blankWindow (xWindow, yWindow, windowWidth, windowHeight) | |
| 170 | end | |
| 171 | ||
| 172 | --OBEKTY | |
| 173 | local obj = {}
| |
| 174 | local function newObj (class, name, ...) | |
| 175 | obj [class] = obj [class] or {}
| |
| 176 | obj [class] [name] = {...}
| |
| 177 | end | |
| 178 | ||
| 179 | local function drawButton (name, isPressed) | |
| 180 | local buttonColor = 0x888888 | |
| 181 | if isPressed then buttonColor = ecs.colors.blue end | |
| 182 | local d = {ecs.drawAdaptiveButton ( "auto", yWindowEnd - 3, 2, 1, name, buttonColor, 0xffffff)}
| |
| 183 | newObj ( "buttons", name, d [1], d [2], d [3], d [4]) | |
| 184 | end | |
| 185 | ||
| 186 | local function waitForClickOnButton (buttonName) | |
| 187 | while true do | |
| 188 | local e = {event.pull ()}
| |
| 189 | if e [1] == "touch" then | |
| 190 | if ecs.clickedAtArea (e [3], e [4], obj [ "buttons"] [buttonName] [1], obj [ "buttons"] [buttonName] [2], obj [ "buttons"] [buttonName] [3], obj [ "buttons"] [buttonName] [4]) then | |
| 191 | drawButton (buttonName, true) | |
| 192 | os.sleep (timing) | |
| 193 | break | |
| 194 | end | |
| 195 | end | |
| 196 | end | |
| 197 | end | |
| 198 | ||
| 199 | ||
| 200 | ------------------------------ ------------------ LANGUAGE ------------------ | |
| 201 | ||
| 202 | ecs.prepareToExit () | |
| 203 | ||
| 204 | local downloadWallpapers, showHelpTips = false, false | |
| 205 | ||
| 206 | do | |
| 207 | ||
| 208 | clear () | |
| 209 | ||
| 210 | image.draw (math.ceil (xSize / 2 - 30), yWindow + 2, imageLanguages) | |
| 211 | ||
| 212 | --knopa | |
| 213 | drawButton ( "Select language", false) | |
| 214 | ||
| 215 | waitForClickOnButton ( "Select language") | |
| 216 | ||
| 217 | local data = ecs.universalWindow ( "auto", "auto", 36, 0x262626, true, { "EmptyLine"}, { "CenterText", ecs.colors.orange, "Select language"}, { "EmptyLine"}, { "Select", 0xFFFFFF, ecs.colors.green, "Russian", "English"}, { "EmptyLine"}, { "CenterText", ecs.colors.orange, "Change some OS properties"}, { "EmptyLine "}, {" Switch ", 0xF2B233, 0xffffff, 0xFFFFFF," Download wallpapers ", true}, {" EmptyLine "}, {" Switch ", 0xF2B233, 0xffffff, 0xFFFFFF," Show help tips in OS ", true}, { "EmptyLine"}, { "Button", {ecs.colors.green, 0xffffff, "OK"}})
| |
| 218 | downloadWallpapers, showHelpTips = data [2], data [3] | |
| 219 | ||
| 220 | --USTANAVLIVAEM Desired language | |
| 221 | _G.OSSettings = {ShowHelpOnApplicationStart = showHelpTips, language = data [1]}
| |
| 222 | ecs.saveOSSettings () | |
| 223 | ||
| 224 | --Kachaem language | |
| 225 | ecs.info ( "auto", "auto", "", "Installing language packages ...") | |
| 226 | local pathToLang = "MineOS / System / OS / Installer / Language.lang" | |
| 227 | getFromGitHubSafely (GitHubUserUrl .. "IgorTimofeev / OpenComputers / master / Installer /" .. _G.OSSettings.language .. ".lang", pathToLang) | |
| 228 | getFromGitHubSafely (GitHubUserUrl .. "IgorTimofeev / OpenComputers / master / MineOS / License /" .. _G.OSSettings.language .. ".txt", "MineOS / System / OS / License.txt") | |
| 229 | ||
| 230 | --Stavim language | |
| 231 | lang = config.readAll (pathToLang) | |
| 232 | ||
| 233 | end | |
| 234 | ||
| 235 | ||
| 236 | ------------------------------ ----------------- AXIS IS PUT ------------------- | |
| 237 | ||
| 238 | do | |
| 239 | clear () | |
| 240 | ||
| 241 | image.draw (math.ceil (xSize / 2 - 15), yWindow + 2, imageOS) | |
| 242 | ||
| 243 | --Tekstik Centered | |
| 244 | gpu.setBackground (ecs.windowColors.background) | |
| 245 | gpu.setForeground (ecs.colors.gray) | |
| 246 | ecs.centerText ( "x", yWindowEnd - 5, lang.beginOsInstall) | |
| 247 | ||
| 248 | --knopa | |
| 249 | drawButton ( "->", false) | |
| 250 | ||
| 251 | waitForClickOnButton ( "->") | |
| 252 | ||
| 253 | end | |
| 254 | ||
| 255 | ------------------------------ ------------------ PERSONS SOGLASCHENKA ------------------------ | |
| 256 | ||
| 257 | do | |
| 258 | clear () | |
| 259 | ||
| 260 | --Otkuda Draw acc conditions | |
| 261 | local from = 1 | |
| 262 | local xText, yText, TextWidth, TextHeight = xWindow + 4, yWindow + 2, windowWidth - 8, windowHeight - 7 | |
| 263 | ||
| 264 | --Chitaem File sogll persons | |
| 265 | local lines = {}
| |
| 266 | local file = io.open ( "MineOS / System / OS / License.txt", "r") | |
| 267 | for line in file: lines () do | |
| 268 | table.insert (lines, line) | |
| 269 | end | |
| 270 | file: close () | |
| 271 | ||
| 272 | --Shtuku draw | |
| 273 | ecs.textField (xText, yText, TextWidth, TextHeight, lines, from, 0xffffff, 0x262626, 0x888888, ecs.colors.blue) | |
| 274 | ||
| 275 | --Info draw | |
| 276 | --ecs.centerText ( "x", yWindowEnd - 5, "Do you accept the license agreement?") | |
| 277 | ||
| 278 | --knopa | |
| 279 | drawButton (lang.acceptLicense, false) | |
| 280 | ||
| 281 | while true do | |
| 282 | local e = {event.pull ()}
| |
| 283 | if e [1] == "touch" then | |
| 284 | 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 | |
| 285 | drawButton (lang.acceptLicense, true) | |
| 286 | os.sleep (timing) | |
| 287 | break | |
| 288 | end | |
| 289 | elseif e [1] == "scroll" then | |
| 290 | if e [5] == -1 then | |
| 291 | if from <#lines then from = from + 1; ecs.textField (xText, yText, TextWidth, TextHeight, lines, from, 0xffffff, 0x262626, 0x888888, ecs.colors.blue) end | |
| 292 | else | |
| 293 | if from> 1 then from = from - 1; ecs.textField (xText, yText, TextWidth, TextHeight, lines, from, 0xffffff, 0x262626, 0x888888, ecs.colors.blue) end | |
| 294 | end | |
| 295 | end | |
| 296 | end | |
| 297 | end | |
| 298 | ||
| 299 | -------------------------- Prepare filesystem --------------------- ------------- | |
| 300 | ||
| 301 | --Sozdaem Starting way and other little things purely for aesthetics | |
| 302 | local desktopPath = "MineOS / Desktop /" | |
| 303 | local dockPath = "MineOS / System / OS / Dock /" | |
| 304 | local applicationsPath = "MineOS / Applications /" | |
| 305 | local picturesPath = "MineOS / Pictures /" | |
| 306 | ||
| 307 | fs.remove (desktopPath) | |
| 308 | fs.remove (dockPath) | |
| 309 | ||
| 310 | fs.makeDirectory (desktopPath .. "My files") | |
| 311 | fs.makeDirectory (picturesPath) | |
| 312 | fs.makeDirectory (dockPath) | |
| 313 | ||
| 314 | -------------------------- ---------------------- STAGE LOADING ------------- | |
| 315 | ||
| 316 | do | |
| 317 | ||
| 318 | local barWidth = math.floor (windowWidth * 2/3) | |
| 319 | local xBar = math.floor (xSize / 2-barWidth / 2) | |
| 320 | local yBar = yWindowEnd - 3 | |
| 321 | ||
| 322 | local function drawInfo (x, y, info) | |
| 323 | ecs.square (x, y, barWidth, 1, ecs.windowColors.background) | |
| 324 | ecs.colorText (x, y, ecs.colors.gray, info) | |
| 325 | end | |
| 326 | ||
| 327 | ecs.blankWindow (xWindow, yWindow, windowWidth, windowHeight) | |
| 328 | ||
| 329 | image.draw (math.floor (xSize / 2 - 33), yWindow + 2, imageDownloading) | |
| 330 | ||
| 331 | ecs.colorTextWithBack (xBar, yBar - 1, ecs.colors.gray, ecs.windowColors.background, lang.osInstallation) | |
| 332 | ecs.progressBar (xBar, yBar, barWidth, 1, 0xcccccc, ecs.colors.blue, 0) | |
| 333 | os.sleep (timing) | |
| 334 | ||
| 335 | for app = 1, #applications do | |
| 336 | --All FOR GRAFONA | |
| 337 | drawInfo (xBar, yBar + 1, lang.downloading .. "" .. applications [app] [ "name"]) | |
| 338 | local percent = app / #applications * 100 | |
| 339 | ecs.progressBar (xBar, yBar, barWidth, 1, 0xcccccc, ecs.colors.blue, percent) | |
| 340 | ||
| 341 | --All DOWNLOAD | |
| 342 | local path = applications [app] [ "name"] | |
| 343 | fs.remove (path .. ".app") | |
| 344 | ||
| 345 | --If Type = application | |
| 346 | if applications [app] [ "type"] == "Application" then | |
| 347 | fs.makeDirectory (path .. ". app / Resources") | |
| 348 | getFromGitHubSafely (GitHubUserUrl .. applications [app] [ "url"], path .. ".app /" .. fs.name (applications [app] [ "name"] .. ".lua")) | |
| 349 | getFromGitHubSafely (GitHubUserUrl .. applications [app] [ "icon"], path .. ".app / Resources / Icon.pic") | |
| 350 | ||
| 351 | --If There are resources, then downloaded resources | |
| 352 | if applications [app] [ "resources"] then | |
| 353 | for i = 1, #applications [app] [ "resources"] do | |
| 354 | getFromGitHubSafely (GitHubUserUrl .. applications [app] [ "resources"] [i] [ "url"], path .. ". app / Resources /" .. applications [app] [ "resources"] [i] [ "name "]) | |
| 355 | end | |
| 356 | end | |
| 357 | ||
| 358 | --If There is a file "on the program", the ship and its | |
| 359 | if applications [app] .about then | |
| 360 | getFromGitHubSafely (GitHubUserUrl .. applications [app] .about, path .. ".app / Resources / About.txt") | |
| 361 | end | |
| 362 | ||
| 363 | --If There is a label creation mode, you create it | |
| 364 | if applications [app] .createShortcut then | |
| 365 | if applications [app] .createShortcut == "dock" then | |
| 366 | ecs.createShortCut (dockPath .. fs.name (applications [app] .name) .. ".lnk", applications [app] .name .. ".app") | |
| 367 | else | |
| 368 | ecs.createShortCut (desktopPath .. fs.name (applications [app] .name) .. ".lnk", applications [app] .name .. ".app") | |
| 369 | end | |
| 370 | end | |
| 371 | ||
| 372 | --If Type = other, stranger, and MB and their pastebin | |
| 373 | elseif applications [app] [ "type"] == "Pastebin" then | |
| 374 | fs.remove (applications [app] [ "name"]) | |
| 375 | fs.makeDirectory (fs.path (applications [app] [ "name"])) | |
| 376 | getFromPastebin (applications [app] [ "url"], applications [app] [ "name"]) | |
| 377 | ||
| 378 | --If wallpaper | |
| 379 | elseif applications [app] [ "type"] == "Wallpaper" then | |
| 380 | if downloadWallpapers then | |
| 381 | getFromGitHubSafely (GitHubUserUrl .. applications [app] [ "url"], path) | |
| 382 | end | |
| 383 | --A If something else Th | |
| 384 | else | |
| 385 | getFromGitHubSafely (GitHubUserUrl .. applications [app] [ "url"], path) | |
| 386 | end | |
| 387 | end | |
| 388 | ||
| 389 | os.sleep (timing) | |
| 390 | end | |
| 391 | ||
| 392 | --Sozdaem Basic wallpaper | |
| 393 | ecs.createShortCut (desktopPath .. "Pictures.lnk", picturesPath) | |
| 394 | if downloadWallpapers then ecs.createShortCut ( "MineOS / System / OS / Wallpaper.lnk", picturesPath .. "ChristmasTree.pic") end | |
| 395 | ||
| 396 | --Avtozagruzka | |
| 397 | local file = io.open ( "autorun.lua", "w") | |
| 398 | file: write ( "local success, reason = pcall (loadfile (\" OS.lua \ ")); if not success then print (\" Error: \ ".. tostring (reason)) end") | |
| 399 | file: close () | |
| 400 | ||
| 401 | -------------------------- PHASE RESET COMP --------------------- -------------- | |
| 402 | ||
| 403 | ecs.blankWindow (xWindow, yWindow, windowWidth, windowHeight) | |
| 404 | ||
| 405 | image.draw (math.floor (xSize / 2 - 16), math.floor (ySize / 2 - 11), imageOK) | |
| 406 | ||
| 407 | --Tekstik Centered | |
| 408 | gpu.setBackground (ecs.windowColors.background) | |
| 409 | gpu.setForeground (ecs.colors.gray) | |
| 410 | ecs.centerText ( "x", yWindowEnd - 5, lang.needToRestart) | |
| 411 | ||
| 412 | --Knopa | |
| 413 | drawButton (lang.restart, false) | |
| 414 | waitForClickOnButton (lang.restart) | |
| 415 | ecs.prepareToExit () | |
| 416 | ||
| 417 | computer.shutdown (true) |