Added option to enable 'fuzzy' wake on LAN (ignoring additional arguments instead of requiring an exact match). Closes #1368.

This commit is contained in:
Florian Nücke 2015-08-29 12:07:45 +02:00
parent fb816b9da7
commit 362b62341b

View File

@ -24,6 +24,8 @@ class NetworkCard(val host: EnvironmentHost) extends prefab.ManagedEnvironment {
protected var wakeMessage: Option[String] = None protected var wakeMessage: Option[String] = None
protected var wakeMessageFuzzy = false
// ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- //
@Callback(doc = """function(port:number):boolean -- Opens the specified port. Returns true if the port was opened.""") @Callback(doc = """function(port:number):boolean -- Opens the specified port. Returns true if the port was opened.""")
@ -39,7 +41,7 @@ class NetworkCard(val host: EnvironmentHost) extends prefab.ManagedEnvironment {
@Callback(doc = """function([port:number]):boolean -- Closes the specified port (default: all ports). Returns true if ports were closed.""") @Callback(doc = """function([port:number]):boolean -- Closes the specified port (default: all ports). Returns true if ports were closed.""")
def close(context: Context, args: Arguments): Array[AnyRef] = { def close(context: Context, args: Arguments): Array[AnyRef] = {
if (args.count == 0) { if (args.count == 0) {
val closed = openPorts.size > 0 val closed = openPorts.nonEmpty
openPorts.clear() openPorts.clear()
result(closed) result(closed)
} }
@ -78,17 +80,21 @@ class NetworkCard(val host: EnvironmentHost) extends prefab.ManagedEnvironment {
@Callback(direct = true, doc = """function():number -- Gets the maximum packet size (config setting).""") @Callback(direct = true, doc = """function():number -- Gets the maximum packet size (config setting).""")
def maxPacketSize(context: Context, args: Arguments): Array[AnyRef] = result(Settings.get.maxNetworkPacketSize) def maxPacketSize(context: Context, args: Arguments): Array[AnyRef] = result(Settings.get.maxNetworkPacketSize)
@Callback(direct = true, doc = """function():string -- Get the current wake-up message.""") @Callback(direct = true, doc = """function():string, boolean -- Get the current wake-up message.""")
def getWakeMessage(context: Context, args: Arguments): Array[AnyRef] = result(wakeMessage.orNull) def getWakeMessage(context: Context, args: Arguments): Array[AnyRef] = result(wakeMessage.orNull, wakeMessageFuzzy)
@Callback(doc = """function(message:string):string -- Set the wake-up message.""") @Callback(doc = """function(message:string[, fuzzy:boolean]):string -- Set the wake-up message and whether to ignore additional data/parameters.""")
def setWakeMessage(context: Context, args: Arguments): Array[AnyRef] = { def setWakeMessage(context: Context, args: Arguments): Array[AnyRef] = {
val oldMessage = wakeMessage val oldMessage = wakeMessage
val oldFuzzy = wakeMessageFuzzy
if (args.optAny(0, null) == null) if (args.optAny(0, null) == null)
wakeMessage = None wakeMessage = None
else else
wakeMessage = Option(args.checkString(0)) wakeMessage = Option(args.checkString(0))
result(oldMessage.orNull) wakeMessageFuzzy = args.optBoolean(1, wakeMessageFuzzy)
result(oldMessage.orNull, oldFuzzy)
} }
protected def doSend(packet: Packet) { protected def doSend(packet: Packet) {
@ -136,6 +142,10 @@ class NetworkCard(val host: EnvironmentHost) extends prefab.ManagedEnvironment {
node.sendToNeighbors("computer.start") node.sendToNeighbors("computer.start")
case Array(message: String) if wakeMessage.contains(message) => case Array(message: String) if wakeMessage.contains(message) =>
node.sendToNeighbors("computer.start") node.sendToNeighbors("computer.start")
case Array(message: Array[Byte], _*) if wakeMessageFuzzy && wakeMessage.contains(new String(message, Charsets.UTF_8)) =>
node.sendToNeighbors("computer.start")
case Array(message: String, _*) if wakeMessageFuzzy && wakeMessage.contains(message) =>
node.sendToNeighbors("computer.start")
case _ => case _ =>
} }
} }
@ -151,6 +161,7 @@ class NetworkCard(val host: EnvironmentHost) extends prefab.ManagedEnvironment {
if (nbt.hasKey("wakeMessage")) { if (nbt.hasKey("wakeMessage")) {
wakeMessage = Option(nbt.getString("wakeMessage")) wakeMessage = Option(nbt.getString("wakeMessage"))
} }
wakeMessageFuzzy = nbt.getBoolean("wakeMessageFuzzy")
} }
override def save(nbt: NBTTagCompound) { override def save(nbt: NBTTagCompound) {
@ -158,6 +169,7 @@ class NetworkCard(val host: EnvironmentHost) extends prefab.ManagedEnvironment {
nbt.setIntArray("openPorts", openPorts.toArray) nbt.setIntArray("openPorts", openPorts.toArray)
wakeMessage.foreach(nbt.setString("wakeMessage", _)) wakeMessage.foreach(nbt.setString("wakeMessage", _))
nbt.setBoolean("wakeMessageFuzzy", wakeMessageFuzzy)
} }
// ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- //