与pokemon决战交互的可扩展客户端

showdownp的Python项目详细描述


简介

python 3.4和3.5的Pokemon Showdown!客户端。这是为了使编写机器人程序、与用户交互、适度的聊天室和收集数据变得更容易。

设置

使用pip3 install --user showdownpy安装包。如果尚未安装包的websocketsaiohttp依赖项,则也将安装它们。

示例

示例已在./examples directory中提供。确保在./examples/data/目录中创建自己版本的login.txtowner.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_connecton_loginon_room_initon_room_deiniton_query_responseon_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的重播服务器。

贡献

这套方案仍在进行中,任何贡献都将是伟大的!我目前正在优先考虑文档而不是新特性,但如果你有什么想法,请告诉我。请随意与客户分享您所做的任何事情,如果它足够简洁,我可以将其添加到示例池中。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java数据未插入SQLite数据库   Java中内存有效的对象创建   java在方法内部使用“this”(不用于调用方法、构造函数或变量)   java为什么这里会出现NullPointerException?   在REST中使用HATEOAS导致的java循环依赖   java如何定制spring boot横幅?   Java数字基数计算器(即基数10到基数5)   如果在Kotlin vs Java中声明,用作全局上下文的安卓 MainApplication类将崩溃   用于过滤对象的Java lambda函数   java从字符串数组中获取整数列表   java为什么Maven找不到org。json JPMS自动模块?   java将字符串数组转换为int   仅当与阈值字节匹配时,java才会在映射中填充字符串值