与pokemon决战交互的可扩展客户端
showdownp的Python项目详细描述
简介
python 3.4和3.5的Pokemon Showdown!客户端。这是为了使编写机器人程序、与用户交互、适度的聊天室和收集数据变得更容易。
设置
使用pip3 install --user showdownpy
安装包。如果尚未安装包的websockets
和aiohttp
依赖项,则也将安装它们。
示例
示例已在./examples directory
中提供。确保在./examples/data/
目录中创建自己版本的login.txt
和owner.txt
文件。已经提供了这些文件的模板。
客户端本身并没有做太多的工作,而是打算进行扩展和修改。这可以通过遗留在基类中的各种“钩子”协程来完成。下面的程序使用on_private_message
钩子回显它接收到的任何pms的内容。
"""An example client that echoes back any message that is private messaged to it"""importshowdownwithopen('./examples/data/login.txt','rt')asf:username,password=f.read().strip().splitlines()classEchoClient(showdown.Client):asyncdefon_private_message(self,pm):ifpm.recipient==self:awaitpm.reply(pm.content)EchoClient(name=username,password=password).start()
其他钩子包括on_connect
、on_login
、on_room_init
、on_room_deinit
、on_query_response
和on_chat_message
。
这些钩子决不是包罗万象的(showdown在其协议中有40多种不同类型的消息用于与客户机交互),因此还存在一个catch all钩子on_receive
。每个钩子在事件循环中都有自己的任务,因此您不必担心任何任务相互阻塞。
机器人还可以用来收集战斗数据。以下机器人以“ou”格式匿名加入正在进行的匹配,并在用户完成后保存这些匹配的重播。
"""An example client that joins all OU battlesand saves replays."""importshowdownwithopen('./examples/data/login.txt','rt')asf:username,password=f.read().strip().splitlines()classReplayClient(showdown.Client):asyncdefon_query_response(self,response_type,data):ifresponse_type=='roomlist':forbattle_idinset(data['rooms'])-set(self.rooms):awaitself.join(battle_id)asyncdefon_receive(self,room_id,inp_type,params):ifinp_type=='win':withopen('./data/'+room_id,'wt')asf:f.write('\n'.join(self.rooms[room_id].logs))@showdown.Client.on_interval(interval=3)asyncdefcheck_ou(self):awaitself.query_battles(tier='gen7ou',lifespan=3)ReplayClient(name=username,password=password).start(autologin=False)
建议您保存这些匹配项的本地副本,而不是上载它们,以免超过Showdown的重播服务器。
贡献
这套方案仍在进行中,任何贡献都将是伟大的!我目前正在优先考虑文档而不是新特性,但如果你有什么想法,请告诉我。请随意与客户分享您所做的任何事情,如果它足够简洁,我可以将其添加到示例池中。