class BattleThread(threading.Thread): def __init__(self,include,serverid,playerinfo,config): threading.Thread.__init__(self) self.stoped = False self.request = Request(include) self.serverid = serverid self.playerinfo = playerinfo self.config = config self.timehelp = TimeHelp() self.armiesId = self.request.include.legion_battle.get(self.config._defaultConfig.get("battle-legion")) def stop(self): self.request.include.logger.info(u"自动刷军团线程停止") if self.config._defaultConfig.get("battle-autoformat"): # 调整阵型为雁行阵 formatThread = FormationThread(self.request.include,self.serverid,160) formatThread.start() self.stoped = True def isStoped(self): return self.stoped def run(self): self.request.include.logger.info(u"自动刷%s军团功能启动" %(self.config._defaultConfig.get("battle-legion"))) # 调整阵型为:八卦阵 if self.config._defaultConfig.get("battle-autoformat"): formatThread = FormationThread(self.request.include,self.serverid,120) formatThread.start() while True: if self.stoped: return if self.playerinfo.forces<=10000: draughtThread = DraughtThread(self.request.include,self.serverid,self.playerinfo) draughtThread.start() if self.playerinfo.token==0: self.request.include.logger.info(u"军令数量为0") self.stop() return if self.playerinfo.tokencdflag==1: if self.playerinfo.tokencd>0: chatSendThread = ChatSendThread(self.request.include,self.serverid,u"征战CD中,剩余:%s" %(self.timehelp.getDownTime(self.playerinfo.tokencd)),u"国家") chatSendThread.start() self.request.include.logger.info(u"征战CD中,剩余 %s" %(self.timehelp.getDownTime(self.playerinfo.tokencd))) self.stop() return # 获得征战队伍信息 battleTeamInfo = self.getTeamInfo() role = None if len(battleTeamInfo.memberlist)>0: for member in battleTeamInfo.memberlist: if member.playerid == int(self.playerinfo.playerid): if member.role=="CREATER": # 解散队伍 self.dismissTeam() elif member.role=="COMMON": # 退出队伍 self.quitTeam() break # 重新获得队伍信息 battleTeamInfo = self.getTeamInfo() # 判断是否存在合适的征战队伍,返回合适的队伍 team = self.isExistsTeam(battleTeamInfo) if team: # 加入征战队伍 if not self.joinTeam(team): self.stop() return role = "COMMON" else: # 若配置文件中不可以创建征战队伍,就跳过继续等待加入队伍 if not self.config._defaultConfig.get("battle-autocreate"): while True: battleTeamInfo = self.getTeamInfo() team = self.isExistsTeam(battleTeamInfo) if team: # 加入征战队伍 if not self.joinTeam(team): self.stop() return role = "COMMON" break time.sleep(3) else: # 创建征战队伍 url = "http://s%d.as.yaowan.com/root/multiBattle!createTeam.action?%d" %(self.serverid,int(time.time()*1000)) data = {"rule":"4:0;2", "armiesId":self.armiesId} reqinfo = self.request.request(url,data,jsonFormat=False) res = zlib.decompress(reqinfo.read()) print "create:",res role = "CREATER" sendnum = 0 battlePer = {} while True: battleTeamInfo = self.getTeamInfo() # 判断加入的队伍是否已经开始 if battleTeamInfo.sceneevent: playerbattleinfo = battleTeamInfo.sceneevent.playerbattleinfo if playerbattleinfo: self.playerinfo.token = playerbattleinfo.token self.playerinfo.tokencd = playerbattleinfo.tokencd self.playerinfo.tokencdflag = playerbattleinfo.tokencdflag self.playerinfo.forces = playerbattleinfo.forces #print "剩余总军工:",playerbattleinfo.jyungong self.request.include.logger.info(u"剩余总军工:%d" %(playerbattleinfo.jyungong)) break # 判断加入的队伍是否存在 if len(battleTeamInfo.memberlist)==0: self.request.include.logger.info(u"征战队伍解散") break if role=="CREATER": for member in battleTeamInfo.memberlist: if member.playername.find("u老鬼")>=0: battlePer.setdefault("laogui",1) elif member.playername.find(u"米粥")>=0: battlePer.setdefault("mizhou",1) elif member.playername.find(u"不停")>=0: battlePer.setdefault("buting",1) elif member.playername.find(u"豆包")>=0: battlePer.setdefault("doubao",1) elif member.playername.find(u"人民")>=0: battlePer.setdefault("renming",1) elif member.playername.find(u"猪猪")>=0: battlePer.setdefault("zhuzhu",1) elif member.playername.find(u"亚特")>=0: battlePer.setdefault("yate",1) elif member.playername.find(u"来时")>=0: battlePer.setdefault("laishi",1) elif member.playername.find(u"小馬")>=0: battlePer.setdefault("xiaomage",1) elif member.playername.find(u"睡觉")>=0: battlePer.setdefault("shuijiao",1) # 自己创建的队伍需要6个成员以上才能开启 if battleTeamInfo.currentnum>=5 or (len(battlePer.items())>=2 and battleTeamInfo.currentnum>=4): # 开始征战,获得征战结果 battleInfo = self.getBattleInfo() if battleInfo.sceneevent: playerbattleinfo = battleInfo.sceneevent.playerbattleinfo if playerbattleinfo: self.playerinfo.token = playerbattleinfo.token self.playerinfo.tokencd = playerbattleinfo.tokencd self.playerinfo.tokencdflag = playerbattleinfo.tokencdflag self.playerinfo.forces = playerbattleinfo.forces print u"剩余总军工:",playerbattleinfo.jyungong break else: print u"征战队伍已开启,需要%d个成员才能开始..." %(5-battleTeamInfo.currentnum) if (5-battleTeamInfo.currentnum)<=1: if sendnum<=1: chatSendThread = ChatSendThread(self.request.include,self.serverid,u"闯王=%d" %(5-battleTeamInfo.currentnum),"国家") chatSendThread.start() sendnum = sendnum + 1 time.sleep(3) time.sleep(3) ''' # 未知 url = "http://s%d.as.yaowan.com/root/battle.action?%d " %(self.serverid,int(time.time()*1000)) reqinfo = self.request.request(url) res = zlib.decompress(reqinfo.read()) print reqinfo ''' ''' 加入征战队伍 team: 队伍信息 ''' def joinTeam(self,team): url = "http://s%d.as.yaowan.com/root/multiBattle!joinTeam.action?%d" %(self.serverid,int(time.time()*1000)) data = {"teamId":team.teamid} reqinfo = self.request.request(url,data,jsonFormat=False) res = zlib.decompress(reqinfo.read()) if res.find(u"军令还没有冷却")>=0: self.request.include.logger.warning(u"军令还没有冷却,不可以征战") return False self.request.include.logger.info(u"加入由玩家:%s 创建的征战队伍" %team.teamname) print 'join:',res return True ''' 退出队伍 ''' def quitTeam(self): self.request.include.logger.info(u"退出队伍") url = "http://s%d.as.yaowan.com/root/multiBattle!quit.action?%d" %(self.serverid,int(time.time()*1000)) reqinfo = self.request.request(url) res = zlib.decompress(reqinfo.read()) print 'quit:',res ''' 解散队伍 ''' def dismissTeam(self): self.request.include.logger.info(u"解散队伍") url = "http://s%d.as.yaowan.com/root/multiBattle!dismiss.action?%d" %(self.serverid,int(time.time()*1000)) reqinfo = self.request.request(url) res = zlib.decompress(reqinfo.read()) print 'dismiss:',res ''' 判断是否存在合适的征战队伍 ''' def isExistsTeam(self,battleTeamInfo): for team in battleTeamInfo.teamlist: if self.playerinfo.league==2: if team.condition.find(u"魏国")>=0 and (team.currentnum!=team.maxnum): return team if team.condition.find(u"吴国")>=0 and (team.currentnum!=team.maxnum): return team if team.condition.find(u"英雄")>=0 and (team.currentnum!=team.maxnum): return team return None ''' 玩家自己创建,获得征战结果 返回BattleInfo对象 ''' def getBattleInfo(self): url = "http://s%d.as.yaowan.com/root/multiBattle!battle.action?%d" %(self.serverid,int(time.time()*1000)) reqinfo = self.request.request(url) res = zlib.decompress(reqinfo.read()) if res: res = res[res.find("<?xml"):] resXML = etree.XML(res) childli = resXML.getchildren() battleInfo = BattleInfo() for child in childli: if child.tag=="state": battleInfo.state = child.text if child.tag=="message": battleInfo.message = child.text if child.tag=="sceneevent": sceneevent = SceneEvent() for cchild in child: if cchild.tag=="scene": sceneevent.scene = child.text if cchild.tag=="kfzonestate": sceneevent.kfzonestate = child.text if cchild.tag=="playerbattleinfo": print 'battle playerbattleinfo:',cchild.getchildren() forces = int(cchild.find("forces").text) if cchild.findtext("jyungong"): jyungong = int(cchild.find("jyungong").text) else: jyungong = -1 token = int(cchild.find("token").text) tokencd = int(cchild.find("tokencd").text) tokencdflag = int(cchild.find("tokencdflag").text) kfzonestate = cchild.find("kfzonestate").text playerbattleinfo = PlayerBattleInfo(forces,jyungong,token,tokencd,tokencdflag,kfzonestate) sceneevent.playerbattleinfo = playerbattleinfo battleInfo.sceneevent = sceneevent return battleInfo ''' 获得征战队伍信息 ''' def getTeamInfo(self): url = "http://s%d.as.yaowan.com/root/multiBattle!getTeamInfo.action?%d" %(self.serverid,int(time.time()*1000)) data = {"armiesId":self.armiesId} reqinfo = self.request.request(url,data,jsonFormat=False) res = zlib.decompress(reqinfo.read()) if res: res = res[res.find("<?xml"):] resXML = etree.XML(res) childli = resXML.getchildren() battleTeamInfo = BattleTeamInfo() teamlist = [] memberlist = [] for child in childli: if child.tag=="state": battleTeamInfo.state = child.text if child.tag=="maxnum": battleTeamInfo.maxnum = int(child.text) if child.tag=="currentnum": battleTeamInfo.currentnum = int(child.text) if child.tag=="armies": _id = child.find("id").text name = child.find("name").text level = child.find("level").text minplayer = child.find("minplayer").text maxplayer = child.find("maxplayer").text maxwinnum = child.find("maxwinnum").text battlenum = child.find("battlenum").text honor = child.find("honor").text itemname = child.find("itemname").text armynum = child.find("armynum").text _filter = child.find("filter").text itempic = child.find("itempic").text armies = Armies(_id,name,level,minplayer,maxplayer,maxwinnum,battlenum,honor,itemname,armynum,_filter,itempic) battleTeamInfo.armies = armies if child.tag=="team": teamid = child.find("teamid").text teamname = child.find("teamname").text maxnum = int(child.find("maxnum").text) targetname = child.find("targetname").text currentnum = int(child.find("currentnum").text) condition = child.find("condition").text team = Team(teamid,teamname,maxnum,targetname,currentnum,condition) teamlist.append(team) if child.tag=="member": playername = child.find("playername").text playerid = int(child.find("playerid").text) playerlevel = child.find("playerlevel").text role = child.find("role").text attlv = child.find("attlv").text deflv = child.find("deflv").text makemode = child.find("makemode").text maxsolidernum = child.find("maxsolidernum").text solidernum = child.find("solidernum").text member = Member(playername,playerid,playerlevel,role,attlv,deflv,makemode,maxsolidernum,solidernum) memberlist.append(member) if child.tag=="sceneevent": sceneevent = SceneEvent() for cchild in child: if cchild.tag=="scene": sceneevent.scene = child.text if cchild.tag=="kfzonestate": sceneevent.kfzonestate = child.text if cchild.tag=="playerbattleinfo": print 'playerbattleinfo:',cchild.getchildren() if cchild.findtext("forces"): forces = int(cchild.find("forces").text) else: forces = -1 if cchild.findtext("jyungong"): jyungong = int(cchild.find("jyungong").text) else: jyungong = -1 if cchild.findtext("token"): token = int(cchild.findtext("token")) else: token = -1 tokencd = int(cchild.find("tokencd").text) tokencdflag = int(cchild.find("tokencdflag").text) kfzonestate = cchild.find("kfzonestate").text playerbattleinfo = PlayerBattleInfo(forces,jyungong,token,tokencd,tokencdflag,kfzonestate) sceneevent.playerbattleinfo = playerbattleinfo battleTeamInfo.sceneevent = sceneevent battleTeamInfo.teamlist = teamlist battleTeamInfo.memberlist = memberlist return battleTeamInfo
class TradeThread(threading.Thread): """ include: include对象 serverid: 服务器ID playerinfo: playerinfo对象 userconfig: 用户配置对象 """ def __init__(self, include, serverid, playerinfo, config): threading.Thread.__init__(self) self.stoped = False self.include = include self.request = Request(include) self.config = config self.serverid = serverid self.playerinfo = playerinfo self.timehelp = TimeHelp() def stop(self): self.stoped = True def isStoped(self): return self.stoped def run(self): # 获得玩家的委派商人信息 playerMerchant = self.getPlayerMerchant() # 判断钱币是否达到最低限制和是否正在CD中 mincoins = self.config._defaultConfig.get("coins-minlimit") if int(self.playerinfo.copper) < mincoins: print "钱币小于%d,停止委派" % (mincoins) self.stoped = True print "auto market cdflag:", int(playerMerchant.cdflag), ",cd:", int(playerMerchant.cd) if int(playerMerchant.cdflag) == 1 and int(playerMerchant.cd) > 0: print "委派CD中,停止委派,剩余:%s" % (self.timehelp.getDownTime(int(playerMerchant.cd))) self.include.tradeCD = int(playerMerchant.cd) self.include.tradeCDFlag = True self.stoped = True while True: if self.stoped: print "自动委派线程停止" return # 委派马商 if not playerMerchant: self.stoped = True print "委派失败,返回值为空" return playerMerchant = self.marketTrade(playerMerchant) if not playerMerchant.tradesn: print "委派失败,未获取到委派结果" self.stoped = True return print playerMerchant.message marketresult = self.marketConfirm(playerMerchant) if marketresult: # 卖出货物成功 # 判断委派返回的玩家钱币是否达到最低限制,true:则停止委派 if int(marketresult.playerupdateinfo.copper) < mincoins: print "钱币小于%d,停止委派" % (mincoins) self.stoped = True return else: # 卖出货物失败 if playerMerchant.playerupdateinfo and playerMerchant.playerupdateinfo.copper: if int(playerMerchant.playerupdateinfo.copper) < mincoins: print "钱币小于%d,停止委派" % (mincoins) self.stoped = True return if int(playerMerchant.cdflag) == 1: msg = "委派CD中,停止委派,剩余:%s" % (self.timehelp.getDownTime(int(playerMerchant.cd))) print msg self.include.tradeCD = int(playerMerchant.cd) self.include.tradeCDFlag = True self.stoped = True return time.sleep(1) """ 获得玩家的马商信息 """ def getPlayerMerchant(self): url = "http://s%d.as.yaowan.com/root/market!getPlayerMerchant.action?%d" % ( self.serverid, long(time.time() * 1000), ) reqinfo = self.request.request(url) res = zlib.decompress(reqinfo.read()) print "market res:", res # get xml str return self.resolveMerXML(res) """ 解析玩家的马商信息和委派过后的马商信息 content: 要解析的内容 返回 PlayerMerchant 对象 """ def resolveMerXML(self, content): res = content[content.find("<?xml") :] if not res: return None results = etree.XML(res) childli = results.getchildren() playerMerchant = PlayerMerchant() merchantlist = [] for child in childli: # 委派结果 if child.tag == "merchandise": merchandiseid = child.find("merchandiseid").text merchandisename = unicode(child.find("merchandisename").text).encode("utf-8") merchandiselv = child.find("merchandiselv").text merchandisequality = child.find("merchandisequality").text limitlv = child.find("limitlv").text pic = child.find("pic").text equiptype = child.find("equiptype").text attribute = child.find("attribute").text hp = child.find("hp").text cost = child.find("cost").text stagename = child.find("stagename").text merchandise = Merchandise( merchandiseid, merchandisename, merchandiselv, merchandisequality, limitlv, pic, equiptype, attribute, hp, cost, stagename, ) playerMerchant.merchandise = merchandise if child.tag == "merchant": merchantid = child.find("merchantid").text merchantname = unicode(child.find("merchantname").text).encode("utf-8") merchantintro = child.find("merchantintro").text cost = child.find("cost").text nextcharge = child.find("nextcharge").text merchant = Merchant(merchantid, merchantname, merchantintro, cost, nextcharge) merchantlist.append(merchant) if child.tag == "playerupdateinfo": # print 'trade playerupdateinfo:',child.getchildren() if child.find("copper"): copper = child.find("copper").text updateinfo = PlayerUpdateInfo() updateinfo.copper = copper playerMerchant.playerupdateinfo = updateinfo if child.tag == "state": state = child.text playerMerchant.state = state if child.tag == "cd": cd = child.text playerMerchant.cd = cd if child.tag == "cdflag": cdflag = child.text playerMerchant.cdflag = cdflag if child.tag == "free": free = child.text playerMerchant.free = free if child.tag == "gold": gold = child.text playerMerchant.gold = gold if child.tag == "tradesn": tradesn = child.text playerMerchant.tradesn = tradesn if child.tag == "message": message = unicode(child.text).encode("utf-8") playerMerchant.message = message playerMerchant.merchantlist = merchantlist return playerMerchant """ 马商委派 """ def marketTrade(self, param): # 得到marketfile中最高的那个商人 merchant = param.merchantlist[0] for i in range(len(param.merchantlist)): if int(param.merchantlist[i].merchantid) == 5: merchant = param.merchantlist[i - 1] break data = {"merchantId": int(merchant.merchantid), "gold": int(param.gold)} url = "http://s%d.as.yaowan.com/root/market!trade.action?%d" % (self.serverid, long(time.time() * 1000)) reqinfo = self.request.request(url, data, jsonFormat=False) res = zlib.decompress(reqinfo.read()) # 得到返回的委派货物和商人信息 playerMerchant = self.resolveMerXML(res) return playerMerchant """ 判断委派的货物是否需要卖出 """ def marketConfirm(self, playerMerchant): if (int(playerMerchant.merchandise.limitlv) < self.config._defaultConfig.get("trade-limitlv")) or ( int(playerMerchant.merchandise.attribute) < self.config._defaultConfig.get("trade-attribute") ): # 卖出货物 data = {"tradeSN": playerMerchant.tradesn} url = "http://s%d.as.yaowan.com/root/market!confirm.action?%d" % (self.serverid, long(time.time() * 1000)) reqinfo = self.request.request(url, data, jsonFormat=False) res = zlib.decompress(reqinfo.read()) res = res[res.find("<?xml") :] if not res: print "卖出货物%s失败" % (playerMerchant.merchandise.merchandisename) return None results = etree.XML(res) childli = results.getchildren() # 返回结果对象 marketresult = MarketResult() for child in childli: if child.tag == "state": state = child.text if int(state) != 1: print "卖出货物%s失败" % (playerMerchant.merchandise.merchandisename) return None marketresult.state = state if child.tag == "usesize": # 使用大小 usesize = child.text marketresult.usesize = usesize if child.tag == "cost": cost = child.text marketresult.cost = cost if child.tag == "playerupdateinfo": copper = child.find("copper").text updateinfo = PlayerUpdateInfo() updateinfo.copper = copper marketresult.playerupdateinfo = updateinfo msg = "卖出货物%s成功,获得%d钱币" % (playerMerchant.merchandise.merchandisename, int(cost)) print msg return marketresult else: msg = "货物%s属性或级别大于配置参数,没有卖出" % (playerMerchant.merchandise.merchandisename) print msg return None