跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
  • 世界
  • 用户
  • 群组
皮肤
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(Cerulean)
  • 不使用皮肤
折叠
品牌标识

PyMUD官方论坛

  1. 主页
  2. 版块
  3. PyMUD讨论区
  4. 一个极简COMMAND的演示代码

一个极简COMMAND的演示代码

已定时 已固定 已锁定 已移动 PyMUD讨论区
5 帖子 3 发布者 222 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • H 离线
    H 离线
    hhyzz
    写于 最后由 编辑
    #1
    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])
    
    1 条回复 最后回复
    1
    • T 离线
      T 离线
      terry
      写于 最后由 编辑
      #2

      肉哥,你没import asyncio
      😊

      1 条回复 最后回复
      0
      • T 离线
        T 离线
        terry
        写于 最后由 编辑
        #3

        不得不说,提前定义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),
                }
        
        1 条回复 最后回复
        0
        • S 离线
          S 离线
          shanghua
          写于 最后由 编辑
          #4

          command功能,我理解的是,批量处理触发,等待一个结果执行完之后,再执行另1个结果,还有别的我没理解到的作用吗?

          1 条回复 最后回复
          0
          • T 离线
            T 离线
            terry
            写于 最后由 编辑
            #5

            command还可以返回值,所以可以把一个大任务分解成若干具有返回值的command,根据返回值判断下一步操作

            1 条回复 最后回复
            0
            回复
            • 在新帖中回复
            登录后回复
            • 从旧到新
            • 从新到旧
            • 最多赞同


            • 登录

            • 没有帐号? 注册

            • 登录或注册以进行搜索。
            Powered by NodeBB Contributors
            • 第一个帖子
              最后一个帖子
            0
            • 版块
            • 最新
            • 标签
            • 热门
            • 世界
            • 用户
            • 群组