Merge branch 'CMHopeSunshine:Bot' into Bot

This commit is contained in:
Mmx 2023-05-17 14:12:12 +08:00 committed by GitHub
commit 5cc8901dec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
23 changed files with 6117 additions and 2333 deletions

View File

@ -9,15 +9,15 @@ assignees: ''
### 确认 ### 确认
- 我的Bot版本已更新到最新且已尝试使用`poetry install`更新依赖库 - 我的Bot版本已更新到最新且已尝试使用`nb paimon install`更新依赖库
- 我已查阅[文档-常见问题](https://docs.paimon.cherishmoon.fun/question.html),无相关解决方案 - 我已查阅[文档-常见问题](https://docs.paimon.cherishmoon.fun/question.html),无相关解决方案
- 我已确认[issue](https://github.com/CMHopeSunshine/LittlePaimon/issues)中没有类似的问题或仍然得不到解决 - 我已确认[issue](https://github.com/CMHopeSunshine/LittlePaimon/issues)中没有类似的问题或仍然得不到解决
### 环境信息 ### 环境信息
- 系统版本: Windows10 - 系统版本: Windows10(example)
- Python版本: 3.9.10 - Python版本: 3.9.10(example)
- Nonebot2版本: 2.0.0rc2 - Nonebot2版本: 2.0.0rc4(example)
### 问题描述 ### 问题描述

View File

@ -18,16 +18,24 @@ class ConfigManager:
:param value: 新配置值 :param value: 新配置值
""" """
if config_name not in cls.config.dict(by_alias=True).keys(): if config_name not in cls.config.dict(by_alias=True).keys():
return f'没有配置项为{config_name}' return f"没有配置项为{config_name}"
if '启用' in config_name or '开关' in config_name or config_name in {'自动接受好友请求', '自动接受群邀请'}: if (
if value not in ['', '', 'true', 'false', 'on', 'off']: "启用" in config_name
return '参数错误' or "开关" in config_name
value = value in ['', 'true', 'on'] or config_name in {"自动接受好友请求", "自动接受群邀请", "绑定二维码以链接形式发送"}
elif config_name != 'CookieWeb地址' and not value.isdigit(): ):
return '配置项不合法,必须为数字' if value not in ["", "", "true", "false", "on", "off"]:
cls.config.update(config_name=value) return "参数错误"
value = value in ["", "true", "on"]
elif config_name == "重启时修改群名片群列表":
return "该配置项暂时不支持此方法修改,请在后台管理页面进行更改"
elif config_name not in ["CookieWeb地址", "Web端管理员密码", "Web端token密钥", "github资源地址"]:
if not value.isdigit():
return "配置项不合法,必须为数字"
value = int(value)
cls.config.update(**{config_name: value})
cls.save() cls.save()
return f'成功设置{config_name}{value}' return f"成功设置{config_name}{value}"
@classmethod @classmethod
def save(cls): def save(cls):

View File

@ -9,7 +9,7 @@ class ConfigModel(BaseModel):
qrcode_bind_use_url: bool = Field(False, alias='绑定二维码以链接形式发送') qrcode_bind_use_url: bool = Field(False, alias='绑定二维码以链接形式发送')
img_use_cache: bool = Field(True, alias='图片资源缓存开关') img_use_cache: bool = Field(True, alias='图片资源缓存开关')
reboot_card_enable: List[int] = Field([], alias='启用重启时修改群名片群列表') reboot_card_enable: List[int] = Field([], alias='重启时修改群名片群列表')
sim_gacha_cd_group: int = Field(30, alias='模拟抽卡群冷却') sim_gacha_cd_group: int = Field(30, alias='模拟抽卡群冷却')
sim_gacha_cd_member: int = Field(60, alias='模拟抽卡群员冷却') sim_gacha_cd_member: int = Field(60, alias='模拟抽卡群员冷却')

View File

@ -326,6 +326,11 @@
"夜阑", "夜阑",
"叶兰" "叶兰"
], ],
"10000061": [
"绮良良",
"草猫",
"猫又"
],
"10000065": [ "10000065": [
"久岐忍", "久岐忍",
"忍者", "忍者",
@ -407,10 +412,11 @@
"米卡" "米卡"
], ],
"10000081": [ "10000081": [
"白术" "卡维"
], ],
"10000082": [ "10000082": [
"卡维" "白术",
"白师傅"
] ]
}, },
"武器": { "武器": {

View File

@ -2,11 +2,11 @@
"Name": { "Name": {
"UI_RelicIcon_10000_2": "初学者之羽", "UI_RelicIcon_10000_2": "初学者之羽",
"UI_RelicIcon_10000_4": "初学者之花", "UI_RelicIcon_10000_4": "初学者之花",
"UI_RelicIcon_10001_5": "感别之冠", "UI_RelicIcon_10001_5": "逐光之石",
"UI_RelicIcon_10001_1": "故人之心", "UI_RelicIcon_10001_1": "异国之盏",
"UI_RelicIcon_10001_2": "归乡之羽", "UI_RelicIcon_10001_2": "归乡之羽",
"UI_RelicIcon_10001_3": "逐光之石", "UI_RelicIcon_10001_3": "感别之冠",
"UI_RelicIcon_10001_4": "异国之盏", "UI_RelicIcon_10001_4": "故人之心",
"UI_RelicIcon_10002_1": "勇士的壮行", "UI_RelicIcon_10002_1": "勇士的壮行",
"UI_RelicIcon_10002_2": "勇士的期许", "UI_RelicIcon_10002_2": "勇士的期许",
"UI_RelicIcon_10002_3": "勇士的冠冕", "UI_RelicIcon_10002_3": "勇士的冠冕",
@ -211,7 +211,17 @@
"UI_RelicIcon_15028_2": "谢落的筵席", "UI_RelicIcon_15028_2": "谢落的筵席",
"UI_RelicIcon_15028_3": "紫晶的花冠", "UI_RelicIcon_15028_3": "紫晶的花冠",
"UI_RelicIcon_15028_4": "月女的华彩", "UI_RelicIcon_15028_4": "月女的华彩",
"UI_RelicIcon_15028_5": "凝结的时刻" "UI_RelicIcon_15028_5": "凝结的时刻",
"UI_RelicIcon_15029_1": "勇者们的茶会",
"UI_RelicIcon_15029_2": "坏巫师的羽杖",
"UI_RelicIcon_15029_3": "恶龙的单片镜",
"UI_RelicIcon_15029_4": "旅途中的鲜花",
"UI_RelicIcon_15029_5": "水仙的时时刻刻",
"UI_RelicIcon_15030_1": "无边酣乐之筵",
"UI_RelicIcon_15030_2": "琦色灵彩之羽",
"UI_RelicIcon_15030_3": "灵光明烁之心",
"UI_RelicIcon_15030_4": "灵光源起之蕊",
"UI_RelicIcon_15030_5": "久远花落之时"
}, },
"Mapping": { "Mapping": {
"冒险家之花": "冒险家", "冒险家之花": "冒险家",
@ -418,7 +428,17 @@
"谢落的筵席": "乐园遗落之花", "谢落的筵席": "乐园遗落之花",
"紫晶的花冠": "乐园遗落之花", "紫晶的花冠": "乐园遗落之花",
"月女的华彩": "乐园遗落之花", "月女的华彩": "乐园遗落之花",
"凝结的时刻": "乐园遗落之花" "凝结的时刻": "乐园遗落之花",
"勇者们的茶会": "水仙之梦",
"坏巫师的羽杖": "水仙之梦",
"恶龙的单片镜": "水仙之梦",
"旅途中的鲜花": "水仙之梦",
"水仙的时时刻刻": "水仙之梦",
"无边酣乐之筵": "花海甘露之光",
"琦色灵彩之羽": "花海甘露之光",
"灵光明烁之心": "花海甘露之光",
"灵光源起之蕊": "花海甘露之光",
"久远花落之时": "花海甘露之光"
}, },
"Info": { "Info": {
"冒险家": { "冒险家": {

View File

@ -2190,5 +2190,31 @@
"10805": "Skill_E_Mika_01" "10805": "Skill_E_Mika_01"
}, },
"SideIconName": "UI_AvatarIcon_Side_Mika" "SideIconName": "UI_AvatarIcon_Side_Mika"
},
"10000081": {
"SkillOrder": [
10801,
10802,
10805
],
"Skills": {
"10801": "Skill_A_04",
"10802": "Skill_S_Kaveh_01",
"10805": "Skill_E_Kaveh_01"
},
"SideIconName": "UI_AvatarIcon_Side_Kaveh"
},
"10000082": {
"SkillOrder": [
10801,
10802,
10805
],
"Skills": {
"10801": "Skill_A_Catalyst_MD",
"10802": "Skill_S_Baizhuer_01",
"10805": "Skill_E_Baizhuer_01"
},
"SideIconName": "UI_AvatarIcon_Side_Baizhuer"
} }
} }

