From dbd2f3067f997f2ef318a97aed6cccf8f1067871 Mon Sep 17 00:00:00 2001 From: payonel Date: Sat, 4 Feb 2017 11:25:01 -0800 Subject: [PATCH 1/3] term safe slow write, fix pastebin get, low mem loadfile fix --- .../assets/opencomputers/loot/openos/bin/pastebin.lua | 2 +- .../assets/opencomputers/loot/openos/boot/00_base.lua | 3 ++- .../assets/opencomputers/loot/openos/lib/term.lua | 8 +++++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/resources/assets/opencomputers/loot/openos/bin/pastebin.lua b/src/main/resources/assets/opencomputers/loot/openos/bin/pastebin.lua index 685428499..b5ff93473 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/bin/pastebin.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/bin/pastebin.lua @@ -21,7 +21,7 @@ local function get(pasteId, filename) end io.write("Downloading from pastebin.com... ") - local url = "http://pastebin.com/raw.php?i=" .. pasteId + local url = "http://pastebin.com/raw/" .. pasteId local result, response = pcall(internet.request, url) if result then io.write("success.\n") diff --git a/src/main/resources/assets/opencomputers/loot/openos/boot/00_base.lua b/src/main/resources/assets/opencomputers/loot/openos/boot/00_base.lua index 87311875c..581584347 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/boot/00_base.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/boot/00_base.lua @@ -15,7 +15,8 @@ function loadfile(filename, mode, env) end table.insert(buffer, data) end - buffer = table.concat(buffer):gsub("^#![^\n]+", "") -- remove shebang if any + buffer[1] = (buffer[1] or ""):gsub("^#![^\n]+", "") -- remove shebang if any + buffer = table.concat(buffer) return load(buffer, "=" .. filename, mode, env) end diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/term.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/term.lua index 297fbd890..b936ac261 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/term.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/term.lua @@ -390,7 +390,13 @@ function term.drawText(value, wrap, window) local function scroll(_sy,_y) return _sy + term.internal.scroll(window,_y-h), math.min(_y,h) end + local uptime = computer.uptime + local last_sleep = uptime() while index <= vlen do + if uptime() - last_sleep > 4 then + os.sleep(0) + last_sleep = uptime() + end local si,ei = value:find("[\t\r\n\a]", index) si = si or vlen+1 if index==si then @@ -401,7 +407,7 @@ function term.drawText(value, wrap, window) x,y=1,y+1 sy,y = scroll(sy,y) elseif delim=="\a" and not beeped then - require("computer").beep() + computer.beep() beeped = true end cr_last = delim == "\r" From e8352fb07f06f42c484f3bf2d991043b5f0f663a Mon Sep 17 00:00:00 2001 From: Vexatos Date: Sat, 4 Feb 2017 22:11:08 +0100 Subject: [PATCH 2/3] Use lower-case name for checking debug card access so that comparison with whitelist works properly. Closes #2262. --- src/main/scala/li/cil/oc/Settings.scala | 2 +- src/main/scala/li/cil/oc/common/item/DebugCard.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/scala/li/cil/oc/Settings.scala b/src/main/scala/li/cil/oc/Settings.scala index 09db72e59..a7a8efee4 100644 --- a/src/main/scala/li/cil/oc/Settings.scala +++ b/src/main/scala/li/cil/oc/Settings.scala @@ -660,7 +660,7 @@ object Settings { } def checkAccess(ctxOpt: Option[DebugCard.AccessContext]): Option[String] = ctxOpt match { - case Some(ctx) => values.get(ctx.player) match { + case Some(ctx) => values.get(ctx.player.toLowerCase) match { case Some(x) => if (x == ctx.nonce) None else Some("debug card is invalidated, please re-bind it to yourself") diff --git a/src/main/scala/li/cil/oc/common/item/DebugCard.scala b/src/main/scala/li/cil/oc/common/item/DebugCard.scala index 7aaf1c669..7c5a56853 100644 --- a/src/main/scala/li/cil/oc/common/item/DebugCard.scala +++ b/src/main/scala/li/cil/oc/common/item/DebugCard.scala @@ -19,7 +19,7 @@ class DebugCard(val parent: Delegator) extends traits.Delegate { } override def onItemRightClick(stack: ItemStack, world: World, player: EntityPlayer): ItemStack = { - if (player.isSneaking) { + if (!world.isRemote && player.isSneaking) { val data = new DebugCardData(stack) val name = player.getCommandSenderName From d8471278ba18f5f09e2e8c6cdf494da2b498a02b Mon Sep 17 00:00:00 2001 From: payonel Date: Sat, 4 Feb 2017 14:48:47 -0800 Subject: [PATCH 3/3] require("internet").request now returns a function object The function object can be called to read from the stream, same usage as before But the object also exposes the request handle userdata, to allow calling close for example: ``` local request = require("internet").request("http://www.google.com") print(request()) -- same as before request:close() -- clean up resources now, as opposed to waiting for gc ``` closes #2255 --- .../loot/openos/lib/internet.lua | 46 ++++++++++++------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/internet.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/internet.lua index 0b252bb30..c924a0dab 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/internet.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/internet.lua @@ -11,10 +11,10 @@ function internet.request(url, data, headers) checkArg(2, data, "string", "table", "nil") checkArg(3, headers, "table", "nil") - local inet = component.internet - if not inet then + if not component.isAvailable("internet") then error("no primary internet card found", 2) end + local inet = component.internet local post if type(data) == "string" then @@ -31,23 +31,35 @@ function internet.request(url, data, headers) error(reason, 2) end - return function() - while true do - local data, reason = request.read() - if not data then - request.close() - if reason then - error(reason, 2) - else - return nil -- eof + return setmetatable( + { + ["()"] = "function():string -- Tries to read data from the socket stream and return the read byte array.", + close = setmetatable({}, + { + __call = request.close, + __tostring = function() return "function() -- closes the connection" end + }) + }, + { + __call = function() + while true do + local data, reason = request.read() + if not data then + request.close() + if reason then + error(reason, 2) + else + return nil -- eof + end + elseif #data > 0 then + return data end - elseif #data > 0 then - return data + -- else: no data, block + os.sleep(0) end - -- else: no data, block - os.sleep(0) - end - end + end, + __index = request, + }) end -------------------------------------------------------------------------------