Esempio n. 1
0
    def get_recruit_operators(self):
        recruit_detail = remove_xml_tag(
            self.get_json_data('gacha_table')['recruitDetail'])
        recruit_group = re.findall(r'★\\n(.*)', recruit_detail)
        recruit_operators = []

        for item in recruit_group:
            recruit_operators += item.replace(' ', '').split('/')

        return recruit_operators
Esempio n. 2
0
    def requests_content(self, only_id=False, index=0):
        session = requests.session()

        cards = self.get_cards_list()

        if index >= len(cards):
            return Reply('博士,只能获取到列表内的微博哦')

        target_blog = cards[index]
        blog = target_blog['mblog']
        detail_url = target_blog['scheme']
        item_id = target_blog['itemid']

        if only_id:
            return item_id

        # 获取完整正文
        url = 'https://m.weibo.cn/statuses/extend?id=%s' % blog['id']
        result = session.get(url, headers=self.headers).json()
        html_text = result['data']['longTextContent']
        html_text = re.sub('<br />', '\n', html_text)
        html_text = remove_xml_tag(html_text)
        html_text = html_text.strip('\n')

        # 获取静态图片列表
        pics_list = []
        pics = blog['pics'] if 'pics' in blog else []
        for pic in pics:
            pic_url = pic['large']['url']
            name = pic_url.split('/')[-1]
            suffix = name.split('.')[-1]
            if suffix.lower() == 'gif':
                continue
            temp = 'resource/message/Blog'
            path = '%s/%s' % (temp, name)
            if os.path.exists(path) is False:
                if os.path.exists(temp) is False:
                    os.mkdir(temp)
                stream = requests.get(pic_url,
                                      headers=self.headers,
                                      stream=True)
                if stream.status_code == 200:
                    open(path, 'wb').write(stream.content)

            pics_list.append(Image(path))

        return [
            Reply(html_text),
            Reply(detail_url, 0, at=False, auto_image=False),
            Reply(pics_list, 0, at=False)
        ]
Esempio n. 3
0
    def talents(self, operator_id):
        talents = []
        if self.data['talents']:
            for item in self.data['talents']:
                max_item = item['candidates'][-1]
                talents.append({
                    'operator_id':
                    operator_id,
                    'talents_name':
                    max_item['name'],
                    'talents_desc':
                    remove_xml_tag(max_item['description'])
                })

        return talents
Esempio n. 4
0
    def detail(self, operator_id):
        items = self.get_json_data('item_table')['items']

        token_id = 'p_' + self.id
        token = None
        if token_id in items:
            token = items[token_id]

        max_phases = self.data['phases'][-1]
        max_attr = max_phases['attributesKeyFrames'][-1]['data']

        detail = {
            'operator_id':
            operator_id,
            'operator_desc':
            remove_xml_tag(self.data['description']),
            'operator_usage':
            self.data['itemUsage'] or '',
            'operator_quote':
            self.data['itemDesc'] or '',
            'operator_token':
            token['description'] if token else '',
            'max_level':
            '%s-%s' % (len(self.data['phases']) - 1, max_phases['maxLevel']),
            'max_hp':
            max_attr['maxHp'],
            'attack':
            max_attr['atk'],
            'defense':
            max_attr['def'],
            'magic_resistance':
            max_attr['magicResistance'],
            'cost':
            max_attr['cost'],
            'block_count':
            max_attr['blockCnt'],
            'attack_time':
            max_attr['baseAttackTime'],
            'respawn_time':
            max_attr['respawnTime']
        }

        return detail
Esempio n. 5
0
    def get_blog_list(self):

        cards = self.get_cards_list()

        text = '博士,这是【明日方舟Arknights】最近的微博列表。\n'

        for index, item in enumerate(cards):
            content = remove_xml_tag(item['mblog']['text'])
            content = content[:30].replace('\n', ' ').replace('#明日方舟#',
                                                              '').strip()

            date = item['mblog']['created_at']
            date = time.strptime(date, '%a %b %d %H:%M:%S +0800 %Y')
            date = time.strftime('%m-%d %H:%M', date)

            text += '\n【%d】%s\n --- %s…' % (index + 1, date, content)

        text += '\n\n请和我说「阿米娅查看第 N 条微博」来获取详情吧'

        return Reply(text)