View File

@ -326,6 +326,12 @@
"10801": "普通攻击·西风枪术·镝传", "10801": "普通攻击·西风枪术·镝传",
"10802": "星霜的流旋", "10802": "星霜的流旋",
"10805": "苍翎的颂愿", "10805": "苍翎的颂愿",
"10811": "普通攻击·旋规设矩",
"10812": "画则巧施",
"10815": "繁绘隅穹",
"10821": "普通攻击·金匮针解",
"10822": "太素诊要",
"10825": "愈气全形论",
"20001": "风魔炮", "20001": "风魔炮",
"20002": "风魔炮", "20002": "风魔炮",
"20011": "飞行挑战 - 前冲", "20011": "飞行挑战 - 前冲",
@ -419,7 +425,6 @@
"10384": "抓猫扔鱼", "10384": "抓猫扔鱼",
"100540": "普通攻击·故去的追忆", "100540": "普通攻击·故去的追忆",
"100541": "旅行者五连击(火)", "100541": "旅行者五连击(火)",
"100542": "旅行者五连击(水)",
"100543": "普通攻击·异邦铁风", "100543": "普通攻击·异邦铁风",
"100544": "旅行者五连击(冰)", "100544": "旅行者五连击(冰)",
"100545": "普通攻击·异邦岩锋", "100545": "普通攻击·异邦岩锋",
@ -427,7 +432,6 @@
"100547": "普通攻击·异邦草翦", "100547": "普通攻击·异邦草翦",
"100550": "普通攻击·故去的追忆", "100550": "普通攻击·故去的追忆",
"100551": "旅行者五连击(火)", "100551": "旅行者五连击(火)",
"100552": "旅行者五连击(水)",
"100553": "普通攻击·异邦铁风", "100553": "普通攻击·异邦铁风",
"100554": "旅行者五连击(冰)", "100554": "旅行者五连击(冰)",
"100555": "普通攻击·异邦岩锋", "100555": "普通攻击·异邦岩锋",
@ -483,14 +487,14 @@
"5047010": "枫原万叶空中攻击", "5047010": "枫原万叶空中攻击",
"5048010": "烟绯空中攻击", "5048010": "烟绯空中攻击",
"5049010": "宵宫空中攻击", "5049010": "宵宫空中攻击",
"5050010": "测试角色50空中攻击", "5050010": "托马空中攻击",
"5051010": "优菈空中攻击", "5051010": "优菈空中攻击",
"5052010": "雷电将军空中攻击", "5052010": "雷电将军空中攻击",
"5053010": "早柚空中攻击", "5053010": "早柚空中攻击",
"5054010": "珊瑚宫心海空中攻击", "5054010": "珊瑚宫心海空中攻击",
"5055010": "五郎空中攻击", "5055010": "五郎空中攻击",
"5056010": "九条裟罗空中攻击", "5056010": "九条裟罗空中攻击",
"5058010": "测试角色空中攻击", "5058010": "八重神子空中攻击",
"5057010": "荒泷一斗空中攻击", "5057010": "荒泷一斗空中攻击",
"5059010": "鹿野院平藏空中攻击", "5059010": "鹿野院平藏空中攻击",
"5060010": "夜兰空中攻击", "5060010": "夜兰空中攻击",
@ -508,11 +512,13 @@
"5073010": "纳西妲空中攻击", "5073010": "纳西妲空中攻击",
"5074010": "莱依拉空中攻击", "5074010": "莱依拉空中攻击",
"5075010": "流浪者空中攻击", "5075010": "流浪者空中攻击",
"5076010": "空中攻击", "5076010": "珐露珊空中攻击",
"5077010": "瑶瑶空中攻击", "5077010": "瑶瑶空中攻击",
"5078010": "艾尔海森空中攻击", "5078010": "艾尔海森空中攻击",
"5079010": "迪希雅空中攻击", "5079010": "迪希雅空中攻击",
"5080010": "米卡空中攻击" "5080010": "米卡空中攻击",
"5081010": "卡维空中攻击",
"5082010": "白术空中攻击"
}, },
"Icon": { "Icon": {
"10001": "", "10001": "",
@ -841,6 +847,12 @@
"10801": "Skill_A_03", "10801": "Skill_A_03",
"10802": "Skill_S_Mika_01", "10802": "Skill_S_Mika_01",
"10805": "Skill_E_Mika_01", "10805": "Skill_E_Mika_01",
"10811": "Skill_A_04",
"10812": "Skill_S_Kaveh_01",
"10815": "Skill_E_Kaveh_01",
"10821": "Skill_A_Catalyst_MD",
"10822": "Skill_S_Baizhuer_01",
"10825": "Skill_E_Baizhuer_01",
"20001": "Skill_A_Dvalin_AirGun", "20001": "Skill_A_Dvalin_AirGun",
"20002": "Skill_A_Dvalin_AirGun", "20002": "Skill_A_Dvalin_AirGun",
"20011": "Btn_FlightSprint", "20011": "Btn_FlightSprint",
@ -934,7 +946,6 @@
"10384": "Btn_Recon_Bait", "10384": "Btn_Recon_Bait",
"100540": "Skill_A_01", "100540": "Skill_A_01",
"100541": "Skill_A_01", "100541": "Skill_A_01",
"100542": "Skill_A_01",
"100543": "Skill_A_01", "100543": "Skill_A_01",
"100544": "Skill_A_01", "100544": "Skill_A_01",
"100545": "Skill_A_01", "100545": "Skill_A_01",
@ -942,7 +953,6 @@
"100547": "Skill_A_01", "100547": "Skill_A_01",
"100550": "Skill_A_01", "100550": "Skill_A_01",
"100551": "Skill_A_01", "100551": "Skill_A_01",
"100552": "Skill_A_01",
"100553": "Skill_A_01", "100553": "Skill_A_01",
"100554": "Skill_A_01", "100554": "Skill_A_01",
"100555": "Skill_A_01", "100555": "Skill_A_01",
@ -1027,6 +1037,8 @@
"5077010": "Skill_A_03", "5077010": "Skill_A_03",
"5078010": "Skill_A_01", "5078010": "Skill_A_01",
"5079010": "Skill_A_04", "5079010": "Skill_A_04",
"5080010": "Skill_A_03" "5080010": "Skill_A_03",
"5081010": "Skill_A_04",
"5082010": "Skill_A_Catalyst_MD"
} }
} }

