关于commands的问题,如何在异步执行的await中添加其他条件?
PyMUD讨论区
5
帖子
2
发布者
112
浏览
-
我写了一个skills命令,意图查看自身或者师父的技能。
现在是第一步,先实现自身的技能查询,并保存到变量中。你目前所掌握的技能:(十四项) ┏━ 普通知识 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ 读书识字 (literate) - 学贯古今 192/ 22225 ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━ 基本技能 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ 基本弓箭 (archery) - 初窥堂奥 171/ 2729 ┃ ┃ 基本轻功 (dodge) - 凌空渡虚 502/ 49830 ┃ ┃ 内功心法 (force) - 深不可测 503/ 239011 ┃ ┃ 拆招卸力之法 (parry) - 一代宗师 502/ 41364 ┃ ┃ 法术 (spells) - 变换莫测 503/ 8800 ┃ ┃ 基本剑术 (sword) - 一代宗师 502/ 8384 ┃ ┃ 扑击格斗之技 (unarmed) - 一代宗师 502/ 4228 ┃ ┠─ 特殊技能 ────────────────────────────┨ ┃□百花掌 (baihua-zhang) - 一代宗师 502/ 32618 ┃ ┃□枯骨刀 (kugu-blade) - 一代宗师 502/ 21322 ┃ ┃□冷月凝香舞 (moondance) - 一代宗师 502/ 43960 ┃ ┃□圆月心法 (moonforce) - 一代宗师 503/ 7155 ┃ ┃□月宫仙法 (moonshentong) - 一代宗师 502/ 351011 ┃ ┃□风回雪舞剑法 (snowsword) - 一代宗师 502/ 29453 ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛这是输入skills命令后的显示结果,我想通过'┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛'来触发命令结束,但这个在整个技能中出现了不止一次,所以我想结合技能的数量判断是否已经结束,即技能的获取数量和掌握技能的总数(十四项),可以判断技能查询结束了,如何把这个条件也加到异步判断中呢?
下面是我暂时写的代码:from pymud import Command, Trigger, IConfig, DotDict,trigger,async_exception import traceback import re, cn2an class CmdSkills(Command, IConfig): _help = """ 通过命令行查看技能的命令: 正常指令 含义 skills: 查看角色所有技能 skills xxx: 查看npc'xxx'的所有技能 """ def __init__(self, session, *args, **kwargs): pattern = r"^(?:skills|sk)\s*(.*)$" kwargs.setdefault("id", "cmd_skills") super().__init__(session, patterns = pattern, *args, **kwargs) self.session.setVariable('skills',[]) self.category = '' self.skill_count = 0 self.skill_order = 0 def __unload__(self): super().__unload__() @trigger(id = "cmd.skiills.start", patterns = r"^你目前所掌握的技能:((.*?)项)", group = "cmd.skills",enabled = False) def start(self, name, line, wildcards): self.session.info('Start to parse skill on') self.skill_count = cn2an.cn2an(wildcards[0],'normal') self.session.enableGroup(group = "cmd.skills", enabled = True, subgroup = True) @trigger(id = "cmd.skills.end", patterns = r'┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛', group = "cmd.skills",enabled = False) def end(self, name, line, wildcards): self.session.info(f'End to parse skills') self.session.enableGroup(group = "cmd.skills", enabled = False, subgroup = True) @trigger(id = "cmd.skills.item", patterns = r'^\s*┃\s*([□ ]?)\s*([^()]+)\s*\(([^)]+)\)\s*-\s*([^ ]+)\s+(\d+)/\s*(\d+)\s*┃\s*$', group = "cmd.skills",enabled = False) def item(self, name, line, wildcards): skill = {} skill['category'] = self.category skill['enabled'] = '□' in wildcards[0].strip() skill['cn_name'] = wildcards[1].strip() skill['en_name'] = wildcards[2].strip() skill['title'] = wildcards[3].strip() skill['level'] = int(wildcards[4].strip()) skill['experience'] = int(wildcards[5].strip()) self.session.getVariable('skills').append(skill) self.skill_order += 1 @trigger(id = "cmd.skills.category", patterns = r'^[┏┠][━─]\s{2}([\u4e00-\u9fa5]+)\s{2}[━─]+.*[┓┨]\s*$', group = "cmd.skills",enabled = False) def item_end(self, name, line, wildcards): self.category = wildcards[0].strip() self.session.info(f'Skill category: {self.category}') async def execute(self, cmd = "skills", *args, **kwargs): try: self.reset() self.session.tris["cmd.skiills.start"].enabled = True await self.session.waitfor(cmd, self.session.tris["cmd.skills.end"].triggered()) self.session.enableGroup(group = "cmd.skills", enabled = False, subgroup = True) return self.SUCCESS except Exception as e: self.error(f"异步执行中遇到异常, {e}, 类型为 {type(e)}") self.error(f"异常追踪为: {traceback.format_exc()}") -
有两个思路,你参考下:
1.execute方法中整组使能之后关闭cmd.skills.end触发self.session.enableGroup(group = "cmd.skills", enabled = False, subgroup = True) self.session.tris["cmd.skiills.stop"].enabled = False增加一个新的触发"┠─ 特殊技能 ────────────────────────────┨",
用这个触发来使能"cmd.skiills.stop"触发,这样就避免了被前序的字符串误触发了。2.第二个思路就比较不推荐了,只是作为一个参考也许其他地方能用的上。
你目前所掌握的技能:(十四项)此处将"十四"转阿拉伯数字,存变量"_num"
后面写一个while循环等待技能捕获到足够数量,self.session.vars.skills = [] while len(self.session.vars.skills)<_num: #实际使用中,应加入超时机制,避免因为睡觉等无法接收服务器消息的原因造成无限循环 await asyncio.sleep(0.1) self.session.enableGroup(group = "cmd.skills", enabled = False, subgroup = True) return self.SUCCESS -
谢谢各位大佬。
我在skill item的触发中计数,当计数和总技能数相等的时候开启end触发,算是绕过去了。from pymud import Command, Trigger, IConfig, DotDict,trigger,async_exception import traceback import re, cn2an class CmdSkills(Command, IConfig): _help = """ 通过命令行查看技能的命令: 正常指令 含义 skills: 查看角色所有技能 skills xxx: 查看npc'xxx'的所有技能 """ def __init__(self, session, *args, **kwargs): pattern = r"^(?:skills|sk)\s*(.*)$" kwargs.setdefault("id", "cmd_skills") super().__init__(session, patterns = pattern, *args, **kwargs) self.session.setVariable('skills',[]) self.category = '' self.skill_count = 0 def __unload__(self): super().__unload__() @trigger(id = "cmd.skills.start", patterns = r"^你目前所掌握的技能:((.*?)项)", group = "cmd.skills",enabled = False) def start(self, name, line, wildcards): self.skills = [] self.skill_order = 0 self.session.info('Start to parse skill on') self.skill_count = cn2an.cn2an(wildcards[0],'normal') self.session.enableGroup(group = "cmd.skills", enabled = True, subgroup = True) @trigger(id = "cmd.skills.end", patterns = r'┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛', group = "cmd.skills",enabled = False) def end(self, name, line, wildcards): self.session.info(f'End to parse skills') self.session.enableGroup(group = "cmd.skills", enabled = False, subgroup = True) @trigger(id = "cmd.skills.item", patterns = r'^\s*┃\s*([□ ]?)\s*([^()]+)\s*\(([^)]+)\)\s*-\s*([^ ]+)\s+(\d+)/\s*(\d+)\s*┃\s*$', group = "cmd.skills",enabled = False) def item(self, name, line, wildcards): skill = {} skill['category'] = self.category skill['enabled'] = '□' in wildcards[0].strip() skill['cn_name'] = wildcards[1].strip() skill['en_name'] = wildcards[2].strip() skill['title'] = wildcards[3].strip() skill['level'] = int(wildcards[4].strip()) skill['experience'] = int(wildcards[5].strip()) self.skills.append(skill) self.skill_order += 1 if self.skill_order == self.skill_count: self.session.tris["cmd.skills.end"].enabled = True @trigger(id = "cmd.skills.category", patterns = r'^[┏┠][━─]\s{2}([\u4e00-\u9fa5]+)\s{2}[━─]+.*[┓┨]\s*$', group = "cmd.skills",enabled = False) def category(self, name, line, wildcards): self.category = wildcards[0].strip() self.session.info(f'Skill category: {self.category}') async def execute(self, cmd = "skills", *args, **kwargs): try: self.reset() self.session.tris["cmd.skills.start"].enabled = True await self.session.waitfor(cmd, self.session.tris["cmd.skills.end"].triggered()) self.session.enableGroup(group = "cmd.skills", enabled = False, subgroup = True) self.session.setVariable('skills',self.skills) return self.SUCCESS except Exception as e: self.error(f"异步执行中遇到异常, {e}, 类型为 {type(e)}") self.error(f"异常追踪为: {traceback.format_exc()}")