一个极简COMMAND的演示代码
PyMUD讨论区
5
帖子
3
发布者
222
浏览
-
from pymud import Session, Command, exception, IConfig, Trigger class cha_rbz(Command, IConfig): def __init__(self, session, *args, **kwargs): kwargs.setdefault("id", "cmd_id") kwargs.setdefault("group", "cmd") super().__init__(session, r"^id( here)?$", *args, **kwargs) self._items = [] options = {"enabled": False, "group": "cmd.id", "keepEval": True} self._tris = { "id_here" : Trigger(self.session, r"^[> ]*你身上携带物品的别称如下|^[> ]*在这个房间中, 生物及物品的\(英文\)名称如下.*", onSuccess = self.id_here, **options), "id_item" : Trigger(self.session, r"^[> ]*([\u4e00-\u9fa5 ]+)\s+ = (.+)$", onSuccess = self.id_item, **options), "stop" : Trigger(self.session, r"^[> ]*系统回馈:id_is_over = 1", onSuccess = self.stop, **options), } #[╰└]+ [╯┘]+ @exception async def execute(self, cmd, *args, **kwargs): self.reset() self._items = [] #指定的触发器使能,也可以是GROUP使能 self._tris["id_here"].enabled = True self._tris["stop"].enabled = True self.session.writeline(f"{cmd}") #此处插入一个等待,仅为演示脚本的等待,实际使用中无需等待 await asyncio.sleep(1) self.session.writeline(f"response id_is_over 1") #等待触发被触发,可以使用任何可等待的对象 await self._tris["stop"].triggered() #command的返回值 return self._items def id_here(self, name, line, wildcards): #没有在CMD开始就使能整组触发器,防止因为网络卡顿的原因造成误触发 self._tris["id_item"].enabled = True def id_item(self, name, line, wildcards): data = list(wildcards) data[0] = data[0].strip() data[1] = data[1].split(", ") if not data[0] == self.session.vars.Status["name"]: #避免捕获自己的信息,Status为自定义字典 self._items.append(data) def __unload__(self): self.session.delObjects(self._tris) super().__unload__() def reset(self): super().reset() self.session.enableGroup("cmd.id", False, False, [Trigger]) def start(self, name, line, wildcards): self.session.enableGroup("cmd.id", True, False, [Trigger]) def stop(self, name=None, line=None, wildcards=None): #cmd流程结束,关闭触发组 self.session.enableGroup("cmd.id", False, False, [Trigger]) -
不得不说,提前定义options这种方式很优雅,让我领教了。
另外在execute方法前的装饰器@exception的作用是什么?是可以省略try-exception的情况下自动抛出异常么?options = {"enabled": False, "group": "cmd.id", "keepEval": True} self._tris = { "id_here" : Trigger(self.session, r"^[> ]*你身上携带物品的别称如下|^[> ]*在这个房间中, 生物及物品的\(英文\)名称如下.*", onSuccess = self.id_here, **options), "id_item" : Trigger(self.session, r"^[> ]*([\u4e00-\u9fa5 ]+)\s+ = (.+)$", onSuccess = self.id_item, **options), "stop" : Trigger(self.session, r"^[> ]*系统回馈:id_is_over = 1", onSuccess = self.stop, **options), }