View File

@ -407,7 +407,19 @@
"803": "游击的心得", "803": "游击的心得",
"804": "晴霜的祝念", "804": "晴霜的祝念",
"805": "引示的铃箭", "805": "引示的铃箭",
"806": "依随的策援" "806": "依随的策援",
"811": "高门的谒礼",
"812": "御驿的径迹",
"813": "金塔的香献",
"814": "百柱的酣宴",
"815": "圣古的库藏",
"816": "天园的理想",
"821": "呿吟至微",
"822": "动静精明",
"823": "八正定气",
"824": "法古观冥",
"825": "盈虚藏象",
"826": "真邪合离"
}, },
"Icon": { "Icon": {
"21": "UI_Talent_S_Ayaka_01", "21": "UI_Talent_S_Ayaka_01",
@ -817,6 +829,18 @@
"803": "UI_Talent_U_Mika_01", "803": "UI_Talent_U_Mika_01",
"804": "UI_Talent_S_Mika_03", "804": "UI_Talent_S_Mika_03",
"805": "UI_Talent_U_Mika_02", "805": "UI_Talent_U_Mika_02",
"806": "UI_Talent_S_Mika_04" "806": "UI_Talent_S_Mika_04",
"811": "UI_Talent_S_Kaveh_01",
"812": "UI_Talent_S_Kaveh_02",
"813": "UI_Talent_U_Kaveh_02",
"814": "UI_Talent_S_Kaveh_03",
"815": "UI_Talent_U_Kaveh_01",
"816": "UI_Talent_S_Kaveh_04",
"821": "UI_Talent_S_Baizhuer_01",
"822": "UI_Talent_S_Baizhuer_02",
"823": "UI_Talent_U_Baizhuer_01",
"824": "UI_Talent_S_Baizhuer_03",
"825": "UI_Talent_U_Baizhuer_02",
"826": "UI_Talent_S_Baizhuer_04"
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -652,6 +652,22 @@
"生命值": 1, "生命值": 1,
"元素充能效率": 1 "元素充能效率": 1
} }
},
"白术": {
"常规": {
"生命值": 1,
"元素充能效率": 1,
"元素精通": 1
}
},
"卡维": {
"常规": {
"攻击力": 1,
"暴击率": 1,
"暴击伤害": 1,
"元素精通": 1,
"元素充能效率": 1
}
} }
}, },
"Talent": { "Talent": {
@ -926,6 +942,14 @@
"米卡": [ "米卡": [
2, 2,
1 1
],
"白术": [
2,
1
],
"卡维": [
2,
1
] ]
} }
} }

View File

@ -123,6 +123,7 @@
"807607555": "天空之卷", "807607555": "天空之卷",
"1455107995": "四风原典", "1455107995": "四风原典",
"693354267": "尘世之锁", "693354267": "尘世之锁",
"4007372867": "碧落之珑",
"1890163363": "不灭月华", "1890163363": "不灭月华",
"310247243": "神乐之真意", "310247243": "神乐之真意",
"1201790667": "千夜浮梦", "1201790667": "千夜浮梦",
@ -290,6 +291,7 @@
"天空之卷": "法器", "天空之卷": "法器",
"四风原典": "法器", "四风原典": "法器",
"尘世之锁": "法器", "尘世之锁": "法器",
"碧落之珑": "法器",
"不灭月华": "法器", "不灭月华": "法器",
"神乐之真意": "法器", "神乐之真意": "法器",
"千夜浮梦": "法器", "千夜浮梦": "法器",
@ -452,6 +454,7 @@
"天空之卷": "UI_EquipIcon_Catalyst_Dvalin", "天空之卷": "UI_EquipIcon_Catalyst_Dvalin",
"四风原典": "UI_EquipIcon_Catalyst_Fourwinds", "四风原典": "UI_EquipIcon_Catalyst_Fourwinds",
"尘世之锁": "UI_EquipIcon_Catalyst_Kunwu", "尘世之锁": "UI_EquipIcon_Catalyst_Kunwu",
"碧落之珑": "UI_EquipIcon_Catalyst_Morax",
"不灭月华": "UI_EquipIcon_Catalyst_Kaleido", "不灭月华": "UI_EquipIcon_Catalyst_Kaleido",
"神乐之真意": "UI_EquipIcon_Catalyst_Narukami", "神乐之真意": "UI_EquipIcon_Catalyst_Narukami",
"千夜浮梦": "UI_EquipIcon_Catalyst_Ayus", "千夜浮梦": "UI_EquipIcon_Catalyst_Ayus",

View File

@ -19,7 +19,8 @@
"旅行者风", "旅行者风",
"旅行者岩", "旅行者岩",
"旅行者雷", "旅行者雷",
"旅行者草" "旅行者草",
"绮良良"
], ],
"法器": [ "法器": [
"丽莎", "丽莎",
@ -161,7 +162,8 @@
"纳西妲", "纳西妲",
"瑶瑶", "瑶瑶",
"艾尔海森", "艾尔海森",
"旅行者草" "旅行者草",
"绮良良"
] ]
} }
}, },

View File

