Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions tooldelta/frame.py
Original file line number Diff line number Diff line change
Expand Up @@ -421,6 +421,36 @@ def sendwocmd(self, cmd: str) -> None:
"""
self.launcher.sendwocmd(cmd)

def sendaicmd(
self, cmd: str, waitForResp: bool = False, timeout: float = 30
) -> Packet_CommandOutput | None:
"""
发送 魔法指令。

Args:
cmd (str): Minecraft 命令
waitForResp (bool, optional): 是否等待返回。默认为 False
timeout (float, optional): 超时时间, 超时则引发 TimeoutError
"""
my_runtimeid = self.players.getBotInfo().runtime_id
return self.launcher.sendaicmd(cmd, my_runtimeid, waitForResp, timeout)

def sendaicmd_with_resp(
self, cmd: str, timeout: float = 30
) -> Packet_CommandOutput:
"""
发送 魔法指令 并获取返回。

Args:
cmd (str): Minecraft 命令
timeout (float, optional): 超时时间, 超时则引发 TimeoutError

Returns:
Packet_CommandOutput: 指令返回类
"""
resp: Packet_CommandOutput = self.sendaicmd(cmd, True, timeout) # type: ignore
return resp

def say_to(self, target: str, text: str) -> None:
"""向玩家发送消息

Expand Down
14 changes: 14 additions & 0 deletions tooldelta/internal/launch_cli/eulogist_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,20 @@ def sendwscmd(
def sendwocmd(self, cmd: str) -> None:
self.eulogist.sendwocmd(cmd)

def sendaicmd(
self,
cmd: str,
my_runtimeid: int | None,
waitForResp: bool = False,
timeout: float = 30,
) -> Packet_CommandOutput | None:
if not waitForResp:
self.eulogist.sendaicmd(cmd, my_runtimeid)
else:
self.eulogist.sendaicmd(cmd, my_runtimeid)
fmts.print_err("赞颂者 未实现 SendAiCmdWithResp 方法")
...

def sendPacket(self, pckID: int, pk: dict | BaseBytesPacket) -> None:
"""发送数据包

Expand Down
25 changes: 25 additions & 0 deletions tooldelta/internal/launch_cli/eulogist_libs/core_conn.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
from ....utils import fmts
from ....mc_bytes_packet.base_bytes_packet import BaseBytesPacket
from ....mc_bytes_packet.pool import BYTES_PACKET_ID_POOL
from ....mc_bytes_packet.py_rpc import PYRPC_OP_SEND


class MessageType(str, enum.Enum):
Expand Down Expand Up @@ -257,6 +258,30 @@ def sendwocmd(self, cmd: str):
{"CommandLine": cmd, "SuppressOutput": False},
)

def sendaicmd(self, cmd: str, my_runtimeid: int | None):
u = uuid.uuid4()
self.sendPacket(
constants.PacketIDS.PyRpc,
{
"Value": [
"ModEventC2S",
[
"Minecraft",
"aiCommand",
"ExecuteCommandEvent",
{
"playerId": str(my_runtimeid),
"cmd": cmd,
"uuid": str(u),
},
],
None,
],
"OperationType": PYRPC_OP_SEND,
},
)
return u

@utils.thread_func("赞颂者消息处理", utils.ToolDeltaThread.SYSTEM)
def handler(self, msg: Message) -> None:
try:
Expand Down
34 changes: 26 additions & 8 deletions tooldelta/internal/launch_cli/fateark_access_point.py
Original file line number Diff line number Diff line change
Expand Up @@ -220,9 +220,8 @@ def sendcmd(
if res is None:
raise TimeoutError("指令超时", ud)
return Packet_CommandOutput(res)
else:
fateark_core.sendcmd_and_get_uuid(cmd)
return None
fateark_core.sendcmd_and_get_uuid(cmd)
return None

def sendwscmd(
self, cmd: str, waitForResp: bool = False, timeout: float = 30
Expand All @@ -236,14 +235,32 @@ def sendwscmd(
if res is None:
raise TimeoutError("指令超时", ud)
return Packet_CommandOutput(res)
else:
fateark_core.sendwscmd_and_get_uuid(cmd)
return None
fateark_core.sendwscmd_and_get_uuid(cmd)
return None

def sendwocmd(self, cmd: str):
self.check_avaliable()
fateark_core.sendwocmd(cmd)

def sendaicmd(
self,
cmd: str,
my_runtimeid: int | None,
waitForResp: bool = False,
timeout: float = 30,
) -> Packet_CommandOutput | None:
self.check_avaliable()
if waitForResp:
ud = fateark_core.sendaicmd_and_get_uuid(cmd, my_runtimeid)
getter, setter = utils.create_result_cb(dict)
self.command_output_cbs[ud] = setter
res = getter(timeout)
if res is None:
raise TimeoutError("指令超时", ud)
return Packet_CommandOutput(res)
fateark_core.sendaicmd_and_get_uuid(cmd, my_runtimeid)
return None

def sendPacket(
self, pkID: int, pk: dict | base_bytes_packet.BaseBytesPacket
) -> None:
Expand All @@ -254,9 +271,10 @@ def sendPacket(
pk (str | BaseBytesPacket): 数据包内容

"""
if type(pk) is not dict:
if isinstance(pk, dict):
fateark_core.sendPacket(pkID, pk)
elif isinstance(pk, base_bytes_packet.BaseBytesPacket):
raise Exception("sendPacket: Bytes packet is not supported")
fateark_core.sendPacket(pkID, pk)

def get_players_info(self):
uuids = fateark_core.get_online_player_uuids()
Expand Down
25 changes: 25 additions & 0 deletions tooldelta/internal/launch_cli/fateark_libs/core_conn.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from .... import constants
from ....internal.types import UnreadyPlayer, Abilities
from ....mc_bytes_packet.pool import is_bytes_packet
from ....mc_bytes_packet.py_rpc import PYRPC_OP_SEND

utils_pb2 = importlib.import_module(".proto.utils_pb2", package=__package__)
reversaler_pb2 = importlib.import_module(".proto.reversaler_pb2", package=__package__)
Expand Down Expand Up @@ -193,6 +194,30 @@ def sendwocmd(cmd: str):
{"CommandLine": cmd, "SuppressOutput": False},
)

