2025-01-30 20:29:55 +00:00

60 lines
2.2 KiB
Scala

package ocelot.desktop.entity.traits
import ocelot.desktop.entity.traits.OcelotInterface.LogEvent
import totoro.ocelot.brain.entity.machine.{Arguments, Callback, Context}
import totoro.ocelot.brain.entity.traits.{result, Entity, Environment}
import totoro.ocelot.brain.event.{EventBus, NodeEvent}
import java.time.Instant
trait OcelotInterface extends Entity with Environment {
@Callback(direct = true, doc = """function(message: string) -- Logs a message to the card's console.""")
def log(context: Context, args: Arguments): Array[AnyRef] = {
val message = args.checkString(0)
EventBus.send(LogEvent.CardToUser(node.address, message))
result()
}
@Callback(direct = true, doc = """function() -- Clears messages logged to the card's console.""")
def clearLog(context: Context, args: Arguments): Array[AnyRef] = {
EventBus.send(LogEvent.Clear(node.address))
result()
}
@Callback(direct = true,
doc = """function(): integer -- Returns the current Unix timestamp (UTC, in milliseconds).""")
def getTimestamp(context: Context, args: Arguments): Array[AnyRef] = {
result(Instant.now().toEpochMilli)
}
@Callback(direct = true, doc = """function(): integer -- Returns a high-resolution timer value (in nanoseconds).""")
def getInstant(context: Context, args: Arguments): Array[AnyRef] = {
result(System.nanoTime())
}
@Callback(direct = true, doc = """function(): number -- Returns the remaining call budget.""")
def getRemainingCallBudget(context: Context, args: Arguments): Array[AnyRef] = {
result(context.getRemainingCallBudget)
}
@Callback(direct = true, doc = """function(): number -- Returns the maximum call budget.""")
def getMaxCallBudget(context: Context, args: Arguments): Array[AnyRef] = {
result(context.getMaxCallBudget)
}
def pushMessage(message: String): Unit = {
node.sendToReachable("computer.signal", "ocelot_message", message)
EventBus.send(LogEvent.UserToCard(node.address, message))
}
}
object OcelotInterface {
sealed trait LogEvent extends NodeEvent
object LogEvent {
case class CardToUser(address: String, message: String) extends LogEvent
case class UserToCard(address: String, message: String) extends LogEvent
case class Clear(address: String) extends LogEvent
}
}