Esempio n. 6
0
    def building_skills(self, operator_id):
        building_data = self.get_json_data('building_data')
        building_skills = building_data['buffs']

        skills = []
        if self.id in building_data['chars']:
            char_buff = building_data['chars'][self.id]
            for buff in char_buff['buffChar']:
                for item in buff['buffData']:
                    buff_id = item['buffId']
                    if buff_id in building_skills:
                        skill = building_skills[buff_id]
                        skills.append({
                            'operator_id':
                            operator_id,
                            'bs_unlocked':
                            item['cond']['phase'],
                            'bs_name':
                            skill['buffName'],
                            'bs_desc':
                            remove_xml_tag(skill['description'])
                        })

        return skills
Esempio n. 7
0
    def save_operator_detail(self, operator_no, operator_id):
        data = self.get_json_data('char/data', operator_no)
        if data:

            # todo 保存详细信息
            attrs_data = data['phases'][-1]['attributesKeyFrames'][-1]
            attrs = attrs_data['data']
            max_level = attrs_data['level']
            detail = {
                'operator_id': operator_id,
                'operator_desc': remove_xml_tag(data['description']),
                'operator_usage': data['itemUsage'] or '',
                'operator_quote': data['itemDesc'] or '',
                'operator_token':
                data['tokenDesc'] if 'tokenDesc' in data else '',
                'max_level': '%s-%s' % (len(data['phases']) - 1, max_level),
                'max_hp': attrs['maxHp'],
                'attack': attrs['atk'],
                'defense': attrs['def'],
                'magic_resistance': attrs['magicResistance'],
                'cost': attrs['cost'],
                'block_count': attrs['blockCnt'],
                'attack_time': attrs['baseAttackTime'],
                'respawn_time': attrs['respawnTime']
            }
            database.operator.add_operator_detail([detail])

            # todo 保存天赋信息
            talents = []
            if data['talents']:
                for item in data['talents']:
                    max_item = item['candidates'][-1]
                    talents.append({
                        'operator_id':
                        operator_id,
                        'talents_name':
                        max_item['name'],
                        'talents_desc':
                        remove_xml_tag(max_item['description'])
                    })
                if talents:
                    database.operator.add_operator_talents(talents)

            # todo 保存基建信息
            building_skill = []
            if data['buildingData']:
                for item in data['buildingData']:
                    if item:
                        for bs in item:
                            building_skill.append({
                                'operator_id':
                                operator_id,
                                'bs_unlocked':
                                bs['cond']['phase'],
                                'bs_name':
                                bs['data']['buffName'],
                                'bs_desc':
                                remove_xml_tag(bs['data']['description'])
                            })
                if building_skill:
                    database.operator.add_operator_building_skill(
                        building_skill)

            # todo 保存潜能信息
            potential = []
            if data['potentialRanks']:
                for index, item in enumerate(data['potentialRanks']):
                    potential.append({
                        'operator_id': operator_id,
                        'potential_desc': item['description'],
                        'potential_rank': index + 1
                    })
                if potential:
                    database.operator.add_operator_potential(potential)

            # todo 保存精英化信息
            evolve_cost = []
            for index, phases in enumerate(data['phases']):
                if phases['evolveCost']:
                    for item in phases['evolveCost']:
                        evolve_cost.append({
                            'operator_id': operator_id,
                            'evolve_level': index,
                            'use_material_id': item['id'],
                            'use_number': item['count']
                        })
            if evolve_cost:
                database.operator.add_operator_evolve_costs(evolve_cost)

            # todo 保存技能信息
            skills = []
            skills_id = []
            skills_desc = {}
            skills_cost = {}
            for index, item in enumerate(data['skills']):
                detail = self.get_json_data('skills', item['skillId'])
                if detail:
                    name = detail['levels'][0]['name']
                    sk_no = item['skillId']

                    skills_id.append(sk_no)

                    if sk_no not in skills_desc:
                        skills_desc[sk_no] = []
                    if sk_no not in skills_cost:
                        skills_cost[sk_no] = []

                    # 预处理技能描述数据
                    for lev, desc in enumerate(detail['levels']):
                        blackboard = {
                            item['key']: item['value']
                            for index, item in enumerate(desc['blackboard'])
                        }
                        description = remove_xml_tag(desc['description'])
                        format_str = re.findall(r'({(\S+?)})', description)
                        if format_str:
                            for desc_item in format_str:
                                key = desc_item[1].split(':')
                                fd = key[0].lower().strip('-')
                                if fd in blackboard:
                                    value = blackboard[fd]
                                    if len(key) >= 2 and key[1] in formatter:
                                        value = formatter[key[1]](value)
                                    description = description.replace(
                                        desc_item[0], str(value))

                        skills_desc[sk_no].append({
                            'skill_level':
                            lev + 1,
                            'skill_type':
                            desc['skillType'],
                            'sp_type':
                            desc['spData']['spType'],
                            'sp_init':
                            desc['spData']['initSp'],
                            'sp_cost':
                            desc['spData']['spCost'],
                            'duration':
                            desc['duration'],
                            'description':
                            description,
                            'max_charge':
                            desc['spData']['maxChargeTime']
                        })

                    # 预处理专精数据
                    for lev, cond in enumerate(item['levelUpCostCond']):
                        if bool(cond['levelUpCost']) is False:
                            continue

                        for idx, cost in enumerate(cond['levelUpCost']):
                            skills_cost[sk_no].append({
                                'mastery_level':
                                lev + 1,
                                'use_material_id':
                                cost['id'],
                                'use_number':
                                cost['count']
                            })

                    icon = 'skill_icon_' + (detail['iconId']
                                            or detail['skillId'])
                    skills.append({
                        'operator_id': operator_id,
                        'skill_no': sk_no,
                        'skill_index': index + 1,
                        'skill_name': name,
                        'skill_icon': icon
                    })
                    self.get_pic('skills/pics/' + icon, 'skills')
            if skills:
                database.operator.add_operator_skill(skills)

            skills_id = {
                sk_no: database.operator.get_skill_id(sk_no, operator_id)
                for sk_no in skills_id
            }

            # todo 保存技能描述和专精信息
            todo_list = [('技能描述', skills_desc,
                          database.operator.add_operator_skill_description),
                         ('技能专精信息', skills_cost,
                          database.operator.add_operator_skill_mastery_costs)]
            for todo in todo_list:
                save_list = []
                for sk_no, sk_list in todo[1].items():
                    for item in sk_list:
                        item['skill_id'] = skills_id[sk_no]
                        save_list.append(item)
                if save_list:
                    todo[2](save_list)
Esempio n. 8
0
    def skills(self, operator_id):
        skill_data = self.get_json_data('skill_table')

        skills = []
        skills_id = []
        skills_desc = {}
        skills_cost = {}
        for index, item in enumerate(self.data['skills']):
            code = item['skillId']

            if code not in skill_data:
                continue

            detail = skill_data[code]
            icon = 'skill_icon_' + (detail['iconId'] or detail['skillId'])

            if bool(detail) is False:
                continue

            skills_id.append(code)

            if code not in skills_desc:
                skills_desc[code] = []
            if code not in skills_cost:
                skills_cost[code] = []

            for lev, desc in enumerate(detail['levels']):
                blackboard = {
                    item['key']: item['value']
                    for index, item in enumerate(desc['blackboard'])
                }
                description = remove_xml_tag(desc['description'])
                format_str = re.findall(r'({(\S+?)})', description)
                if format_str:
                    for desc_item in format_str:
                        key = desc_item[1].split(':')
                        fd = key[0].lower().strip('-')
                        if fd in blackboard:
                            value = blackboard[fd]
                            if len(key) >= 2 and key[1] in formatter:
                                value = formatter[key[1]](value)
                            description = description.replace(
                                desc_item[0], str(value))

                skills_desc[code].append({
                    'skill_level':
                    lev + 1,
                    'skill_type':
                    desc['skillType'],
                    'sp_type':
                    desc['spData']['spType'],
                    'sp_init':
                    desc['spData']['initSp'],
                    'sp_cost':
                    desc['spData']['spCost'],
                    'duration':
                    desc['duration'],
                    'description':
                    description,
                    'max_charge':
                    desc['spData']['maxChargeTime']
                })

            for lev, cond in enumerate(item['levelUpCostCond']):
                if bool(cond['levelUpCost']) is False:
                    continue

                for idx, cost in enumerate(cond['levelUpCost']):
                    skills_cost[code].append({
                        'mastery_level': lev + 1,
                        'use_material_id': cost['id'],
                        'use_number': cost['count']
                    })

            skills.append({
                'operator_id': operator_id,
                'skill_no': code,
                'skill_index': index + 1,
                'skill_name': detail['levels'][0]['name'],
                'skill_icon': icon
            })

        return skills, skills_id, skills_cost, skills_desc
Esempio n. 9
0
    def find_enemy(self, enemy):
        name = find_similar_string(enemy, list(self.enemies.keys()))
        if name:
            try:
                data = self.enemies[name]['info']
                detail = self.enemies[name]['data']

                text = '博士,这是找到的敌方档案\n\n\n\n\n\n\n'
                text += '【%s】\n\n' % name
                text += '%s\n\n' % data['description']
                text += '[能力]\n%s\n\n' % remove_xml_tag(data['ability'] or '无')
                text += '[属性]\n耐久 %s | 攻击力 %s | 防御力 %s | 法术抗性 %s\n' % \
                        (data['endure'],
                         data['attack'],
                         data['defence'],
                         data['resistance'])

                key_map = {
                    'attributes.maxHp': {'title': '生命值', 'value': ''},
                    'attributes.atk': {'title': '攻击力', 'value': ''},
                    'attributes.def': {'title': '物理防御', 'value': ''},
                    'attributes.magicResistance': {'title': '魔法抗性', 'value': ''},
                    'attributes.moveSpeed': {'title': '移动速度', 'value': ''},
                    'attributes.baseAttackTime': {'title': '攻击间隔', 'value': ''},
                    'attributes.hpRecoveryPerSec': {'title': '生命回复/秒', 'value': ''},
                    'attributes.massLevel': {'title': '重量', 'value': ''},
                    'rangeRadius': {'title': '攻击距离/格', 'value': ''},
                    'lifePointReduce': {'title': '进点损失', 'value': ''}
                }

                for item in detail:
                    text += '\n[等级 %s 数值]\n' % (item['level'] + 1)
                    detail_data = item['enemyData']
                    key_index = 0
                    for key in key_map:
                        defined, value = self.get_value(key, detail_data)
                        if defined:
                            key_map[key]['value'] = value
                        else:
                            value = key_map[key]['value']

                        text += '%s:%s%s' % (key_map[key]['title'], value, '    ' if key_index % 2 == 0 else '\n')
                        key_index += 1
                    if detail_data['skills']:
                        text += '技能冷却时间:\n'
                        for sk in detail_data['skills']:
                            sk_info = (sk['prefabKey'], sk['initCooldown'], sk['cooldown'])
                            text += '    - [%s]\n    -- 初始冷却 %ss,后续冷却 %ss\n' % sk_info

                icons = [
                    {
                        'path': 'resource/images/enemy/%s.png' % data['enemyId'],
                        'size': (80, 80),
                        'pos': (10, 30)
                    }
                ]

                return TextImage(text, icons)
            except Exception as e:
                raise e
                print('Enemy', e)
                return '博士,【%s】档案好像损坏了... >.<' % name
        else:
            return False