From ea620fdae9ea83666a867f58c450fab65de115bc Mon Sep 17 00:00:00 2001 From: hibiki <775757368@qq.com> Date: Tue, 15 Jun 2021 10:57:08 +0800 Subject: [PATCH] gold_readbag and russian --- configs/config.py | 61 +-- configs/path_config.py | 6 +- configs/utils/init_config.py | 67 ++-- models/bag_user.py | 11 +- models/ban_user.py | 12 +- models/buff_price.py | 1 + models/friend_user.py | 2 +- models/goods_info.py | 92 +++++ models/group_member_info.py | 2 +- models/group_remind.py | 2 +- models/level_user.py | 5 +- models/redbag_user.py | 65 ++++ models/russian_user.py | 80 ++++ plugins/aconfig/__init__.py | 2 +- plugins/admin_bot_manage/__init__.py | 9 +- plugins/admin_config.py | 5 + plugins/admin_help/__init__.py | 6 +- plugins/ai/__init__.py | 4 +- plugins/ai/data_source.py | 2 +- plugins/auto_invite/__init__.py | 2 +- plugins/ban/__init__.py | 14 +- plugins/broadcast/__init__.py | 4 + plugins/bt/__init__.py | 2 - plugins/check/__init__.py | 4 +- plugins/coser/__init__.py | 6 +- plugins/delete_img/__init__.py | 4 +- plugins/dialogue/__init__.py | 2 +- plugins/draw_card/__init__.py | 3 + plugins/draw_card/announcement.py | 2 +- plugins/draw_card/genshin_handle.py | 25 +- plugins/draw_card/guardian_handle.py | 2 +- plugins/draw_card/init_card_pool.py | 6 +- plugins/draw_card/prts_handle.py | 36 +- plugins/draw_card/update_game_info.py | 26 +- plugins/draw_card/update_game_simple_info.py | 36 +- plugins/epic/__init__.py | 6 +- plugins/fake_msg.py | 7 +- plugins/genshin/almanac/__init__.py | 1 + .../genshin/qiu_qiu_translation/__init__.py | 3 + .../genshin/query_resource_points/__init__.py | 9 + .../query_resource_points/icon/182.png | Bin 0 -> 16791 bytes .../query_resource_points/icon/185.png | Bin 0 -> 26211 bytes .../query_resource_points/icon/187.png | Bin 0 -> 24631 bytes .../query_resource_points/icon/188.png | Bin 0 -> 22360 bytes .../query_resource_points/icon/190.png | Bin 0 -> 23394 bytes .../query_resource_points/icon/191.png | Bin 0 -> 20248 bytes .../query_resource_points/icon/192.png | Bin 0 -> 22687 bytes .../query_resource_points/icon/193.png | Bin 0 -> 23581 bytes plugins/genshin/query_resource_points/icon/dd | 1 - .../query_resource_points/query_resource.py | 21 +- plugins/group_handle/__init__.py | 5 + plugins/group_welcome_msg.py | 4 + plugins/help/__init__.py | 22 +- plugins/help/config.py | 4 +- plugins/help/data_source.py | 25 +- plugins/hook.py | 2 +- plugins/jitang.py | 38 +- plugins/last_chat/__init__.py | 2 + plugins/luxun/__init__.py | 4 + plugins/move_img/__init__.py | 4 +- plugins/mute.py | 2 + plugins/nickname.py | 7 + plugins/nonebot_plugin_cocdicer/__init__.py | 72 ---- plugins/nonebot_plugin_cocdicer/create.py | 147 -------- .../nonebot_plugin_cocdicer/data_source.py | 249 ------------- plugins/nonebot_plugin_cocdicer/madness.py | 36 -- plugins/nonebot_plugin_cocdicer/messages.py | 258 ------------- plugins/nonebot_plugin_cocdicer/san_check.py | 38 -- .../nonebot_plugin_picsearcher/__init__.py | 8 + plugins/nonebot_plugin_withdraw/__init__.py | 8 + plugins/one_friend/__init__.py | 6 +- plugins/open_cases/__init__.py | 2 +- plugins/parse_bilibili_json.py | 12 +- plugins/pixiv/__init__.py | 38 +- plugins/poke/__init__.py | 12 +- plugins/quotations.py | 2 - plugins/russian/__init__.py | 348 ++++++++++++++++++ plugins/russian/data_source.py | 33 ++ plugins/search_anime/__init__.py | 2 - plugins/search_buff_skin_price/__init__.py | 4 +- plugins/send_img/__init__.py | 2 +- plugins/send_setu/__init__.py | 5 +- plugins/send_setu/data_source.py | 76 ++-- plugins/server_ip.py | 5 +- plugins/shop/buy.py | 66 ++-- plugins/shop/gold.py | 28 ++ plugins/shop/gold_redbag/__init__.py | 310 ++++++++++++++++ plugins/shop/gold_redbag/data_source.py | 96 +++++ plugins/shop/my_gold.py | 26 -- plugins/shop/my_props.py | 4 +- plugins/shop/reset_today_gold.py | 15 +- plugins/shop/shop_handle/__init__.py | 125 +++++++ plugins/shop/shop_handle/data_source.py | 99 +++++ plugins/shop/shop_help.py | 41 --- plugins/shop/use/__init__.py | 6 +- plugins/sign_in/__init__.py | 4 +- plugins/sign_in/group_user_checkin.py | 19 +- plugins/songpicker2/__init__.py | 3 + plugins/songpicker2/data_source.py | 3 +- plugins/super_cmd/__init__.py | 2 +- plugins/super_help/__init__.py | 16 +- plugins/test.py | 25 +- plugins/translate/__init__.py | 5 + plugins/update_gocqhttp/__init__.py | 4 + plugins/update_info.py | 2 + plugins/update_setu/__init__.py | 4 +- plugins/update_setu/data_source.py | 88 +++-- plugins/upload_img/__init__.py | 4 +- plugins/weather/__init__.py | 10 +- plugins/white2black_img.py | 5 +- requirements.txt | 4 +- resources/img/other/shop_text.png | Bin 0 -> 10804 bytes resources/img/prts/redbag_12.png | Bin 0 -> 197752 bytes resources/img/prts/redbag_2/chen_00.png | Bin 0 -> 501501 bytes resources/img/prts/redbag_2/dusk_00.png | Bin 0 -> 476219 bytes resources/img/prts/redbag_2/jessica_00.png | Bin 0 -> 459000 bytes resources/img/prts/redbag_2/nian_00.png | Bin 0 -> 470518 bytes resources/img/prts/redbag_2/sikadi_00.png | Bin 0 -> 470862 bytes resources/img/prts/redbag_2/tknogi_00.png | Bin 0 -> 468346 bytes resources/img/zhenxun/toukan.png | Bin 0 -> 157308 bytes resources/img/zhenxun/toukan_2.png | Bin 0 -> 23407 bytes util/data_utils.py | 24 ++ util/get_bilibili_img.py | 140 +++++++ util/img_utils.py | 32 +- util/init_result.py | 2 + 125 files changed, 2106 insertions(+), 1244 deletions(-) create mode 100644 models/goods_info.py create mode 100644 models/redbag_user.py create mode 100644 models/russian_user.py create mode 100644 plugins/genshin/query_resource_points/icon/182.png create mode 100644 plugins/genshin/query_resource_points/icon/185.png create mode 100644 plugins/genshin/query_resource_points/icon/187.png create mode 100644 plugins/genshin/query_resource_points/icon/188.png create mode 100644 plugins/genshin/query_resource_points/icon/190.png create mode 100644 plugins/genshin/query_resource_points/icon/191.png create mode 100644 plugins/genshin/query_resource_points/icon/192.png create mode 100644 plugins/genshin/query_resource_points/icon/193.png delete mode 100644 plugins/genshin/query_resource_points/icon/dd delete mode 100644 plugins/nonebot_plugin_cocdicer/__init__.py delete mode 100644 plugins/nonebot_plugin_cocdicer/create.py delete mode 100644 plugins/nonebot_plugin_cocdicer/data_source.py delete mode 100644 plugins/nonebot_plugin_cocdicer/madness.py delete mode 100644 plugins/nonebot_plugin_cocdicer/messages.py delete mode 100644 plugins/nonebot_plugin_cocdicer/san_check.py create mode 100644 plugins/russian/__init__.py create mode 100644 plugins/russian/data_source.py create mode 100644 plugins/shop/gold.py create mode 100644 plugins/shop/gold_redbag/__init__.py create mode 100644 plugins/shop/gold_redbag/data_source.py delete mode 100644 plugins/shop/my_gold.py create mode 100644 plugins/shop/shop_handle/__init__.py create mode 100644 plugins/shop/shop_handle/data_source.py delete mode 100644 plugins/shop/shop_help.py create mode 100644 resources/img/other/shop_text.png create mode 100644 resources/img/prts/redbag_12.png create mode 100644 resources/img/prts/redbag_2/chen_00.png create mode 100644 resources/img/prts/redbag_2/dusk_00.png create mode 100644 resources/img/prts/redbag_2/jessica_00.png create mode 100644 resources/img/prts/redbag_2/nian_00.png create mode 100644 resources/img/prts/redbag_2/sikadi_00.png create mode 100644 resources/img/prts/redbag_2/tknogi_00.png create mode 100644 resources/img/zhenxun/toukan.png create mode 100644 resources/img/zhenxun/toukan_2.png create mode 100644 util/data_utils.py create mode 100644 util/get_bilibili_img.py diff --git a/configs/config.py b/configs/config.py index 60c44424..dcea582a 100644 --- a/configs/config.py +++ b/configs/config.py @@ -11,21 +11,21 @@ USE_CONFIG_FILE = False # API KEY(必要) -LOLICON_KEY: str = "" # lolicon +LOLICON_KEY: str = "336595836015174952daa2" # lolicon RSSHUBAPP: str = "https://docs.rsshub.app/" # rsshub # 图灵 -TL_KEY: List[str] = [] +TL_KEY: List[str] = ["4474710fabbf4540bfaa569c192bb457", "6f4c0920d2ff4962b5cbd8148aef771b", + "f5595738894042fb9fad88ecdc4acf41", "c24400595fed48f9a5c5bc3ff03a3267", "efab135b75d84b02a59115f5b571f277"] # 数据库(必要) # 如果填写了bind就不需要再填写后面的字段了#) -# bind示例:"bind": "postgresql://user:password@127.0.0.1:5432/database" -bind: str = '' # 数据库连接url -sql_name: str = 'postgresql' -user: str = '' # 数据库用户名 -password: str = '' # 数据库密码 -address: str = '' # 数据库地址 -port: str = '' # 数据库端口 -database: str = '' # 数据库名称 +bind: str = 'postgresql://hibiki:Dimension130123@hibiki0v0.cn:6666/hibikibot' +sql_name: str = '' +user: str = '' +password: str = '' +address: str = '' +port: str = '' +database: str = '' # 公开图库列表 @@ -33,19 +33,6 @@ IMAGE_DIR_LIST: List[str] = ["色图", "美图", "萝莉", "壁纸"] # 对被ban用户发送的消息 BAN_RESULT: str = "才不会给你发消息." - - -# 各种抽卡卡池的开关 -PRTS_FLAG: bool = True # 明日方舟 -GENSHIN_FLAG: bool = True # 原神 -PRETTY_FLAG: bool = True # 赛马娘 -GUARDIAN_FLAG: bool = True # 坎公骑冠剑 -PCR_FLAG: bool = True # 公主连结 -AZUR_FLAG: bool = True # 碧蓝航线 -FGO_FLAG: bool = True # 命运-冠位指定(FGO) -ONMYOJI_FLAG: bool = True # 阴阳师 - -PCR_TAI: bool = True # pcr是否开启台服卡池 # 插件配置 @@ -55,7 +42,19 @@ MAXINFO_BT: int = 10 # bt功能单次查找最大数 MAXINFO_PRIVATE_ANIME: int = 20 # 私聊搜索动漫返回的最大数量 MAXINFO_GROUP_ANIME: int = 5 # 群搜索动漫返回的最大数量 MAX_FIND_IMG_COUNT: int = 3 # 识图最大返回数 -MAX_SETU_R_COUNT: int = 5 # 每日色图r次数限制 +MAX_SETU_R_COUNT: int = 5 # 每日色图r次数限制 + +# 各种卡池的开关 +PRTS_FLAG = True # 明日方舟 +GENSHIN_FLAG = True # 原神 +PRETTY_FLAG = True # 赛马娘 +GUARDIAN_FLAG = True # 坎公骑冠剑 +PCR_FLAG = True # 公主连结 +AZUR_FLAG = True # 碧蓝航线 +FGO_FLAG = True # 命运-冠位指定(FGO) +ONMYOJI_FLAG = True # 阴阳师 + +PCR_TAI = True # pcr是否开启台服卡池 ADMIN_DEFAULT_AUTH: int = 5 # 默认群管理员权限 @@ -85,11 +84,11 @@ MUTE_LEVEL: int = 5 # 更改禁言设置权限 # 需要为哪些群更新最新版gocq吗?(上传最新版gocq) # 示例:[434995955, 239483248] -UPDATE_GOCQ_GROUP: List[int] = [] +UPDATE_GOCQ_GROUP: List[int] = [774261838] # 代理 -system_proxy: str = '' # 系统代理 示例:'http:127.0.0.1:9999' -buff_proxy: str = '' # buff代理 +system_proxy: str = 'http://127.0.0.1:7890' +buff_proxy: str = '' # 是否存储色图 DOWNLOAD_SETU: bool = True @@ -114,7 +113,7 @@ plugins2name_dict = { 'buy': ['购买', '购买道具'], 'my_gold': ['我的金币'], 'my_props': ['我的道具'], - 'shop_help': ['商店'], + 'shop_handle': ['商店'], 'nonebot_plugin_cocdicer': ['骰子娘'], 'update_pic': ['图片', '操作图片', '修改图片'], 'search_buff_skin_price': ['查询皮肤'], @@ -125,8 +124,8 @@ plugins2name_dict = { 'songpicker2': ['点歌'], 'epic': ['epic'], 'pixiv': ['pixiv', 'p站排行', '搜图'], - 'poke': ['戳一戳'], - 'draw_card': ['游戏抽卡', '原神一井', '原神来一井', '方舟一井', '方舟来一井'], + 'poke': ['戳一戳', '拍一拍'], + 'draw_card': ['抽卡', '游戏抽卡', '原神抽卡', '方舟抽卡', '坎公骑冠剑抽卡', 'pcr抽卡', 'fgo抽卡', '碧蓝抽卡', '碧蓝航线抽卡', '阴阳师抽卡'], 'ai': ['ai', 'Ai', 'AI', 'aI'], 'one_friend': ['我有一个朋友', '我有一个朋友想问问'], 'translate': ['翻译', '英翻', '翻英', '日翻', '翻日', '韩翻', '翻韩'], @@ -135,6 +134,8 @@ plugins2name_dict = { 'material_remind': ['今日素材', '天赋材料'], 'qiu_qiu_translation': ['丘丘翻译', '丘丘一下', '丘丘语翻译'], 'query_resource_points': ['原神资源查询', '原神资源列表'], + 'russian': ['俄罗斯轮盘', '俄罗斯转盘', '装弹'], + 'gold_redbag': ['塞红包', '红包', '抢红包'] } # 群管理员功能 与 对应权限 diff --git a/configs/path_config.py b/configs/path_config.py index 0fffc5ed..b4472c01 100644 --- a/configs/path_config.py +++ b/configs/path_config.py @@ -14,14 +14,12 @@ LOG_PATH = Path("log/") TTF_PATH = Path("resources/ttf/") # 数据路径 DATA_PATH = Path("data/") -# 抽卡数据路径 -DRAW_PATH = Path("data/draw_card/") # 临时图片路径 TEMP_PATH = Path("resources/img/temp/") def init_path(): - global IMAGE_PATH, VOICE_PATH, TXT_PATH, LOG_PATH, TTF_PATH, DATA_PATH, DRAW_PATH, TEMP_PATH + global IMAGE_PATH, VOICE_PATH, TXT_PATH, LOG_PATH, TTF_PATH, DATA_PATH, TEMP_PATH if USE_CONFIG_FILE: data = get_config_data() if data.get('IMAGE_PATH'): @@ -46,7 +44,6 @@ def init_path(): LOG_PATH.mkdir(parents=True, exist_ok=True) TTF_PATH.mkdir(parents=True, exist_ok=True) DATA_PATH.mkdir(parents=True, exist_ok=True) - DRAW_PATH.mkdir(parents=True, exist_ok=True) TEMP_PATH.mkdir(parents=True, exist_ok=True) IMAGE_PATH = str(IMAGE_PATH.absolute()) + '/' @@ -55,7 +52,6 @@ def init_path(): LOG_PATH = str(LOG_PATH.absolute()) + '/' TTF_PATH = str(TTF_PATH.absolute()) + '/' DATA_PATH = str(DATA_PATH.absolute()) + '/' - DRAW_PATH = str(DRAW_PATH.absolute()) + '/' TEMP_PATH = str(TEMP_PATH.absolute()) + '/' diff --git a/configs/utils/init_config.py b/configs/utils/init_config.py index 814c7f84..9f5f2bdf 100644 --- a/configs/utils/init_config.py +++ b/configs/utils/init_config.py @@ -9,7 +9,7 @@ except ModuleNotFoundError: base_config = Path() / 'config.json' plugins_cmd_config = Path() / 'configs' / 'plugins2cmd_config.json' -other_config = Path() / 'configs' / 'other_config.json' +plugins_setting = Path() / 'configs' / 'plugins_setting.json' def init_config(): @@ -50,6 +50,18 @@ def init_config(): 'OC_LEVEL': 2, 'MUTE_LEVEL': 5, }, + 'auth': { + 'ADMIN_DEFAULT_AUTH': 5, + 'admin_plugins_auth': { + "admin_bot_manage": 2, + "ban": 5, + "delete_img": 7, + "move_img": 7, + "upload_img": 6, + "admin_help": 1, + "mute": 5 + } + } } with open(base_config, 'w', encoding='utf8') as f: json.dump(config_dict, f, indent=4, ensure_ascii=False) @@ -71,7 +83,7 @@ def init_config(): 'buy': ['购买', '购买道具'], 'my_gold': ['我的金币'], 'my_props': ['我的道具'], - 'shop_help': ['商店'], + 'shop_handle': ['商店'], 'nonebot_plugin_cocdicer': ['骰子娘'], 'update_pic': ['图片', '操作图片', '修改图片'], 'search_buff_skin_price': ['查询皮肤'], @@ -96,30 +108,49 @@ def init_config(): } with open(plugins_cmd_config, 'w', encoding='utf8') as f: json.dump(config_dict, f, indent=4, ensure_ascii=False) - if not other_config.exists(): - other_config.parent.mkdir(parents=True, exist_ok=True) + if not plugins_setting.exists(): + plugins_setting.parent.mkdir(parents=True, exist_ok=True) config_dict = { 'base': { 'IMAGE_DIR_LIST': ["色图", "美图", "萝莉", "壁纸"], 'BAN_RESULT': "才不会给你发消息.", }, - 'bool': { - 'AUTO_ADD_FRIEND': True, - 'DOWNLOAD_SETU': True, + 'draw_card': { + 'PRTS_FLAG': True, # 明日方舟 + 'GENSHIN_FLAG': True, # 原神 + 'PRETTY_FLAG': True, # 赛马娘 + 'GUARDIAN_FLAG': True, # 坎公骑冠剑 + 'PCR_FLAG': True, # 公主连结 + 'AZUR_FLAG': True, # 碧蓝航线 + 'FGO_FLAG': True, # 命运-冠位指定(FGO) + 'ONMYOJI_FLAG': True, # 阴阳师 + + 'PCR_TAI': False # pcr是否开启台服卡池 }, - 'probability': { - 'INITIAL_SETU_PROBABILITY': 0.7, + 'fudu': { 'FUDU_PROBABILITY': 0.7, }, - 'max_count': { + 'reimu': { 'MAXINFO_REIMU': 7, 'COUNT_PER_DAY_REIMU': 5, + }, + 'bt': { 'MAXINFO_BT': 10, + }, + 'search_anime': { 'MAXINFO_PRIVATE_ANIME': 20, 'MAXINFO_GROUP_ANIME': 5, + }, + 'picsearcher': { 'MAX_FIND_IMG_COUNT': 3, + }, + 'sign': { 'MAX_SIGN_GOLD': 200, + }, + 'send_setu': { + 'INITIAL_SETU_PROBABILITY': 0.7, 'MAX_SETU_R_COUNT': 5, + 'DOWNLOAD_SETU': True, }, 'malicious_ban': { 'MALICIOUS_BAN_TIME': 30, @@ -134,23 +165,11 @@ def init_config(): 'MUTE_DEFAULT_TIME': 7, 'MUTE_DEFAULT_DURATION': 10, }, - 'other': { + 'update_gocq': { 'UPDATE_GOCQ_GROUP': [], - 'ADMIN_DEFAULT_AUTH': 5, - }, - 'auth': { - 'admin_plugins_auth': { - "admin_bot_manage": 2, - "ban": 5, - "delete_img": 7, - "move_img": 7, - "upload_img": 6, - "admin_help": 1, - "mute": 5 - } }, } - with open(other_config, 'w', encoding='utf8') as f: + with open(plugins_setting, 'w', encoding='utf8') as f: json.dump(config_dict, f, indent=4, ensure_ascii=False) diff --git a/models/bag_user.py b/models/bag_user.py index 9952e156..40b2d888 100644 --- a/models/bag_user.py +++ b/models/bag_user.py @@ -2,7 +2,7 @@ from services.db_context import db -class UserBag(db.Model): +class BagUser(db.Model): __tablename__ = 'bag_users' id = db.Column(db.Integer(), primary_key=True) @@ -63,7 +63,7 @@ class UserBag(db.Model): return '' @classmethod - async def add_glod(cls, user_qq: int, belonging_group: int, num: int) -> bool: + async def add_gold(cls, user_qq: int, belonging_group: int, num: int) -> bool: query = cls.query.where( (cls.user_qq == user_qq) & (cls.belonging_group == belonging_group) ) @@ -89,7 +89,7 @@ class UserBag(db.Model): return False @classmethod - async def spend_glod(cls, user_qq: int, belonging_group: int, num: int) -> bool: + async def spend_gold(cls, user_qq: int, belonging_group: int, num: int) -> bool: query = cls.query.where( (cls.user_qq == user_qq) & (cls.belonging_group == belonging_group) ) @@ -170,16 +170,13 @@ class UserBag(db.Model): @classmethod async def get_user_all(cls, group_id: int = None) -> list: - user_list = [] if not group_id: query = await cls.query.gino.all() else: query = await cls.query.where( (cls.belonging_group == group_id) ).gino.all() - for user in query: - user_list.append(user) - return user_list + return query diff --git a/models/ban_user.py b/models/ban_user.py index 3172b6df..3e70658f 100644 --- a/models/ban_user.py +++ b/models/ban_user.py @@ -42,16 +42,15 @@ class BanUser(db.Model): if await cls.check_ban_time(user_qq): return True else: - await cls.unban(user_qq, True) + await cls.unban(user_qq) return False @classmethod - async def ban(cls, user_qq: int, ban_level: int, duration: int, for_update: bool = False) -> 'bool': + async def ban(cls, user_qq: int, ban_level: int, duration: int) -> 'bool': query = cls.query.where( (cls.user_qq == user_qq) ) - if for_update: - query = await query.with_for_update() + query = query.with_for_update() user = await query.gino.first() if not await cls.check_ban_time(user_qq): await cls.unban(user_qq) @@ -68,12 +67,11 @@ class BanUser(db.Model): return False @classmethod - async def unban(cls, user_qq: int, for_update: bool = False) -> 'bool': + async def unban(cls, user_qq: int) -> 'bool': query = cls.query.where( (cls.user_qq == user_qq) ) - if for_update: - query = query.with_for_update() + query = query.with_for_update() user = await query.gino.first() if user is None: return False diff --git a/models/buff_price.py b/models/buff_price.py index 510743ca..b27451fd 100644 --- a/models/buff_price.py +++ b/models/buff_price.py @@ -1,4 +1,5 @@ from datetime import datetime +from datetime import datetime from services.db_context import db diff --git a/models/friend_user.py b/models/friend_user.py index d32801a0..8e4d5b14 100644 --- a/models/friend_user.py +++ b/models/friend_user.py @@ -60,7 +60,7 @@ class FriendUser(db.Model): query = cls.query.where( cls.user_id == user_id ) - user = await query.with_for_update().gino.first() + user = await query.gino.first() if user: if user.nickname: return user.nickname diff --git a/models/goods_info.py b/models/goods_info.py new file mode 100644 index 00000000..642e7589 --- /dev/null +++ b/models/goods_info.py @@ -0,0 +1,92 @@ + +from services.db_context import db + + +class GoodsInfo(db.Model): + __tablename__ = 'goods_info' + + id = db.Column(db.Integer(), primary_key=True) + goods_name = db.Column(db.TEXT(), nullable=False) # 名称 + goods_price = db.Column(db.Integer(), nullable=False) # 价格 + goods_description = db.Column(db.TEXT(), nullable=False) # 商品描述 + goods_discount = db.Column(db.Numeric(scale=3, asdecimal=False), default=1) # 打折 + goods_limit_time = db.Column(db.BigInteger(), default=0) # 限时 + + _idx1 = db.Index('goods_group_users_idx1', 'goods_name', unique=True) + + @classmethod + async def add_goods(cls, goods_name: str, goods_price: int, + goods_description: str, goods_discount: float = 1, goods_limit_time: int = 0) -> bool: + # try: + await cls.create( + goods_name=goods_name, + goods_price=goods_price, + goods_description=goods_description, + goods_discount=goods_discount, + goods_limit_time=goods_limit_time + ) + return True + # except Exception: + # return False + + @classmethod + async def del_goods(cls, goods_name: str) -> bool: + query = await cls.query.where( + cls.goods_name == goods_name + ).with_for_update().gino.first() + if not query: + return False + await query.delete() + return True + + @classmethod + async def update_goods(cls, goods_name: str, goods_price: int = None, + goods_description: str = None, goods_discount: float = None, + goods_limit_time: int = None) -> bool: + try: + query = await cls.query.where( + cls.goods_name == goods_name + ).with_for_update().gino.first() + if not query: + return False + if goods_price: + await query.update( + goods_price=goods_price + ).apply() + if goods_description: + await query.update( + goods_description=goods_description + ).apply() + if goods_discount: + await query.update( + goods_discount=goods_discount + ).apply() + if goods_limit_time: + await query.update( + goods_limit_time=goods_limit_time + ).apply() + return True + except Exception: + return False + + @classmethod + async def get_goods_info(cls, goods_name: str) -> 'GoodsInfo': + query = await cls.query.where( + cls.goods_name == goods_name + ).gino.first() + return query + + @classmethod + async def get_all_goods(cls) -> list: + query = await cls.query.gino.all() + return query + + + + + + + + + + diff --git a/models/group_member_info.py b/models/group_member_info.py index 5dbc4879..3f2ef1b4 100644 --- a/models/group_member_info.py +++ b/models/group_member_info.py @@ -73,7 +73,7 @@ class GroupInfoUser(db.Model): query = cls.query.where( (cls.user_qq == user_qq) & (cls.belonging_group == belonging_group) ) - user = await query.gino.first() + user = await query.with_for_update().gino.first() if user: await user.update( nickname=nickname diff --git a/models/group_remind.py b/models/group_remind.py index 9f93e64f..1e06110d 100644 --- a/models/group_remind.py +++ b/models/group_remind.py @@ -48,7 +48,7 @@ class GroupRemind(db.Model): try: group = await cls.query.where( (cls.group_id == group_id) - ).gino.first() + ).with_for_update().gino.first() if not group: group = await cls.create( group_id=group_id, diff --git a/models/level_user.py b/models/level_user.py index 2093f116..850626b7 100644 --- a/models/level_user.py +++ b/models/level_user.py @@ -43,12 +43,11 @@ class LevelUser(db.Model): return False @classmethod - async def delete_level(cls, user_qq: int, group_id: int, for_update: bool = False) -> 'bool': + async def delete_level(cls, user_qq: int, group_id: int) -> 'bool': query = cls.query.where( (cls.user_qq == user_qq) & (cls.group_id == group_id) ) - if for_update: - query = query.with_for_update() + query = query.with_for_update() user = await query.gino.first() if user is None: return False diff --git a/models/redbag_user.py b/models/redbag_user.py new file mode 100644 index 00000000..d7a3cf57 --- /dev/null +++ b/models/redbag_user.py @@ -0,0 +1,65 @@ + +from services.db_context import db + + +class RedbagUser(db.Model): + __tablename__ = 'redbag_users' + + id = db.Column(db.Integer(), primary_key=True) + user_qq = db.Column(db.BigInteger(), nullable=False) + group_id = db.Column(db.BigInteger(), nullable=False) + send_redbag_count = db.Column(db.Integer(), default=0) + get_redbag_count = db.Column(db.Integer(), default=0) + spend_gold = db.Column(db.Integer(), default=0) + get_gold = db.Column(db.Integer(), default=0) + + _idx1 = db.Index('redbag_group_users_idx1', 'user_qq', 'group_id', unique=True) + + @classmethod + async def add_redbag_data(cls, user_qq: int, group_id: int, itype: str, money: int): + query = cls.query.where( + (cls.user_qq == user_qq) & (cls.group_id == group_id) + ) + user = await query.with_for_update().gino.first() or await cls.create( + user_qq=user_qq, + group_id=group_id, + ) + if itype == 'get': + await user.update( + get_redbag_count=user.get_redbag_count + 1, + get_gold=user.get_gold + money, + ).apply() + else: + await user.update( + send_redbag_count=user.send_redbag_count + 1, + spend_gold=user.spend_gold + money, + ).apply() + + @classmethod + async def ensure(cls, user_qq: int, group_id: int) -> bool: + query = cls.query.where( + (cls.user_qq == user_qq) & (cls.group_id == group_id) + ) + user = await query.gino.first() or await cls.create( + user_qq=user_qq, + group_id=group_id, + ) + return user + + @classmethod + async def get_user_all(cls, group_id: int = None) -> list: + if not group_id: + query = await cls.query.gino.all() + else: + query = await cls.query.where( + (cls.group_id == group_id) + ).gino.all() + return query + + + + + + + + diff --git a/models/russian_user.py b/models/russian_user.py new file mode 100644 index 00000000..c281f067 --- /dev/null +++ b/models/russian_user.py @@ -0,0 +1,80 @@ +from services.db_context import db +from typing import List + + +class RussianUser(db.Model): + __tablename__ = 'russian_users' + + id = db.Column(db.Integer(), primary_key=True) + user_qq = db.Column(db.BigInteger(), nullable=False) + group_id = db.Column(db.BigInteger(), nullable=False) + win_count = db.Column(db.Integer(), default=0) + fail_count = db.Column(db.Integer(), default=0) + make_money = db.Column(db.Integer(), default=0) + lose_money = db.Column(db.Integer(), default=0) + + _idx1 = db.Index('russian_group_users_idx1', 'user_qq', 'group_id', unique=True) + + @classmethod + async def ensure(cls, user_qq: int, group_id: int) -> 'RussianUser': + user = await cls.query.where( + (cls.user_qq == user_qq) & (cls.group_id == group_id) + ).with_for_update().gino.first() + return user or await cls.create( + user_qq=user_qq, + group_id=group_id + ) + + @classmethod + async def add_count(cls, user_qq: int, group_id: int, itype: str) -> bool: + try: + user = await cls.query.where( + (cls.user_qq == user_qq) & (cls.group_id == group_id) + ).with_for_update().gino.first() + if not user: + user = await cls.create( + user_qq=user_qq, + group_id=group_id + ) + if itype == 'win': + await user.update( + win_count=user.win_count + 1, + ).apply() + elif itype == 'lose': + await user.update( + fail_count=user.fail_count + 1, + ).apply() + return True + except Exception: + return False + + @classmethod + async def money(cls, user_qq: int, group_id: int, itype: str, count: int) -> bool: + try: + user = await cls.query.where( + (cls.user_qq == user_qq) & (cls.group_id == group_id) + ).gino.first() + if not user: + user = await cls.create( + user_qq=user_qq, + group_id=group_id + ) + if itype == 'win': + await user.update( + make_money=user.make_money + count, + ).apply() + elif itype == 'lose': + await user.update( + lose_money=user.lose_money + count, + ).with_for_update().apply() + return True + except Exception: + return False + + @classmethod + async def all_user(cls, group_id: int) -> List['RussianUser']: + users = await cls.query.where( + (cls.group_id == group_id) + ).gino.all() + return users + diff --git a/plugins/aconfig/__init__.py b/plugins/aconfig/__init__.py index a3f2d2f0..2c7c81fa 100644 --- a/plugins/aconfig/__init__.py +++ b/plugins/aconfig/__init__.py @@ -12,7 +12,7 @@ from util.utils import FreqLimiter __plugin_name__ = '基本设置 [Hidden]' -__plugin_usage__ = '用法: 基本' +__plugin_usage__ = '用法: 无' _flmt = FreqLimiter(300) diff --git a/plugins/admin_bot_manage/__init__.py b/plugins/admin_bot_manage/__init__.py index c8322843..816decca 100644 --- a/plugins/admin_bot_manage/__init__.py +++ b/plugins/admin_bot_manage/__init__.py @@ -9,9 +9,10 @@ from services.log import logger from configs.config import plugins2name_dict from nonebot.plugin import export -__plugin_usage__ = '''自定义进群欢迎消息: - 自定义进群欢迎消息 xxxx(图片) - 示例:自定义进群欢迎消息 欢迎新人!(后面可以跟一张图片噢)''' +__plugin_name__ = '自定义进群欢迎消息' + +__plugin_usage__ = '''自定义进群欢迎消息 [消息] [图片](可省略) + \t示例:自定义进群欢迎消息 欢迎新人![图片]''' export = export() export.update_member_info = update_member_info @@ -55,8 +56,6 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State): @custom_welcome.handle() async def _(bot: Bot, event: GroupMessageEvent, state: T_State): - if str(event.get_message()) in ['帮助'] or str(event.get_message()) == '': - await custom_welcome.finish(__plugin_usage__) msg = get_message_text(event.json()) imgs = get_message_imgs(event.json()) await custom_welcome.finish(await custom_group_welcome(msg, imgs, event.user_id, event.group_id), at_sender=True) diff --git a/plugins/admin_config.py b/plugins/admin_config.py index 84b6fe94..de0a0a79 100644 --- a/plugins/admin_config.py +++ b/plugins/admin_config.py @@ -7,6 +7,11 @@ from models.group_member_info import GroupInfoUser from configs.config import ADMIN_DEFAULT_AUTH +__plugin_name__ = '群管理员监测' + +__plugin_usage__ = '无' + + admin_notice = on_notice(priority=5) diff --git a/plugins/admin_help/__init__.py b/plugins/admin_help/__init__.py index 9425fd46..8ad6e868 100644 --- a/plugins/admin_help/__init__.py +++ b/plugins/admin_help/__init__.py @@ -29,15 +29,15 @@ passive_help = '''【被动技能开关(2): 开启/关闭b站转发解析 开启/关闭丢人爬 开启/关闭epic通知 - 开启/关闭全部通知 - 开启/关闭原神黄历提醒】 + 开启/关闭原神黄历提醒 + 开启/关闭全部通知】 ''' admin_help = on_command("管理员帮助", aliases={"管理帮助"}, priority=5, block=True) admin_help_img = CreateImg(1000, 600, font_size=24) admin_help_img.text((10, 10), __plugin_usage__) -admin_help_img.paste(CreateImg(400, 600, font_size=24).text((0, 0), passive_help), (600, 50)) +admin_help_img.paste(CreateImg(450, 600, font_size=24).text((0, 0), passive_help), (650, 50)) admin_help_img.save(IMAGE_PATH + 'admin_help_img.png') diff --git a/plugins/ai/__init__.py b/plugins/ai/__init__.py index a999f07f..510643f4 100644 --- a/plugins/ai/__init__.py +++ b/plugins/ai/__init__.py @@ -8,7 +8,7 @@ from util.utils import get_message_text, get_message_imgs from models.friend_user import FriendUser from models.group_member_info import GroupInfoUser -__plugin_name__ = 'AI' +__plugin_name__ = 'AI [Hidden]' ai = on_message(rule=to_me(), priority=8) @@ -21,7 +21,7 @@ async def _(bot: Bot, event: PrivateMessageEvent, state: T_State): if str(event.get_message()).find('CQ:xml') != -1: return # 打招呼 - if not msg and not imgs: + if (not msg and not imgs) or msg in ['你好啊', '你好', '在吗', '在不在', '您好', '您好啊', '你好', '在']: await ai.finish(hello()) img = imgs[0] if imgs else '' nickname = await FriendUser.get_friend_nickname(event.user_id) diff --git a/plugins/ai/data_source.py b/plugins/ai/data_source.py index 732e7299..e604bff1 100644 --- a/plugins/ai/data_source.py +++ b/plugins/ai/data_source.py @@ -82,7 +82,7 @@ async def get_qqbot_chat_result(text: str, img_url: str, user_id: int, user_name return '' resp_payload = json.loads(await response.text()) if resp_payload['intent']: - if resp_payload['intent']['code'] != 0: + if int(resp_payload['intent']['code']) in [4003]: index += 1 # 该AI很屑!!!!!!!!!!!! async with sess.get(f'http://api.qingyunke.com/api.php?key=free&appid=0&msg={text}') as res: diff --git a/plugins/auto_invite/__init__.py b/plugins/auto_invite/__init__.py index 06a83336..652c9082 100644 --- a/plugins/auto_invite/__init__.py +++ b/plugins/auto_invite/__init__.py @@ -5,7 +5,7 @@ from datetime import datetime from configs.config import AUTO_ADD_FRIEND from nonebot.adapters.cqhttp.exception import ActionFailed -__plugin_name__ = '处理请求' +__plugin_name__ = '好友群聊处理请求 [Hidden]' friend_req = on_request(priority=5) diff --git a/plugins/ban/__init__.py b/plugins/ban/__init__.py index 4d53b2fd..982d228a 100644 --- a/plugins/ban/__init__.py +++ b/plugins/ban/__init__.py @@ -11,11 +11,13 @@ from models.group_member_info import GroupInfoUser __plugin_name__ = 'Ban/unBan' -__plugin_usage__ = f'用法: 封禁/解封用户(不是禁言!是针对bot是否处理封禁用户消息)\n' \ - '示例:.ban @djdsk\n' \ - '示例:.ban @djdsk 0(小时) 30(分钟)\n' \ - '示例:.ban @sdasf 4(小时)\n' \ - '示例:.unban @sdasf' +__plugin_usage__ = '用法:\n' \ + '(不是禁言!是针对真寻是否处理封禁用户消息)\n' \ + '封禁/解封用户 [小时] [分钟]\n' \ + '示例:.ban @djdsk\n' \ + '示例:.ban @djdsk 0 30\n' \ + '示例:.ban @sdasf 4\n' \ + '示例:.unban @sdasf' ban = on_command(".ban", aliases={'.unban', '/ban', '/unban'}, priority=5, permission=GROUP, block=True) @@ -23,8 +25,6 @@ ban = on_command(".ban", aliases={'.unban', '/ban', '/unban'}, priority=5, permi @ban.handle() async def _(bot: Bot, event: GroupMessageEvent, state: T_State): - if get_message_text(event.json()) in ['帮助'] or str(event.get_message()) == '': - await ban.finish(__plugin_usage__) # try: result = '' qq = int(get_message_at(event.json())[0]) diff --git a/plugins/broadcast/__init__.py b/plugins/broadcast/__init__.py index 54c94a3b..bf01a6c4 100644 --- a/plugins/broadcast/__init__.py +++ b/plugins/broadcast/__init__.py @@ -8,6 +8,10 @@ from services.log import logger from models.group_remind import GroupRemind from util.init_result import image +__plugin_name__ = "广播 [Hidden]" + +__plugin_usage__ = '广播- [消息] or [图片]' + broadcast = on_command("广播-", priority=1, permission=SUPERUSER, block=True) diff --git a/plugins/bt/__init__.py b/plugins/bt/__init__.py index 29989780..3ba3ac29 100644 --- a/plugins/bt/__init__.py +++ b/plugins/bt/__init__.py @@ -37,8 +37,6 @@ async def _(bot: Bot, event: PrivateMessageEvent, state: T_State): @bt.handle() async def _(bot: Bot, event: PrivateMessageEvent, state: T_State): - if get_message_text(event.json()) in ['帮助'] or str(event.get_message()) == '': - await bt.finish(__plugin_usage__) if _ulmt.check(event.user_id): await bt.finish('您有bt任务正在进行,请等待结束.', at_sender=True) mp = get_message_text(event.json()).split(" ") diff --git a/plugins/check/__init__.py b/plugins/check/__init__.py index 85292fc3..65260683 100644 --- a/plugins/check/__init__.py +++ b/plugins/check/__init__.py @@ -7,7 +7,9 @@ from nonebot.rule import to_me from nonebot.permission import SUPERUSER -__plugin_name__ = '自我检查' +__plugin_name__ = '自我检查 [Hidden]' + +__plugin_usage__ = '用法:自检' check = Check() diff --git a/plugins/coser/__init__.py b/plugins/coser/__init__.py index f2589abc..9eeaa2c6 100644 --- a/plugins/coser/__init__.py +++ b/plugins/coser/__init__.py @@ -6,7 +6,9 @@ from services.log import logger from util.init_result import image import requests -__plugin_usage_coser__ = '不得看看可爱的coser?发送‘coser’' +__plugin_name__ = 'coser' + +__plugin_usage__ = '用法:发送‘coser’' coser = on_command('cos', aliases={'coser', '括丝'}, priority=5, block=True) @@ -17,8 +19,6 @@ url_2 = 'http://api.rosysun.cn/cos' @coser.handle() async def _(bot: Bot, event: Event, state: T_State): - if get_message_text(event.json()) in ['帮助']: - await coser.finish(__plugin_usage_coser__) img_url = requests.get(url_2).text await coser.send(image(img_url)) logger.info( diff --git a/plugins/delete_img/__init__.py b/plugins/delete_img/__init__.py index 5ca22837..e3686ae2 100644 --- a/plugins/delete_img/__init__.py +++ b/plugins/delete_img/__init__.py @@ -11,8 +11,8 @@ from util.utils import is_number, cn2py __plugin_name__ = '删除图片' __plugin_usage__ = '删除图片帮助:\n\t' \ - '1.查看列表 --> 指令: 删除图片 列表/目录\n\t' \ - '2.删除图片 图库 id, 即在相应目录下删除图片\n\t\t示例: 删除图片 色图 1 ' + '1.查看列表 --> 指令: 删除图片 列表/目录\n\t' \ + '2.删除图片 图库 id, 即在相应目录下删除图片\n\t\t示例: 删除图片 色图 1 ' delete_img = on_command("删除图片", priority=5, rule=to_me(), block=True) diff --git a/plugins/dialogue/__init__.py b/plugins/dialogue/__init__.py index e2064b9d..941c5029 100644 --- a/plugins/dialogue/__init__.py +++ b/plugins/dialogue/__init__.py @@ -8,7 +8,7 @@ from util.init_result import at __plugin_name__ = '联系管理员' -__plugin_usage__ = '滴滴滴- 后接内容 联系管理员' +__plugin_usage__ = '用法:滴滴滴- [消息]' dialogue = on_command("[滴滴滴]", aliases={"滴滴滴-"}, priority=1, block=True) diff --git a/plugins/draw_card/__init__.py b/plugins/draw_card/__init__.py index 8735f886..685c0ac6 100644 --- a/plugins/draw_card/__init__.py +++ b/plugins/draw_card/__init__.py @@ -20,6 +20,9 @@ import asyncio from util.utils import scheduler from services.log import logger +__plugin_name__ = '游戏抽卡' + + prts = on_regex(r'.*?方舟[1-9|一][0-9]{0,2}[抽|井]', rule=is_switch('prts'), priority=5, block=True) prts_update = on_keyword({'更新方舟信息', '更新明日方舟信息'}, permission=SUPERUSER, priority=1, block=True) prts_up_reload = on_keyword({'重载方舟卡池'}, priority=1, block=True) diff --git a/plugins/draw_card/announcement.py b/plugins/draw_card/announcement.py index bf4e6583..dafb54c7 100644 --- a/plugins/draw_card/announcement.py +++ b/plugins/draw_card/announcement.py @@ -26,7 +26,7 @@ def is_expired(data: dict): start_date = datetime.strptime(times[0], '%Y-%m-%d').date() end_date = datetime.strptime(times[1], '%Y-%m-%d').date() now = datetime.now().date() - return start_date < now < end_date + return start_date <= now <= end_date # 检查写入 diff --git a/plugins/draw_card/genshin_handle.py b/plugins/draw_card/genshin_handle.py index 748c38ac..8f8d2e2e 100644 --- a/plugins/draw_card/genshin_handle.py +++ b/plugins/draw_card/genshin_handle.py @@ -2,14 +2,17 @@ import os from nonebot.adapters.cqhttp import MessageSegment import nonebot import random +from configs.path_config import IMAGE_PATH from .update_game_info import update_info -from .util import generate_img, init_star_rst, BaseData, set_list, get_star, UpEvent +from .util import generate_img, init_star_rst, BaseData, set_list, get_star, UpEvent, download_img from .config import GENSHIN_FIVE_P, GENSHIN_FOUR_P, GENSHIN_G_FIVE_P, GENSHIN_G_FOUR_P, GENSHIN_THREE_P, I72_ADD, \ DRAW_PATH, GENSHIN_FLAG from dataclasses import dataclass from .init_card_pool import init_game_pool from .announcement import GenshinAnnouncement from services.log import logger +from util.init_result import image + try: import ujson as json except ModuleNotFoundError: @@ -27,7 +30,6 @@ ALL_ARMS = [] UP_CHAR = [] UP_ARMS = [] - _CURRENT_CHAR_POOL_TITLE = '' _CURRENT_ARMS_POOL_TITLE = '' POOL_IMG = '' @@ -65,7 +67,8 @@ async def genshin_draw(user_id: int, count: int, pool_name: str): pool_info = f'当前up池:{title}\n{tmp}' if title else '' if count > 90: char_list = set_list(char_list) - return pool_info + '\n' + MessageSegment.image("base64://" + await generate_img(char_list, 'genshin', star_list)) + '\n' + rst[:-1] + \ + return pool_info + '\n' + MessageSegment.image( + "base64://" + await generate_img(char_list, 'genshin', star_list)) + '\n' + rst[:-1] + \ temp[:-1] + f'\n距离保底发还剩 {90 - genshin_count[user_id] if genshin_count.get(user_id) else "^"} 抽' \ + "\n【五星:0.6%,四星:5.1%\n第72抽开始五星概率每抽加0.585%】" @@ -205,9 +208,17 @@ async def _init_up_char(): up_char_dict = await GenshinAnnouncement.update_up_char() _CURRENT_CHAR_POOL_TITLE = up_char_dict['char']['title'] _CURRENT_ARMS_POOL_TITLE = up_char_dict['arms']['title'] + if _CURRENT_CHAR_POOL_TITLE and _CURRENT_ARMS_POOL_TITLE: - POOL_IMG = MessageSegment.image(up_char_dict['char']['pool_img']) + \ - MessageSegment.image(up_char_dict['arms']['pool_img']) + await download_img(up_char_dict['char']['pool_img'], 'genshin', 'up_char_pool_img') + await download_img(up_char_dict['arms']['pool_img'], 'genshin', 'up_arms_pool_img') + POOL_IMG = image('up_char_pool_img.png', '/draw_card/genshin/') + \ + image('up_arms_pool_img.png', '/draw_card/genshin/') + else: + if os.path.exists(IMAGE_PATH + '/draw_card/genshin/up_char_pool_img.png'): + os.remove(IMAGE_PATH + '/draw_card/genshin/up_char_pool_img.png') + if os.path.exists(IMAGE_PATH + '/draw_card/genshin/up_arms_pool_img.png'): + os.remove(IMAGE_PATH + '/draw_card/genshin/up_arms_pool_img.png') logger.info(f'成功获取原神当前up信息...当前up池: {_CURRENT_CHAR_POOL_TITLE} & {_CURRENT_ARMS_POOL_TITLE}') for key in up_char_dict.keys(): for star in up_char_dict[key]['up_char'].keys(): @@ -223,7 +234,3 @@ async def _init_up_char(): async def reload_genshin_pool(): await _init_up_char() return f'当前UP池子:{_CURRENT_CHAR_POOL_TITLE} & {_CURRENT_ARMS_POOL_TITLE} {POOL_IMG}' - - - - diff --git a/plugins/draw_card/guardian_handle.py b/plugins/draw_card/guardian_handle.py index f047b683..add2fd1f 100644 --- a/plugins/draw_card/guardian_handle.py +++ b/plugins/draw_card/guardian_handle.py @@ -86,7 +86,7 @@ def _get_guardian_card(pool_name: str): if pool_name != 'arms': star = get_star([3, 2, 1], [GUARDIAN_THREE_CHAR_P, GUARDIAN_TWO_CHAR_P, GUARDIAN_ONE_CHAR_P]) chars = [x for x in ALL_CHAR if x.star == star] - return random.choice(chars), 3- star + return random.choice(chars), 3 - star else: star = get_star([5, 4, 3, 2], [GUARDIAN_FIVE_ARMS_P, GUARDIAN_FOUR_ARMS_P, GUARDIAN_THREE_ARMS_P, GUARDIAN_TWO_ARMS_P]) diff --git a/plugins/draw_card/init_card_pool.py b/plugins/draw_card/init_card_pool.py index d93c2f53..12731dd9 100644 --- a/plugins/draw_card/init_card_pool.py +++ b/plugins/draw_card/init_card_pool.py @@ -10,11 +10,13 @@ def init_game_pool(game: str, data: dict, Operator: Any): event_only = False if '限定寻访' in data[key]['获取途径']: limited = True - if len(data[key]['获取途径']) == 1 and data[key]['获取途径'][0] == '公开招募': + if '干员寻访' not in data[key]['获取途径'] and '公开招募' in data[key]['获取途径']: recruit_only = True if '活动获取' in data[key]['获取途径']: event_only = True - if len(data[key]['获取途径']) == 1 and '凭证交易所' == data[key]['获取途径'][0]: + if '干员寻访' not in data[key]['获取途径'] and '凭证交易所' == data[key]['获取途径'][0]: + limited = True + if '干员寻访' not in data[key]['获取途径'] and '信用累计奖励' == data[key]['获取途径'][0]: limited = True if key.find('阿米娅') != -1: continue diff --git a/plugins/draw_card/prts_handle.py b/plugins/draw_card/prts_handle.py index 44157a23..d06eb21b 100644 --- a/plugins/draw_card/prts_handle.py +++ b/plugins/draw_card/prts_handle.py @@ -4,7 +4,7 @@ import nonebot import random from .config import PRTS_FIVE_P, PRTS_FOUR_P, PRTS_SIX_P, PRTS_THREE_P, DRAW_PATH, PRTS_FLAG from .update_game_info import update_info -from .util import generate_img, init_star_rst, max_card, BaseData, UpEvent, set_list, get_star, format_card_information +from .util import generate_img, init_star_rst, max_card, BaseData, UpEvent, set_list, get_star from .init_card_pool import init_game_pool from pathlib import Path from .announcement import PrtsAnnouncement @@ -36,8 +36,7 @@ class Operator(BaseData): async def prts_draw(count: int = 300): cnlist = ['★★★★★★', '★★★★★', '★★★★', '★★★'] star_list = [0, 0, 0, 0] - operator_list, operator_dict, six_list, star_list, six_index_list = format_card_information(count, star_list, - _get_operator_card) + operator_list, operator_dict, six_list, star_list, six_index_list = format_card_information(count, star_list) up_list = [] if _CURRENT_POOL_TITLE: for x in UP_OPERATOR: @@ -73,8 +72,8 @@ async def init_prts_data(): # 抽取干员 -def _get_operator_card(): - star = get_star([6, 5, 4, 3], [PRTS_SIX_P, PRTS_FIVE_P, PRTS_FOUR_P, PRTS_THREE_P]) +def _get_operator_card(add: float): + star = get_star([6, 5, 4, 3], [PRTS_SIX_P + add, PRTS_FIVE_P, PRTS_FOUR_P, PRTS_THREE_P]) if _CURRENT_POOL_TITLE: zooms = [x.zoom for x in UP_OPERATOR if x.star == star] zoom = 0 @@ -107,6 +106,33 @@ def _get_operator_card(): return acquire_operator, 6 - star +# 整理数据 +def format_card_information(count: int, star_list: list): + max_star_lst = [] # 获取的最高星级角色列表 + max_index_lst = [] # 获取最高星级角色的次数 + obj_list = [] # 获取所有角色 + obj_dict = {} # 获取角色次数字典 + add = 0.0 + count_idx = 0 + for i in range(count): + count_idx += 1 + obj, code = _get_operator_card(add) + star_list[code] += 1 + if code == 0: + max_star_lst.append(obj.name) + max_index_lst.append(i) + add = 0.0 + count_idx = 0 + elif count_idx > 50: + add += 0.02 + try: + obj_dict[obj.name] += 1 + except KeyError: + obj_dict[obj.name] = 1 + obj_list.append(obj) + return obj_list, obj_dict, max_star_lst, star_list, max_index_lst + + # 获取up干员和概率 async def _init_up_char(): global _CURRENT_POOL_TITLE, POOL_IMG, UP_OPERATOR diff --git a/plugins/draw_card/update_game_info.py b/plugins/draw_card/update_game_info.py index 252bbf73..34ed3b11 100644 --- a/plugins/draw_card/update_game_info.py +++ b/plugins/draw_card/update_game_info.py @@ -131,15 +131,15 @@ async def _modify_avatar_url(session: aiohttp.ClientSession, game_name: str, cha # 数据最后处理(是否需要额外数据或处理数据) async def _last_check(data: dict, game_name: str, session: aiohttp.ClientSession): - if game_name == 'prts': - url = 'https://wiki.biligame.com/arknights/' - tasks = [] - for key in data.keys(): - tasks.append(asyncio.ensure_future(_async_update_prts_extra_info(url, key, session))) - asyResult = await asyncio.gather(*tasks) - for x in asyResult: - for key in x.keys(): - data[key]['获取途径'] = x[key]['获取途径'] + # if game_name == 'prts': + # url = 'https://wiki.biligame.com/arknights/' + # tasks = [] + # for key in data.keys(): + # tasks.append(asyncio.ensure_future(_async_update_prts_extra_info(url, key, session))) + # asyResult = await asyncio.gather(*tasks) + # for x in asyResult: + # for key in x.keys(): + # data[key]['获取途径'] = x[key]['获取途径'] if game_name == 'genshin': for key in data.keys(): async with session.get(f'https://wiki.biligame.com/ys/{key}', timeout=7) as res: @@ -177,6 +177,14 @@ async def _last_check(data: dict, game_name: str, session: aiohttp.ClientSession # 对抓取每行数据是否需要额外处理? def intermediate_check(member_dict: dict, key: str, game_name: str, td: bs4.element.Tag): + if game_name == 'prts': + if key == '获取途径': + msg = re.search('
dk(
z97iQ(;RqmS3nYsI$s&+81R8YN3Wk6{qg1BPsd9Q$C?Ggai-9psU=au*YWIyLf~W)&
z>Mm6R!f*(Vr4 IzepxX8CQ
zjsjkpt=uqo`Xl$B-TAsihwbUDUP4Hj?0fxByr*|+|LrULKhwXI`}pO^({2jm&Xl;}
zJAdxCgXrQcg;3i3Tko1UkhUi7=w^t1=JQ0OnysXc=tf5!v5lPaQ27*r1Wc)EVwq`&
z?A+GjiXBtTPIhR<2}%YCd^Xfcueq!cNF_+(koH(YYpO$IvO_S|KnIFbD}9y+1GFuP
zLPrug0%g#y^7*Hs;nZ@$sZ~Q~tVyTcL|egPH)mlvWteFOnPHguoR+I2zS3BWHF%yif#jhv|m&X3aT_HI&-W&n&92bS#urNTn@heOMf_&UtQ*Mn~^M39zL_
zmxa%biDc9Bz26ClR(|@$(@UTI#NzDBUg4zL@}9Q0U;6`Bf6Gt2?Z99B^823&F4xlv
ztf}i>GPd(&-~0O)^Q(k&G#Y$iaeT*J%cq1&i#q!~`Wn~K-zX2Iq>t!AwV}D90JOH0
zMMEn7+^38
zgDJ8Anp?K9;K
ZQ-L42gD1l!A8r`XJag2LPlaX
z`W?h{86c-AlGO8nRZnAaE?_wvrY#!*6l@B^?V=$8r66Z3$XJrN&AAN{^0ow);mDl7
zLKU#QiZDS
uDwcZ9{Z>Ro&hL2J$C?U%E0+hr)@
zWB6`2#S)*&CT=|5t!}#orN3s}X*-RF_Pz7Jy!iB;AAQon^`rr7<~gsKy7oujeB0Lp
zm9lA`9{SuJOZz{4^+?%HmQ9AuJ187lX+(S`*3J~#M3f^?SVTMzWt74>N9GLOT+zyf
z)EYAB;+X)8BSUFVhNhAOhLWlvIVfccUILWHn203O7^TSaj65|c9fRapQj9K9jtrw!
zMQk8a7O^=_ERl(^L^L|Wa>vJ6h3gs~9b?x`H&IH;D1qDwX_lizFvc{`c1ORWw%mFv
zQSvo2W!r8%bpJbk?bb7Qe|-K@-K)p4o)ln>@4BUS;~W3v3(3&LO<(JEDs8r#dp~%`
z%CWm{9UW5TB+`h@Fv_AOrwE$`MPwqJ0%u(yKrPN@WU0{13~j5)5gZOJ3dm8~VO>h<
zGL$xqBngpGSOI4>-7H5bjn;}Jil~-Kl#>!#DVpsr^;U+