def sendaicmd_and_get_uuid(cmd: str, my_runtimeid: int | None):
ud = str(uuid.uuid4())
sendPacket(
constants.PacketIDS.PyRpc,
{
"Value": [
"ModEventC2S",
[
"Minecraft",
"aiCommand",
"ExecuteCommandEvent",
{
"playerId": str(my_runtimeid),
"cmd": cmd,
"uuid": ud,
},
],
None,
],
"OperationType": PYRPC_OP_SEND,
},
)
return ud


def get_online_player_uuids() -> list[str]:
return json.loads(
Expand Down
34 changes: 34 additions & 0 deletions tooldelta/internal/launch_cli/neomega_access_point.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@
import subprocess
import threading
import time
import uuid

from ...mc_bytes_packet.pool import bytes_packet_by_id
from ... import utils
from ...constants import SysStatus, PacketIDS, TOOLDELTA_BIN_PATH
from ...internal.types import Packet_CommandOutput
from ...mc_bytes_packet.base_bytes_packet import BaseBytesPacket
from ...mc_bytes_packet.py_rpc import PYRPC_OP_SEND
from ...utils import fmts, urlmethod
from ..types import UnreadyPlayer, Abilities
from .standard_launcher import StandardFrame
Expand Down Expand Up @@ -239,6 +241,7 @@ def kill_proc(self):

def get_neomega_library(self):
from .neo_libs.neo_conn import LIB as _Library

return _Library

def get_players_info(self):
Expand Down Expand Up @@ -342,6 +345,36 @@ def sendwocmd(self, cmd: str) -> None:
self.check_avaliable()
self.omega.send_settings_command(cmd)

def sendaicmd(
self,
cmd: str,
my_runtimeid: int | None,
waitForResp: bool = False,
timeout: float = 30,
) -> Packet_CommandOutput | None:
self.check_avaliable()
if waitForResp:
fmts.print_err("NeOmega接入点 未实现 SendAiCmdWithResp 方法")
pk = {
"Value": [
"ModEventC2S",
[
"Minecraft",
"aiCommand",
"ExecuteCommandEvent",
{
"playerId": str(my_runtimeid),
"cmd": cmd,
"uuid": str(uuid.uuid4()),
},
],
None,
],
"OperationType": PYRPC_OP_SEND,
}
self.omega.send_packet(PacketIDS.PyRpc, pk)
return None

def sendPacket(self, pkID: int, pk: dict | bytes | BaseBytesPacket) -> None:
"""发送数据包

Expand All @@ -351,6 +384,7 @@ def sendPacket(self, pkID: int, pk: dict | bytes | BaseBytesPacket) -> None:
"""
self.check_avaliable()
self.omega.send_packet(pkID, pk)

def blobHashHolder(self) -> BlobHashHolder:
"""blobHashHolder 返回当前结点的 Blob hash cache 缓存数据集的持有人

Expand Down
14 changes: 14 additions & 0 deletions tooldelta/internal/launch_cli/tangame_access_point.py
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,20 @@ def sendwscmd(
def sendwocmd(self, cmd: str) -> None:
self.conn.sendwocmd(cmd)

def sendaicmd(
self,
cmd: str,
my_runtimeid: int | None,
waitForResp: bool = False,
timeout: float = 30,
) -> Packet_CommandOutput | None:
if not waitForResp:
self.conn.sendaicmd(cmd, my_runtimeid)
else:
self.conn.sendaicmd(cmd, my_runtimeid)
fmts.print_err("TanGame接入点 未实现 SendAiCmdWithResp 方法")
...

def sendPacket(self, pckID: int, pk: dict | BaseBytesPacket) -> None:
"""发送数据包

Expand Down
25 changes: 25 additions & 0 deletions tooldelta/internal/launch_cli/tangame_libs/core_conn.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
from ....utils import fmts
from ....mc_bytes_packet.base_bytes_packet import BaseBytesPacket
from ....mc_bytes_packet.pool import BYTES_PACKET_ID_POOL
from ....mc_bytes_packet.py_rpc import PYRPC_OP_SEND


class MessageType(str, enum.Enum):
Expand Down Expand Up @@ -216,6 +217,30 @@ def sendwocmd(self, cmd: str):
{"CommandLine": cmd, "SuppressOutput": False},
)

def sendaicmd(self, cmd: str, my_runtimeid: int | None):
u = uuid.uuid4()
self.sendPacket(
constants.PacketIDS.PyRpc,
{
"Value": [
"ModEventC2S",
[
"Minecraft",
"aiCommand",
"ExecuteCommandEvent",
{
"playerId": str(my_runtimeid),
"cmd": cmd,
"uuid": str(u),
},
],
None,
],
"OperationType": PYRPC_OP_SEND,
},
)
return u

@utils.thread_func("TanGame消息处理", utils.ToolDeltaThread.SYSTEM)
def handler(self, msg: Message) -> None:
try:
Expand Down
Loading