From 99902fd205d8d77f395f053f9a5540bca5eabd9f Mon Sep 17 00:00:00 2001 From: Vladimir Kalinin Date: Sat, 6 Apr 2019 20:25:42 +0300 Subject: [PATCH 1/4] Explicit type conversion for hash map (#3080) --- .../li/cil/oc/integration/appeng/NetworkControl.scala | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/scala/li/cil/oc/integration/appeng/NetworkControl.scala b/src/main/scala/li/cil/oc/integration/appeng/NetworkControl.scala index a808a3cb2..98922e55a 100644 --- a/src/main/scala/li/cil/oc/integration/appeng/NetworkControl.scala +++ b/src/main/scala/li/cil/oc/integration/appeng/NetworkControl.scala @@ -63,11 +63,14 @@ trait NetworkControl[AETile >: Null <: TileEntity with IGridProxyable with IActi private def allCraftables: Iterable[IAEItemStack] = allItems.collect{ case aeItem if aeItem.isCraftable => aeCraftItem(aeItem) } private def convert(aeItem: IAEItemStack): java.util.HashMap[String, AnyRef] = { - case class StringAnyRefHash (value: java.util.HashMap[String, AnyRef]) + def hashConvert(value: java.util.HashMap[_, _]) = { + val hash = new java.util.HashMap[String, AnyRef] + value.collect{ case (k:String, v:AnyRef) => hash += k -> v } + hash + } val potentialItem = aePotentialItem(aeItem) - val result = Registry - .convert(Array[AnyRef](potentialItem.getItemStack)) - .collect { case StringAnyRefHash(hash) => hash } + val result = Registry.convert(Array[AnyRef](potentialItem.getItemStack)) + .collect { case hash: java.util.HashMap[_,_] => hashConvert(hash) } if (result.length > 0) { val hash = result(0) // it would have been nice to put these fields in a registry convert From 91e913bbff5c2fdd9d0c523e348c10bd2bbd4921 Mon Sep 17 00:00:00 2001 From: "Wilma456 (Jakob0815)" Date: Sat, 2 Feb 2019 09:49:49 +0100 Subject: [PATCH 2/4] Update robot.names --- src/main/resources/assets/opencomputers/robot.names | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/assets/opencomputers/robot.names b/src/main/resources/assets/opencomputers/robot.names index 7cead7cfa..8ba9c910f 100644 --- a/src/main/resources/assets/opencomputers/robot.names +++ b/src/main/resources/assets/opencomputers/robot.names @@ -80,6 +80,7 @@ Kodos # Contributor Laire # Perry Rhodan Loader 1340 # Borderlands 2 LordFokas # Contributor +Maria # Metropolis Marvin # Hitchhiker's Guide to the Galaxy Mawhrin-skel # The Player of Games (Iain M Banks) Michiyo # Contributor From 920e66bafd706d8bffce6a7383318380eac744e2 Mon Sep 17 00:00:00 2001 From: Kingsley Chanakira Date: Sat, 25 May 2019 14:13:16 -0400 Subject: [PATCH 3/4] More HTTP request methods #1938 Adds the ability to specify the HTTP method used when sending a request with the internet card. Fixes https://github.com/MightyPirates/OpenComputers/issues/1938 --- .../loot/openos/lib/internet.lua | 5 +++-- .../oc/server/component/InternetCard.scala | 19 ++++++++----------- 2 files changed, 11 insertions(+), 13 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 c924a0dab..87fe3ea5c 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/internet.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/internet.lua @@ -6,10 +6,11 @@ local internet = {} ------------------------------------------------------------------------------- -function internet.request(url, data, headers) +function internet.request(url, data, headers, method) checkArg(1, url, "string") checkArg(2, data, "string", "table", "nil") checkArg(3, headers, "table", "nil") + checkArg(4, method, "string", "nil") if not component.isAvailable("internet") then error("no primary internet card found", 2) @@ -26,7 +27,7 @@ function internet.request(url, data, headers) end end - local request, reason = inet.request(url, post, headers) + local request, reason = inet.request(url, post, headers, method) if not request then error(reason, 2) end diff --git a/src/main/scala/li/cil/oc/server/component/InternetCard.scala b/src/main/scala/li/cil/oc/server/component/InternetCard.scala index b9d08a7c6..ba33e2842 100644 --- a/src/main/scala/li/cil/oc/server/component/InternetCard.scala +++ b/src/main/scala/li/cil/oc/server/component/InternetCard.scala @@ -59,7 +59,7 @@ class InternetCard extends prefab.ManagedEnvironment with DeviceInfo { @Callback(direct = true, doc = """function():boolean -- Returns whether HTTP requests can be made (config setting).""") def isHttpEnabled(context: Context, args: Arguments): Array[AnyRef] = result(Settings.get.httpEnabled) - @Callback(doc = """function(url:string[, postData:string[, headers:table]]):userdata -- Starts an HTTP request. If this returns true, further results will be pushed using `http_response` signals.""") + @Callback(doc = """function(url:string[, postData:string[, headers:table[, method:string]]]):userdata -- Starts an HTTP request. If this returns true, further results will be pushed using `http_response` signals.""") def request(context: Context, args: Arguments): Array[AnyRef] = this.synchronized { checkOwner(context) val address = args.checkString(0) @@ -77,7 +77,8 @@ class InternetCard extends prefab.ManagedEnvironment with DeviceInfo { if (!Settings.get.httpHeadersEnabled && headers.nonEmpty) { return result(Unit, "http request headers are unavailable") } - val request = new InternetCard.HTTPRequest(this, checkAddress(address), post, headers) + val method = if (args.isString(3)) Option(args.checkString(3)) else None + val request = new InternetCard.HTTPRequest(this, checkAddress(address), post, headers, method) connections += request result(request) } @@ -363,10 +364,10 @@ object InternetCard { } class HTTPRequest extends AbstractValue with Closable { - def this(owner: InternetCard, url: URL, post: Option[String], headers: Map[String, String]) { + def this(owner: InternetCard, url: URL, post: Option[String], headers: Map[String, String], method: Option[String]) { this() this.owner = Some(owner) - this.stream = threadPool.submit(new RequestSender(url, post, headers)) + this.stream = threadPool.submit(new RequestSender(url, post, headers, method)) } private var owner: Option[InternetCard] = None @@ -465,27 +466,23 @@ object InternetCard { } // This one doesn't (see comment in TCP socket), but I like to keep it consistent. - private class RequestSender(val url: URL, val post: Option[String], val headers: Map[String, String]) extends Callable[InputStream] { + private class RequestSender(val url: URL, val post: Option[String], val headers: Map[String, String], val method: Option[String]) extends Callable[InputStream] { override def call() = try { checkLists(InetAddress.getByName(url.getHost), url.getHost) val proxy = Option(MinecraftServer.getServer.getServerProxy).getOrElse(java.net.Proxy.NO_PROXY) url.openConnection(proxy) match { case http: HttpURLConnection => try { http.setDoInput(true) + http.setDoOutput(post.isDefined) + http.setRequestMethod(if (method.isDefined) method.get else if (post.isDefined) "POST" else "GET") headers.foreach(Function.tupled(http.setRequestProperty)) if (post.isDefined) { - http.setRequestMethod("POST") - http.setDoOutput(true) http.setReadTimeout(Settings.get.httpTimeout) val out = new BufferedWriter(new OutputStreamWriter(http.getOutputStream)) out.write(post.get) out.close() } - else { - http.setRequestMethod("GET") - http.setDoOutput(false) - } val input = http.getInputStream HTTPRequest.this.synchronized { From e0174b973f0e07f182e6bb3c0c6d407761f2bd0c Mon Sep 17 00:00:00 2001 From: Amanda Cameron Date: Sun, 23 Dec 2018 18:00:51 -0500 Subject: [PATCH 4/4] Make it possible to insert an Analyzer inside a tablet. This makes it so that the tablet can accept the Analyzer, which makes it possible to "scan" the component type, and address of the component, making the data available as a table in the `tablet_use` event, under `analyzed`. --- .../scala/li/cil/oc/common/init/Items.scala | 1 + .../DriverUpgradeBarcodeReader.scala | 27 +++++++ .../opencomputers/ModOpenComputers.scala | 5 ++ .../component/UpgradeBarcodeReader.scala | 77 +++++++++++++++++++ 4 files changed, 110 insertions(+) create mode 100644 src/main/scala/li/cil/oc/integration/opencomputers/DriverUpgradeBarcodeReader.scala create mode 100644 src/main/scala/li/cil/oc/server/component/UpgradeBarcodeReader.scala diff --git a/src/main/scala/li/cil/oc/common/init/Items.scala b/src/main/scala/li/cil/oc/common/init/Items.scala index abd0aa29c..4960b8bf6 100644 --- a/src/main/scala/li/cil/oc/common/init/Items.scala +++ b/src/main/scala/li/cil/oc/common/init/Items.scala @@ -284,6 +284,7 @@ object Items extends ItemAPI { Option(safeGetStack(Constants.ItemName.PistonUpgrade)), Option(safeGetStack(Constants.BlockName.Geolyzer)), Option(safeGetStack(Constants.ItemName.NavigationUpgrade)), + Option(safeGetStack(Constants.ItemName.Analyzer)), Option(safeGetStack(Constants.ItemName.GraphicsCardTier2)), Option(safeGetStack(Constants.ItemName.RedstoneCardTier2)), diff --git a/src/main/scala/li/cil/oc/integration/opencomputers/DriverUpgradeBarcodeReader.scala b/src/main/scala/li/cil/oc/integration/opencomputers/DriverUpgradeBarcodeReader.scala new file mode 100644 index 000000000..3419caf70 --- /dev/null +++ b/src/main/scala/li/cil/oc/integration/opencomputers/DriverUpgradeBarcodeReader.scala @@ -0,0 +1,27 @@ +package li.cil.oc.integration.opencomputers + +import li.cil.oc.Constants +import li.cil.oc.api.driver.EnvironmentProvider +import li.cil.oc.api +import li.cil.oc.api.driver.item.{HostAware, Slot} +import li.cil.oc.api.network.{EnvironmentHost, ManagedEnvironment} +import li.cil.oc.server.component +import li.cil.oc.server.component.UpgradeBarcodeReader +import net.minecraft.item.ItemStack + +object DriverUpgradeBarcodeReader extends Item with HostAware { + override def worksWith(stack: ItemStack) = isOneOf(stack, + api.Items.get(Constants.ItemName.Analyzer)) + + override def createEnvironment(stack: ItemStack, host: EnvironmentHost): ManagedEnvironment = + new UpgradeBarcodeReader(host) + + override def slot(stack: ItemStack) = Slot.Upgrade + + object Provider extends EnvironmentProvider { + override def getEnvironment(stack: ItemStack): Class[_] = + if (worksWith(stack)) + classOf[component.UpgradeBarcodeReader] + else null + } +} diff --git a/src/main/scala/li/cil/oc/integration/opencomputers/ModOpenComputers.scala b/src/main/scala/li/cil/oc/integration/opencomputers/ModOpenComputers.scala index cfce85a78..a0a27e823 100644 --- a/src/main/scala/li/cil/oc/integration/opencomputers/ModOpenComputers.scala +++ b/src/main/scala/li/cil/oc/integration/opencomputers/ModOpenComputers.scala @@ -151,6 +151,7 @@ object ModOpenComputers extends ModProxy { api.Driver.add(DriverTerminalServer) api.Driver.add(DriverUpgradeAngel) + api.Driver.add(DriverUpgradeBarcodeReader) api.Driver.add(DriverUpgradeBattery) api.Driver.add(DriverUpgradeChunkloader) api.Driver.add(DriverUpgradeCrafting) @@ -212,6 +213,7 @@ object ModOpenComputers extends ModProxy { Constants.BlockName.ScreenTier1, Constants.BlockName.Transposer, Constants.BlockName.CarpetedCapacitor, + Constants.ItemName.Analyzer, Constants.ItemName.AngelUpgrade, Constants.ItemName.BatteryUpgradeTier1, Constants.ItemName.BatteryUpgradeTier2, @@ -235,6 +237,7 @@ object ModOpenComputers extends ModProxy { Constants.BlockName.ScreenTier1, Constants.BlockName.Transposer, Constants.BlockName.CarpetedCapacitor, + Constants.ItemName.Analyzer, Constants.ItemName.APUTier1, Constants.ItemName.APUTier2, Constants.ItemName.GraphicsCardTier1, @@ -250,6 +253,7 @@ object ModOpenComputers extends ModProxy { Constants.BlockName.Keyboard, Constants.BlockName.ScreenTier1, Constants.BlockName.CarpetedCapacitor, + Constants.ItemName.Analyzer, Constants.ItemName.APUTier1, Constants.ItemName.APUTier2, Constants.ItemName.GraphicsCardTier1, @@ -275,6 +279,7 @@ object ModOpenComputers extends ModProxy { blacklistHost(classOf[internal.Robot], Constants.BlockName.Transposer, Constants.BlockName.CarpetedCapacitor, + Constants.ItemName.Analyzer, Constants.ItemName.LeashUpgrade) blacklistHost(classOf[internal.Tablet], Constants.BlockName.ScreenTier1, diff --git a/src/main/scala/li/cil/oc/server/component/UpgradeBarcodeReader.scala b/src/main/scala/li/cil/oc/server/component/UpgradeBarcodeReader.scala new file mode 100644 index 000000000..07070ea32 --- /dev/null +++ b/src/main/scala/li/cil/oc/server/component/UpgradeBarcodeReader.scala @@ -0,0 +1,77 @@ +package li.cil.oc.server.component + +import java.util + +import li.cil.oc.{Constants, OpenComputers, api} +import li.cil.oc.api.driver.DeviceInfo +import li.cil.oc.api.driver.DeviceInfo.DeviceAttribute +import li.cil.oc.api.driver.DeviceInfo.DeviceClass +import li.cil.oc.api.internal +import li.cil.oc.api.network._ +import li.cil.oc.api.prefab +import li.cil.oc.util.BlockPosition +import li.cil.oc.util.ExtendedWorld._ +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.item.ItemStack +import net.minecraft.nbt.NBTTagCompound +import net.minecraft.nbt.NBTTagList +import net.minecraft.util.EnumFacing +import net.minecraft.world.WorldServer +import net.minecraftforge.common.util.ForgeDirection + +import scala.collection.convert.WrapAsJava._ + +class UpgradeBarcodeReader(val host: EnvironmentHost) extends prefab.ManagedEnvironment with DeviceInfo { + override val node = api.Network.newNode(this, Visibility.Network). + withComponent("barcode_reader"). + withConnector(). + create() + + private final lazy val deviceInfo = Map( + DeviceAttribute.Class -> DeviceClass.Generic, + DeviceAttribute.Description -> "Barcode reader upgrade", + DeviceAttribute.Vendor -> Constants.DeviceInfo.DefaultVendor, + DeviceAttribute.Product -> "Readerizer Deluxe" + ) + + override def getDeviceInfo: util.Map[String, String] = deviceInfo + + override def onMessage(message: Message): Unit = { + super.onMessage(message) + if (message.name == "tablet.use") message.source.host match { + case machine: api.machine.Machine => (machine.host, message.data) match { + case (tablet: internal.Tablet, Array(nbt: NBTTagCompound, stack: ItemStack, player: EntityPlayer, blockPos: BlockPosition, side: ForgeDirection, hitX: java.lang.Float, hitY: java.lang.Float, hitZ: java.lang.Float)) => + host.world.getTileEntity(blockPos) match { + case analyzable: Analyzable => + processNodes(analyzable.onAnalyze(player, side.ordinal(), hitX.toFloat, hitY.toFloat, hitZ.toFloat), nbt) + case host: SidedEnvironment => + processNodes(Array(host.sidedNode(side)), nbt) + case host: Environment => + processNodes(Array(host.node), nbt) + } + } + } + } + + private def processNodes(nodes: Array[Node], nbt: NBTTagCompound): Unit = if (nodes != null) { + val readerNBT = new NBTTagList() + + for (node <- nodes if node != null) { + val nodeNBT = new NBTTagCompound() + node match { + case component: Component => + nodeNBT.setString("type", component.name) + case _ => + } + + val address = node.address() + if (address != null && !address.isEmpty) { + nodeNBT.setString("address", node.address()) + } + + readerNBT.appendTag(nodeNBT) + } + + nbt.setTag("analyzed", readerNBT) + } +}