Esempio n. 1
0
 def __init__(self,username=None,password=None,serverid=295):
     self.include  = Include(username)
     self.config   = Config()
     self.username = username
     self.password = password
     self.serverid = serverid
     self.timehelp = TimeHelp()
Esempio n. 2
0
 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"))
Esempio n. 3
0
 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()
Esempio n. 4
0
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
Esempio n. 5
0
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
Esempio n. 6
0
class yaowan(object):
    def __init__(self,username=None,password=None,serverid=295):
        self.include  = Include(username)
        self.config   = Config()
        self.username = username
        self.password = password
        self.serverid = serverid
        self.timehelp = TimeHelp()

    def start(self):
        self.include.addheaders = [('Content-Type', 'application/x-www-form-urlencoded'),
                                   ('User-agent','Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1'),#'Mozilla/5.0(X12;Unixx86_64;9.0.0) By JackSyen'),
                                   ('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'),
                                   ('Accept-Language','zh-cn,zh;q=0.5'),
                                   ('Accept-Encoding','gzip,deflate'),
                                   ('Accept-Charset','GB2312,utf-8;q=0.7,*;q=0.7'),
                                   ('Referer','http://as.yaowan.com'),
                                   ('Host','as.yaowan.com'),
                                   ('Connection','keep-alive'),
                                   ('Cookie','pageReferrInSession=; cnzz_a2184393=0; sin2184393=; rtime=0; ltime=1326903486641; cnzz_eid=66719180-1326902030-; cnzz_a2343924=0; sin2343924=; AJSTAT_ok_pages=1; AJSTAT_ok_times=1')]
        self.Request = Request(self.include)

        self.include.logger.info(u"-------%s开始登录--------" %(self.username))
        if self.username and self.password:
            self.login()
        else:
            self.include.logger.warning(u"用户名或密码为空,程序退出...")
            exit(-1)
        #print "login last cookie:",self.include.cj
        self.initAS()
        
    def login(self):
        url = 'http://as.yaowan.com/Default.php?m=user&action=loginform&astd=1'
        data = {'username' : self.username,
                'password' : self.password,
                'buttion'  : ''}
        self.Request.request(url,data,jsonFormat=False)
        # check login result
        #print "cj:",self.include.cj
        if len(re.findall("userid=\d+",str(self.include.cj)))>0:
            self.include.logger.info(u"登录成功")
        else:
            self.include.logger.error(u"登录失败,程序退出...")
            exit(-1)

    '''
    def getXmlName(self,url):
        if url:
            result = re.findall(r"root/(\w+!?\w+)",url)
            if len(result)>0:
                return str(self.serverid)+"_"+str(result[0])+'.xml'
            return str(self.serverid)+"_"+str(int(time.time()))+"unknown.xml"
            '''

    def initAS(self):
        url = "http://www.yaowan.com/?m=game&game_id=15&district_id=%d" %(683)
        #print "url:",url
        
        self.Request.request(url)  # redicet to http://s322.as.yaowan.com
        
        url = "http://s%d.as.yaowan.com/root/server!getServerTime.action?%d" %(self.serverid,int(time.time()*1000))
        reqinfo = self.Request.request(url)
        servertime = self.getServerTime(reqinfo)
        self.include.serverTime = servertime
        self.include.logger.info(u"服务器时间:%s" %(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(self.include.serverTime/1000))))
        self.gameTimer = GameTimer(self.include)
        self.gameTimer.start()
        
        url = "http://s%d.as.yaowan.com/root/server!getPlayerInfoByUserId.action?%d" %(self.serverid,int(time.time()*1000))
        reqinfo = self.Request.request(url)
        #zlib decompress
        res = zlib.decompress(reqinfo.read())
        res = res[res.find("<?xml"):]
        #print 'playerinfo res:',res
        self.playerinfo = self.getPlayerInfo(res)

        if not self.playerinfo.playerid:
            self.include.logger.error(u"未获取到玩家ID,程序退出...")
            exit(-1)
        self.include.logger.info(u"玩家ID:%d,名称:%s,级别:%d" %(self.playerinfo.playerid,self.playerinfo.playername,self.playerinfo.playerlevel))
        
        url = "http://s%d.as.yaowan.com/root/server!getSessionId.action?%d" %(self.serverid,int(time.time()*1000))
        reqinfo = self.Request.request(url)
        
        url = "http://s%d.as.yaowan.com/root/mainCity.action?%d" %(self.serverid,int(time.time()*1000))
        reqinfo = self.Request.request(url)
        #zlib decompress
        res = zlib.decompress(reqinfo.read())
        res = res[res.find("<?xml"):]
        self.cityinfo = self.getCityInfo(res)
        
        # 如果获取主城信息失败,则表示有验证码
        if len(self.cityinfo.buildlist)==0:
            self.include.logger.error(u"未获取到主城信息,程序退出")
            exit(-1)
            url = "http://s%d.as.yaowan.com/root/validateCode!redirect.action?%d" %(self.serverid,int(time.time()*1000))
            reqinfo = self.Request.request(url)
            #zlib decompress
            res = zlib.decompress(reqinfo.read())
            res = res[res.find("<?xml"):]
            print 'validatecode res:',res
            url = "http://s%d.as.yaowan.com/root/validateCode.action?%d" %(self.serverid,int(time.time()*1000))
            reqinfo = self.Request.request(url)
            #image/jpeg decomress
            print 'validateCode img res:',reqinfo.read()

            #send validate code
            '''
            url = "http://s%d.as.yaowan.com/root/validateCode!code.action?%d" %(self.serverid,int(time.time()*1000))
            #zlib decompress
            res = zlib.decompress(reqinfo.read())
            res = res[res.find("<?xml"):]
            print 'send validate code:',res
            '''
        # 聊天线程
        chatThread = ChatThread(self.include,self.serverid,self.playerinfo)
        chatThread.start()

        # 开发区线程
        if self.playerinfo.isinkfzone == "true":
            self.include.logger.info(u"当前正在开发区中")

        # 全局设置线程
        # 自动委派
        self.tradeThread = None
        if self.config._defaultConfig.get("trade-autostate"):
            self.include.logger.log(u"自动委派功能开启")
            self.tradeThread = TradeThread(self.include,self.serverid,self.playerinfo,self.config)
            self.tradeThread.start()
        # 自动贸易
        if self.config._defaultConfig.get("stock-autostate"):
            self.stockThread = StockThread(self.include,self.serverid,self.playerinfo,self.config)
            self.stockThread.start()

        # 自动征战
        self.battleThread = None
        #print "CD:",self.playerinfo.tokencd,",flag:",self.playerinfo.tokencdflag
        if self.config._defaultConfig.get("battle-autostate"):
            # 在军攻加成时间段才开始(13:00~14:00/20:00~23:00)
            servertime = self.gameTimer.include.serverTime
            localtime = time.localtime(servertime/1000)
            print 'battle localtime:',time.strftime("%Y-%m-%d %H:%M:%S",localtime)
            # 开始征战线程
            #self.battleThread = BattleThread(self.include,self.serverid,self.playerinfo,self.config)
            #self.battleThread.start()
            if 20<=localtime.tm_hour<23 or (13<=localtime.tm_hour<14):
            #if 11<=localtime.tm_hour<14 or 20<=localtime.tm_hour<23:
                # 开始征战线程
                self.battleThread = BattleThread(self.include,self.serverid,self.playerinfo,self.config)
                self.battleThread.start()

        # 自动宴会                
        if self.config._defaultConfig.get("dinner-autostate"):
            self.dinnerThread = None

        # 自动秘书线程(领取俸禄/粮食)
        if self.config._defaultConfig.get("secreatry-auto"):
            self.secretaryThread = SecretaryThread(self.include,self.serverid,self.playerinfo)
            self.secretaryThread.start()

        # 自动采集线程
        self.outcityThread = OutCityThread(self.include,self.serverid,self.playerinfo,self.config)
        self.outcityThread.start()

        # 自动粮食买卖
        self.foodBandCThread = FoodBandCThread(self.include,self.serverid,self.playerinfo)
        self.foodBandCThread.start()

        # 自动开启训练师
        if self.config._defaultConfig.get("trainer-autoopen"):
            self.generalThread = GeneralThread(self.include,self.serverid,self.playerinfo,self.config)
            self.generalThread.start()

        # 精炼工人线程
        if self.playerinfo.playerlevel>=130 and self.config._defaultConfig.get("refine-autostate"):
            self.refineThread = RefineThread(self.include,self.serverid,self.playerinfo)
            self.refineThread.start()
        
        # 主线程
        while True:
            # 判断委派线程
            if self.config._defaultConfig.get("trade-autostate"):
                if self.tradeThread.include.tradeCDFlag:
                    self.tradeThread.include.tradeCD = self.tradeThread.include.tradeCD - 1000
                    if self.tradeThread.include.tradeCD<1000*10 and self.tradeThread.include.tradeCD>0:
                        print u"委派倒计时:",self.tradeThread.include.tradeCD/1000
                    if self.tradeThread.include.tradeCD<0:
                        if self.tradeThread:
                            self.tradeThread = TradeThread(self.tradeThread.include,self.tradeThread.serverid,self.tradeThread.playerinfo,self.config)
                            self.tradeThread.start()
            # 判断征战线程
            if self.config._defaultConfig.get("battle-autostate"):
                servertime = self.gameTimer.include.serverTime
                localtime = time.localtime(servertime/1000)
                if 20<=localtime.tm_hour<23 or (13<=localtime.tm_hour<14):
                #if 20<=localtime.tm_hour<23 or (localtime.tm_hour==13 and localtime.tm_min<30):
                #if 11<=localtime.tm_hour<14 or 20<=localtime.tm_hour<23:
                    if not self.battleThread:
                        self.battleThread = BattleThread(self.include,self.serverid,self.playerinfo,self.config)
                        self.battleThread.start()
                    else:
                        # 继续开始征战
                        if self.battleThread.playerinfo.token>0:
                            if self.battleThread.playerinfo.tokencdflag==1:
                                self.battleThread.playerinfo.tokencd = self.battleThread.playerinfo.tokencd - 1000
                                '''
                                if self.battleThread.playerinfo.tokencd<1000*10 and self.battleThread.playerinfo.tokencd>0:
                                    print "征战倒计时:",self.battleThread.playerinfo.tokencd/1000
                                    if self.battleThread.playerinfo.tokencd<=1000*3 and self.battleThread.playerinfo.tokencd>0:
                                        chatSendThread = ChatSendThread(self.include,self.serverid,"征战倒计时 %d" %(self.battleThread.playerinfo.tokencd/1000),"guojia")
                                        chatSendThread.start()
                                        '''
                                if self.battleThread.playerinfo.tokencd<=0:
                                    if self.battleThread.stoped:
                                        self.battleThread = BattleThread(self.include,self.battleThread.serverid,self.battleThread.playerinfo,self.battleThread.config)
                                        self.battleThread.start()
                        else:
                            self.battleThread.stoped = True
                else:
                    if self.battleThread:
                        self.battleThread.stoped = True

            # 判断宴会线程
            if self.config._defaultConfig.get("dinner-autostate"):
                servertime = self.gameTimer.include.serverTime
                localtime = time.localtime(servertime/1000)
                if 10<=localtime.tm_hour<14 or 19<=localtime.tm_hour<23:
                    if not self.dinnerThread:
                        self.dinnerThread = DinnerThread(self.include,self.serverid,self.playerinfo)
                        self.dinnerThread.start()
                else:
                    self.dinnerThread = None
            time.sleep(1)
    '''
    获得CityInfo对象
    res: 请求URL返回的XML字符串
    '''
    def getCityInfo(self,res):
        if not res:
            print "playerinfo result is null,exit..."
            exit(-1)
            return
        infoXML = etree.XML(res)
        cityinfo = CityInfo()
        buildlist = []
        corlist  = []
        for child in infoXML.getchildren():
            # 主城建筑
            if child.tag=="maincitydto":
                id_            = child.find("id").text
                buildid        = child.find("buildid").text
                buildname      = child.find("buildname").text
                intro          = child.find("intro").text
                cityid         = child.find("cityid").text
                playerid       = child.find("playerid").text
                buildlevel     = child.find("buildlevel").text
                nextcopper     = child.find("nextcopper").text
                cdtime         = child.find("cdtime").text
                lastcdtime     = child.find("lastcdtime").text
                lastupdatetime = child.find("lastupdatetime").text
                citybuild = CityBuild(id_,buildid,buildname,intro,cityid,playerid,
                                     buildlevel,nextcopper,cdtime,lastcdtime,lastupdatetime)
                buildlist.append(citybuild)
            # 建造队列
            if child.tag=="constructordto":
                cid     = int(child.find("cid").text)
                cdflag  = int(child.find("cdflag").text)
                ctime   = int(child.find("ctime").text)
                buildcd = BuildCD(ctime,cid,cdflag)
                #正在建造CD中
                if cdflag:
                    endtime = int(time.time()+ctime)
                    buildcd.endtime = endtime
                corlist.append(buildcd)
        cityinfo.buildlist   = buildlist
        cityinfo.buildcdlist = corlist
        return cityinfo
        
        
    '''
    获得PlayerInfo对象
    res: 请求URL返回的XML字符串
    '''
    def getPlayerInfo(self,res):
        if not res:
            print "playerinfo result is null,exit..."
            exit(-1)
            return
        infoXML = etree.XML(res)
        for child in infoXML.getchildren():
            if child.tag=="player":
                tokencd         = int(child.find("tokencd").text)
                tokencdflag     = int(child.find("tokencdflag").text)
                imposecd        = child.find("imposecd").text
                imposecdflag    = child.find("imposecdflag").text
                protectcd       = child.find("protectcd").text
                playerid        = int(child.find("playerid").text)
                playername      = child.find("playername").text
                playerlevel     = int(child.find("playerlevel").text)
                copper          = child.find("copper").text
                food            = child.find("food").text
                forces          = int(child.find("forces").text)
                sys_gold        = child.find("sys_gold").text
                user_gold       = child.find("user_gold").text
                jyungong        = child.find("jyungong").text
                prestige        = child.find("prestige").text
                nation          = child.find("nation").text
                year            = child.find("year").text
                season          = child.find("season").text
                token           = int(child.find("token").text)
                maxtoken        = child.find("maxtoken").text
                isinkfzone      = child.find("isinkfzone").text
                kfzoneid        = child.find("kfzoneid").text
                kfzonesate      = int(child.find("kfzonesate").text)
                transfercd      = child.find("transfercd").text
                traincurrentnum = child.find("traincurrentnum").text
                maxtrainnum     = child.find("maxtrainnum").text
                stockcd         = child.find("stockcd").text
                inspirestate    = child.find("inspirestate").text
                inspirecd       = child.find("inspirecd").text
                league          = int(child.find("league").text)
                playerinfo = PlayerInfo(tokencd,tokencdflag,imposecd,imposecdflag,protectcd,playerid,playername,playerlevel,
                                        copper,food,forces,sys_gold,user_gold,jyungong,prestige,nation,year,season,
                                        token,maxtoken,transfercd,traincurrentnum,maxtrainnum,stockcd,inspirestate,inspirecd)
                playerinfo.isinkfzone = isinkfzone
                playerinfo.kfzoneid   = kfzoneid
                playerinfo.kfzonesate = kfzonesate
                playerinfo.league     = league
            elif child.tag=="limitvalue":
                if playerinfo:
                    playerinfo.maxfood = child.find("maxfood").text
                    playerinfo.maxcoin = child.find("maxcoin").text
                    playerinfo.maxforce = child.find("maxforce").text
        return playerinfo

    '''
    获得服务器时间
    '''
    def getServerTime(self,res):
        #zlib decompress
        resXML = zlib.decompress(res.read())
        resXML = resXML[resXML.find("<?xml"):]
        timexml = etree.XML(resXML)
        rtime = int(timexml.find("time").text)
        # 因为傲视服务器的时间比当前大8小时,这里减去,便于用户查看
        rtime = rtime - 8*60*60*1000
        print "rtime:",self.timehelp.getStrTime(rtime)
        return rtime