Advertisement
1lann

Plastic w/ no getStringWidth

Apr 16th, 2014
209
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 38.84 KB | None | 0 0
  1. -- Plastic Beta v0.11
  2. -- [New in 0.11] Support for latest version of OpenPeripheral
  3. -- A Google Glass like OS/Programs/Whatever you want to call it
  4. -- That runs on Terminal Glasses in OpenPeripheral
  5. -- Just stick in a computer with a Terminal Glass Peripheral and run it!
  6. -- Have fun using it!
  7. -- Feel free to use my code in anyway you want!
  8. -- HOWEVER as stated by the policies of the APIs I used
  9. -- Please do not use my API keys. Just register for them
  10. -- Yourself! It's free and World Weather Online is instant!
  11.  
  12. local tArgs = {...}
  13.  
  14. local function searchArgs(text)
  15.     for k,v in pairs(tArgs) do
  16.         if v == text then return true end
  17.     end
  18.     return false
  19. end
  20.  
  21. if not http then print("Sorry, Plastic requires HTTP to run!") return end
  22.  
  23. local plasticInstallation = shell.getRunningProgram()
  24.  
  25. -- Find glass bridge
  26. local plastic = false
  27. local worldSensor = false
  28.  
  29. if fs.exists("/ocs/apis/sensor") then
  30.     os.loadAPI("ocs/apis/sensor")
  31. end
  32.  
  33. for k,v in pairs(rs.getSides()) do
  34.     if (peripheral.getType(v) == "openperipheral_bridge") then
  35.         plastic = peripheral.wrap(v)
  36.         break
  37.     elseif (peripheral.getType(v) == "sensor") and (not worldSensor) then
  38.         worldSensor = sensor.wrap(v)
  39.         if not (worldSensor.getSensorName() == "worldCard") then
  40.             worldSensor = false
  41.         end
  42.     end
  43. end
  44.  
  45. if not plastic then print("Could not find Glass Bridge!") error() end
  46.  
  47. local rootApps = nil
  48.  
  49. if searchArgs("root") then
  50.     rootApps = {}
  51.     if term.isColor() then
  52.         term.setTextColor(colors.red)
  53.     end
  54.     print("-- [[ ROOT MODE ENABLED ]] --")
  55.     print("PLASTIC MAY BECOME UNSTABLE AND")
  56.     print("MAY CRASH. USE AT YOUR OWN RISK!")
  57.     if fs.isDir("/plasticApps") then
  58.  
  59.     else
  60.         print("Creating /plasticApps folder")
  61.         fs.delete("/plasticApps")
  62.         fs.makeDir("/plasticApps")
  63.     end
  64.     -- Example plastic root app
  65.     --   --[[Plastic Root App]]--
  66.     --   --NAME: Example App
  67.     --   if cmd == "hello" then
  68.     --   print("HELLO!")
  69.     --   end
  70.  
  71.     print("Searching for apps in /plasticApps")
  72.     print("")
  73.     for k,v in pairs(fs.list("/plasticApps")) do
  74.         if not(fs.isDir("/plasticApps/"..v)) then
  75.             local f = io.open("/plasticApps/"..v, "r")
  76.             if f:read("*l") == "--[[Plastic Root App]]--" then
  77.                 local name = f:read("*l"):match("%-%-NAME%: (.+)")
  78.                 dofile("/plasticApps/"..v)
  79.                 print("-- Application registered: ", name, " --")
  80.                 local data = f:read("*a")
  81.                 rootApps[name] = data
  82.             end
  83.             f:close()
  84.         end
  85.     end
  86.     print("")
  87.     print("Search completed!")
  88.     print("Starting Plastic...")
  89. end
  90.  
  91. if not(searchArgs("nodaemon")) and not(searchArgs("root")) then
  92.     term.clear()
  93.     term.setCursorPos(1,1)
  94.  
  95.     print("Plastic daemon now running. Use exit to exit")
  96. end
  97.  
  98. local function reliableSleep(time)
  99.     sleep(time)
  100. end
  101.  
  102.  
  103. -- Setup the actual "plastic"
  104. local gColors = {}
  105. gColors.red = 0xff3333
  106. gColors.blue = 0x7dd2e4
  107. gColors.yellow = 0xffff4d
  108. gColors.green = 0x4dff4d
  109. gColors.gray = 0xe0e0e0
  110. gColors.textGray = 0x818181
  111. gColors.text = 0x5a5a5a
  112. gColors.rain = 0x2e679f
  113.  
  114. plastic.clear()
  115. local mainBox = plastic.addBox(20, 20, 1, 48, gColors.gray, 0.7)
  116. local outlineT = plastic.addBox(18,18,2,2,gColors.blue,0.7)
  117. local outlineB = plastic.addBox(18,68,2,2,gColors.blue,0.7)
  118. --Startup Animation
  119. if not(searchArgs("lite")) then
  120.     -- 120, Edge is 140, Center is 80
  121.     for i = 0, 17 do
  122.         mainBox.setWidth(i*8)
  123.         outlineT.setWidth(i*8+4)
  124.         outlineB.setWidth(i*8+4)
  125.         reliableSleep(0.01)
  126.     end
  127. else
  128.     mainBox.setWidth(136)
  129.     outlineT.setWidth(140)
  130.     outlineB.setWidth(140)
  131.     mainBox.setHeight(48)
  132. end
  133. local header = plastic.addText(75, 25, "", gColors.textGray)
  134. local secondText = plastic.addText(50, 40, "", gColors.blue)
  135. local thirdText = plastic.addText(40, 55, "", gColors.blue)
  136. local mainText = plastic.addText(40, 27, "", gColors.blue)
  137. local forthText = plastic.addText(40, 55, "", gColors.text)
  138. local tempText = plastic.addText(40, 70, "", gColors.text)
  139. header.setZ(5)
  140. mainText.setZ(5)
  141. secondText.setZ(5)
  142. thirdText.setZ(5)
  143. tempText.setZ(5)
  144. forthText.setZ(5)
  145.  
  146. local function closeAnimation()
  147.     if mainBox then
  148.         pcall(mainText.delete)
  149.         pcall(secondText.delete)
  150.         pcall(header.delete)
  151.         pcall(thirdText.delete)
  152.         pcall(tempText.delete)
  153.         pcall(forthText.delete)
  154.         os.queueEvent("plastic_clock_manager", "kill")
  155.         reliableSleep(0.1)
  156.         if not(searchArgs("lite")) then
  157.             pcall(function()
  158.             for i = 17, 0, -1 do
  159.                 mainBox.setWidth(i*8)
  160.                 outlineT.setWidth(i*8+2)
  161.                 outlineB.setWidth(i*8+2)
  162.                 reliableSleep(0.01)
  163.             end
  164.             end)
  165.         end
  166.         pcall(outlineT.delete)
  167.         pcall(outlineB.delete)
  168.         pcall(mainBox.delete)
  169.     end
  170. end
  171.  
  172. local oldShutdown = os.shutdown
  173. local oldReboot = os.reboot
  174.  
  175. function os.shutdown()
  176.     closeAnimation()
  177.     return oldShutdown()
  178. end
  179.  
  180. function os.reboot()
  181.     closeAnimation()
  182.     return oldReboot()
  183. end
  184.  
  185. local function runPlastic()
  186.     -- Variables & Stuff
  187.     local corruption = false
  188.     local firstTime = true
  189.     local showClock = false
  190.  
  191.     -- Fancy functions
  192.     local gWidth = 24
  193.     local extraSupport = 0
  194.  
  195.     local function trimText(s)
  196.         return s:match("^%s*(.-)%s*$")
  197.     end
  198.  
  199.     local function plasticGet(url, noCancel)
  200.         http.request(url)
  201.         while true do
  202.             local e, rUrl, rmsg = os.pullEvent()
  203.             if (e == "http_success") and (rUrl == url) then
  204.                 if rmsg then
  205.                     local data = rmsg.readAll()
  206.                     rmsg.close()
  207.                     if data then
  208.                         return "success", data
  209.                     else
  210.                         sleep(1)
  211.                         http.request(url)
  212.                     end
  213.                 else
  214.                     sleep(1)
  215.                     http.request(url)
  216.                 end
  217.             elseif (e == "http_failure") and (rUrl == url) then
  218.                 return "failure"
  219.             elseif (e == "chat_command") and ((trimText(rUrl:lower()) == "cancel") or (trimText(rUrl:lower()) == "home")) and not(noCancel) then
  220.                 return "cancel"
  221.             end
  222.         end
  223.     end
  224.  
  225.     local function slowText(text, object)
  226.         if not(searchArgs("lite")) then
  227.             object.setText("")
  228.             for i = 1, #text do
  229.                 object.setText(string.sub(text, 1, i))
  230.                 reliableSleep(0.01)
  231.             end
  232.         else
  233.             object.setText(text)
  234.         end
  235.     end
  236.  
  237.     local function getCenter(text)
  238.         return math.ceil(((136/2)-((#text*8)*(0.65)/2))+20-0.5)
  239.     end
  240.  
  241.     local function centerText(text, object)
  242.         object.setText("")
  243.         object.setX(getCenter(text))
  244.         slowText(text, object)
  245.     end
  246.  
  247.     local function copyTable(tb)
  248.         local newTable = {}
  249.         for k,v in pairs(tb) do
  250.             newTable[k] = v
  251.         end
  252.         return newTable
  253.     end
  254.  
  255.     -- Load settings
  256.     local settings = {}
  257.     if fs.exists("/plasticOptions") and not(fs.isDir("/plasticOptions")) then
  258.         local f = io.open("/plasticOptions", "r")
  259.         local data = f:read("*l")
  260.         settings = textutils.unserialize(data)
  261.         f:close()
  262.         firstTime = false
  263.     end
  264.  
  265.     if not((type(settings["name"]) == "string") and (type(settings["use12hour"]) == "boolean") and
  266.         (type(settings["city"]) == "string") and (type(settings["showtime"]) == "string") and
  267.         ((settings["temperature"] == "c") or (settings["temperature"] == "f"))) and not(firstTime) then
  268.         corruption = true
  269.     end
  270.  
  271.     local function getWT(city, canceller)
  272.         local function getRawWT(city, canceller) --f or c for unit
  273.             local unit = settings["temperature"]
  274.             local use12hour = settings["use12hour"]
  275.             local months = {"Jan", "Feb", "March", "Apr", "May", "June", "July", "Aug", "Sept", "Oct", "Nov", "Dec"}
  276.             local resp, webData = nil
  277.             if canceller then
  278.                 resp, webData = plasticGet("http://api.worldweatheronline.com/free/v1/weather.ashx?q="..textutils.urlEncode(city).."&format=xml&extra=localObsTime&num_of_days=1&includelocation=yes&key=uyp4r5ekjns64pmpvv3qkynj", true)
  279.             else
  280.                 resp, webData = plasticGet("http://api.worldweatheronline.com/free/v1/weather.ashx?q="..textutils.urlEncode(city).."&format=xml&extra=localObsTime&num_of_days=1&includelocation=yes&key=uyp4r5ekjns64pmpvv3qkynj")
  281.             end
  282.             if resp == "cancel" then
  283.                 return "cancel"
  284.             elseif resp == "success" then
  285.             else
  286.                 error()
  287.             end
  288.             if webData:find("<error>") then
  289.                 return "invalid"
  290.             end
  291.             local city, country = webData:match([[<areaName><!%[CDATA%[([^>]+)%]%]></areaName><country><!%[CDATA%[([^>]+)%]%]></country>]])
  292.             if trimText(country) == "United States Of America" then
  293.                 country = "USA"
  294.             end
  295.             city = trimText(city):gsub(" City", "")
  296.             local resolvedLocation = city .. ", " .. country
  297.  
  298.             local currentTemp = nil
  299.             if unit == "c" then
  300.                 currentTemp = webData:match([[<current_condition>.+<temp_C>([^<]+)</temp_C>.+</current_condition>]])
  301.             elseif unit == "f" then
  302.                 currentTemp = webData:match([[<current_condition>.+<temp_F>([^<]+)</temp_F>.+</current_condition>]])
  303.             end
  304.             local currentHumidity = webData:match([[<current_condition>.+<humidity>([^<]+)</humidity>.+</current_condition>]])
  305.             local currentWeather = trimText(webData:match([[<current_condition>.+<weatherDesc><!%[CDATA%[([^>]+)%]%]></weatherDesc>.+</current_condition>]]))
  306.             local lowTemp, highTemp = nil
  307.             if unit == "c" then
  308.                 highTemp = webData:match([[<weather>.+<tempMaxC>([^<]+)</tempMaxC>.+</weather>]])
  309.                 lowTemp = webData:match([[<weather>.+<tempMinC>([^<]+)</tempMinC>.+</weather>]])
  310.             elseif unit == "f" then
  311.                 highTemp = webData:match([[<weather>.+<tempMaxF>([^<]+)</tempMaxF>.+</weather>]])
  312.                 lowTemp = webData:match([[<weather>.+<tempMinF>([^<]+)</tempMinF>.+</weather>]])
  313.             end
  314.             dayWeather = trimText(webData:match([[<weather>.+<weatherDesc><!%[CDATA%[([^<]+)%]%]></weatherDesc>.+</weather>]]))
  315.  
  316.             local time = nil
  317.             local year, month, day, rawTime, timeFormat = webData:match("<localObsDateTime>(%d+)%-(%d+)%-(%d+) (%d+:%d+) (%u+)</localObsDateTime>")
  318.             local resolvedDate = day .. " " .. months[tonumber(month)] .. " " .. year
  319.             if not use12hour then
  320.                 if timeFormat == "AM" then
  321.                     if rawTime:sub(1,2) == "12" then
  322.                         time = "0" .. rawTime:sub(3,-1)
  323.                     else
  324.                         time = rawTime
  325.                     end
  326.                 elseif timeFormat == "PM" then
  327.                     if rawTime:sub(1,2) == "12" then
  328.                         time = rawTime
  329.                     else
  330.                         time = tostring(tonumber(rawTime:sub(1,2))+12) .. rawTime:sub(3,-1)
  331.                     end
  332.                 else
  333.                     error()
  334.                 end
  335.             else
  336.                 time = rawTime .. " " .. timeFormat
  337.             end
  338.             if time:sub(1,1) == "0" then time = time:sub(2,-1) end
  339.             local current = {}
  340.             current["temp"] = currentTemp
  341.             current["weather"] = currentWeather
  342.             current["humidity"] = currentHumidity
  343.             current["time"] = time
  344.             current["date"] = resolvedDate
  345.             current["url"] = timeURL
  346.             current["location"] = resolvedLocation
  347.  
  348.             local day = {}
  349.             day["high"] = highTemp
  350.             day["low"] = lowTemp
  351.             day["weather"] = dayWeather
  352.  
  353.             return "success", current, day
  354.         end
  355.         local result = nil
  356.         result = {pcall(getRawWT, city, canceller)}
  357.         if result[1] then
  358.             table.remove(result, 1)
  359.         end
  360.         if result[1] then
  361.             return unpack(result)
  362.         else
  363.             return "failure"
  364.         end
  365.     end
  366.  
  367.     -- Get the time and weather!
  368.     local function getTime(city)
  369.         --local resp, time = getTime(settings["city"])
  370.         local resp, cur, today = getWT(city)
  371.         if resp == "success" then
  372.             return "success", cur["time"]
  373.         else return "failure" end
  374.     end
  375.  
  376.     local function displayTime(time)
  377.         if time then
  378.             if #time == 4 then
  379.                 mainText.setX(60)
  380.             elseif #time == 5 then
  381.                 mainText.setX(50)
  382.             elseif #time == 7 then
  383.                 mainText.setX(36)
  384.             elseif #time == 8 then
  385.                 mainText.setX(27)
  386.             end
  387.             mainText.setText(time)
  388.         end
  389.     end
  390.  
  391.     local function resetScreen()
  392.         thirdText.setText("")
  393.         header.setText("")
  394.         forthText.setText("")
  395.         tempText.setText("")
  396.         mainText.setText("")
  397.         mainText.setColor(gColors.text)
  398.         mainText.setScale(3)
  399.         mainText.setY(32)
  400.         secondText.setText("")
  401.         secondText.setColor(gColors.blue)
  402.         secondText.setY(57)
  403.         os.queueEvent("plastic_clock_manager", "show")
  404.         centerText("Welcome, " .. settings["name"], secondText)
  405.     end
  406.  
  407.     local function textScreen()
  408.         thirdText.setText("")
  409.         header.setText("")
  410.         mainText.setText("")
  411.         secondText.setText("")
  412.         os.queueEvent("plastic_clock_manager", "hide")
  413.         reliableSleep(0.05)
  414.         header.setScale(1)
  415.         mainText.setScale(1)
  416.         secondText.setScale(1)
  417.         thirdText.setScale(1)
  418.         header.setColor(gColors.text)
  419.         mainText.setColor(gColors.text)
  420.         secondText.setColor(gColors.text)
  421.         thirdText.setColor(gColors.text)
  422.         header.setY(25)
  423.         mainText.setY(37)
  424.         secondText.setY(47)
  425.         thirdText.setY(57)
  426.         reliableSleep(0.1)
  427.     end
  428.  
  429.     local function squeezeScreen()
  430.         thirdText.setText("")
  431.         header.setText("")
  432.         mainText.setText("")
  433.         secondText.setText("")
  434.         forthText.setText("")
  435.         os.queueEvent("plastic_clock_manager", "hide")
  436.         reliableSleep(0.05)
  437.         header.setScale(1)
  438.         mainText.setScale(1)
  439.         secondText.setScale(1)
  440.         thirdText.setScale(1)
  441.         forthText.setScale(1)
  442.         header.setColor(gColors.text)
  443.         mainText.setColor(gColors.text)
  444.         secondText.setColor(gColors.text)
  445.         thirdText.setColor(gColors.text)
  446.         forthText.setColor(gColors.text)
  447.         header.setY(22)
  448.         mainText.setY(31)
  449.         secondText.setY(40)
  450.         thirdText.setY(49)
  451.         forthText.setY(58)
  452.         reliableSleep(0.1)
  453.     end
  454.  
  455.     -- Setup functions
  456.     local function setupName()
  457.         thirdText.setY(57)
  458.         secondText.setText("")
  459.         mainText.setText("")
  460.         thirdText.setText("")
  461.         centerText("What's your name?", mainText)
  462.         secondText.setY(47)
  463.         secondText.setScale(1)
  464.         secondText.setColor(gColors.text)
  465.         centerText("Ex: $$John", secondText)
  466.         local e, msg = os.pullEvent("chat_command")
  467.         local name = msg
  468.         secondText.setText("")
  469.         centerText("Your name is", mainText)
  470.         centerText(name .. "?", secondText)
  471.         thirdText.setColor(gColors.blue)
  472.         centerText("Options: $$y/n", thirdText)
  473.         while true do
  474.             local e, msg = os.pullEvent("chat_command")
  475.             msg = trimText(msg:lower())
  476.             if msg:find("y") then
  477.                 return name
  478.             elseif msg:find("n") then
  479.                 return setupName()
  480.             end
  481.         end
  482.     end
  483.  
  484.  
  485.     local function setupTime()
  486.         thirdText.setY(57)
  487.         secondText.setText("")
  488.         thirdText.setText("")
  489.         centerText("Use 12h Time Format?", mainText)
  490.         secondText.setColor(gColors.blue)
  491.         centerText("Options: $$y/n", secondText)
  492.         while true do
  493.             local e, msg = os.pullEvent("chat_command")
  494.             msg = trimText(msg:lower())
  495.             if msg:find("y") then
  496.                 return true
  497.             elseif msg:find("n") then
  498.                 return false
  499.             end
  500.         end
  501.     end
  502.  
  503.     local function setupTemperature()
  504.         thirdText.setY(57)
  505.         secondText.setText("")
  506.         thirdText.setText("")
  507.         centerText("Celsius or Farenheit?", mainText)
  508.         secondText.setColor(gColors.blue)
  509.         centerText("Options: $$c/f", secondText)
  510.         while true do
  511.             local e, msg = os.pullEvent("chat_command")
  512.             msg = trimText(msg:lower())
  513.             if msg:find("c") then
  514.                 return "c"
  515.             elseif msg:find("f") then
  516.                 return "f"
  517.             end
  518.         end
  519.     end
  520.  
  521.     local function setupLocation()
  522.         thirdText.setY(57)
  523.         secondText.setText("")
  524.         thirdText.setText("")
  525.         secondText.setColor(gColors.text)
  526.         thirdText.setColor(gColors.text)
  527.         centerText("What's your city?", mainText)
  528.         centerText("(To get time/weather)", secondText)
  529.         centerText("Ex: $$New York", thirdText)
  530.         while true do
  531.             local e, city = os.pullEvent("chat_command")
  532.             thirdText.setColor(gColors.yellow)
  533.             centerText("Connecting...", thirdText)
  534.             local resp, cur = getWT(city)
  535.             if resp == "success" then
  536.                 mainText.setText("")
  537.                 secondText.setText("")
  538.                 thirdText.setText("")
  539.                 centerText("You're in", mainText)
  540.                 centerText(cur["location"] .. "?", secondText)
  541.                 thirdText.setColor(gColors.blue)
  542.                 centerText("Options: $$y/n", thirdText)
  543.                 while true do
  544.                     local e, msg = os.pullEvent("chat_command")
  545.                     msg = trimText(msg:lower())
  546.                     if msg:find("y") then
  547.                         return city
  548.                     elseif msg:find("n") then
  549.                         return setupLocation()
  550.                     end
  551.                 end
  552.             else
  553.                 thirdText.setColor(gColors.red)
  554.                 centerText("Invalid city!", thirdText)
  555.             end
  556.         end
  557.     end
  558.  
  559.     local function mainThread()
  560.         local function start()
  561.             if corruption then
  562.                 header.setY(25)
  563.                 header.setColor(gColors.red)
  564.                 centerText("Error: Corruption", header)
  565.                 mainText.setY(37)
  566.                 mainText.setColor(gColors.yellow)
  567.                 centerText("Options data is", mainText)
  568.                 secondText.setY(47)
  569.                 secondText.setColor(gColors.yellow)
  570.                 centerText("corrupted.", secondText)
  571.                 thirdText.setY(57)
  572.                 thirdText.setColor(gColors.yellow)
  573.                 thirdText.setX(40)
  574.                 slowText("Resetting Plastic...", thirdText)
  575.                 reliableSleep(2)
  576.                 fs.delete("/plasticOptions")
  577.                 closeAnimation()
  578.                 reliableSleep(1)
  579.                 shell.run(plasticInstallation, "nodaemon", unpack(tArgs))
  580.                 error()
  581.             end
  582.             local function welcome()
  583.                 centerText("Welcome to", mainText)
  584.                 secondText.setScale(3)
  585.                 secondText.setX(40)
  586.                 slowText("Plastic", secondText)
  587.                 reliableSleep(2)
  588.                 secondText.setText("")
  589.                 mainText.setText("")
  590.                 centerText("Setup", header)
  591.                 mainText.setText("")
  592.                 mainText.setColor(gColors.text)
  593.                 mainText.setY(37)
  594.                 thirdText.setY(57)
  595.                 return setupName()
  596.             end
  597.  
  598.             if firstTime then
  599.                 settings["name"] = welcome()
  600.                 settings["use12hour"] = setupTime()
  601.                 settings["city"] = setupLocation()
  602.                 settings["temperature"] = setupTemperature()
  603.                 settings["showtime"] = "ingame"
  604.  
  605.                 local f = io.open("/plasticOptions", "w")
  606.                 f:write(textutils.serialize(settings))
  607.                 f:close()
  608.                 closeAnimation()
  609.                 reliableSleep(1)
  610.                 shell.run(plasticInstallation, "nodaemon", unpack(tArgs))
  611.                 error()
  612.             else
  613.                 return
  614.             end
  615.         end
  616.  
  617.         local function convert(query)
  618.             secondText.setX(25)
  619.             slowText("Powered by STANDS4 APIs", secondText)
  620.             --reliableSleep(1)
  621.             --secondText.setX(35)
  622.             --slowText("Converting... | cancel", secondText)
  623.             local resp, msg = plasticGet("http://www.stands4.com/services/v2/conv.php?uid=2464&tokenid=lQAygI15b9x34e2L&expression=" .. textutils.urlEncode(query))
  624.             if resp == "success" then
  625.                 if tonumber(msg:match("<errorCode>(%d+)")) > 0 then
  626.                     centerText(trimText(msg:match("<errorMessage>([^<]+)</errorMessage>")), secondText)
  627.                     return
  628.                 else
  629.                     local response = msg:match("<result>([^<]+)</result>")
  630.                     local replaceable = {["kilogram"] = "kg", ["nautical mile"] = "nmile" , ["megabyte"] = "mb", ["gigabyte"] = "gb", ["kilobyte"] = "kb"
  631.                         ,["millimeter"] = "mm", ["centimeter"] = "cm", ["micrometer"] = "Um", ["nanometer"] = "nm", ["terrabyte"] = "tb", ["exabyte"] = "eb",
  632.                         ["British"] = "gb", ["kilometer"] = "km", ["hour"] = "h", [" / "] = "/", ["&amp;"] = "", ["deg;"] = ""}
  633.                     for k,v in pairs(replaceable) do
  634.                         response = response:lower():gsub(k,v)
  635.                         response = response:lower():gsub(k .. "s",v)
  636.                     end
  637.                     if #response >24 then
  638.                         local startSearch = response:find("%=")
  639.                         local trim = response:find("%.", startSearch)
  640.                         local units = response:find("%s", trim)
  641.                         local nresponse = response:sub(1, trim+3) .. response:sub(units,-1)
  642.                         response = trimText(nresponse)
  643.                     end
  644.                     secondText.setX(25)
  645.                     if #response > 22 then
  646.                         slowText(response, secondText)
  647.                     else
  648.                         centerText(response, secondText)
  649.                     end
  650.                     return
  651.                 end
  652.             elseif resp == "failure" then
  653.                 centerText("Service not available", secondText)
  654.                 return
  655.             elseif resp == "cancel" then
  656.                 centerText("Request Cancelled", secondText)
  657.                 return
  658.             end
  659.         end
  660.  
  661.         local function renderWeather(city)
  662.             local resp, cur, day = nil
  663.             centerText("Src: World Weather Online",secondText)
  664.             if not city then
  665.                 resp, cur, day = getWT(settings["city"], true)
  666.             else
  667.                 resp, cur, day = getWT(city, true)
  668.             end
  669.             if resp == "success" then
  670.                     squeezeScreen()
  671.                     header.setColor(gColors.blue)
  672.                     centerText(cur["location"], header)
  673.                     mainText.setColor(gColors.textGray)
  674.                     centerText(cur["weather"], mainText)
  675.                     tempText.setX(97)
  676.                     tempText.setScale(3)
  677.                     tempText.setY(43)
  678.                     tempText.setColor(gColors.blue)
  679.                     slowText(cur["temp"]..settings["temperature"]:upper(), tempText)
  680.                     secondText.setX(23)
  681.                     slowText("Humidity: " .. cur["humidity"] .. "%", secondText)
  682.                     thirdText.setX(23)
  683.                     slowText("Current", thirdText)
  684.                     forthText.setX(23)
  685.                     slowText("$$back/day", forthText)
  686.                 local function loadCurrent()
  687.                     centerText(cur["weather"], mainText)
  688.                     slowText(cur["temp"]..settings["temperature"]:upper(), tempText)
  689.                     slowText("Current", thirdText)
  690.                     slowText("$$back/day", forthText)
  691.                     while true do
  692.                         local e, msg = os.pullEvent("chat_command")
  693.                         msg = trimText(msg:lower())
  694.                         if (msg == "back") or msg == "home" then
  695.                             return resetScreen()
  696.                         elseif (msg == "day") then
  697.                             return loadDay()
  698.                         end
  699.                     end
  700.                 end
  701.                 local function loadDay()
  702.                     centerText(day["weather"], mainText)
  703.                     slowText(day["high"]..settings["temperature"]:upper(), tempText)
  704.                     slowText("Low: " .. day["low"] .. (settings["temperature"]:upper()), thirdText)
  705.                     slowText("$$back/cur", forthText)
  706.                     while true do
  707.                         local e, msg = os.pullEvent("chat_command")
  708.                         msg = trimText(msg:lower())
  709.                         if (msg == "back") or msg == "home" then
  710.                             return resetScreen()
  711.                         elseif (msg:find("cur")) then
  712.                             return loadCurrent()
  713.                         end
  714.                     end
  715.                 end
  716.                 while true do
  717.                     local e, msg = os.pullEvent("chat_command")
  718.                     msg = trimText(msg:lower())
  719.                     if (msg == "back") or msg == "home" then
  720.                         return resetScreen()
  721.                     elseif (msg == "day") then
  722.                         return loadDay()
  723.                     end
  724.                 end
  725.             elseif resp == "cancel" then
  726.                 centerText("Request Cancelled", secondText)
  727.                 return
  728.             elseif resp == "invalid" then
  729.                 centerText("Invalid location!", secondText)
  730.                 return
  731.             else
  732.                 centerText("Service not available", secondText)
  733.                 return
  734.             end
  735.         end
  736.  
  737.         local function renderDate(city)
  738.             centerText("Src: World Weather Online",secondText)
  739.             local resp, cur = getWT(city, true)
  740.             if resp == "success" then
  741.                 textScreen()
  742.                 header.setColor(gColors.blue)
  743.                 centerText("Current Time/Date", header)
  744.                 centerText(cur["location"], mainText)
  745.                 centerText(cur["date"] .. " - " .. cur["time"], secondText)
  746.                 centerText("$$back", thirdText)
  747.                 while true do
  748.                     local e, msg = os.pullEvent("chat_command")
  749.                     msg = trimText(msg:lower())
  750.                     if (msg == "back") or (msg == "home") then
  751.                         resetScreen()
  752.                         return
  753.                     end
  754.                 end
  755.             elseif resp == "cancel" then
  756.                 centerText("Request Cancelled", secondText)
  757.                 return
  758.             elseif resp == "invalid" then
  759.                 centerText("Invalid location!", secondText)
  760.                 return
  761.             else
  762.                 centerText("Service not available", secondText)
  763.                 return
  764.             end
  765.         end
  766.  
  767.         local function getEnvs()
  768.             local newEnv = getfenv(0)
  769.             newEnv.secondText = secondText
  770.             newEnv.thirdText = thirdText
  771.             newEnv.forthText = forthText
  772.             newEnv.tempText = tempText
  773.             newEnv.mainText = mainText
  774.             newEnv.resetScreen = resetScreen
  775.             newEnv.squeezeScreen = squeezeScreen
  776.             newEnv.textScreen = textScreen
  777.             newEnv.slowText = slowText
  778.             newEnv.centerText = centerText
  779.             newEnv.plasticGet = plasticGet
  780.             newEnv.trimText = trimText
  781.             newEnv.header = header
  782.             newEnv.plastic = plastic
  783.             return newEnv
  784.         end
  785.  
  786.         local function home()
  787.             local function resetSecond()
  788.                 secondText.setText("")
  789.                 secondText.setColor(gColors.blue)
  790.                 secondText.setY(57)
  791.                 secondText.setScale(1)
  792.             end
  793.             thirdText.setText("")
  794.             header.setText("")
  795.             mainText.setText("")
  796.             mainText.setColor(gColors.text)
  797.             mainText.setScale(3)
  798.             mainText.setY(32)
  799.             secondText.setText("")
  800.             secondText.setColor(gColors.blue)
  801.             secondText.setY(57)
  802.             displayTime("00:00 --")
  803.             os.queueEvent("plastic_clock_manager", "show")
  804.             centerText("Welcome, " .. settings["name"], secondText)
  805.             while true do
  806.                 local skipAll = false
  807.                 local e, msg = os.pullEvent()
  808.                 if e == "chat_command" then
  809.                     msg = trimText(msg:lower())
  810.                     if searchArgs("root") then
  811.                         for k,v in pairs(rootApps) do
  812.                             local a = loadstring("local cmd = [[" .. msg .. "]]\n" .. v)
  813.                             if a then
  814.                                 local env = getEnvs()
  815.                                 setfenv(a, env)
  816.                                 if a() then
  817.                                     skipAll = true
  818.                                 end
  819.                             else
  820.                                 print("Failed to run application: ", k)
  821.                             end
  822.                         end
  823.                     end
  824.                     if not(skipAll) then
  825.                         if (msg:sub(1,1) == "=") then
  826.                             local banned = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o",
  827.                             "p", "q", "r", "s", "t", "u", "v", "w", "x","y", "z"}
  828.                             local formula = msg:sub(2, -1):lower()
  829.                             for k,v in pairs(banned) do
  830.                                 formula = formula:gsub(v, "")
  831.                             end
  832.                             local func = loadstring("return " .. formula)
  833.                             local e, resp = pcall(func)
  834.                             if e and ((type(resp) == "number") or (type(resp) == "string")) then
  835.                                 centerText("=" .. resp, secondText)
  836.                             else
  837.                                 centerText("Syntax Error", secondText)
  838.                             end
  839.                         elseif msg == "help" then
  840.                             squeezeScreen()
  841.                             header.setColor(gColors.blue)
  842.                             centerText("Help, Try: $$", header)
  843.                             centerText("=12*3, home, irl, restart,", mainText)
  844.                             centerText("igl, quit, update, weather,", secondText)
  845.                             centerText("time/weather for city,", thirdText)
  846.                             centerText("convert x to y (back)", forthText)
  847.                             while true do
  848.                                 local _, msg = os.pullEvent("chat_command")
  849.                                 msg = trimText(msg:lower())
  850.                                 if (msg == "back") or (msg == "home") then
  851.                                     resetScreen()
  852.                                     break
  853.                                 end
  854.                             end
  855.                         elseif msg == "about" then
  856.                             secondText.setX(32)
  857.                             slowText("Plastic B v0.11 by 1lann", secondText)
  858.                         elseif (msg:sub(1,8) == "weather ") or msg == "weather" then
  859.                             local location = nil
  860.                             if msg:sub(1,12) == "weather for " then
  861.                                 location = trimText(msg:sub(13, -1))
  862.                             elseif msg:sub(1,11) == "weather in " then
  863.                                 location = trimText(msg:sub(12, -1))
  864.                             elseif msg == "weather" then
  865.                                 location = ""
  866.                             else
  867.                                 location = trimText(msg:sub(9, -1))
  868.                             end
  869.                             if location == "" then
  870.                                 renderWeather()
  871.                             else
  872.                                 renderWeather(location)
  873.                             end
  874.                         elseif (msg:sub(1,8) == "time in ") or (msg:sub(1,9) == "time for ") or (msg:sub(1,9) == "date for ") then
  875.                             local location = nil
  876.                             if (msg:sub(1,8) == "time in ") then
  877.                                 location = msg:sub(9,-1)
  878.                             else
  879.                                 location = msg:sub(10, -1)
  880.                             end
  881.                             if location == "" then
  882.                                 centerText("No city speicifed!", secondText)
  883.                             else
  884.                                 renderDate(location)
  885.                             end
  886.                         elseif msg == "settings" then
  887.                             local exit = false
  888.                             while true do
  889.                                 local noSave = false
  890.                                 textScreen()
  891.                                 header.setColor(gColors.blue)
  892.                                 centerText("Change Settings", header)
  893.                                 centerText("Options: temperature,", mainText)
  894.                                 centerText("time format, name,", secondText)
  895.                                 centerText("location, back", thirdText)
  896.                                 while true do
  897.                                     local _, msg = os.pullEvent("chat_command")
  898.                                     msg = trimText(msg:lower())
  899.                                     if (msg == "back") or (msg == "home") then
  900.                                         resetScreen()
  901.                                         exit = true
  902.                                         break
  903.                                     elseif (msg == "temperature") then
  904.                                         mainText.setText("")
  905.                                         secondText.setText("")
  906.                                         thirdText.setText("")
  907.                                         header.setText("")
  908.                                         header.setColor(gColors.textGray)
  909.                                         centerText("Setup", header)
  910.                                         settings["temperature"] = setupTemperature()
  911.                                         noSave = false
  912.                                     elseif (msg == "time format") then
  913.                                         mainText.setText("")
  914.                                         secondText.setText("")
  915.                                         thirdText.setText("")
  916.                                         header.setText("")
  917.                                         header.setColor(gColors.textGray)
  918.                                         centerText("Setup", header)
  919.                                         settings["use12hour"] = setupTime()
  920.                                         noSave = false
  921.                                     elseif (msg == "name") then
  922.                                         mainText.setText("")
  923.                                         secondText.setText("")
  924.                                         thirdText.setText("")
  925.                                         header.setText("")
  926.                                         header.setColor(gColors.textGray)
  927.                                         centerText("Setup", header)
  928.                                         settings["name"] = setupName()
  929.                                         noSave = false
  930.                                     elseif (msg == "location") then
  931.                                         mainText.setText("")
  932.                                         secondText.setText("")
  933.                                         thirdText.setText("")
  934.                                         header.setText("")
  935.                                         header.setColor(gColors.textGray)
  936.                                         centerText("Setup", header)
  937.                                         settings["city"] = setupLocation()
  938.                                         noSave = false
  939.                                     else
  940.                                         noSave = true
  941.                                     end
  942.                                     if not(noSave) then
  943.                                         local f = io.open("/plasticOptions", "w")
  944.                                         f:write(textutils.serialize(settings))
  945.                                         f:close()
  946.                                         mainText.setText("")
  947.                                         secondText.setText("")
  948.                                         thirdText.setText("")
  949.                                         header.setText("")
  950.                                         mainText.setColor(gColors.green)
  951.                                         centerText("Settings saved!", mainText)
  952.                                         sleep(2)
  953.                                         break
  954.                                     end
  955.                                 end
  956.                                 if exit then break end
  957.                             end
  958.                         elseif (msg:sub(1,8) == "convert ") then
  959.                             os.queueEvent("plastic_clock_manager", "show")
  960.                             resetSecond()
  961.                             convert(msg)
  962.                         elseif msg == "irl" then
  963.                             if not(settings["showtime"] == "irl") then
  964.                                 secondText.setX(30)
  965.                                 slowText("Changing time... | cancel", secondText)
  966.                                 local resp, time = getTime(settings["city"])
  967.                                 if resp == "success" then
  968.                                     settings["showtime"] = "irl"
  969.                                     os.queueEvent("plastic_clock_manager", "force", time)
  970.                                     os.queueEvent("plastic_clock_manager", "show")
  971.                                     os.queueEvent("plastic_clock_manager", "irl")
  972.                                     displayTime(time)
  973.                                     local f = io.open("/plasticOptions", "w")
  974.                                     f:write(textutils.serialize(settings))
  975.                                     f:close()
  976.                                     centerText("Time is now IRL", secondText)
  977.                                 else
  978.                                     centerText("Could not get IRL time!", secondText)
  979.                                 end
  980.                             else
  981.                                 centerText("Time is already IRL!", secondText)
  982.                             end
  983.                         elseif msg == "ingame" or (msg == "igl") then
  984.                             if not(settings["showtime"] == "ingame") then
  985.                                 settings["showtime"] = "ingame"
  986.                                 os.queueEvent("plastic_clock_manager", "force", textutils.formatTime(os.time(), not(settings["use12hour"])))
  987.                                 os.queueEvent("plastic_clock_manager", "show")
  988.                                 os.queueEvent("plastic_clock_manager", "ingame")
  989.                                 local f = io.open("/plasticOptions", "w")
  990.                                 f:write(textutils.serialize(settings))
  991.                                 f:close()
  992.                                 centerText("Time is now in-game", secondText)
  993.                             else
  994.                                 secondText.setX(30)
  995.                                 slowText("Time is already in-game!", secondText)
  996.                             end
  997.                         elseif msg == "update" then
  998.                             secondText.setX(35)
  999.                             centerText("Updating... | cancel", secondText)
  1000.                             local resp, data = plasticGet("http://pastebin.com/raw.php?i=43nHyKXU")
  1001.                             if resp == "success" then
  1002.                                 local f = io.open(plasticInstallation, "w")
  1003.                                 f:write(data)
  1004.                                 f:close()
  1005.                                 closeAnimation()
  1006.                                 reliableSleep(1)
  1007.                                 shell.run(plasticInstallation, "nodaemon", unpack(tArgs))
  1008.                                 error()
  1009.                             elseif resp == "failure" then
  1010.                                 centerText("Failed to update!", secondText)
  1011.                             elseif resp == "cancel" then
  1012.                                 centerText("Request Cancelled", secondText)
  1013.                             end
  1014.                         elseif (msg == "home") or (msg == "clock") or (msg == "time") then
  1015.                             resetScreen()
  1016.                         elseif (msg == "restart") then
  1017.                             closeAnimation()
  1018.                             reliableSleep(1)
  1019.                             shell.run(plasticInstallation, "nodaemon", unpack(tArgs))
  1020.                             error()
  1021.                         elseif (msg == "exit") or (msg == "quit") or (msg == "stop") then
  1022.                             closeAnimation()
  1023.                             error()
  1024.                         else
  1025.                             centerText("Unknown Command!", secondText)
  1026.                         end
  1027.                     end
  1028.                 end
  1029.             end
  1030.         end
  1031.  
  1032.         start()
  1033.         home()
  1034.     end
  1035.  
  1036.     local function updateWeather()
  1037.         if sensor then
  1038.             if worldSensor then
  1039.                 header.setY(22)
  1040.                 local data = worldSensor.getTargets()["CURRENT"]
  1041.                 if data["Thundering"] then
  1042.                     header.setColor(gColors.textGray)
  1043.                     header.setX(53)
  1044.                     header.setText("Thunderstorm")
  1045.                 elseif data["Raining"] then
  1046.                     header.setColor(gColors.rain)
  1047.                     header.setX(80)
  1048.                     header.setText("Rain")
  1049.                 elseif data["Daytime"] then
  1050.                     header.setColor(gColors.yellow)
  1051.                     header.setX(75)
  1052.                     header.setText("Sunny")
  1053.                 else
  1054.                     header.setColor(gColors.rain)
  1055.                     header.setX(59)
  1056.                     header.setText("Clear Night")
  1057.                 end
  1058.             else
  1059.                 header.setColor(gColors.textGray)
  1060.                 header.setX(35)
  1061.                 header.setText("Missing world sensor!")
  1062.             end
  1063.         end
  1064.     end
  1065.  
  1066.     local function weatherThread()
  1067.         local timer = os.startTimer(5)
  1068.         while true do
  1069.             local e, id = os.pullEvent()
  1070.             if e == "plastic_clock_manager" then
  1071.                 if id == "hide" then
  1072.                     showClock = false
  1073.                 elseif id == "show" then
  1074.                     updateWeather()
  1075.                     timer = os.startTimer(5)
  1076.                     showClock = true
  1077.                 end
  1078.             elseif (e == "timer") and (timer == id) and showClock then
  1079.                 updateWeather()
  1080.                 timer = os.startTimer(5)
  1081.             end
  1082.         end
  1083.     end
  1084.  
  1085.     local function backgroundThread()
  1086.         local webUpdate = 0
  1087.         local resp, time = nil
  1088.         local lastTimeUpdate = os.clock()
  1089.         local function updateTime(prevTime, city)
  1090.             if os.clock() >= lastTimeUpdate+60 then
  1091.                 webUpdate  = webUpdate + 1
  1092.                 if webUpdate < 60 then
  1093.                     if prevTime then
  1094.                         local hour,minute,ampm = prevTime:match("^(%d+):(%d+)(.-)$")
  1095.                         if ampm == " AM" then
  1096.                             if settings["use12hour"] == false then
  1097.                                 return getTime(city)
  1098.                             end
  1099.                             lastTimeUpdate = os.clock()
  1100.                             if minute == "59" then
  1101.                                 if hour == "11" then
  1102.                                     return "success","12:00 PM"
  1103.                                 elseif hour == "12" then
  1104.                                     return "success","1:00 AM"
  1105.                                 else
  1106.                                     return "success",tostring(tonumber(hour)+1)..":00 AM"
  1107.                                 end
  1108.                             else
  1109.                                 if #tostring(tonumber(minute)+1) > 1 then
  1110.                                     return "success",hour..":"..tostring(tonumber(minute)+1).." AM"
  1111.                                 else
  1112.                                     return "success",hour..":0"..tostring(tonumber(minute)+1).." AM"
  1113.                                 end
  1114.                             end
  1115.                         elseif ampm == " PM" then
  1116.                             if settings["use12hour"] == false then
  1117.                                 return getTime(city)
  1118.                             end
  1119.                             lastTimeUpdate = os.clock()
  1120.                             if minute == "59" then
  1121.                                 if hour == "11" then
  1122.                                     return "success","12:00 AM"
  1123.                                 elseif hour == "12" then
  1124.                                     return "success","1:00 PM"
  1125.                                 else
  1126.                                     return "success",tostring(tonumber(hour)+1)..":00 PM"
  1127.                                 end
  1128.                             else
  1129.                                 if #tostring(tonumber(minute)+1) > 1 then
  1130.                                     return "success",hour..":"..tostring(tonumber(minute)+1).." PM"
  1131.                                 else
  1132.                                     return "success",hour..":0"..tostring(tonumber(minute)+1).." PM"
  1133.                                 end
  1134.                             end
  1135.                         else
  1136.                             if settings["use12hour"] == true then
  1137.                                 return getTime(city)
  1138.                             end
  1139.                             lastTimeUpdate = os.clock()
  1140.                             if minute == "59" then
  1141.                                 if hour == "23" then
  1142.                                     return "success", "0:00"
  1143.                                 else
  1144.                                     return "success", tostring(tonumber(hour)+1)..":".."00"
  1145.                                 end
  1146.                             else
  1147.                                 if #tostring(tonumber(minute)+1) > 1 then
  1148.                                     return "success",hour..":"..tostring(tonumber(minute)+1)
  1149.                                 else
  1150.                                     return "success",hour..":0"..tostring(tonumber(minute)+1)
  1151.                                 end
  1152.                             end
  1153.                         end
  1154.                     else
  1155.                         return "failure"
  1156.                     end
  1157.                 else
  1158.                     return getTime(city)
  1159.                 end
  1160.             else
  1161.                 return "success",prevTime
  1162.             end
  1163.         end
  1164.         local clockType = settings["showtime"]
  1165.         local timerID = nil
  1166.         local updateTimer = nil
  1167.         local previousClock = nil
  1168.         local dynamicSleep = nil
  1169.         local resp = nil
  1170.         if settings["showtime"] == "irl" then
  1171.             resp, time = getTime(settings["city"])
  1172.             if resp == "success" then
  1173.                 settings["showtime"] = "irl"
  1174.                 os.queueEvent("plastic_clock_manager", "force", time)
  1175.                 os.queueEvent("plastic_clock_manager", "show")
  1176.                 os.queueEvent("plastic_clock_manager", "irl")
  1177.                 displayTime(time)
  1178.                 local f = io.open("/plasticOptions", "w")
  1179.                 f:write(textutils.serialize(settings))
  1180.                 f:close()
  1181.  
  1182.             else
  1183.  
  1184.             end
  1185.         end
  1186.         if clockType == "ingame" then
  1187.             dynamicSleep = 0.83
  1188.         else
  1189.             dynamicSleep = 60
  1190.         end
  1191.         timerID = os.clock() + dynamicSleep
  1192.         os.startTimer(0.83)
  1193.         updateTimer = 0.83+os.clock()
  1194.         while true do
  1195.             if os.clock() >= updateTimer then
  1196.                     os.startTimer(0.83)
  1197.                     updateTimer = 0.83+os.clock()
  1198.             end
  1199.             local e, command, param =  os.pullEvent()
  1200.             if e == "plastic_clock_manager" then
  1201.                 if command == "show" then
  1202.                     if time then
  1203.                         displayTime(time)
  1204.                     end
  1205.                     mainText.setColor(gColors.text)
  1206.                     mainText.setScale(3)
  1207.                     mainText.setY(32)
  1208.                     header.setText("")
  1209.                     showClock = true
  1210.                     timerID = os.clock()
  1211.                 elseif command == "hide" then
  1212.                     header.setText("")
  1213.                     mainText.setText("")
  1214.                     timerID = os.clock()+2
  1215.                     showClock = false
  1216.                 elseif command == "irl" then
  1217.                     clockType = "irl"
  1218.                     dynamicSleep = 60
  1219.                     timerID = os.clock() + dynamicSleep
  1220.                 elseif command == "ingame" then
  1221.                     clockType = "ingame"
  1222.                     dynamicSleep = 0.83
  1223.                     timerID = os.clock() + dynamicSleep
  1224.                 elseif command == "force" then
  1225.                     if param then
  1226.                         time = param
  1227.                     end
  1228.                 elseif command == "kill" then
  1229.                     sleep(100)
  1230.                 end
  1231.             elseif os.clock() >= timerID then
  1232.                 if showClock then
  1233.                     if clockType == "irl" then
  1234.                         resp, time = updateTime(time,settings["city"])
  1235.                         if resp ~= "success" then
  1236.                             displayTime("ERROR")
  1237.                             webUpdate = 60
  1238.                         else
  1239.                             displayTime(time)
  1240.                         end
  1241.                     elseif clockType == "ingame" then
  1242.                         time = textutils.formatTime(os.time(), not(settings["use12hour"]))
  1243.                         displayTime(time)
  1244.                     end
  1245.                 end
  1246.                 timerID = os.clock() + dynamicSleep
  1247.             end
  1248.         end
  1249.     end
  1250.  
  1251.     local eError, eResp = pcall(function() parallel.waitForAny(mainThread,backgroundThread,weatherThread) end)
  1252.     if eError then
  1253.         return
  1254.     elseif eResp then
  1255.         if not(fs.exists("/plasticLog")) then
  1256.             local f = io.open("/plasticLog", "w") f:write("-- Plastic Error Logs --\n") f:close()
  1257.         end
  1258.         local f = io.open("/plasticLog", "a")
  1259.         f:write(eResp .. "\n")
  1260.         f:close()
  1261.         mainText.setText("")
  1262.         secondText.setText("")
  1263.         thirdText.setText("")
  1264.         forthText.setText("")
  1265.         tempText.setText("")
  1266.         header.setText("")
  1267.         header.setY(25)
  1268.         header.setColor(gColors.red)
  1269.         centerText("Plastic has crashed", header)
  1270.         mainText.setY(37)
  1271.         mainText.setColor(gColors.yellow)
  1272.         secondText.setColor(gColors.yellow)
  1273.         thirdText.setColor(gColors.yellow)
  1274.         mainText.setScale(1)
  1275.         secondText.setScale(1)
  1276.         thirdText.setScale(1)
  1277.         centerText("and will now restart.", mainText)
  1278.         secondText.setY(47)
  1279.         centerText("See /plasticLog for", secondText)
  1280.         thirdText.setY(57)
  1281.         centerText("more information.", thirdText)
  1282.         reliableSleep(3)
  1283.         closeAnimation()
  1284.         reliableSleep(1)
  1285.         shell.run(plasticInstallation, "nodaemon", unpack(tArgs))
  1286.         error()
  1287.     end
  1288. end
  1289.  
  1290. local function plasticWrapper()
  1291.     pcall(runPlastic)
  1292. end
  1293.  
  1294. --[[function os.pullEvent(lookfor)
  1295.     local data = {os.pullEventRaw()}
  1296.     --if not(data[1] == "timer") and not(data[1] == "ocs_success") then
  1297.         print(os.clock(), data[1], tostring(data[2]))
  1298.     --end
  1299.     if not lookfor then
  1300.         return unpack(data)
  1301.     elseif data[1] == lookfor then
  1302.         return unpack(data)
  1303.     end
  1304. end]]
  1305.  
  1306. if not(searchArgs("nodaemon")) then
  1307.     parallel.waitForAny(plasticWrapper, function() shell.run("/rom/programs/shell") end)
  1308.     closeAnimation()
  1309.     term.clear()
  1310.     term.setCursorPos(1,1)
  1311.     print("Thank you for using Plastic Beta v0.11 by 1lann")
  1312. else
  1313.     runPlastic()
  1314.     closeAnimation()
  1315.     term.clear()
  1316.     term.setCursorPos(1,1)
  1317.     print("Thank you for using Plastic Beta v0.11 by 1lann")
  1318. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement