diff --git a/Dockerfile b/Dockerfile index f77bf51..5a0d059 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,7 +14,7 @@ RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ WORKDIR /bot COPY requirements.txt /bot/requirements.txt RUN pip install -r requirements.txt -RUN pip install https://github.com/jxtech/wechatpy/archive/master.zip +# RUN pip install https://github.com/jxtech/wechatpy/archive/master.zip # RUN pip install -i https://mirrors.aliyun.com/pypi/simple/ -r requirements.txt FROM develop AS release diff --git a/kokkoro/bot/tomon/bot.py b/kokkoro/bot/tomon/bot.py index 85a735e..6025669 100644 --- a/kokkoro/bot/tomon/bot.py +++ b/kokkoro/bot/tomon/bot.py @@ -170,4 +170,12 @@ def get_groups(self) -> List[TomonGroup]: @overrides(KokkoroBot) def get_members_in_group(self, gid) -> List[TomonUser]: raw_members = asyncio.run(self._bot.api().route(f'/guilds/{gid}/members').get()) - return TomonUser.from_raw_members(raw_members) \ No newline at end of file + return TomonUser.from_raw_members(raw_members) + + def get_group_by_id(self, gid) -> TomonGroup: + raw_group = asyncio.run(self._bot.api().route(f'/guilds/{gid}').get()) + return TomonGroup(raw_group) + + def get_roles_by_group(self, gid): + raw_roles = asyncio.run(self._bot.api().route(f'/guilds/{gid}/roles').get()) + return raw_roles \ No newline at end of file diff --git a/kokkoro/bot/tomon/tomon_adaptor.py b/kokkoro/bot/tomon/tomon_adaptor.py index 34d5bb1..4324715 100644 --- a/kokkoro/bot/tomon/tomon_adaptor.py +++ b/kokkoro/bot/tomon/tomon_adaptor.py @@ -1,12 +1,16 @@ import asyncio from kokkoro import config from kokkoro.priv import SUPERUSER, ADMIN, NORMAL, OWNER - -from kokkoro.bot.tomon import get_bot from kokkoro.typing import List, overrides from kokkoro.common_interface import EventInterface, UserInterface, GroupInterface, SupportedMessageType from kokkoro.util import to_string +from . import get_bot +from .tomon_util import has_permission_for, calculate_permission + +class TomonPriv: + ADMINISTRATOR = 1 << 3 + ''' Raw User (dict) https://developer.tomon.co/docs/guild#群组成员guild-member @@ -15,7 +19,9 @@ class TomonUser(UserInterface): def __init__(self, user, member={}): self.raw_user = user self.raw_member = member + # lazy loaded var self.group = None + self.roles = None @staticmethod def from_raw_member(member): @@ -46,9 +52,6 @@ def get_raw_user(self): def get_nick_name(self): return to_string(self.raw_member.get('nick')) or self.get_name() - def get_roles(self): - return self.raw_member.get('roles') - @overrides(UserInterface) def get_priv(self): if self.get_id() in config.SUPER_USER: @@ -59,17 +62,32 @@ def get_priv(self): return ADMIN return NORMAL + def get_roles(self): + if self.roles == None: + my_roles_id = self.raw_member.get('roles') # only role id in this list + bot = get_bot() + all_roles = bot.get_roles_by_group(self.raw_member.get('guild_id')) + + my_roles = [] + for role in all_roles: + for rid in my_roles_id: + if role["id"] == rid: + my_roles.append(role) + self.roles = my_roles + return self.roles + @overrides(UserInterface) def is_admin(self): - return False #FIXME: wait for sdk to process permissions + permission = calculate_permission(self.get_roles()) + return has_permission_for(permission, TomonPriv.ADMINISTRATOR) def is_owner(self): if self.group == None: guild_id = self.raw_member.get('guild_id') if guild_id == None: return False - _bot = get_bot().get_raw_bot() - self.group = TomonGroup(asyncio.run(_bot.api().route(f'/guilds/{guild_id}').get())) + bot = get_bot() + self.group = bot.get_group_by_id(guild_id) if self.group.get_owner_id() == self.get_id(): return True return False diff --git a/kokkoro/bot/tomon/tomon_util.py b/kokkoro/bot/tomon/tomon_util.py index eb58769..00ca981 100644 --- a/kokkoro/bot/tomon/tomon_util.py +++ b/kokkoro/bot/tomon/tomon_util.py @@ -26,4 +26,13 @@ def normalize_at(raw_at): """ 规范化 at 信息,"<@123>" => " @123 " """ - return f' @{raw_at[2:-1]} ' \ No newline at end of file + return f' @{raw_at[2:-1]} ' + +def has_permission_for(src, dst): + return src & dst != 0 + +def calculate_permission(roles, everyone=0): + permission = everyone + for role in roles: + permission = permission | role["permissions"] + return permission \ No newline at end of file diff --git a/kokkoro/bot/wechat_enterprise/__init__.py b/kokkoro/bot/wechat_enterprise/__init__.py index 459ce68..d23fc52 100644 --- a/kokkoro/bot/wechat_enterprise/__init__.py +++ b/kokkoro/bot/wechat_enterprise/__init__.py @@ -5,6 +5,6 @@ def get_bot(): global kkr_bot if kkr_bot == None: - from kokkoro.wechat_enterprise.bot import KokkoroWechatEpBot + from kokkoro.bot.wechat_enterprise.bot import KokkoroWechatEpBot kkr_bot = KokkoroWechatEpBot(config) return kkr_bot \ No newline at end of file diff --git a/kokkoro/bot/wechat_enterprise/bot.py b/kokkoro/bot/wechat_enterprise/bot.py index dacb3b4..cf236c8 100644 --- a/kokkoro/bot/wechat_enterprise/bot.py +++ b/kokkoro/bot/wechat_enterprise/bot.py @@ -10,7 +10,7 @@ import kokkoro from kokkoro.typing import overrides from kokkoro.common_interface import KokkoroBot, EventInterface, SupportedMessageType -from kokkoro.wechat_enterprise.wechat_enterprise_adaptor import WechatEpEvent +from kokkoro.bot.wechat_enterprise.wechat_enterprise_adaptor import WechatEpEvent def wechat_handler(bot): async def wrapper(): diff --git a/kokkoro/bot/wechat_enterprise/wechat_enterprise_adaptor.py b/kokkoro/bot/wechat_enterprise/wechat_enterprise_adaptor.py index bd9ca69..c7b42af 100644 --- a/kokkoro/bot/wechat_enterprise/wechat_enterprise_adaptor.py +++ b/kokkoro/bot/wechat_enterprise/wechat_enterprise_adaptor.py @@ -3,6 +3,7 @@ from kokkoro.util import to_string from kokkoro.common_interface import EventInterface from kokkoro import config +from kokkoro.typing import overrides class WechatEpEvent(EventInterface): def __init__(self, raw_event: BaseMessage): diff --git a/kokkoro/config_example/modules/pcrclanbattle.py b/kokkoro/config_example/modules/pcrclanbattle.py index 877492b..76a9ad1 100644 --- a/kokkoro/config_example/modules/pcrclanbattle.py +++ b/kokkoro/config_example/modules/pcrclanbattle.py @@ -6,7 +6,7 @@ [ 6000000, 8000000, 10000000, 12000000, 15000000], [ 6000000, 8000000, 10000000, 12000000, 15000000], [ 7000000, 9000000, 13000000, 15000000, 20000000], - [15000000, 16000000, 18000000, 19000000, 20000000] + [17000000, 18000000, 20000000, 21000000, 23000000] ], "SCORE_RATE_JP": [ [1.2, 1.2, 1.3, 1.4, 1.5], diff --git a/kokkoro/config_example/modules/priconne.py b/kokkoro/config_example/modules/priconne.py index 65c0b0a..fa8ce28 100644 --- a/kokkoro/config_example/modules/priconne.py +++ b/kokkoro/config_example/modules/priconne.py @@ -85,7 +85,7 @@ class arena: "up_prob": 14, "s3_prob": 50, "s2_prob": 180, - "up": [ "真阳(游侠)", "拉比林斯达" ], + "up": [ "凛(NGs)", "怜(万圣节)" ], "_comment": "star3 仅填3星常驻角色。不要填UP角,否则出率会偏高", "star3": [ "杏奈","真步","璃乃","初音","霞","伊绪", @@ -94,7 +94,7 @@ class arena: "亚里莎","安","古蕾娅", "空花(大江户)", "妮诺(大江户)", "克萝依", "碧(插班生)", "美美(万圣节)", "露娜", "伊莉亚(圣诞节)", "霞(魔法少女)", "优妮", "琪爱儿", - "リン(レンジャー)", "マヒル(レンジャー)", "璃乃(奇境)", "祈梨" + "铃(游侠)", "真阳(游侠)", "璃乃(奇幻)" ], "other_normal_star3": [ ], "star2": [ @@ -112,7 +112,7 @@ class arena: "up_prob": 7, "s3_prob": 25, "s2_prob": 180, - "up": [ "真阳(游侠)" ], + "up": [ "凛(NGs)" ], "_comment": "star3 仅填3星常驻角色。不要填UP角,否则出率会偏高", "star3": [ "杏奈","真步","璃乃","初音","霞","伊绪", @@ -120,9 +120,10 @@ class arena: "伊莉亚","纯","静流","莫妮卡","流夏","吉塔", "亚里莎","安","古蕾娅", "空花(大江户)", "妮诺(大江户)", "克萝依", "碧(插班生)", "美美(万圣节)", "露娜", - "伊莉亚(圣诞节)", "霞(魔法少女)", "优妮", "琪爱儿" + "伊莉亚(圣诞节)", "霞(魔法少女)", "优妮", "琪爱儿", + "铃(游侠)", "真阳(游侠)", "璃乃(奇幻)", "祈梨" ], - "other_normal_star3": [ "リン(レンジャー)", "マヒル(レンジャー)", "璃乃(奇境)", "祈梨"], + "other_normal_star3": [ ], "star2": [ "茉莉","茜里","宫子","雪","七七香","美里", "铃奈","香织","美美","绫音","铃","惠理子", @@ -138,7 +139,7 @@ class arena: "up_prob": 7, "s3_prob": 25, "s2_prob": 180, - "up": [ "拉比林斯达" ], + "up": [ "怜(万圣节)" ], "_comment": "star3 仅填3星常驻角色。不要填UP角,否则出率会偏高", "star3": [ "杏奈","真步","璃乃","初音","霞","伊绪", @@ -147,7 +148,7 @@ class arena: "亚里莎","安","古蕾娅", "空花(大江户)", "妮诺(大江户)", "克萝依", "碧(插班生)", "美美(万圣节)", "露娜", "伊莉亚(圣诞节)", "霞(魔法少女)", "优妮", "琪爱儿", - "リン(レンジャー)", "マヒル(レンジャー)", "璃乃(奇境)", "祈梨", + "铃(游侠)", "真阳(游侠)", "璃乃(奇幻)", "祈梨", "七七香(夏日)" ], "other_normal_star3": [ ], @@ -163,19 +164,19 @@ class arena: ] }, "BL": { - "up_prob": 7, + "up_prob": 14, "s3_prob": 25, "s2_prob": 180, - "up": [ "凯留(夏日)" ], + "up": [ "环奈" ], "_comment": "star3 仅填3星常驻角色。不要填UP角,否则出率会偏高", "star3": [ "杏奈","璃乃","初音","伊绪", "望","妮诺","秋乃", "亚里莎", "静流","莫妮卡","吉塔", "纯", "镜华", - "伊莉亚", "真步", "咲恋", "真琴" + "伊莉亚", "真步", "咲恋", "真琴", "智" ], "other_normal_star3": [ - "霞", "智", "纯", "流夏", "安", "古蕾娅","空花(大江户)", "妮诺(大江户)", + "霞", "流夏", "安", "古蕾娅","空花(大江户)", "妮诺(大江户)", "克萝依", "碧(插班生)", "美美(万圣节)", "露娜", "伊莉亚(圣诞节)", "霞(魔法少女)", "优妮", "琪爱儿" ], @@ -183,7 +184,7 @@ class arena: "茜里","宫子","雪","铃", "铃奈","香织","美美","绫音","惠理子", "真阳","栞","千歌","空花","珠希","美冬", - "深月", "美里", "纺希", "忍" + "深月", "美里", "纺希", "忍", "茉莉" ], "star1" : [ "日和","怜","禊","胡桃","依里","铃莓", diff --git a/kokkoro/modules/arknights/recruit.py b/kokkoro/modules/arknights/recruit.py index 9413827..8da2924 100644 --- a/kokkoro/modules/arknights/recruit.py +++ b/kokkoro/modules/arknights/recruit.py @@ -123,7 +123,8 @@ async def _async_init(): else: sv.logger.error("Fail to load recruit info of arknights") -asyncio.run(_async_init()) +loop = asyncio.new_event_loop() +loop.run_until_complete(_async_init()) HELP_MESSAGE = '请输入标签。默认仅显示必得4★的TAG组合\n示例:公开招募 位移 近战位\n显示所有可能干员请使用参数"-a"或"全部"\n示例:公开招募 -a 位移 近战位\n网页版:https://www.bigfun.cn/tools/aktools-old/akhr.html' @sv.on_prefix(('ark-recruit','公开招募', "公招")) diff --git a/kokkoro/modules/pcrclanbattle/clanbattle/__init__.py b/kokkoro/modules/pcrclanbattle/clanbattle/__init__.py index ee62e5a..244c0c6 100644 --- a/kokkoro/modules/pcrclanbattle/clanbattle/__init__.py +++ b/kokkoro/modules/pcrclanbattle/clanbattle/__init__.py @@ -1,5 +1,6 @@ # 公主连接Re:Dive会战管理插件 # clan == クラン == 戰隊(直译为氏族)(CLANNAD的CLAN(笑)) +from functools import wraps from .argparse import ArgParser from .exception import * @@ -23,6 +24,7 @@ def cb_cmd(prefixes, parser:ArgParser) -> Callable: raise ValueError('`name` of cb_cmd must be `str` or `Iterable[str]`') def deco(func): + @wraps(func) async def wrapper(bot: KokkoroBot, ev: EventInterface): try: args = parser.parse(ev.get_param().args, ev) diff --git a/kokkoro/modules/pcrclanbattle/clanbattle/battlemaster.py b/kokkoro/modules/pcrclanbattle/clanbattle/battlemaster.py index 23ed219..4e736d9 100644 --- a/kokkoro/modules/pcrclanbattle/clanbattle/battlemaster.py +++ b/kokkoro/modules/pcrclanbattle/clanbattle/battlemaster.py @@ -9,11 +9,30 @@ def get_config(): class BattleMaster(object): + ''' + Different bits represent different damage kind: + ''' + NORM = BattleDao.NORM # 0 + LAST = BattleDao.LAST # 1<<0 + EXT = BattleDao.EXT # 1<<1 + TIMEOUT = BattleDao.TIMEOUT # 1<<2 - NORM = BattleDao.NORM - LAST = BattleDao.LAST - EXT = BattleDao.EXT - TIMEOUT = BattleDao.TIMEOUT + @staticmethod + def has_damage_kind_for(src, dst): + return src & dst != 0 + + @staticmethod + def damage_kind_to_string(src): + res = [] + if src & BattleMaster.EXT: + res.append('补时') + if src & BattleMaster.LAST: + res.append('尾刀') + if src & BattleMaster.TIMEOUT: + res.append('掉线') + if src == BattleMaster.NORM: + res.append('通常') + return res SERVER_JP = ClanDao.SERVER_JP SERVER_TW = ClanDao.SERVER_TW diff --git a/kokkoro/modules/pcrclanbattle/clanbattle/cmdv2.py b/kokkoro/modules/pcrclanbattle/clanbattle/cmdv2.py index 6c3e387..26ade76 100644 --- a/kokkoro/modules/pcrclanbattle/clanbattle/cmdv2.py +++ b/kokkoro/modules/pcrclanbattle/clanbattle/cmdv2.py @@ -201,39 +201,47 @@ async def process_challenge(bot:KokkoroBot, ev:EventInterface, ch:ParseResult): cur_round, cur_boss, cur_hp = bm.get_challenge_progress(1, now) round_ = ch.round or cur_round boss = ch.boss or cur_boss - damage = ch.damage if ch.flag != BattleMaster.LAST else (ch.damage or cur_hp) + + damage = None + if not (ch.round or ch.boss): + # 当前周目并且是尾刀,则自动将伤害设置为当前血量 + if BattleMaster.has_damage_kind_for(ch.flag, BattleMaster.LAST): + damage = cur_hp + if not damage: + if not ch.damage: + raise NotFoundError('请给出伤害值') + damage = ch.damage + + flag = ch.flag - if (ch.flag == BattleMaster.LAST) and (ch.round or ch.boss) and (not damage): - raise NotFoundError('补报尾刀请给出伤害值') # 补报尾刀必须给出伤害值 + # if (ch.flag == BattleMaster.LAST) and (ch.round or ch.boss) and (not damage): + # raise NotFoundError('补报尾刀请给出伤害值') # 补报尾刀必须给出伤害值 msg = [''] # 上一刀如果是尾刀,这一刀就是补偿刀 challenges = bm.list_challenge_of_user_of_day(mem['uid'], mem['alt'], now) if len(challenges) > 0 and challenges[-1]['flag'] == BattleMaster.LAST: - flag = BattleMaster.EXT + flag = flag | BattleMaster.EXT msg.append('⚠️已自动标记为补时刀') if round_ != cur_round or boss != cur_boss: msg.append('⚠️上报与当前进度不一致') else: # 伤害校对 - eps = 30000 - if damage > cur_hp + eps: - damage = cur_hp - msg.append(f'⚠️过度虐杀 伤害数值已自动修正为{damage}') - if flag == BattleMaster.NORM: - flag = BattleMaster.LAST + if damage >= cur_hp: + if damage > cur_hp: + damage = cur_hp + msg.append(f'⚠️过度虐杀 伤害数值已自动修正为{damage}') + # 不是尾刀,则标记为尾刀 + if not BattleMaster.has_damage_kind_for(flag, BattleMaster.LAST): + flag = flag | BattleMaster.LAST msg.append('⚠️已自动标记为尾刀') - elif flag == BattleMaster.LAST: - if damage < cur_hp - eps: - msg.append('⚠️尾刀伤害不足 请未报刀成员及时上报') - elif damage < cur_hp: - if damage % 1000 == 0: - damage = cur_hp - msg.append(f'⚠️尾刀伤害已自动修正为{damage}') - else: - msg.append('⚠️Boss仍有少量残留血量') + + elif BattleMaster.has_damage_kind_for(flag, BattleMaster.LAST): + if damage < cur_hp: + damage = cur_hp + msg.append(f'⚠️尾刀伤害已自动修正为{damage}') eid = bm.add_challenge(mem['uid'], mem['alt'], round_, boss, damage, flag, now) aft_round, aft_boss, aft_hp = bm.get_challenge_progress(1, now) @@ -250,11 +258,11 @@ async def process_challenge(bot:KokkoroBot, ev:EventInterface, ch:ParseResult): await auto_unsubscribe(bot, ev, bm.group, mem['uid'], boss) def isDD(damage): - return damage < 450000 + return damage < 600000 import random async def jiuzhe(bot, ev): - msglist = ['这是法刀吗?', f'恁搁着挠痒痒呢?', f'就这?', R.img('就这.jpg')] + msglist = ['就这?', R.img('就这.jpg')] index = random.randint(0, len(msglist)-1) await bot.kkr_send(ev, msglist[index]) @@ -879,7 +887,7 @@ async def list_challenge(bot:KokkoroBot, ev:EventInterface, args:ParseResult): mem = bm.get_member(c['uid'], c['alt']) c['name'] = mem['name'] if mem else c['uid'] flag = c['flag'] - c['flag_str'] = '|补时' if flag & bm.EXT else '|尾刀' if flag & bm.LAST else '|掉线' if flag & bm.TIMEOUT else '|通常' + c['flag_str'] = '|' + ','.join(BattleMaster.damage_kind_to_string(flag)) msg.append(challenstr.format_map(c)) await bot.kkr_send(ev, '\n'.join(msg)) diff --git a/kokkoro/modules/pcrclanbattle/clanbattle/report/__init__.py b/kokkoro/modules/pcrclanbattle/clanbattle/report/__init__.py index 716eee2..98a8639 100644 --- a/kokkoro/modules/pcrclanbattle/clanbattle/report/__init__.py +++ b/kokkoro/modules/pcrclanbattle/clanbattle/report/__init__.py @@ -31,6 +31,7 @@ import kokkoro from .. import sv +from ..battlemaster import BattleMaster FONT_PATH = kokkoro.config.FONT_PATH["msyh"] @@ -109,10 +110,13 @@ def gen_report(gid, uid, nickname, type=REPORT_UNDECLARED, kpi=False): for idx,chl in challenges.iterrows(): total_damage += chl['dmg'] times_to_boss[chl['boss']-1] += 1 - if chl['flag'] == 0: + # FIXME: 目前版本离职报告直接忽略尾刀与补偿刀的伤害,计算boss均伤时,仅计算普通刀 + if chl['flag'] == BattleMaster.NORM: damage_to_boss[chl['boss']-1] += chl['dmg'] truetimes_to_boss[chl['boss']-1] += 1 - if chl['flag'] != 1: + # 尾刀与补偿刀仅计算一刀的刀数 + # 因此忽略尾刀即可 + if not BattleMaster.has_damage_kind_for(chl['flag'], BattleMaster.LAST): total_chl += 1 if chl['dmg'] == 0: miss_chl += 1 diff --git a/kokkoro/modules/priconne/_chara_data.py b/kokkoro/modules/priconne/_chara_data.py deleted file mode 100644 index 7800526..0000000 --- a/kokkoro/modules/priconne/_chara_data.py +++ /dev/null @@ -1,90 +0,0 @@ -# 名字, 公会, 生日, 年龄, 身高, 体重, 血型, 种族, 喜好, 声优 -CHARA_DATA= { - 1001: ["日和", "破晓之星", "8月27日", "16", "155", "44", "A", "兽人族", "助人、打气加油", "东山奈央"], - 1002: ["优衣", "破晓之星", "4月5日", "17", "158", "47", "O", "人族", "料理、观察人类", "种田梨沙"], - 1003: ["怜", "破晓之星", "1月12日", "18", "163", "46", "B", "魔族", "读书、骑马、茶", "早见沙织"], - 1004: ["禊", "小小甜心", "8月10日", "9", "128", "27", "O", "人族", "恶作剧、探险", "诸星堇"], - 1005: ["茉莉", "王宫骑士团", "11月25日", "12", "146", "40", "O", "兽人族", "英雄扮演游戏", "下田麻美"], - 1006: ["茜里", "恶魔伪王国军", "11月22日", "13", "150", "42", "O", "魔族", "萨克斯风", "浅仓杏美"], - 1007: ["宫子", "恶魔伪王国军", "1月23日", "14", "130", "32", "B", "魔族", "吃布丁", "雨宫天"], - 1008: ["雪", "纯白之翼 兰德索尔分部", "10月10日", "14", "150", "40", "AB", "精灵族", "欣赏镜中的自己", "大空直美"], - 1009: ["杏奈", "暮光流星群", "7月5日", "17", "159", "45", "A", "魔族", "写小说", "高野麻美"], - 1010: ["真步", "自卫团", "9月22日", "16", "155", "42", "O", "兽人族", "幻想、收集玩偶", "内田真礼"], - 1011: ["璃乃", "拉比林斯", "8月25日", "15", "156", "44", "A", "人族", "裁缝", "阿澄佳奈"], - 1012: ["初音", "森林守卫", "12月24日", "17", "156", "46", "A", "精灵族", "和妹妹一起玩、回笼觉、午睡、早睡", "大桥彩香"], - 1013: ["七七香", "暮光流星群", "8月21日", "18", "166", "55", "O", "魔族", "读书、魔法", "佳村遥"], - 1014: ["霞", "自卫团", "11月3日", "15", "152", "41", "AB", "兽人族", "读书、推理", "水濑祈"], - 1015: ["美里", "森林守卫", "9月5日", "21", "165", "54", "O", "精灵族", "制作绘本", "国府田麻理子"], - 1016: ["铃奈", "月光学院", "4月10日", "18", "167", "48", "O", "魔族", "时尚", "上坂堇"], - 1017: ["香织", "自卫团", "7月7日", "19", "158", "53", "A", "兽人族", "跳舞、空手道", "高森奈津美"], - 1018: ["伊绪", "月光学院", "8月14日", "23", "162", "52", "B", "魔族", "看恋爱小说、恋爱剧、恋爱漫画", "伊藤静"], - - 1020: ["美美", "小小甜心", "4月3日", "10", "117", "21", "O", "兽人族", "收集可爱的东西", "日高里菜"], - 1021: ["胡桃", "咲恋救济院", "6月9日", "12", "150", "40", "B", "人族", "看戏、扮家家酒", "植田佳奈"], - 1022: ["依里", "恶魔伪王国军", "11月22日", "13", "150", "40", "O", "魔族", "所有游戏", "原纱友里"], - 1023: ["绫音", "咲恋救济院", "5月10日", "14", "148", "38", "B", "人族", "能在房间里玩的游戏", "芹泽优"], - - 1025: ["铃莓", "咲恋救济院", "12月12日", "15", "154", "43", "O", "人族", "服侍", "悠木碧"], - 1026: ["铃", "伊丽莎白牧场", "1月1日", "17", "144", "42", "B", "兽人族", "红豆面包", "小岩井小鸟"], - 1027: ["惠理子", "暮光流星群", "7月30日", "16", "154", "43", "B", "魔族", "实验、裁缝、料理", "桥本千波"], - 1028: ["咲恋", "咲恋救济院", "10月4日", "17", "156", "43", "A", "精灵族", "经营、茶会", "堀江由衣"], - 1029: ["望", "慈乐之音", "1月24日", "17", "157", "40", "B", "人族", "看舞台剧、跳舞", "日笠阳子"], - 1030: ["妮诺", "纯白之翼 兰德索尔分部", "8月31日", "16", "163", "51", "O", "人族", "忍术开发", "佐藤聪美"], - 1031: ["忍", "恶魔伪王国军", "12月22日", "18", "157", "42", "AB", "魔族", "占卜", "大坪由佳"], - 1032: ["秋乃", "墨丘利财团", "3月12日", "18", "157", "45", "AB", "人族", "慈善事业", "松嵜丽"], - 1033: ["真阳", "伊丽莎白牧场", "3月3日", "20", "142", "35", "B", "人族", "相声", "新田惠海"], - 1034: ["优花梨", "墨丘利财团", "3月16日", "22", "164", "55", "A", "精灵族", "随意逛街", "今井麻美"], - - 1036: ["镜华", "小小甜心", "2月2日", "8", "118", "21", "A", "精灵族", "读书", "小仓唯"], - 1037: ["智", "王宫骑士团", "8月11日", "13", "149", "43", "A", "人族", "剑术、戏弄长者", "茅原实里"], - 1038: ["栞", "伊丽莎白牧场", "11月3日", "14", "153", "40", "A", "兽人族", "读书、散步", "小清水亚美"], - - 1040: ["碧", "森林守卫", "6月6日", "13", "158", "44", "AB", "精灵族", "交朋友的想象训练", "花泽香菜"], - - 1042: ["千歌", "慈乐之音", "6月3日", "17", "163", "46", "O", "人族", "各种乐器", "福原绫香"], - 1043: ["真琴", "自卫团", "8月9日", "17", "168", "54", "O", "兽人族", "做点心", "小松未可子"], - 1044: ["伊莉亚", "恶魔伪王国军", "5月5日", "???", "172", "50", "A", "魔族", "征服世界", "丹下樱"], - 1045: ["空花", "纯白之翼 兰德索尔分部", "11月19日", "18", "157", "49", "AB", "人族", "阅读小说", "长妻树里"], - 1046: ["珠希", "墨丘利财团", "3月1日", "18", "158", "48", "AB", "兽人族", "与猫咪玩耍", "沼仓爱美"], - 1047: ["纯", "王宫骑士团", "10月25日", "25", "171", "50", "A", "人族", "格斗技、入浴", "川澄绫子"], - 1048: ["美冬", "墨丘利财团", "11月11日", "20", "163", "49", "O", "人族", "佣兵等等的打工", "田所梓"], - 1049: ["静流", "拉比林斯", "10月24日", "18", "168", "54", "O", "人族", "所有家事", "天生目仁美"], - 1050: ["美咲", "月光学院", "1月3日", "11", "120", "22", "A", "魔族", "阅读流行杂志、搜集化妆品", "久野美咲"], - 1051: ["深月", "暮光流星群", "3月7日", "27", "166", "53", "A", "人族", "研究、实验", "三石琴乃"], - 1052: ["莉玛", "伊丽莎白牧场", "3月14日", "18", "150", "100", "A", "兽人族", "理毛、聊天", "德井青空"], - 1053: ["莫妮卡", "纯白之翼 兰德索尔分部", "7月28日", "18", "140", "33", "A", "人族", "逛糖果店", "辻亚由美"], - 1054: ["纺希", "慈乐之音", "9月7日", "14", "153", "45", "AB", "人族", "裁缝", "木户衣吹"], - 1055: ["步未", "纯白之翼 兰德索尔分部", "4月7日", "16", "155", "43", "O", "精灵族", "观察", "大关英里"], - 1056: ["流夏", "暮光流星群", "7月11日", "25", "167", "54", "B", "人族", "钓鱼", "佐藤利奈"], - 1057: ["吉塔", "???", "3月10日", "17", "156", "45", "O", "人族", "冒险、聊天", "金元寿子"], - 1058: ["贪吃佩可", "美食殿堂", "3月31日", "17", "156", "46", "O", "人族", "边走边吃、料理", "M·A·O"], - 1059: ["可可萝", "美食殿堂", "5月11日", "11", "140", "35", "B", "精灵族", "冥想、养育动植物", "伊藤美来"], - 1060: ["凯留", "美食殿堂", "9月2日", "14", "152", "39", "A", "兽人族", "和猫咪玩耍", "立花理香"], - 1061: ["矛依未", "???", "8月11日", "16", "148", "40", "O", "人族", "冒险、回忆故事", "潘惠美"], - - 1063: ["亚里莎", "???", "6月17日", "15", "155", "42", "O", "精灵族", "搜集漂亮的叶子", "优木加奈"], - - 1065: ["嘉夜", "龙族巢穴", "6月25日", "16", "156", "???", "B", "龙人族", "格斗技", "小市真琴"], - 1066: ["祈梨", "龙族巢穴", "9月29日", "13", "145", "???", "AB", "龙人族", "游戏", "藤田茜"], - - 1070: ["似似花", "???", "3月24日", "24", "149", "???", "O", "精灵族", "模仿、艺术欣赏", "井口裕香"], - 1071: ["克莉丝提娜", "王宫骑士团", "2月7日", "27", "165", "???", "O", "人族", "和强敌之间的竞争", "高桥智秋"], - - 1092: ["安", "???", "12月1日", "17", "156", "55", "AB", "人族", "读书", "日笠阳子"], - 1093: ["露", "???", "2月4日", "15", "144", "45", "O", "人族", "吃饭、睡觉", "古山贵实子"], - 1094: ["古蕾娅", "???", "11月3日", "17", "167", "67", "B", "半人半龙", "钢琴", "福原绫香"], - - 1097: ["雷姆", "???", "2月2日", "17", "154", "???", "???", "鬼族", "戏剧欣赏、诗和散文", "水濑祈"], - 1098: ["拉姆", "???", "2月2日", "17", "154", "???", "???", "鬼族", "读书", "村川梨衣"], - 1099: ["爱蜜莉雅", "???", "9月23日", "114", "164", "???", "???", "半精灵族", "帮帕克梳理毛发、念书", "高桥李依"], - - 1108: ["克萝依", "圣特蕾莎女子学院(好朋友社)", "8月7日", "17", "154", "42", "O", "精灵族", "飞镖", "种崎敦美"], - 1109: ["琪爱儿", "圣特蕾莎女子学院(好朋友社)", "9月15日", "16", "156", "46", "O", "人族", "跳舞、卡拉OK", "佐仓绫音"], - 1110: ["优妮", "圣特蕾莎女子学院(好朋友社)", "2月28日", "18", "142", "36", "O", "人族", "读书", "小原好美"], - - 1114: ["露娜", "???", "???", "???", "142", "28", "???", "人族", "找「朋友」之事", "小仓唯"], - - 1124: ["卯月(偶像大师)", "new generations", "4月24日", "17", "159", "45", "O", "人族", "和朋友打长电话", "大桥彩香"], - 1125: ["凛(偶像大师)", "new generations", "8月10日", "15", "165", "44", "B", "人族", "带狗散步", "福原绫香"], - 1126: ["未央(偶像大师)", "new generations", "12月1日", "15", "161", "46", "B", "人族", "购物", "原纱友里"], - } \ No newline at end of file diff --git a/kokkoro/modules/priconne/_pcr_data.py b/kokkoro/modules/priconne/_pcr_data.py index 4751f62..f34b15b 100644 --- a/kokkoro/modules/priconne/_pcr_data.py +++ b/kokkoro/modules/priconne/_pcr_data.py @@ -15,7 +15,7 @@ 1005: ["茉莉", "マツリ", "Matsuri", "跳跳虎", "老虎", "虎", "🐅"], 1006: ["茜里", "アカリ", "Akari", "妹法", "妹妹法"], 1007: ["宫子", "ミヤコ", "Miyako", "布丁", "布", "🍮"], - 1008: ["雪", "ユキ", "Yuki", "小雪", "镜子", "镜法", "伪娘", "男孩子", "男孩纸"], + 1008: ["雪", "ユキ", "Yuki", "小雪", "镜子", "镜法", "伪娘", "男孩子", "男孩纸", "雪哥"], 1009: ["杏奈", "アンナ", "Anna", "中二", "煤气罐"], 1010: ["真步", "マホ", "Maho", "狐狸", "真扎", "咕噜灵波", "真布", "🦊"], 1011: ["璃乃", "リノ", "Rino", "妹弓"], @@ -58,7 +58,7 @@ 1048: ["美冬", "ミフユ", "Mifuyu", "子龙", "赵子龙"], 1049: ["静流", "シズル", "Shizuru", "姐姐"], 1050: ["美咲", "ミサキ", "Misaki", "大眼", "👀", "👁️", "👁"], - 1051: ["深月", "ミツキ", "Mitsuki", "眼罩", "抖s"], + 1051: ["深月", "ミツキ", "Mitsuki", "眼罩", "抖s", "医生"], 1052: ["莉玛", "リマ", "Rima", "Lima", "草泥马", "羊驼", "🦙", "🐐"], 1053: ["莫妮卡", "モニカ", "Monika", "毛二力"], 1054: ["纺希", "ツムギ", "Tsumugi", "裁缝", "蜘蛛侠", "🕷️", "🕸️"], @@ -68,12 +68,12 @@ 1058: ["贪吃佩可", "ペコリーヌ", "Pecoriinu", "佩可莉姆", "吃货", "佩可", "公主", "饭团", "🍙"], 1059: ["可可萝", "コッコロ", "Kokkoro", "可可罗", "妈", "普白"], 1060: ["凯留", "キャル", "Kyaru", "凯露", "百地希留耶", "希留耶", "Kiruya", "黑猫", "臭鼬", "普黑", "接头霸王", "街头霸王"], - 1061: ["矛依未", "ムイミ", "Muimi", "诺维姆", "Noemu", "夏娜", "511", "无意义", "天楼霸断剑"], + 1061: ["矛依未", "ムイミ", "Muimi", "诺维姆", "Noemu", "夏娜", "511", "无意义", "天楼霸断剑", "姆咪", "母咪"], 1063: ["亚里莎", "アリサ", "Arisa", "鸭梨瞎", "瞎子", "亚里沙", "鸭梨傻", "亚丽莎", "亚莉莎", "瞎子弓", "🍐🦐", "yls"], - 1065: ["嘉夜", "カヤ", "Kaya", "憨憨龙", "龙拳", "🐲👊🏻", "🐉👊🏻", "接龙笨比"], - 1066: ["祈梨", "イノリ", "Inori", "梨老八", "李老八"], + 1065: ["嘉夜", "カヤ", "Kaya", "憨憨龙", "龙拳", "🐲👊🏻", "🐉👊🏻", "接龙笨比", "鬼道嘉夜"], + 1066: ["祈梨", "イノリ", "Inori", "梨老八", "李老八", "龙锤", "🐲🔨"], 1067: ["穗希", "ホマレ", "Homare"], 1068: ["拉比林斯达", "ラビリスタ", "Rabirisuta", "迷宫女王", "模索路晶", "模索路", "晶"], 1069: ["真那", "マナ", "Mana", "霸瞳皇帝", "千里真那", "千里", "霸瞳", "霸铜"], @@ -85,7 +85,7 @@ 1075: ["贪吃佩可(夏日)", "ペコリーヌ(サマー)", "Pekoriinu(Summer)", "佩可莉姆(夏日)", "水吃", "水饭", "水吃货", "水佩可", "水公主", "水饭团", "水🍙", "泳吃", "泳饭", "泳吃货", "泳佩可", "泳公主", "泳饭团", "泳🍙", "泳装吃货", "泳装公主", "泳装饭团", "泳装🍙", "佩可(夏日)", "🥡", "👙🍙", "泼妇"], 1076: ["可可萝(夏日)", "コッコロ(サマー)", "Kokkoro(Summer)", "水白", "水妈", "水可", "水可可", "水可可萝", "水可可罗", "泳装妈", "泳装可可萝", "泳装可可罗"], 1077: ["铃莓(夏日)", "スズメ(サマー)", "Suzume(Summer)", "水女仆", "水妹抖"], - 1078: ["凯留(夏日)", "キャル(サマー)", "Kyaru(Summer)", "水黑", "水黑猫", "水臭鼬", "泳装黑猫", "泳装臭鼬", "潶", "溴", "💧黑"], + 1078: ["凯留(夏日)", "キャル(サマー)", "Kyaru(Summer)", "凯露(夏日)", "水黑", "水黑猫", "水臭鼬", "泳装黑猫", "泳装臭鼬", "潶", "溴", "💧黑"], 1079: ["珠希(夏日)", "タマキ(サマー)", "Tamaki(Summer)", "水猫剑", "水猫", "渵", "💧🐱🗡️", "水🐱🗡️"], 1080: ["美冬(夏日)", "ミフユ(サマー)", "Mifuyu(Summer)", "水子龙", "水美冬"], 1081: ["忍(万圣节)", "シノブ(ハロウィン)", "Shinobu(Halloween)", "万圣忍", "瓜忍", "🎃忍", "🎃💀"], @@ -101,7 +101,7 @@ 1091: ["静流(情人节)", "シズル(バレンタイン)", "Shizuru(Valentine)", "情人节静流", "情姐", "情人节姐姐"], 1092: ["安", "アン", "An", "胖安", "55kg"], 1093: ["露", "ルゥ", "Ruu", "逃课女王"], - 1094: ["古蕾娅", "グレア", "Gurea", "龙姬", "古雷娅", "古蕾亚", "古雷亚", "🐲🐔", "🐉🐔"], + 1094: ["古蕾娅", "グレア", "Gurea", "龙姬", "古雷娅", "古蕾亚", "古雷亚", "古蕾雅", "🐲🐔", "🐉🐔"], 1095: ["空花(大江户)", "クウカ(オーエド)", "Kuuka(Ooedo)", "江户空花", "江户抖m", "江m", "花m", "江花"], 1096: ["妮诺(大江户)", "ニノン(オーエド)", "Ninon(Ooedo)", "江户扇子", "忍扇"], 1097: ["雷姆", "レム", "Remu", "蕾姆"], @@ -117,39 +117,59 @@ 1107: ["碧(插班生)", "アオイ(編入生)", "Aoi(Hennyuusei)", "生菜", "插班碧"], 1108: ["克萝依", "クロエ", "Kuroe", "华哥", "黑江", "黑江花子", "花子"], 1109: ["琪爱儿", "チエル", "Chieru", "切露", "茄露", "茄噜", "切噜"], - 1110: ["优妮", "ユニ", "Yuni", "真行寺由仁", "由仁", "u2", "优妮辈先", "辈先", "书记", "uni", "先辈", "仙贝", "油腻", "优妮先辈", "学姐", "18岁黑丝学姐"], + 1110: ["优妮", "ユニ", "Yuni", "真行寺由仁", "由仁", "优尼", "u2", "优妮辈先", "辈先", "书记", "uni", "先辈", "仙贝", "油腻", "优妮先辈", "学姐", "18岁黑丝学姐"], 1111: ["镜华(万圣节)", "キョウカ(ハロウィン)", "Kyouka(Halloween)", "万圣镜华", "万圣小仓唯", "万圣xcw", "猫仓唯", "黑猫仓唯", "mcw", "猫唯", "猫仓", "喵唯"], 1112: ["禊(万圣节)", "ミソギ(ハロウィン)", "Misogi(Halloween)", "万圣禊", "万圣炸弹人", "瓜炸弹人", "万圣炸弹", "万圣炸", "瓜炸", "南瓜炸", "🎃💣"], 1113: ["美美(万圣节)", "ミミ(ハロウィン)", "Mimi(Halloween)", "万圣兔", "万圣兔子", "万圣兔兔", "绷带兔", "绷带兔子", "万圣美美", "绷带美美", "万圣🐰", "绷带🐰", "🎃🐰", "万圣🐇", "绷带🐇", "🎃🐇"], - 1114: ["露娜", "ルナ", "Runa", "露仓唯", "露cw"], + 1114: ["露娜", "ルナ", "Runa", "Luna", "露仓唯", "露cw"], 1115: ["克莉丝提娜(圣诞节)", "クリスティーナ(クリスマス)", "Kurisutiina(Xmas)", "Christina(Xmas)", "Cristina(Xmas)", "圣诞克", "圣诞克总", "圣诞女帝", "蛋克", "圣克", "必胜客"], 1116: ["望(圣诞节)", "ノゾミ(クリスマス)", "Nozomi(Xmas)", "圣诞望", "圣诞偶像", "蛋偶像", "蛋望"], 1117: ["伊莉亚(圣诞节)", "イリヤ(クリスマス)", "Iriya(Xmas)", "圣诞伊莉亚", "圣诞伊利亚", "圣诞伊莉雅", "圣诞伊利雅", "圣诞yly", "圣诞吸血鬼", "圣伊", "圣yly"], 1119: ["可可萝(新年)", "コッコロ(ニューイヤー)", "Kokkoro(NewYear)", "春可可", "春白", "新年妈", "春妈"], - 1120: ["凯留(新年)", "キャル(ニューイヤー)", "Kyaru(NewYear)", "春凯留", "春黑猫", "春黑", "春臭鼬", "新年凯留", "新年黑猫", "新年臭鼬", "唯一神"], + 1120: ["凯留(新年)", "キャル(ニューイヤー)", "Kyaru(NewYear)", "凯露(新年)", "春凯留", "春黑猫", "春黑", "春臭鼬", "新年凯留", "新年黑猫", "新年臭鼬", "唯一神"], 1121: ["铃莓(新年)", "スズメ(ニューイヤー)", "Suzume(NewYear)", "春铃莓", "春女仆", "春妹抖", "新年铃莓", "新年女仆", "新年妹抖"], 1122: ["霞(魔法少女)", "カスミ(マジカル)", "Kasumi(MagiGirl)", "魔法少女霞", "魔法侦探", "魔法杜宾犬", "魔法驴", "魔法驴子", "魔驴", "魔法霞", "魔法少驴"], 1123: ["栞(魔法少女)", "シオリ(マジカル)", "Shiori(MagiGirl)", "魔法少女栞", "魔法tp弓", "魔法小栞", "魔法白虎弓", "魔法白虎妹", "魔法白虎", "魔栞"], - 1124: ["卯月(偶像大师)", "ウヅキ(デレマス)", "Udsuki(DEREM@S)", "卯月", "卵用", "Udsuki(DEREMAS)", "岛村卯月"], - 1125: ["凛(偶像大师)", "リン(デレマス)", "Rin(DEREM@S)", "凛", "Rin(DEREMAS)", "涩谷凛", "西部凛"], - 1126: ["未央(偶像大师)", "ミオ(デレマス)", "Mio(DEREM@S)", "未央", "Mio(DEREMAS)", "本田未央"], + 1124: ["卯月(NGs)", "ウヅキ(デレマス)", "Udsuki(DEREM@S)", "卯月", "卵用", "Udsuki(DEREMAS)", "岛村卯月"], + 1125: ["凛(NGs)", "リン(デレマス)", "Rin(DEREM@S)", "凛", "Rin(DEREMAS)", "涩谷凛", "西部凛"], + 1126: ["未央(NGs)", "ミオ(デレマス)", "Mio(DEREM@S)", "未央", "Mio(DEREMAS)", "本田未央"], 1127: ["铃(游侠)", "リン(レンジャー)", "Rin(Ranger)", "骑兵松鼠", "游侠松鼠", "游骑兵松鼠", "护林员松鼠", "护林松鼠", "游侠🐿️", "武松"], - 1128: ["真阳(游侠)", "マヒル(レンジャー)", "Mahiru(Ranger)", "骑兵奶牛", "游侠奶牛", "游骑兵奶牛", "护林员奶牛", "护林奶牛", "游侠🐄", "游侠🐮"], - 1129: ["璃乃(奇境)", "リノ(ワンダー)", "Rino(Wonder)", "璃乃(仙境)", "爽弓", "爱丽丝弓", "爱弓", "兔弓", "奇境妹弓", "仙境妹弓", "白丝妹弓"], - 1130: ["步未(奇境)", "アユミ(ワンダー)", "Ayumi(Wonder)", "步未(仙境)", "路人兔", "兔人妹", "爱丽丝路人", "奇境路人", "仙境路人"], + 1128: ["真阳(游侠)", "マヒル(レンジャー)", "Mahiru(Ranger)", "骑兵奶牛", "游侠奶牛", "游骑兵奶牛", "护林员奶牛", "护林奶牛", "游侠🐄", "游侠🐮", "牛叉"], + 1129: ["璃乃(奇幻)", "リノ(ワンダー)", "Rino(Wonder)", "璃乃(奇境)", "璃乃(仙境)", "爽弓", "爱丽丝弓", "爱弓", "兔弓", "奇境妹弓", "奇幻妹弓", "奇幻璃乃", "仙境妹弓", "白丝妹弓"], + 1130: ["步未(奇幻)", "アユミ(ワンダー)", "Ayumi(Wonder)", "步未(奇境)", "步未(仙境)", "路人兔", "兔人妹", "爱丽丝路人", "奇境路人", "奇幻路人", "奇幻步未", "仙境路人"], 1131: ["流夏(夏日)", "ルカ(サマー)", "Ruka(Summer)", "泳装流夏", "水流夏", "泳装刘夏", "水刘夏", "泳装大姐", "泳装大姐头", "水大姐", "水大姐头", "水儿力", "泳装儿力", "水流"], 1132: ["杏奈(夏日)", "アンナ(サマー)", "Anna(Summer)", "泳装中二", "泳装煤气罐", "水中二", "水煤气罐", "冲", "冲二"], - 1133: ["七七香(夏日)", "ナナカ(サマー)", "Nanaka(Summer)", "泳装娜娜卡", "泳装77k", "泳装77香", "水娜娜卡", "水77k", "水77香"], + 1133: ["七七香(夏日)", "ナナカ(サマー)", "Nanaka(Summer)", "泳装娜娜卡", "泳装77k", "泳装77香", "水娜娜卡", "水77k", "水77香", "水七七香", "泳装七七香"], 1134: ["初音(夏日)", "ハツネ(サマー)", "Hatsune(Summer)", "水星", "海星", "水hego", "水星法", "泳装星法", "水⭐法", "水睡法", "湦"], 1135: ["美里(夏日)", "ミサト(サマー)", "Misato(Summer)", "水母", "泳装圣母", "水圣母"], 1136: ["纯(夏日)", "ジュン(サマー)", "Jun(Summer)", "泳装黑骑", "水黑骑", "泳装纯", "水纯", "小次郎"], + 1137: ["茜里(天使)", "アカリ(エンジェル)", "Akari(Angel)", "天使妹法", "天使茜里", "丘比特妹法"], + 1138: ["依里(天使)", "ヨリ(エンジェル)", "Yori(Angel)", "天使姐法", "天使依里", "丘比特姐法"], + 1139: ["纺希(万圣节)", "ツムギ(ハロウィン)", "Tsumugi(Halloween)", "万圣裁缝", "万圣蜘蛛侠", "🎃🕷️", "🎃🕸️", "万裁", "瓜裁", "鬼裁", "鬼才"], + 1140: ["怜(万圣节)", "レイ(ハロウィン)", "Rei(Halloween)", "万圣剑圣", "万剑", "瓜剑", "瓜怜", "万圣怜"], + 1141: ["茉莉(万圣节)", "マツリ(ハロウィン)", "Matsuri(Halloween)", "万圣跳跳虎", "万圣老虎", "瓜虎", "🎃🐅"], + + + + + # =================================== # + 1701: ["环奈", "カンナ", "Kanna", "桥本环奈", "毛大力", "毛小力", "毛六力", "可大萝", "大可萝", "缝合怪"], + + + + + + - 1802: ["优衣(公主)", "ユイ(プリンセス)", "Yui(Princess)", "公主优衣", "公主yui", "公主种田", "公主田", "公主ue", "掉毛优衣", "掉毛yui", "掉毛ue", "掉毛", "飞翼优衣", "飞翼ue", "飞翼", "飞翼高达"], + + # =================================== # + + 1802: ["优衣(公主)", "ユイ(プリンセス)", "Yui(Princess)", "公主优衣", "公主yui", "公主种田", "公主田", "公主ue", "掉毛优衣", "掉毛yui", "掉毛ue", "掉毛", "飞翼优衣", "飞翼ue", "飞翼", "飞翼高达", "飞田"], 1804: ["贪吃佩可(公主)", "ペコリーヌ(プリンセス)", "Pekoriinu(Princess)", "公主吃", "公主饭", "公主吃货", "公主佩可", "公主饭团", "公主🍙", "命运高达", "高达", "命运公主", "高达公主", "命吃", "春哥高达", "🤖🍙", "🤖"], 1805: ["可可萝(公主)", "コッコロ(プリンセス)", "Kokkoro(Princess)", "公主妈", "月光妈", "蝶妈", "蝴蝶妈", "月光蝶妈", "公主可", "公主可萝", "公主可可萝", "月光可", "月光可萝", "月光可可萝", "蝶可", "蝶可萝", "蝶可可萝"], @@ -157,14 +177,40 @@ # =================================== # + 1900: ["爱梅斯", "アメス", "Amesu", "菲欧", "フィオ", "Fio"], + + + + + + 1907: ["大古", "タイゴ", "Taigo", "大吾", "鬼道大吾"], 1908: ["花凛", "カリン", "Karin", "绿毛恶魔"], - + 1909: ["涅比亚", "ネビア", "Nevia", "Nebia"], + 1910: ["真崎", "マサキ", "Masaki"], + 1911: ["米涅尔β", "ミネルβ", "MineruBeta", "米涅尔", "ミネル", "Mineru"], + + + 1914: ["豪绅", "ゴウシン", "Goushin"], + 1915: ["克里吉塔", "クレジック", "Kurejikku"], + 1916: ["基洛", "キイロ", "Kiiro"], + 1917: ["善", "ゼーン", "Seen"], + 1918: ["兰法", "ランファ", "Ranfa"], + 1919: ["阿佐尔德", "アンゾールド", "Anzoorudo"], + 1920: ["美空", "ミソラ", "Misora"], + + + + + + + + + + # =================================== # 4031: ["骷髅", "髑髏", "Dokuro", "骷髅老爹", "老爹"], 9000: ["祐树", "ユウキ", "Yuuki", "骑士", "骑士君"], - 9401: ["爱梅斯", "アメス", "Amesu", "菲欧", "フィオ", "Fio"], - #赛马新增 9601: ["01", "001", "one"], 9602: ["02", "002", "two"], @@ -172,6 +218,97 @@ 9604: ["04", "004", "four"] } +# 名字, 公会, 生日, 年龄, 身高, 体重, 血型, 种族, 喜好, 声优 +CHARA_DATA= { + 1001: ["日和", "破晓之星", "8月27日", "16", "155", "44", "A", "兽人族", "助人、打气加油", "东山奈央"], + 1002: ["优衣", "破晓之星", "4月5日", "17", "158", "47", "O", "人族", "料理、观察人类", "种田梨沙"], + 1003: ["怜", "破晓之星", "1月12日", "18", "163", "46", "B", "魔族", "读书、骑马、茶", "早见沙织"], + 1004: ["禊", "小小甜心", "8月10日", "9", "128", "27", "O", "人族", "恶作剧、探险", "诸星堇"], + 1005: ["茉莉", "王宫骑士团", "11月25日", "12", "146", "40", "O", "兽人族", "英雄扮演游戏", "下田麻美"], + 1006: ["茜里", "恶魔伪王国军", "11月22日", "13", "150", "42", "O", "魔族", "萨克斯风", "浅仓杏美"], + 1007: ["宫子", "恶魔伪王国军", "1月23日", "14", "130", "32", "B", "魔族", "吃布丁", "雨宫天"], + 1008: ["雪", "纯白之翼 兰德索尔分部", "10月10日", "14", "150", "40", "AB", "精灵族", "欣赏镜中的自己", "大空直美"], + 1009: ["杏奈", "暮光流星群", "7月5日", "17", "159", "45", "A", "魔族", "写小说", "高野麻美"], + 1010: ["真步", "自卫团", "9月22日", "16", "155", "42", "O", "兽人族", "幻想、收集玩偶", "内田真礼"], + 1011: ["璃乃", "拉比林斯", "8月25日", "15", "156", "44", "A", "人族", "裁缝", "阿澄佳奈"], + 1012: ["初音", "森林守卫", "12月24日", "17", "156", "46", "A", "精灵族", "和妹妹一起玩、回笼觉、午睡、早睡", "大桥彩香"], + 1013: ["七七香", "暮光流星群", "8月21日", "18", "166", "55", "O", "魔族", "读书、魔法", "佳村遥"], + 1014: ["霞", "自卫团", "11月3日", "15", "152", "41", "AB", "兽人族", "读书、推理", "水濑祈"], + 1015: ["美里", "森林守卫", "9月5日", "21", "165", "54", "O", "精灵族", "制作绘本", "国府田麻理子"], + 1016: ["铃奈", "月光学院", "4月10日", "18", "167", "48", "O", "魔族", "时尚", "上坂堇"], + 1017: ["香织", "自卫团", "7月7日", "19", "158", "53", "A", "兽人族", "跳舞、空手道", "高森奈津美"], + 1018: ["伊绪", "月光学院", "8月14日", "23", "162", "52", "B", "魔族", "看恋爱小说、恋爱剧、恋爱漫画", "伊藤静"], + + 1020: ["美美", "小小甜心", "4月3日", "10", "117", "21", "O", "兽人族", "收集可爱的东西", "日高里菜"], + 1021: ["胡桃", "咲恋救济院", "6月9日", "12", "150", "40", "B", "人族", "看戏、扮家家酒", "植田佳奈"], + 1022: ["依里", "恶魔伪王国军", "11月22日", "13", "150", "40", "O", "魔族", "所有游戏", "原纱友里"], + 1023: ["绫音", "咲恋救济院", "5月10日", "14", "148", "38", "B", "人族", "能在房间里玩的游戏", "芹泽优"], + + 1025: ["铃莓", "咲恋救济院", "12月12日", "15", "154", "43", "O", "人族", "服侍", "悠木碧"], + 1026: ["铃", "伊丽莎白牧场", "1月1日", "17", "144", "42", "B", "兽人族", "红豆面包", "小岩井小鸟"], + 1027: ["惠理子", "暮光流星群", "7月30日", "16", "154", "43", "B", "魔族", "实验、裁缝、料理", "桥本千波"], + 1028: ["咲恋", "咲恋救济院", "10月4日", "17", "156", "43", "A", "精灵族", "经营、茶会", "堀江由衣"], + 1029: ["望", "慈乐之音", "1月24日", "17", "157", "40", "B", "人族", "看舞台剧、跳舞", "日笠阳子"], + 1030: ["妮诺", "纯白之翼 兰德索尔分部", "8月31日", "16", "163", "51", "O", "人族", "忍术开发", "佐藤聪美"], + 1031: ["忍", "恶魔伪王国军", "12月22日", "18", "157", "42", "AB", "魔族", "占卜", "大坪由佳"], + 1032: ["秋乃", "墨丘利财团", "3月12日", "18", "157", "45", "AB", "人族", "慈善事业", "松嵜丽"], + 1033: ["真阳", "伊丽莎白牧场", "3月3日", "20", "142", "35", "B", "人族", "相声", "新田惠海"], + 1034: ["优花梨", "墨丘利财团", "3月16日", "22", "164", "55", "A", "精灵族", "随意逛街", "今井麻美"], + + 1036: ["镜华", "小小甜心", "2月2日", "8", "118", "21", "A", "精灵族", "读书", "小仓唯"], + 1037: ["智", "王宫骑士团", "8月11日", "13", "149", "43", "A", "人族", "剑术、戏弄长者", "茅原实里"], + 1038: ["栞", "伊丽莎白牧场", "11月3日", "14", "153", "40", "A", "兽人族", "读书、散步", "小清水亚美"], + + 1040: ["碧", "森林守卫", "6月6日", "13", "158", "44", "AB", "精灵族", "交朋友的想象训练", "花泽香菜"], + + 1042: ["千歌", "慈乐之音", "6月3日", "17", "163", "46", "O", "人族", "各种乐器", "福原绫香"], + 1043: ["真琴", "自卫团", "8月9日", "17", "168", "54", "O", "兽人族", "做点心", "小松未可子"], + 1044: ["伊莉亚", "恶魔伪王国军", "5月5日", "???", "172", "50", "A", "魔族", "征服世界", "丹下樱"], + 1045: ["空花", "纯白之翼 兰德索尔分部", "11月19日", "18", "157", "49", "AB", "人族", "阅读小说", "长妻树里"], + 1046: ["珠希", "墨丘利财团", "3月1日", "18", "158", "48", "AB", "兽人族", "与猫咪玩耍", "沼仓爱美"], + 1047: ["纯", "王宫骑士团", "10月25日", "25", "171", "50", "A", "人族", "格斗技、入浴", "川澄绫子"], + 1048: ["美冬", "墨丘利财团", "11月11日", "20", "163", "49", "O", "人族", "佣兵等等的打工", "田所梓"], + 1049: ["静流", "拉比林斯", "10月24日", "18", "168", "54", "O", "人族", "所有家事", "天生目仁美"], + 1050: ["美咲", "月光学院", "1月3日", "11", "120", "22", "A", "魔族", "阅读流行杂志、搜集化妆品", "久野美咲"], + 1051: ["深月", "暮光流星群", "3月7日", "27", "166", "53", "A", "人族", "研究、实验", "三石琴乃"], + 1052: ["莉玛", "伊丽莎白牧场", "3月14日", "18", "150", "100", "A", "兽人族", "理毛、聊天", "德井青空"], + 1053: ["莫妮卡", "纯白之翼 兰德索尔分部", "7月28日", "18", "140", "33", "A", "人族", "逛糖果店", "辻亚由美"], + 1054: ["纺希", "慈乐之音", "9月7日", "14", "153", "45", "AB", "人族", "裁缝", "木户衣吹"], + 1055: ["步未", "纯白之翼 兰德索尔分部", "4月7日", "16", "155", "43", "O", "精灵族", "观察", "大关英里"], + 1056: ["流夏", "暮光流星群", "7月11日", "25", "167", "54", "B", "人族", "钓鱼", "佐藤利奈"], + 1057: ["吉塔", "???", "3月10日", "17", "156", "45", "O", "人族", "冒险、聊天", "金元寿子"], + 1058: ["贪吃佩可", "美食殿堂", "3月31日", "17", "156", "46", "O", "人族", "边走边吃、料理", "M·A·O"], + 1059: ["可可萝", "美食殿堂", "5月11日", "11", "140", "35", "B", "精灵族", "冥想、养育动植物", "伊藤美来"], + 1060: ["凯留", "美食殿堂", "9月2日", "14", "152", "39", "A", "兽人族", "和猫咪玩耍", "立花理香"], + 1061: ["矛依未", "???", "8月11日", "16", "148", "40", "O", "人族", "冒险、回忆故事", "潘惠美"], + + 1063: ["亚里莎", "???", "6月17日", "15", "155", "42", "O", "精灵族", "搜集漂亮的叶子", "优木加奈"], + + 1065: ["嘉夜", "龙族巢穴", "6月25日", "16", "156", "???", "B", "龙人族", "格斗技", "小市真琴"], + 1066: ["祈梨", "龙族巢穴", "9月29日", "13", "145", "???", "AB", "龙人族", "游戏", "藤田茜"], + + 1070: ["似似花", "???", "3月24日", "24", "149", "???", "O", "精灵族", "模仿、艺术欣赏", "井口裕香"], + 1071: ["克莉丝提娜", "王宫骑士团", "2月7日", "27", "165", "???", "O", "人族", "和强敌之间的竞争", "高桥智秋"], + + 1092: ["安", "???", "12月1日", "17", "156", "55", "AB", "人族", "读书", "日笠阳子"], + 1093: ["露", "???", "2月4日", "15", "144", "45", "O", "人族", "吃饭、睡觉", "古山贵实子"], + 1094: ["古蕾娅", "???", "11月3日", "17", "167", "67", "B", "半人半龙", "钢琴", "福原绫香"], + + 1097: ["雷姆", "???", "2月2日", "17", "154", "???", "???", "鬼族", "戏剧欣赏、诗和散文", "水濑祈"], + 1098: ["拉姆", "???", "2月2日", "17", "154", "???", "???", "鬼族", "读书", "村川梨衣"], + 1099: ["爱蜜莉雅", "???", "9月23日", "114", "164", "???", "???", "半精灵族", "帮帕克梳理毛发、念书", "高桥李依"], + + 1108: ["克萝依", "圣特蕾莎女子学院(好朋友社)", "8月7日", "17", "154", "42", "O", "精灵族", "飞镖", "种崎敦美"], + 1109: ["琪爱儿", "圣特蕾莎女子学院(好朋友社)", "9月15日", "16", "156", "46", "O", "人族", "跳舞、卡拉OK", "佐仓绫音"], + 1110: ["优妮", "圣特蕾莎女子学院(好朋友社)", "2月28日", "18", "142", "36", "O", "人族", "读书", "小原好美"], + + 1114: ["露娜", "???", "???", "???", "142", "28", "???", "人族", "找「朋友」之事", "小仓唯"], + + 1124: ["卯月(偶像大师)", "new generations", "4月24日", "17", "159", "45", "O", "人族", "和朋友打长电话", "大桥彩香"], + 1125: ["凛(偶像大师)", "new generations", "8月10日", "15", "165", "44", "B", "人族", "带狗散步", "福原绫香"], + 1126: ["未央(偶像大师)", "new generations", "12月1日", "15", "161", "46", "B", "人族", "购物", "原纱友里"], + } + # 数据来自兰德索尔图书馆 total_mana = {1:0, 2:960, 3:1920, 4:2880, 5:3840, 6:4800, 7:5760, 8:6720, 9:7680, 10:8640, 11:9600, 12:11040, 13:12480, 14:13920, 15:15360, 16:17200, 17:19440, 18:22080, 19:25120, 20:28560, 21:32400, 22:36640, 23:41280, 24:46320, 25:51760, 26:57600, 27:63840, 28:70480, 29:77520, 30:84960, 31:92800, 32:101840, 33:112080, 34:123520, 35:136160, 36:150000, 37:165040, 38:184080, 39:207120, 40:234160, 41:265200, 42:300240, 43:339280, 44:382320, 45:429760, 46:481600, 47:537840, 48:598480, 49:663520, 50:732960, 51:806800, 52:885040, 53:967680, 54:1053560, 55:1142640, 56:1234920, 57:1330400, 58:1429080, 59:1530960, 60:1636040, 61:1744320, 62:1855800, 63:1970480, 64:2088360, 65:2209440, 66:2333720, 67:2461200, 68:2591880, 69:2725760, 70:2862840, 71:3003120, 72:3146600, 73:3293280, 74:3443160, 75:3596240, 76:3752520, 77:3912000, 78:4074680, 79:4240560, 80:4409640, 81:4581920, 82:4757400, 83:4936080, 84:5117960, 85:5303040, 86:5491320, 87:5682800, 88:5877480, 89:6075360, 90:6276440, 91:6480720, 92:6688200, 93:6898880, 94:7112760, 95:7329840, 96:7550120, 97:7773600, 98:8000280, 99:8230160, 100:8463240, 101:8699520, 102:8939000, 103:9181680, 104:9427560, 105:9676640, 106:9928920, 107:10184400, 108:10443080, 109:10704960, 110:10970040, 111:11238320, 112:11509800, 113:11784480, 114:12062360, 115:12343440, 116:12627720, 117:12915200, 118:13205880, 119:13499760, 120:13796840, 121:14097120, 122:14400600, 123:14707280, 124:15017160, 125:15330240, 126:15646520, 127:15966000, 128:16288680, 129:16614560, 130:16943640, 131:17275920, 132:17611400, 133:17950080, 134:18291960, 135:18637040, 136:18985320, 137:19336800, 138:19691480, 139:20049360, 140:20410440, 141:20774720, 142:21142200, 143:21512880, 144:21886760, 145:22263840, 146:22644120, 147:23027600, 148:23414280, 149:23804160, 150:24197240, 151:24593520, 152:24993000, 153:25395680, 154:25801560, 155:26210640, 156:26622920, 157:27038400, 158:27457080, 159:27878960, 160:28304040, 161:28732320, 162:29163800, 163:29598480, 164:30036360, 165:30477440, 166:30921720, 167:31369200, 168:31819880, 169:32273760} diff --git a/kokkoro/modules/priconne/chara.py b/kokkoro/modules/priconne/chara.py index 9a3e722..466669d 100644 --- a/kokkoro/modules/priconne/chara.py +++ b/kokkoro/modules/priconne/chara.py @@ -95,7 +95,7 @@ def is_npc(id_): if id_ in UnavailableChara: return True else: - return not ((1000 < id_ < 1200) or (1800 < id_ < 1900)) + return not ((1000 < id_ < 1200) or (1700 < id_ < 1900)) def gen_team_pic(team, size=64, star_slot_verbose=True): num = len(team) diff --git a/kokkoro/modules/priconne/guess/pcr_avatar_guess.py b/kokkoro/modules/priconne/guess/pcr_avatar_guess.py index ffbc03e..23ce58f 100644 --- a/kokkoro/modules/priconne/guess/pcr_avatar_guess.py +++ b/kokkoro/modules/priconne/guess/pcr_avatar_guess.py @@ -16,7 +16,9 @@ ONE_TURN_TIME = 20 DB_PATH = os.path.expanduser(f'~/.kokkoro/pcr_avatar_guess_winning_counter.db') BLACKLIST_ID = [ - 1072, 1908, 4031, 9000, 1000, + 1000, # unknow chara + 1072, 1900, 1908, 1909, 1910, 1911, 1914, 1915, 1916, 1917, 1918, 1919, 1920, + 4031, 9000, # npc 9601, 9602, 9603, 9604, # horse ] diff --git a/kokkoro/modules/priconne/guess/pcr_desc_guess.py b/kokkoro/modules/priconne/guess/pcr_desc_guess.py index 15ea3c1..2ee7c57 100644 --- a/kokkoro/modules/priconne/guess/pcr_desc_guess.py +++ b/kokkoro/modules/priconne/guess/pcr_desc_guess.py @@ -5,7 +5,7 @@ import kokkoro import os, random -from .. import _chara_data +from .. import _pcr_data from .guess_helper import WinnerJudger, WinningCounter @@ -16,17 +16,6 @@ winner_judger = WinnerJudger() - - -def get_cqcode(chara_id): - dir_path = os.path.join(os.path.expanduser(hoshino.config.RES_DIR), 'img', 'priconne', 'unit') - if not os.path.exists(dir_path): - os.makedirs(dir_path) - c = chara.fromid(chara_id) - cqcode = '' if not c.icon.exist else c.icon.cqcode - return c.name, cqcode - - @sv.on_fullmatch(('猜描述排行榜', '猜描述群排行')) async def description_guess_group_ranking(bot: KokkoroBot, ev: EventInterface): members = ev.get_members_in_group() @@ -63,10 +52,10 @@ async def description_guess(bot: KokkoroBot, ev: EventInterface): desc_suffix = ['', '', '', '', 'cm', 'kg', '', '', '', ''] index_list = list(range(1,10)) random.shuffle(index_list) - chara_id_list = list(_chara_data.CHARA_DATA.keys()) + chara_id_list = list(_pcr_data.CHARA_DATA.keys()) random.shuffle(chara_id_list) chara_id = chara_id_list[0] - chara_desc_list = _chara_data.CHARA_DATA[chara_id] + chara_desc_list = _pcr_data.CHARA_DATA[chara_id] winner_judger.set_result(gid, chara_id) # init group_hints[gid] = { diff --git a/kokkoro/modules/priconne/query/query.py b/kokkoro/modules/priconne/query/query.py index d8ef7eb..a57c532 100644 --- a/kokkoro/modules/priconne/query/query.py +++ b/kokkoro/modules/priconne/query/query.py @@ -3,12 +3,15 @@ from kokkoro.common_interface import EventInterface from . import sv -p1 = R.img('priconne/quick/r16-5-tw-0.png') -p2 = R.img('priconne/quick/r16-5-tw-1.png') -p4 = R.img('priconne/quick/r17-5-jp-1.png') -p5 = R.img('priconne/quick/r17-5-jp-2.png') -p6 = R.img('priconne/quick/r17-5-jp-3.png') -cn_rank = R.img('priconne/quick/r10-3.jpg') +tw_1 = R.img('priconne/quick/r17-4-1-tw.png') +tw_2 = R.img('priconne/quick/r17-4-2-tw.png') +jp_1 = R.img('priconne/quick/r18-3-1-jp.png') +jp_2 = R.img('priconne/quick/r18-3-2-jp.png') +jp_3 = R.img('priconne/quick/r18-3-3-jp.png') +cn_1 = R.img('priconne/quick/r10-4-1-cn.jpg') +cn_2 = R.img('priconne/quick/r10-4-2-cn.jpg') +cn_3 = R.img('priconne/quick/r10-4-3-cn.jpg') + @sv.on_rex(r'^(\*?([日台国陆b])服?([前中后]*)卫?)?rank(表|推荐|指南)?$') async def rank_sheet(bot, ev:EventInterface): @@ -23,24 +26,26 @@ async def rank_sheet(bot, ev:EventInterface): '\n※表格仅供参考,升r有风险,强化需谨慎\n※一切以会长要求为准——', ] if is_jp: - msg.append('※不定期搬运自图中Q群\n※广告为原作者推广,与本bot无关\nR17-5 rank表:') + msg.append('※不定期搬运自图中Q群\n※广告为原作者推广,与本bot无关\nrank表:') await bot.kkr_send(ev, '\n'.join(msg), at_sender=True) pos = match.group(3) if not pos or '前' in pos: - await bot.kkr_send(ev, p4, at_sender=True) + await bot.kkr_send(ev, jp_1) if not pos or '中' in pos: - await bot.kkr_send(ev, p5, at_sender=True) + await bot.kkr_send(ev, jp_2) if not pos or '后' in pos: - await bot.kkr_send(ev, p6, at_sender=True) + await bot.kkr_send(ev, jp_3) elif is_tw: - msg.append(f'※不定期搬运自漪夢奈特\n※油管频道有介绍视频及原文档\nR16-5 rank表:\n') + msg.append(f'※不定期搬运自漪夢奈特\n※油管频道有介绍视频及原文档\nrank表:\n') await bot.kkr_send(ev, '\n'.join(msg), at_sender=True) - await bot.kkr_send(ev, p1) - await bot.kkr_send(ev, p2) + await bot.kkr_send(ev, tw_1) + await bot.kkr_send(ev, tw_2) elif is_cn: await bot.kkr_send(ev, '\n'.join(msg), at_sender=True) - await bot.kkr_send(ev, cn_rank) + await bot.kkr_send(ev, cn_1) + await bot.kkr_send(ev, cn_2) + await bot.kkr_send(ev, cn_3) @sv.on_fullmatch(('jjc', 'JJC', 'JJC作业', 'JJC作业网', 'JJC数据库', 'jjc作业', 'jjc作业网', 'jjc数据库')) async def say_arina_database(bot, ev): diff --git a/kokkoro/modules/weibo/weibo.py b/kokkoro/modules/weibo/weibo.py index 1914ec2..bde6460 100644 --- a/kokkoro/modules/weibo/weibo.py +++ b/kokkoro/modules/weibo/weibo.py @@ -22,7 +22,8 @@ def __init__(self, config): self.received_weibo_ids = [] self.last_5_weibos = [] self.__recent = False - asyncio.run(self._async_init()) + self._loop = asyncio.new_event_loop() + self._loop.run_until_complete(self._async_init()) async def _async_init(self): self.__init = True diff --git a/kokkoro/platform_patch.py b/kokkoro/platform_patch.py index a52f106..9d7a211 100644 --- a/kokkoro/platform_patch.py +++ b/kokkoro/platform_patch.py @@ -1,3 +1,4 @@ +import kokkoro from kokkoro import config def process_mention_me(raw_msg:str): @@ -25,6 +26,47 @@ def preprocess_message(ev) -> bool: ev.set_content(processed_msg) return to_me +PLATFORM_FIELD = '__kkr_platform__' + +def discord(func): + func.__setattr__(PLATFORM_FIELD, ['discord']) + return func + +def tomon(func): + func.__setattr__(PLATFORM_FIELD, ['tomon']) + return func + +def telegram(func): + func.__setattr__(PLATFORM_FIELD, ['telegram']) + return func + +def platform(pl): + if type(pl) == str: + pl = [pl] + def deco(func): + func.__setattr__(PLATFORM_FIELD, pl) + return func + return deco + +def is_supported(func): + try: + supported_platforms = func.__getattribute__(PLATFORM_FIELD) + except AttributeError as e: + #supported_platforms = "*" + return True + platform = config.BOT_TYPE + if platform in supported_platforms: + return True + return False + +def check_platform(on_deco): + def wrapper(sv_func): + if is_supported(sv_func): + return on_deco(sv_func) + else: + kokkoro.logger.warning(f'`{sv_func.__name__}` isn\'t supported in current platform') + return sv_func + return wrapper \ No newline at end of file diff --git a/kokkoro/service.py b/kokkoro/service.py index 556ac8b..12dad71 100644 --- a/kokkoro/service.py +++ b/kokkoro/service.py @@ -6,12 +6,13 @@ from collections import defaultdict import kokkoro -from kokkoro.typing import * from kokkoro import logger from kokkoro import priv, log, typing, trigger +from kokkoro.typing import * from kokkoro.common_interface import * from kokkoro.bot import get_scheduler, get_bot from kokkoro.util import join_iterable +from kokkoro.platform_patch import check_platform # service management _loaded_services: Dict[str, "Service"] = {} # {name: service} @@ -190,6 +191,7 @@ def get_enable_groups(self) -> dict: def on_prefix(self, prefix, only_to_me=False) -> Callable: if isinstance(prefix, str): prefix = (prefix, ) + @check_platform def deco(func) -> Callable: sf = ServiceFunc(self, func, only_to_me) for p in prefix: @@ -200,6 +202,7 @@ def deco(func) -> Callable: def on_fullmatch(self, word, only_to_me=False) -> Callable: if isinstance(word, str): word = (word, ) + @check_platform def deco(func) -> Callable: @wraps(func) async def wrapper(bot: KokkoroBot, ev: EventInterface): @@ -226,6 +229,7 @@ async def wrapper(bot: KokkoroBot, ev: EventInterface): def on_suffix(self, suffix, only_to_me=False) -> Callable: if isinstance(suffix, str): suffix = (suffix, ) + @check_platform def deco(func) -> Callable: sf = ServiceFunc(self, func, only_to_me) for s in suffix: @@ -236,6 +240,7 @@ def deco(func) -> Callable: def on_keyword(self, keywords, only_to_me=False) -> Callable: if isinstance(keywords, str): keywords = (keywords, ) + @check_platform def deco(func) -> Callable: sf = ServiceFunc(self, func, only_to_me) for kw in keywords: @@ -246,6 +251,7 @@ def deco(func) -> Callable: def on_rex(self, rex: Union[str, re.Pattern], only_to_me=False) -> Callable: if isinstance(rex, str): rex = re.compile(rex) + @check_platform def deco(func) -> Callable: sf = ServiceFunc(self, func, only_to_me) trigger.rex.add(rex, sf) @@ -261,6 +267,7 @@ def scheduled_job(self, *args, **kwargs) -> Callable: else: kwargs.setdefault('misfire_grace_time', 60) + @check_platform def deco(func: Callable) -> Callable: kokkoro.logger.debug(f'{func.__name__} registered to scheduler') @wraps(func) diff --git a/kokkoro/util.py b/kokkoro/util.py index a9d1c25..e6bbb82 100644 --- a/kokkoro/util.py +++ b/kokkoro/util.py @@ -13,6 +13,7 @@ from matplotlib import pyplot as plt from PIL import Image from io import BytesIO + import itertools import kokkoro diff --git a/requirements.txt b/requirements.txt index 749d96b..b8d4c8b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -16,6 +16,6 @@ quart>=0.13.0 APScheduler>=2.1.2 pytz>=2020.1 zhconv>=1.4.0 - +wechatpy==2.0.0a1 nest-asyncio>=1.4.0 tomon-sdk==0.1.6 \ No newline at end of file