@ -10,7 +10,8 @@ from nonebot.params import CommandArg, ArgPlainText
from nonebot.adapters.onebot.v11 import Bot, Message, MessageEvent, PrivateMessageEvent, FriendRequestEvent, \ from nonebot.adapters.onebot.v11 import Bot, Message, MessageEvent, PrivateMessageEvent, FriendRequestEvent, \
GroupRequestEvent, \ GroupRequestEvent, \
RequestEvent, NoticeEvent, \ RequestEvent, NoticeEvent, \
GroupIncreaseNoticeEvent, FriendAddNoticeEvent, GroupMessageEvent GroupIncreaseNoticeEvent, FriendAddNoticeEvent, GroupMessageEvent, \
ActionFailed
from nonebot.typing import T_State from nonebot.typing import T_State
from LittlePaimon.config import config as bot_config from LittlePaimon.config import config as bot_config
@ -105,7 +106,10 @@ async def _(event: PrivateMessageEvent, bot: Bot, state: T_State, id_: str = Arg
@requests.handle() @requests.handle()
async def _(bot: Bot, event: FriendRequestEvent): async def _(bot: Bot, event: FriendRequestEvent):
done[f'add_friend_{event.user_id}'] = datetime.datetime.now() done[f'add_friend_{event.user_id}'] = datetime.datetime.now()
user_info = await bot.get_stranger_info(user_id=event.user_id) try:
user_info = await bot.get_stranger_info(user_id=event.user_id)
except ActionFailed:
user_info = {'nickname': '未知'}
base_msg = f'{user_info["nickname"]}({event.user_id})请求添加好友,验证信息为"{event.comment or ""}"' base_msg = f'{user_info["nickname"]}({event.user_id})请求添加好友,验证信息为"{event.comment or ""}"'
if bot_config.auto_add_friend: if bot_config.auto_add_friend:
await asyncio.sleep(random.randint(10, 20)) await asyncio.sleep(random.randint(10, 20))
@ -121,8 +125,14 @@ async def _(bot: Bot, event: FriendRequestEvent):
@requests.handle() @requests.handle()
async def _(bot: Bot, event: GroupRequestEvent): async def _(bot: Bot, event: GroupRequestEvent):
done[f'add_group_{event.group_id}'] = datetime.datetime.now() done[f'add_group_{event.group_id}'] = datetime.datetime.now()
user_info = await bot.get_stranger_info(user_id=event.user_id) try:
group_info = await bot.get_group_info(group_id=event.group_id) user_info = await bot.get_stranger_info(user_id=event.user_id)
except ActionFailed:
user_info = {'nickname': '未知'}
try:
group_info = await bot.get_group_info(group_id=event.group_id)
except ActionFailed:
group_info = {'group_name': '未知'}
base_msg = f'{user_info["nickname"]}({event.user_id})邀请{NICKNAME}加入群{group_info["group_name"]}({event.group_id})' base_msg = f'{user_info["nickname"]}({event.user_id})邀请{NICKNAME}加入群{group_info["group_name"]}({event.group_id})'
if bot_config.auto_add_group or event.user_id in SUPERUSERS: if bot_config.auto_add_group or event.user_id in SUPERUSERS:
await asyncio.sleep(random.randint(10, 20)) await asyncio.sleep(random.randint(10, 20))

View File

@ -108,7 +108,7 @@ async def _(event: MessageEvent, player=CommandPlayer(1)):
await update_log.send(f'开始为UID{player[0].uid}更新抽卡记录,请稍候...') await update_log.send(f'开始为UID{player[0].uid}更新抽卡记录,请稍候...')
try: try:
result = await get_gacha_log_data(player[0].user_id, player[0].uid) result = await get_gacha_log_data(player[0].user_id, player[0].uid)
await update_log.send(result or 'Stoken已失效请重新绑定之后再更新', at_sender=True) await update_log.send(result or 'Stoken已失效请重新绑定或刷新cookie之后再更新', at_sender=True)
except Exception as e: except Exception as e:
logger.info('原神抽卡记录', f'➤➤更新抽卡记录时出现错误:<r>{e}</r>') logger.info('原神抽卡记录', f'➤➤更新抽卡记录时出现错误:<r>{e}</r>')
await update_log.send(f'更新抽卡记录时出现错误:{e}') await update_log.send(f'更新抽卡记录时出现错误:{e}')

View File

@ -86,7 +86,7 @@ def gacha_log_to_UIGF(user_id: str, uid: str) -> Tuple[bool, str, Optional[Path]
""" """
data, state = load_history_info(user_id, uid) data, state = load_history_info(user_id, uid)
if not state: if not state:
return False, f'UID{uid}还没有抽卡记录数据,请先更新', None return False, f'UID{uid}还没有抽卡记录数据,可使用命令[更新抽卡记录]更新', None
logger.info('原神抽卡记录', '', {'用户': user_id, 'UID': uid}, '导出抽卡记录', True) logger.info('原神抽卡记录', '', {'用户': user_id, 'UID': uid}, '导出抽卡记录', True)
save_path = Path() / 'data' / 'LittlePaimon' / 'user_data' / 'gacha_log_data' / f'gacha_log_UIGF-{user_id}-{uid}.json' save_path = Path() / 'data' / 'LittlePaimon' / 'user_data' / 'gacha_log_data' / f'gacha_log_UIGF-{user_id}-{uid}.json'
uigf_dict = { uigf_dict = {
@ -159,7 +159,7 @@ async def get_gacha_log_data(user_id: str, uid: str):
logger.info('原神抽卡记录', '➤➤', {}, 'Stoken已失效更新失败', False) logger.info('原神抽卡记录', '➤➤', {}, 'Stoken已失效更新失败', False)
cookie_info.stoken = None cookie_info.stoken = None
await cookie_info.save() await cookie_info.save()
return f'UID{uid}的Stoken已失效请重新绑定后再更新抽卡记录' return f'UID{uid}的Stoken已失效请重新绑定或刷新cookie后再更新抽卡记录'
data = data['data']['list'] data = data['data']['list']
if not data: if not data:
break break
@ -198,7 +198,7 @@ async def get_gacha_log_img(user_id: str, uid: str, nickname: str):
await LastQuery.update_last_query(user_id, uid) await LastQuery.update_last_query(user_id, uid)
data, state = load_history_info(user_id, uid) data, state = load_history_info(user_id, uid)
if not state: if not state:
return f'UID{uid}还没有抽卡记录数据,请先更新' return f'UID{uid}还没有抽卡记录数据,可使用命令[更新抽卡记录]更新'
if player_info := await PlayerInfo.get_or_none(user_id=user_id, uid=uid): if player_info := await PlayerInfo.get_or_none(user_id=user_id, uid=uid):
return await draw_gacha_log(player_info.user_id, player_info.uid, player_info.nickname, player_info.signature, return await draw_gacha_log(player_info.user_id, player_info.uid, player_info.nickname, player_info.signature,
data) data)

View File

@ -83,8 +83,10 @@ async def draw_pool_detail(pool_name: str,
not_out: int, not_out: int,
record_time: Tuple[datetime.datetime, datetime.datetime]) -> Optional[ record_time: Tuple[datetime.datetime, datetime.datetime]) -> Optional[
PMImage]: PMImage]:
if not data:
if total_count == 0:
return None return None
total_height = 181 + (446 if len(data) > 3 else 0) + 47 + 192 * math.ceil(len(data) / 6) + 20 + 60 total_height = 181 + (446 if len(data) > 3 else 0) + 47 + 192 * math.ceil(len(data) / 6) + 20 + 60
img = PMImage(size=(1009, total_height), mode='RGBA', color=(255, 255, 255, 0)) img = PMImage(size=(1009, total_height), mode='RGBA', color=(255, 255, 255, 0))
# 橙线 # 橙线
@ -95,7 +97,11 @@ async def draw_pool_detail(pool_name: str,
fm.get('bahnschrift_regular', 30), '#252525', 'right') fm.get('bahnschrift_regular', 30), '#252525', 'right')
# 数据 # 数据
await img.text('平均出货', 174, 137, fm.get('hywh', 24), (24, 24, 24, 102)) await img.text('平均出货', 174, 137, fm.get('hywh', 24), (24, 24, 24, 102))
ave = round((total_count - not_out) / len(data), 2)
ave = 0
if data:
ave = round((total_count - not_out) / len(data), 2)
await img.text(str(ave), (176, 270), 84, await img.text(str(ave), (176, 270), 84,
fm.get('bahnschrift_regular', 48, 'Regular'), fm.get('bahnschrift_regular', 48, 'Regular'),
'#252525', 'center') '#252525', 'center')
@ -105,7 +111,8 @@ async def draw_pool_detail(pool_name: str,
await img.text('未出五星', 562, 137, fm.get('hywh', 24), (24, 24, 24, 102)) await img.text('未出五星', 562, 137, fm.get('hywh', 24), (24, 24, 24, 102))
await img.text(str(not_out), (562, 655), 84, fm.get('bahnschrift_regular', 48, 'Regular'), await img.text(str(not_out), (562, 655), 84, fm.get('bahnschrift_regular', 48, 'Regular'),
'#252525', 'center') '#252525', 'center')
lucky = '' if ave <= (45 if pool_type == '武器' else 50) else '' if ave <= (55 if pool_type == '武器' else 60) else '' if ave <= (65 if pool_type == '武器' else 70) else '' lucky_num = ave if ave > 0 else total_count
lucky = '' if lucky_num <= (45 if pool_type == '武器' else 50) else '' if lucky_num <= (55 if pool_type == '武器' else 60) else '' if lucky_num <= (65 if pool_type == '武器' else 70) else ''
await img.paste(await load_image(RESOURCE_BASE_PATH / 'gacha_log' / f'{lucky}{random.randint(1, 3)}.png'), (753, 68)) await img.paste(await load_image(RESOURCE_BASE_PATH / 'gacha_log' / f'{lucky}{random.randint(1, 3)}.png'), (753, 68))
# 折线图 # 折线图
if len(data) > 3: if len(data) > 3:
@ -126,14 +133,16 @@ async def draw_pool_detail(pool_name: str,
await img.text(str(chara.count), (point, point + 44), height - 48, fm.get('bahnschrift_regular', 30, await img.text(str(chara.count), (point, point + 44), height - 48, fm.get('bahnschrift_regular', 30,
'Regular'), '#040404', 'center') 'Regular'), '#040404', 'center')
i += 1 i += 1
# 详细数据统计 if data:
chara_bg = PMImage(await load_image(RESOURCE_BASE_PATH / 'gacha_log' / 'detail_bg.png')) # 详细数据统计
await chara_bg.stretch((47, chara_bg.height - 20), 192 + 192 * (len(data) // 6), 'height') chara_bg = PMImage(await load_image(RESOURCE_BASE_PATH / 'gacha_log' / 'detail_bg.png'))
await img.paste(chara_bg, (1, 655 if len(data) > 3 else 181)) await chara_bg.stretch((47, chara_bg.height - 20), 192 + 192 * (len(data) // 6), 'height')
await asyncio.gather( await img.paste(chara_bg, (1, 655 if len(data) > 3 else 181))
*[img.paste(await detail_avatar(data[i]), await asyncio.gather(
(18 + i % 6 * 163, (708 if len(data) > 3 else 234) + i // 6 * 192)) *[img.paste(await detail_avatar(data[i]),
for i in range(len(data))]) (18 + i % 6 * 163, (708 if len(data) > 3 else 234) + i // 6 * 192))
for i in range(len(data))])
return img return img
@ -204,7 +213,8 @@ async def draw_gacha_log(user_id: str, uid: str, nickname: Optional[str], signat
await img.text(str(total_gacha_count), (408, 503), 286, fm.get('bahnschrift_regular', 48), '#040404', 'center') await img.text(str(total_gacha_count), (408, 503), 286, fm.get('bahnschrift_regular', 48), '#040404', 'center')
await img.text('总计出金', 597, 335, fm.get('hywh', 24), (24, 24, 24, 102)) await img.text('总计出金', 597, 335, fm.get('hywh', 24), (24, 24, 24, 102))
await img.text(str(total_five_star_count), (598, 694), 286, fm.get('bahnschrift_regular', 48), '#040404', 'center') await img.text(str(total_five_star_count), (598, 694), 286, fm.get('bahnschrift_regular', 48), '#040404', 'center')
lucky = '' if five_star_average <= 50 else '' if five_star_average <= 60 else '' if five_star_average <= 70 else '' lucky_num = five_star_average if five_star_average>0 else total_gacha_count
lucky = '' if lucky_num <= 50 else '' if lucky_num <= 60 else '' if lucky_num <= 70 else ''
await img.paste(await load_image(RESOURCE_BASE_PATH / 'gacha_log' / f'{lucky}{random.randint(1, 3)}.png'), (788, 271)) await img.paste(await load_image(RESOURCE_BASE_PATH / 'gacha_log' / f'{lucky}{random.randint(1, 3)}.png'), (788, 271))
four_star_detail = await draw_four_star_detail(list(data4.values())) four_star_detail = await draw_four_star_detail(list(data4.values()))
if total_five_star_count: if total_five_star_count:

View File

@ -0,0 +1,129 @@
import datetime
from difflib import get_close_matches
from re import escape
from typing import Dict
from nonebot import on_regex
from nonebot.adapters.onebot.v11 import Message, MessageSegment, ActionFailed
from nonebot.internal.matcher import Matcher
from nonebot.internal.params import Arg, ArgPlainText
from nonebot.params import RegexDict
from nonebot.plugin import PluginMetadata
from nonebot.typing import T_State
from LittlePaimon.config import config
from LittlePaimon.utils import DRIVER, NICKNAME, logger
from LittlePaimon.utils.requests import aiorequests
from LittlePaimon.utils.typing import COMMAND_START_RE
wiki_data: Dict[str, Dict[str, str]] = {}
last_update_time: datetime.datetime = datetime.datetime.now()
GAME_ALIAS = ['星穹铁道', '星铁', '崩铁', '穹轨', '铁轨', '铁道', escape('*'), '']
BASE_TYPE = ['图鉴', '材料', '角色图鉴', '角色材料', '遗器图鉴', '光锥图鉴']
GAME_ALIAS_RE = '(' + '|'.join(GAME_ALIAS) + ')'
BASE_TYPE_RE = '(' + '|'.join(BASE_TYPE) + ')'
WIKI_RE = fr'{COMMAND_START_RE}(?P<name>\w{{0,10}}?)(?P<game>{GAME_ALIAS_RE})(?P<type>{BASE_TYPE_RE})'
TYPE_MAP = {
'角色图鉴': 'role',
'角色材料': 'material for role',
'遗器图鉴': 'relic',
'光锥图鉴': 'lightcone'
}
__plugin_meta__ = PluginMetadata(
name='星穹铁道Wiki',
description='星穹铁道WIKI百科',
usage='',
extra={
'author': '惜月',
'version': '3.0',
'priority': 15,
},
)
wiki = on_regex(WIKI_RE,
priority=8,
block=False,
state={
'pm_name': '星穹铁道wiki',
'pm_description': '支持查询:角色、光锥、遗器图鉴和角色材料\n示例:希儿星铁图鉴、与行星相会光锥图鉴',
'pm_usage': '<对象名><星铁图鉴|材料>',
'pm_priority': 1
})
@wiki.handle()
async def sr_wiki_handler(state: T_State, regex_dict: dict = RegexDict()):
name: str = regex_dict['name']
game: str = regex_dict['game']
type: str = regex_dict['type']
if type in {'图鉴', '材料', '角色图鉴', '角色材料'} and not game:
await wiki.finish()
if not wiki_data or datetime.datetime.now() - last_update_time > datetime.timedelta(hours=2):
await init_data()
if not wiki_data:
await wiki.finish('无法获取到星穹铁道资源列表,可能是网络问题~')
if type in {'图鉴', '角色图鉴'}:
type = '角色图鉴'
elif type in {'材料', '角色材料'}:
type = '角色材料'
elif type.startswith('遗器'):
type = '遗器图鉴'
elif type.startswith('光锥'):
type = '光锥图鉴'
state['type'] = type
if name:
state['name'] = Message(name)
else:
data = list(wiki_data[TYPE_MAP[type]].keys())
state['name_list'] = '\n'.join(
[' '.join(data[i: i + 3]) for i in range(0, len(data), 3)]
)
state['times'] = 1
@wiki.got('name', prompt=Message.template('目前支持以下{type}\n{name_list}\n你要查询哪个呢?'))
async def sr_wiki_got(matcher: Matcher,
state: T_State,
type: str = Arg('type'),
name: str = ArgPlainText('name')):
if name in {'取消', '退出', '结束'}:
await wiki.finish(f'好吧,有需要再找{NICKNAME}')
if not name:
if state['times'] == 2:
await wiki.finish('旅行者似乎不太能理解,下次再问我吧' + MessageSegment.face(146))
else:
state['times'] += 1
await wiki.reject(f'你要查询谁的{type}呢?', at_sender=True)
data = wiki_data[TYPE_MAP[type]]
matcher.stop_propagation()
if matches := get_close_matches(name, data.keys(), cutoff=0.4, n=1):
final_name = str(matches[0])
try:
await wiki.finish(MessageSegment.image(
f'{config.github_proxy}https://raw.githubusercontent.com/Nwflower/star-rail-atlas/master{data[final_name]}'
))
except ActionFailed:
await wiki.finish(f'{final_name}{type}发送失败,可能是网络问题')
else:
data = list(data.keys())
msg = '\n'.join(
[' '.join(data[i: i + 3]) for i in range(0, len(data), 3)]
)
await wiki.finish(f'没有找到相关{type}哦!目前支持以下{type}\n{msg}\n请重新发起查询!')
async def init_data():
try:
resp = await aiorequests.get(
f'{config.github_proxy}https://raw.githubusercontent.com/Nwflower/star-rail-atlas/master/path.json')
data = resp.json()
wiki_data.update(data)
global last_update_time
last_update_time = datetime.datetime.now()
except Exception:
logger.warning('星穹铁道WIKI', '获取<m>WIKI资源</m>时<r>出错</r>,请尝试更换<m>github资源地址</m>')
DRIVER.on_startup(init_data)

View File

@ -281,7 +281,7 @@ async def get_mihoyo_public_data(
cookie_info = await get_cookie(user_id, uid, check) cookie_info = await get_cookie(user_id, uid, check)
check = False check = False
if not cookie_info: if not cookie_info:
return '当前没有可使用的cookie绑定私人cookie或联系超级管理员添加公共cookie' return '当前没有可使用的cookie使用命令[原神扫码绑定]/[ysb]绑定私人cookie或联系超级管理员添加公共cookie'
if mode == 'abyss': if mode == 'abyss':
data = await aiorequests.get( data = await aiorequests.get(
url=ABYSS_API, url=ABYSS_API,

View File

@ -1,6 +1,7 @@
from typing import Dict from typing import Dict
from nonebot import logger as nb_logger from nonebot import logger as nb_logger
from nonebot.utils import escape_tag
class logger: class logger:
@ -10,20 +11,20 @@ class logger:
@staticmethod @staticmethod
def info(command: str, info: str = '', param: Dict[str, any] = None, result: str = '', result_type: bool = True): def info(command: str, info: str = '', param: Dict[str, any] = None, result: str = '', result_type: bool = True):
param_str = ' '.join([f'{k}<m>{v}</m>' for k, v in param.items()]) if param else '' param_str = ' '.join([f'{k}<m>{escape_tag(str(v))}</m>' for k, v in param.items()]) if param else ''
result_str = f'<g>{result}</g>' if result_type else f'<r>{result}</r>' if result else '' result_str = f'<g>{escape_tag(result)}</g>' if result_type else f'<r>{escape_tag(result)}</r>' if result else ''
nb_logger.opt(colors=True).info(f'<u><y>[{command}]</y></u>{info}{param_str}{result_str}') nb_logger.opt(colors=True).info(f'<u><y>[{command}]</y></u>{info}{param_str}{result_str}')
@staticmethod @staticmethod
def success(command: str, info: str = '', param: Dict[str, any] = None, result: str = ''): def success(command: str, info: str = '', param: Dict[str, any] = None, result: str = ''):
param_str = ' '.join([f'{k}<m>{v}</m>' for k, v in param.items()]) if param else '' param_str = ' '.join([f'{k}<m>{escape_tag(str(v))}</m>' for k, v in param.items()]) if param else ''
result_str = f'<g>{result}</g>' if result else '' result_str = f'<g>{escape_tag(result)}</g>' if result else ''
nb_logger.opt(colors=True).success(f'<u><y>[{command}]</y></u>{info}{param_str}{result_str}') nb_logger.opt(colors=True).success(f'<u><y>[{command}]</y></u>{info}{param_str}{result_str}')
@staticmethod @staticmethod
def warning(command: str, info: str = '', action: str = ''): def warning(command: str, info: str = '', action: str = ''):
nb_logger.opt(colors=True).warning(f'<u><y>[{command}]</y></u>{info}<m>{action}</m>') nb_logger.opt(colors=True).warning(f'<u><y>[{command}]</y></u>{escape_tag(info)}<m>{escape_tag(action)}</m>')
@staticmethod @staticmethod
def debug(command: str, info: str): def debug(command: str, info: str):
nb_logger.opt(colors=True).debug(f'<u><y>[{command}]</y></u>{info}') nb_logger.opt(colors=True).debug(f'<u><y>[{command}]</y></u>{escape_tag(info)}')

View File

@ -37,7 +37,7 @@ CHARACTERS = ['神里绫华', '琴', '丽莎', '芭芭拉', '凯亚', '迪卢克
'枫原万叶', '烟绯', '宵宫', '托马', '优菈', '雷电将军', '早柚', '珊瑚宫心海', '五郎', '九条裟罗', '枫原万叶', '烟绯', '宵宫', '托马', '优菈', '雷电将军', '早柚', '珊瑚宫心海', '五郎', '九条裟罗',
'荒泷一斗', '八重神子', '夜兰', '埃洛伊', '荒泷一斗', '八重神子', '夜兰', '埃洛伊',
'申鹤', '云堇', '久岐忍', '神里绫人', '鹿野院平藏', '提纳里', '柯莱', '多莉', '赛诺', '坎蒂丝', '妮露', '申鹤', '云堇', '久岐忍', '神里绫人', '鹿野院平藏', '提纳里', '柯莱', '多莉', '赛诺', '坎蒂丝', '妮露',
'纳西妲', '莱依拉', '流浪者', '珐露珊', '艾尔海森', '瑶瑶', '迪希雅', '米卡', '白术', '卡维'] '纳西妲', '莱依拉', '流浪者', '珐露珊', '艾尔海森', '瑶瑶', '迪希雅', '米卡', '白术', '卡维', '绮良良']
"""全角色""" """全角色"""
MALE_CHARACTERS = ['凯亚', '迪卢克', '钟离', '达达利亚', '托马', '荒泷一斗', '神里绫人', '艾尔海森', '白术', '卡维'] MALE_CHARACTERS = ['凯亚', '迪卢克', '钟离', '达达利亚', '托马', '荒泷一斗', '神里绫人', '艾尔海森', '白术', '卡维']
"""成男角色""" """成男角色"""
@ -45,7 +45,7 @@ FEMALE_CHARACTERS = ['琴', '丽莎', '北斗', '凝光', '罗莎莉亚', '优
'申鹤', '坎蒂丝', '迪希雅'] '申鹤', '坎蒂丝', '迪希雅']
"""成女角色""" """成女角色"""
GIRL_CHARACTERS = ['神里绫华', '芭芭拉', '安柏', '香菱', '菲谢尔', '诺艾尔', '甘雨', '莫娜', '刻晴', '砂糖', '辛焱', GIRL_CHARACTERS = ['神里绫华', '芭芭拉', '安柏', '香菱', '菲谢尔', '诺艾尔', '甘雨', '莫娜', '刻晴', '砂糖', '辛焱',
'胡桃', '烟绯', '宵宫', '珊瑚宫心海', '埃洛伊', '云堇', '久岐忍', '柯莱', '妮露', '莱依拉', '珐露珊'] '胡桃', '烟绯', '宵宫', '珊瑚宫心海', '埃洛伊', '云堇', '久岐忍', '柯莱', '妮露', '莱依拉', '珐露珊', '绮良良']
"""少女角色""" """少女角色"""
BOY_CHARACTERS = ['雷泽', '温迪', '行秋', '', '班尼特', '重云', '阿贝多', '枫原万叶', '五郎', '鹿野院平藏', '提纳里', BOY_CHARACTERS = ['雷泽', '温迪', '行秋', '', '班尼特', '重云', '阿贝多', '枫原万叶', '五郎', '鹿野院平藏', '提纳里',
'赛诺', '流浪者', '米卡'] '赛诺', '流浪者', '米卡']

3890
poetry.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -38,7 +38,6 @@ playwright = "^1.27.1"
qrcode = "^7.3.1" qrcode = "^7.3.1"
[tool.poetry.dev-dependencies] [tool.poetry.dev-dependencies]
nb-cli = "^0.6.7"
[tool.nonebot] [tool.nonebot]
plugins = [] plugins = []

View File

@ -1,86 +1,90 @@
--index-url https://mirrors.aliyun.com/pypi/simple --index-url https://mirrors.aliyun.com/pypi/simple
aiosqlite==0.17.0; python_version >= "3.7" and python_version < "4.0" aiosqlite==0.17.0 ; python_version >= "3.8" and python_version < "4.0"
amis-python==1.0.6; python_version >= "3.7" and python_version < "4.0" amis-python==1.0.7 ; python_version >= "3.8" and python_version < "4.0"
anyio==3.6.2; python_full_version >= "3.6.2" and python_version >= "3.8" and python_version < "4.0" anyio==3.6.2 ; python_version >= "3.8" and python_version < "4.0"
apscheduler==3.9.1.post1; python_version >= "3.8" and python_version < "4.0" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version < "4" and python_version >= "3.8" apscheduler==3.10.1 ; python_version >= "3.8" and python_version < "4.0"
backports.zoneinfo==0.2.1; python_version >= "3.8" and python_version < "3.9" and python_full_version < "3.0.0" and (python_version >= "3.8" and python_full_version < "3.0.0" and python_version < "4.0" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.8") or python_full_version >= "3.5.0" and python_version < "3.9" and python_version >= "3.8" and (python_version >= "3.8" and python_full_version < "3.0.0" and python_version < "4.0" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.8") backports-zoneinfo==0.2.1 ; python_version >= "3.8" and python_version < "3.9"
beautifulsoup4==4.11.1; python_full_version >= "3.6.0" beautifulsoup4==4.12.0 ; python_version >= "3.8" and python_version < "4.0"
certifi==2022.12.7; python_version >= "3.7" certifi==2022.12.7 ; python_version >= "3.8" and python_version < "4.0"
click==8.1.3; python_version >= "3.8" and python_version < "4.0" click==8.1.3 ; python_version >= "3.8" and python_version < "4.0"
colorama==0.4.6; python_version >= "3.8" and python_full_version < "3.0.0" and platform_system == "Windows" and python_version < "4.0" and sys_platform == "win32" or python_full_version >= "3.7.0" and platform_system == "Windows" and python_version >= "3.8" and python_version < "4.0" and sys_platform == "win32" colorama==0.4.6 ; python_version >= "3.8" and python_version < "4.0" and platform_system == "Windows" or python_version >= "3.8" and python_version < "4.0" and sys_platform == "win32"
contourpy==1.0.6; python_version >= "3.8" contourpy==1.0.7 ; python_version >= "3.8" and python_version < "4.0"
cycler==0.11.0; python_version >= "3.8" cycler==0.11.0 ; python_version >= "3.8" and python_version < "4.0"
ecdsa==0.18.0; python_version >= "2.6" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" ecdsa==0.18.0 ; python_version >= "3.8" and python_version < "4.0"
expandvars==0.9.0; python_version >= "3.4" expandvars==0.9.0 ; python_version >= "3.8" and python_version < "4.0"
fastapi==0.89.1; python_version >= "3.8" and python_version < "4.0" fastapi==0.95.0 ; python_version >= "3.8" and python_version < "4.0"
fonttools==4.38.0; python_version >= "3.8" fonttools==4.39.3 ; python_version >= "3.8" and python_version < "4.0"
gitdb==4.0.10; python_version >= "3.7" gitdb==4.0.10 ; python_version >= "3.8" and python_version < "4.0"
gitpython==3.1.30; python_version >= "3.7" gitpython==3.1.31 ; python_version >= "3.8" and python_version < "4.0"
greenlet==2.0.1; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7" greenlet==2.0.1 ; python_version >= "3.8" and python_version < "4.0"
h11==0.14.0; python_version >= "3.8" and python_version < "4.0" h11==0.14.0 ; python_version >= "3.8" and python_version < "4.0"
httpcore==0.16.3; python_version >= "3.7" httpcore==0.16.3 ; python_version >= "3.8" and python_version < "4.0"
httptools==0.5.0; python_version >= "3.8" and python_version < "4.0" and python_full_version >= "3.5.0" httptools==0.5.0 ; python_version >= "3.8" and python_version < "4.0"
httpx==0.23.3; python_version >= "3.7" httpx==0.23.3 ; python_version >= "3.8" and python_version < "4.0"
idna==3.4 idna==3.4 ; python_version >= "3.8" and python_version < "4.0"
iso8601==1.1.0; python_full_version >= "3.6.2" and python_version < "4.0" and python_version >= "3.7" importlib-resources==5.12.0 ; python_version >= "3.8" and python_version < "3.10"
jieba==0.42.1 iso8601==1.1.0 ; python_version >= "3.8" and python_version < "4.0"
jinja2==3.1.2; python_version >= "3.7" and python_version < "4.0" jieba==0.42.1 ; python_version >= "3.8" and python_version < "4.0"
joblib==1.2.0; python_version >= "3.8" jinja2==3.1.2 ; python_version >= "3.8" and python_version < "4.0"
kiwisolver==1.4.4; python_version >= "3.8" joblib==1.2.0 ; python_version >= "3.8" and python_version < "4.0"
loguru==0.6.0; python_version >= "3.8" and python_version < "4.0" kiwisolver==1.4.4 ; python_version >= "3.8" and python_version < "4.0"
lxml==4.9.2; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.5.0") loguru==0.6.0 ; python_version >= "3.8" and python_version < "4.0"
markupsafe==2.1.1; python_version >= "3.7" and python_version < "4.0" lxml==4.9.2 ; python_version >= "3.8" and python_version < "4.0"
matplotlib==3.6.3; python_version >= "3.8" markupsafe==2.1.2 ; python_version >= "3.8" and python_version < "4.0"
msgpack==1.0.4; python_version >= "3.8" and python_version < "4.0" matplotlib==3.7.1 ; python_version >= "3.8" and python_version < "4.0"
multidict==6.0.4; python_version >= "3.8" and python_version < "4.0" msgpack==1.0.5 ; python_version >= "3.8" and python_version < "4.0"
nonebot-adapter-onebot==2.2.0; python_version >= "3.8" and python_version < "4.0" multidict==6.0.4 ; python_version >= "3.8" and python_version < "4.0"
nonebot-plugin-apscheduler==0.2.0; python_version >= "3.8" and python_version < "4.0" nonebot-adapter-onebot==2.2.2 ; python_version >= "3.8" and python_version < "4.0"
nonebot2==2.0.0rc2; python_version >= "3.8" and python_version < "4.0" nonebot-plugin-apscheduler==0.2.0 ; python_version >= "3.8" and python_version < "4.0"
numpy==1.24.1; python_version >= "3.8" nonebot2==2.0.0rc4 ; python_version >= "3.8" and python_version < "4.0"
packaging==23.0; python_version >= "3.8" nonebot2[fastapi]==2.0.0rc4 ; python_version >= "3.8" and python_version < "4.0"
pillow==9.4.0; python_version >= "3.7" numpy==1.24.2 ; python_version >= "3.8" and python_version < "4.0"
playwright==1.29.1; python_version >= "3.7" packaging==23.0 ; python_version >= "3.8" and python_version < "4.0"
psutil==5.9.4; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.4.0") pillow==9.5.0 ; python_version >= "3.8" and python_version < "4.0"
pyasn1==0.4.8; python_version >= "3.6" and python_version < "4" playwright==1.32.1 ; python_version >= "3.8" and python_version < "4.0"
pydantic==1.10.4; python_version >= "3.8" and python_version < "4.0" psutil==5.9.4 ; python_version >= "3.8" and python_version < "4.0"
pyee==9.0.4; python_version >= "3.7" pyasn1==0.4.8 ; python_version >= "3.8" and python_version < "4.0"
pygtrie==2.5.0; python_version >= "3.8" and python_version < "4.0" pydantic==1.10.7 ; python_version >= "3.8" and python_version < "4.0"
pyparsing==3.0.9; python_full_version >= "3.6.8" and python_version >= "3.8" pydantic[dotenv]==1.10.7 ; python_version >= "3.8" and python_version < "4.0"
pypika-tortoise==0.1.6; python_version >= "3.7" and python_version < "4.0" pyee==9.0.4 ; python_version >= "3.8" and python_version < "4.0"
pypinyin==0.47.1; (python_version >= "2.6" and python_full_version < "3.0.0") or (python_full_version >= "3.3.0" and python_version < "4") pygtrie==2.5.0 ; python_version >= "3.8" and python_version < "4.0"
python-dateutil==2.8.2; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.8" pyparsing==3.0.9 ; python_version >= "3.8" and python_version < "4.0"
python-dotenv==0.21.0 pypika-tortoise==0.1.6 ; python_version >= "3.8" and python_version < "4.0"
python-jose==3.3.0 pypinyin==0.47.1 ; python_version >= "3.8" and python_version < "4"
pytz-deprecation-shim==0.1.0.post0; python_version >= "3.8" and python_full_version < "3.0.0" and python_version < "4.0" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.8" pypng==0.20220715.0 ; python_version >= "3.8" and python_version < "4.0"
pytz==2022.7; python_version >= "3.7" and python_version < "4.0" and (python_version >= "3.8" and python_version < "4.0" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version < "4" and python_version >= "3.8") python-dateutil==2.8.2 ; python_version >= "3.8" and python_version < "4.0"
pyyaml==6.0; python_version >= "3.8" and python_version < "4.0" python-dotenv==1.0.0 ; python_version >= "3.8" and python_version < "4.0"
qrcode==7.3.1; python_version >= "3.6" python-jose==3.3.0 ; python_version >= "3.8" and python_version < "4.0"
rfc3986==1.5.0; python_version >= "3.7" pytz-deprecation-shim==0.1.0.post0 ; python_version >= "3.8" and python_version < "4.0"
rsa==4.9; python_version >= "3.6" and python_version < "4" pytz==2023.3 ; python_version >= "3.8" and python_version < "4.0"
ruamel.yaml.clib==0.2.7; platform_python_implementation == "CPython" and python_version < "3.11" and python_version >= "3.5" pyyaml==6.0 ; python_version >= "3.8" and python_version < "4.0"
ruamel.yaml==0.17.21; python_version >= "3" qrcode==7.4.2 ; python_version >= "3.8" and python_version < "4.0"
scikit-learn==1.2.0; python_version >= "3.8" rfc3986[idna2008]==1.5.0 ; python_version >= "3.8" and python_version < "4.0"
scipy==1.9.3; python_version >= "3.8" rsa==4.9 ; python_version >= "3.8" and python_version < "4"
setuptools-scm==7.1.0; python_version >= "3.8" ruamel-yaml-clib==0.2.7 ; platform_python_implementation == "CPython" and python_version < "3.11" and python_version >= "3.8"
shapely==1.8.5.post1; python_version >= "3.6" ruamel-yaml==0.17.21 ; python_version >= "3.8" and python_version < "4.0"
six==1.16.0; python_version >= "3.8" and python_full_version < "3.0.0" and python_version < "4.0" or python_full_version >= "3.5.0" and python_version >= "3.8" and python_version < "4" scikit-learn==1.2.2 ; python_version >= "3.8" and python_version < "4.0"
smmap==5.0.0; python_version >= "3.7" scipy==1.9.3 ; python_version >= "3.8" and python_version < "4.0"
sniffio==1.3.0; python_full_version >= "3.6.2" and python_version >= "3.8" and python_version < "4.0" setuptools==67.6.1 ; python_version >= "3.8" and python_version < "4.0"
soupsieve==2.3.2.post1; python_version >= "3.6" and python_full_version >= "3.6.0" shapely==1.8.5.post1 ; python_version >= "3.8" and python_version < "4.0"
starlette==0.22.0; python_version >= "3.8" and python_version < "4.0" six==1.16.0 ; python_version >= "3.8" and python_version < "4.0"
threadpoolctl==3.1.0; python_version >= "3.8" smmap==5.0.0 ; python_version >= "3.8" and python_version < "4.0"
tomli==2.0.1; python_version < "3.11" and python_version >= "3.8" sniffio==1.3.0 ; python_version >= "3.8" and python_version < "4.0"
tomlkit==0.11.6; python_version >= "3.8" and python_version < "4.0" soupsieve==2.4 ; python_version >= "3.8" and python_version < "4.0"
tortoise-orm==0.19.2; python_version >= "3.7" and python_version < "4.0" starlette==0.26.1 ; python_version >= "3.8" and python_version < "4.0"
tqdm==4.64.1; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.4.0") threadpoolctl==3.1.0 ; python_version >= "3.8" and python_version < "4.0"
typing-extensions==4.4.0; python_version >= "3.8" and python_version <= "3.8" tomli==2.0.1 ; python_version >= "3.8" and python_version < "3.11"
tzdata==2022.7; python_version >= "3.8" and python_version < "4.0" and python_full_version < "3.0.0" and platform_system == "Windows" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.8" and platform_system == "Windows" tortoise-orm==0.19.3 ; python_version >= "3.8" and python_version < "4.0"
tzlocal==4.2; python_version >= "3.8" and python_version < "4.0" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version < "4" and python_version >= "3.8" tqdm==4.65.0 ; python_version >= "3.8" and python_version < "4.0"
ujson==5.7.0; python_version >= "3.7" typing-extensions==4.5.0 ; python_version >= "3.8" and python_version < "4.0"
uvicorn==0.20.0; python_version >= "3.8" and python_version < "4.0" tzdata==2023.3 ; python_version >= "3.8" and python_version < "4.0"
uvloop==0.17.0; sys_platform != "win32" and sys_platform != "cygwin" and platform_python_implementation != "PyPy" and python_version >= "3.8" and python_version < "4.0" tzlocal==4.3 ; python_version >= "3.8" and python_version < "4.0"
watchfiles==0.18.1; python_version >= "3.8" and python_version < "4.0" ujson==5.7.0 ; python_version >= "3.8" and python_version < "4.0"
websockets==10.4; python_version >= "3.8" and python_version < "4.0" uvicorn[standard]==0.21.1 ; python_version >= "3.8" and python_version < "4.0"
win32-setctime==1.1.0; python_version >= "3.8" and python_version < "4.0" and sys_platform == "win32" uvloop==0.17.0 ; sys_platform != "win32" and sys_platform != "cygwin" and platform_python_implementation != "PyPy" and python_version >= "3.8" and python_version < "4.0"
yarl==1.8.2; python_version >= "3.8" and python_version < "4.0" watchfiles==0.19.0 ; python_version >= "3.8" and python_version < "4.0"
websockets==10.4 ; python_version >= "3.8" and python_version < "4.0"
win32-setctime==1.1.0 ; python_version >= "3.8" and python_version < "4.0" and sys_platform == "win32"
yarl==1.8.2 ; python_version >= "3.8" and python_version < "4.0"
zipp==3.15.0 ; python_version >= "3.8" and python_version < "3.10"