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('([\\s\\S]*)', str(td)).group(1).strip() + msg = msg[:-1] if msg[-1] == '\n' else msg + if msg.find('') if game_name == 'pretty': if key == '初始星级': member_dict['初始星级'] = len(td.find_all('img')) diff --git a/plugins/draw_card/update_game_simple_info.py b/plugins/draw_card/update_game_simple_info.py index c912fca9..bf8f070a 100644 --- a/plugins/draw_card/update_game_simple_info.py +++ b/plugins/draw_card/update_game_simple_info.py @@ -7,6 +7,7 @@ from .util import remove_prohibited_str from urllib.parse import unquote from services.log import logger import bs4 +import asyncio try: import ujson as json @@ -35,7 +36,7 @@ async def update_simple_info(url: str, game_name: str) -> 'dict, int': for char in contents: data = await retrieve_char_data(char, game_name, data, index) index += 1 - data = await _last_check(data, game_name) + data = await _last_check(data, game_name, session) except TimeoutError: logger.warning(f'更新 {game_name} 超时...') return {}, 999 @@ -70,7 +71,7 @@ def get_char_lst_contents(char_lst: bs4.element.Tag, game_name: str): # 额外数据 -async def _last_check(data: dict, game_name: str) -> dict: +async def _last_check(data: dict, game_name: str, session: aiohttp.ClientSession) -> dict: if game_name == 'azur': idx = 1 for url in [ @@ -85,7 +86,13 @@ async def _last_check(data: dict, game_name: str) -> dict: ]: await download_img(url, 'azur', f'{idx}_star') idx += 1 - + tasks = [] + for key in data.keys(): + tasks.append(asyncio.ensure_future(_async_update_azur_extra_info(key, session))) + asyResult = await asyncio.gather(*tasks) + for x in asyResult: + for key in x.keys(): + data[key]['获取途径'] = x[key]['获取途径'] return data @@ -141,3 +148,26 @@ async def retrieve_char_data(char: bs4.element.Tag, game_name: str, data: dict, data[member_dict['名称']] = member_dict logger.info(f'{member_dict["名称"]} is update...') return data + + +async def _async_update_azur_extra_info(key: str, session: aiohttp.ClientSession): + if key[-1] == '改': + return {key: {'获取途径': ['无法建造']}} + for i in range(20): + try: + async with session.get(f'https://wiki.biligame.com/blhx/{key}', timeout=7) as res: + soup = BeautifulSoup(await res.text(), 'lxml') + construction_time = str(soup.find('table', {'class': 'wikitable sv-general'}).find('tbody')) + x = {key: {'获取途径': []}} + if construction_time.find('无法建造') != -1: + x[key]['获取途径'].append('无法建造') + elif construction_time.find('活动已关闭') != -1: + x[key]['获取途径'].append('活动限定') + else: + x[key]['获取途径'].append('可以建造') + logger.info(f'碧蓝航线获取额外信息 {key}...{x[key]["获取途径"]}') + return x + except TimeoutError: + logger.warning(f'访问 https://wiki.biligame.com/blhx/{key} 第 {i}次 超时...已再次访问') + return {} + diff --git a/plugins/epic/__init__.py b/plugins/epic/__init__.py index 16d454af..d99532a6 100644 --- a/plugins/epic/__init__.py +++ b/plugins/epic/__init__.py @@ -7,7 +7,9 @@ from .data_source import get_epic_game from models.group_remind import GroupRemind from nonebot.adapters.cqhttp.exception import ActionFailed -__plugin_usage__ = 'epic免费游戏提醒' +__plugin_name__ = 'epic免费游戏提醒' + +__plugin_usage__ = '用法:发送’epic‘' epic = on_command("epic", priority=5, block=True) @@ -16,8 +18,6 @@ epic = on_command("epic", priority=5, block=True) @epic.handle() async def _(bot: Bot, event: MessageEvent, state: T_State): # try: - if str(event.get_message()) in ['帮助']: - await epic.finish(__plugin_usage__) try: result = await get_epic_game() except: diff --git a/plugins/fake_msg.py b/plugins/fake_msg.py index b4eb51d1..4453ec2e 100644 --- a/plugins/fake_msg.py +++ b/plugins/fake_msg.py @@ -6,7 +6,10 @@ from util.init_result import share from services.log import logger -__plugin_usage__ = '用法:\n格式:网址 标题 内容(可省略) 图片(可省略)\n示例:假消息 www.4399.com 我喜欢萝莉 为什么我喜欢... (图片)' +__plugin_name = '假消息' + +__plugin_usage__ = '用法:\n格式:假消息 [网址] [标题] [内容](可省) [图片](可省)\n' \ + '示例:假消息 www.4399.com 我喜欢萝莉 为什么我喜欢... [图片]' fake_msg = on_command('假消息', priority=5, block=True) @@ -16,8 +19,6 @@ fake_msg = on_command('假消息', priority=5, block=True) async def _(bot: Bot, event: MessageEvent, state: T_State): msg = get_message_text(event.json()).split(' ') img = get_message_imgs(event.json()) - if not msg or msg in ['帮助']: - await fake_msg.finish(__plugin_usage__) if len(msg) > 1: if len(msg) == 2: url = msg[0] diff --git a/plugins/genshin/almanac/__init__.py b/plugins/genshin/almanac/__init__.py index 36122e09..8abff492 100644 --- a/plugins/genshin/almanac/__init__.py +++ b/plugins/genshin/almanac/__init__.py @@ -9,6 +9,7 @@ from util.init_result import image from services.log import logger from models.group_remind import GroupRemind + FILE_PATH = os.path.dirname(__file__) almanac = on_command('原神黄历', priority=5, block=True) diff --git a/plugins/genshin/qiu_qiu_translation/__init__.py b/plugins/genshin/qiu_qiu_translation/__init__.py index 6f10114e..d3bc61d6 100644 --- a/plugins/genshin/qiu_qiu_translation/__init__.py +++ b/plugins/genshin/qiu_qiu_translation/__init__.py @@ -5,6 +5,9 @@ from nonebot import on_command from util.utils import get_message_text from services.log import logger +__plugin_name__ = '丘丘语翻译' + +__plugin_usage__ = '用法:丘丘翻译 [消息]' qiuqiu = on_command("丘丘语翻译", aliases={"丘丘一下", "丘丘翻译"}, priority=5, block=True) diff --git a/plugins/genshin/query_resource_points/__init__.py b/plugins/genshin/query_resource_points/__init__.py index 29857d09..c318c2fc 100644 --- a/plugins/genshin/query_resource_points/__init__.py +++ b/plugins/genshin/query_resource_points/__init__.py @@ -12,6 +12,15 @@ try: except ModuleNotFoundError: import json +__plugin_name__ = '原神资源查询' + +__plugin_usage__ = '用法:\n' \ + '\t原神资源查询 [消息]\n' \ + '\t原神资源列表\n' \ + '\t[消息]在哪\n' \ + '\t哪有[消息]\n' \ + '[消息] = 资源名称' + qr = on_command("原神资源查询", priority=5, block=True) qr_lst = on_command("原神资源列表", priority=5, block=True) rex_qr = on_regex('.*?(在哪|在哪里|哪有|哪里有).*?', rule=to_me(), priority=5, block=True) diff --git a/plugins/genshin/query_resource_points/icon/182.png b/plugins/genshin/query_resource_points/icon/182.png new file mode 100644 index 00000000..233d0451 Binary files /dev/null and b/plugins/genshin/query_resource_points/icon/182.png differ diff --git a/plugins/genshin/query_resource_points/icon/185.png b/plugins/genshin/query_resource_points/icon/185.png new file mode 100644 index 00000000..090da066 Binary files /dev/null and b/plugins/genshin/query_resource_points/icon/185.png differ diff --git a/plugins/genshin/query_resource_points/icon/187.png b/plugins/genshin/query_resource_points/icon/187.png new file mode 100644 index 00000000..e76468b8 Binary files /dev/null and b/plugins/genshin/query_resource_points/icon/187.png differ diff --git a/plugins/genshin/query_resource_points/icon/188.png b/plugins/genshin/query_resource_points/icon/188.png new file mode 100644 index 00000000..f18f1668 Binary files /dev/null and b/plugins/genshin/query_resource_points/icon/188.png differ diff --git a/plugins/genshin/query_resource_points/icon/190.png b/plugins/genshin/query_resource_points/icon/190.png new file mode 100644 index 00000000..b8ac291e Binary files /dev/null and b/plugins/genshin/query_resource_points/icon/190.png differ diff --git a/plugins/genshin/query_resource_points/icon/191.png b/plugins/genshin/query_resource_points/icon/191.png new file mode 100644 index 00000000..361c184b Binary files /dev/null and b/plugins/genshin/query_resource_points/icon/191.png differ diff --git a/plugins/genshin/query_resource_points/icon/192.png b/plugins/genshin/query_resource_points/icon/192.png new file mode 100644 index 00000000..c4a86cfa Binary files /dev/null and b/plugins/genshin/query_resource_points/icon/192.png differ diff --git a/plugins/genshin/query_resource_points/icon/193.png b/plugins/genshin/query_resource_points/icon/193.png new file mode 100644 index 00000000..8852383a Binary files /dev/null and b/plugins/genshin/query_resource_points/icon/193.png differ diff --git a/plugins/genshin/query_resource_points/icon/dd b/plugins/genshin/query_resource_points/icon/dd deleted file mode 100644 index 8b137891..00000000 --- a/plugins/genshin/query_resource_points/icon/dd +++ /dev/null @@ -1 +0,0 @@ - diff --git a/plugins/genshin/query_resource_points/query_resource.py b/plugins/genshin/query_resource_points/query_resource.py index 7637ffae..4ffee4ab 100644 --- a/plugins/genshin/query_resource_points/query_resource.py +++ b/plugins/genshin/query_resource_points/query_resource.py @@ -7,6 +7,10 @@ import time import base64 from configs.path_config import IMAGE_PATH from util.init_result import image +import asyncio +import nonebot + +driver: nonebot.Driver = nonebot.get_driver() LABEL_URL = 'https://api-static.mihoyo.com/common/blackboard/ys_obc/v1/map/label/tree?app_sn=ys_obc' POINT_LIST_URL = 'https://api-static.mihoyo.com/common/blackboard/ys_obc/v1/map/point/list?map_id=2&app_sn=ys_obc' @@ -16,9 +20,9 @@ header = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, l FILE_PATH = os.path.dirname(__file__) -MAP_PATH = os.path.join(IMAGE_PATH, "genshin", "seek_god_eye", "icon", "map_icon.jpg") -MAP_IMAGE = Image.open(MAP_PATH) -MAP_SIZE = MAP_IMAGE.size +MAP_PATH = None +MAP_IMAGE = None +MAP_SIZE = None # resource_point里记录的坐标是相对坐标,是以蒙德城的大雕像为中心的,所以图片合成时需要转换坐标 CENTER = (3505, 1907) @@ -26,6 +30,16 @@ CENTER = (3505, 1907) zoom = 0.75 resource_icon_offset = (-int(150 * 0.5 * zoom), -int(150 * zoom)) + +@driver.on_startup +async def init(): + global MAP_SIZE, MAP_PATH, MAP_IMAGE + MAP_PATH = os.path.join(IMAGE_PATH, "genshin", "seek_god_eye", "icon", "map_icon.jpg") + MAP_IMAGE = await asyncio.get_event_loop().run_in_executor(None, Image.open, MAP_PATH) + MAP_SIZE = MAP_IMAGE.size + await asyncio.get_event_loop().run_in_executor(None, up_label_and_point_list) + + data = { "all_resource_type": { # 这个字典保存所有资源类型, @@ -142,7 +156,6 @@ def up_label_and_point_list(): # 初始化 # load_resource_type_id() -up_label_and_point_list() class Resource_map(object): diff --git a/plugins/group_handle/__init__.py b/plugins/group_handle/__init__.py index 4672c7fc..c6e1981f 100644 --- a/plugins/group_handle/__init__.py +++ b/plugins/group_handle/__init__.py @@ -17,6 +17,11 @@ except ModuleNotFoundError: import json +__plugin_name__ = '群事件处理 [Hidden]' + +__usage__ = '用法:无' + + export = require("admin_bot_manage") # 群员增加处理 diff --git a/plugins/group_welcome_msg.py b/plugins/group_welcome_msg.py index 6f7e535e..23f55937 100644 --- a/plugins/group_welcome_msg.py +++ b/plugins/group_welcome_msg.py @@ -11,6 +11,10 @@ try: except ModuleNotFoundError: import json +__plugin_name__ = '查看群欢迎消息' + +__plugin_usage__ = '无' + view_custom_welcome = on_command('群欢迎消息', aliases={'查看群欢迎消息', '查看当前群欢迎消息'}, permission=GROUP, priority=5, block=True) diff --git a/plugins/help/__init__.py b/plugins/help/__init__.py index 7459ce59..b5e551de 100644 --- a/plugins/help/__init__.py +++ b/plugins/help/__init__.py @@ -5,8 +5,10 @@ from nonebot.rule import to_me from configs.path_config import DATA_PATH from util.init_result import image import os -from .data_source import create_help_img, create_group_help_img +from .data_source import create_help_img, create_group_help_img, get_plugin_help from nonebot import require +from util.utils import get_message_text + export = require("nonebot_plugin_manager") @@ -19,17 +21,25 @@ create_help_img() for file in os.listdir(DATA_PATH + 'group_help/'): os.remove(DATA_PATH + 'group_help/' + file) -_help = on_command("功能", rule=to_me(), aliases={"帮助", 'help'}, priority=1, block=True) +_help = on_command("功能", rule=to_me(), aliases={'help', '帮助'}, priority=1, block=True) @_help.handle() async def _(bot: Bot, event: GroupMessageEvent, state: T_State): - if not os.path.exists(DATA_PATH + f'group_help/{event.group_id}.png'): - create_group_help_img(event.group_id) - await _help.finish(image(abspath=DATA_PATH + f'group_help/{event.group_id}.png')) + msg = get_message_text(event.json()) + if not msg: + if not os.path.exists(DATA_PATH + f'group_help/{event.group_id}.png'): + create_group_help_img(event.group_id) + await _help.finish(image(abspath=DATA_PATH + f'group_help/{event.group_id}.png')) + else: + await _help.finish(get_plugin_help(msg)) @_help.handle() async def _(bot: Bot, event: PrivateMessageEvent, state: T_State): - await _help.finish(image('help.png')) + msg = get_message_text(event.json()) + if not msg: + await _help.finish(image('help.png')) + else: + await _help.finish(get_plugin_help(msg)) diff --git a/plugins/help/config.py b/plugins/help/config.py index e5b3868f..76add431 100644 --- a/plugins/help/config.py +++ b/plugins/help/config.py @@ -29,7 +29,7 @@ entertainment_help = { 'open_cases': '模拟开箱(戒赌) --> 指令:开箱(N连开箱[N<=30])/我的开箱/群开箱统计/我的金色', 'luxun': '鲁迅说过 --> 指令:鲁迅说', 'fake_msg': '构造一个假消息 --> 指令:假消息', - 'shop': '商店系统(初始送100金币) --> 指令:商店/我的金币/购买道具/使用道具', + 'shop_handle': '商店系统(初始送100金币) --> 指令:商店/我的金币/购买道具/使用道具', 'draw_card_prts': '换个地方当非酋TvT... --> 指令:方舟一井/方舟N抽(0 指令:原神一井/原神N抽(0 指令:赛马娘一井/赛马娘N抽/赛马娘卡一井/赛马娘卡N抽(0 指令:今日素材/天赋材料', 'qiu_qiu_translation': '这家伙到底在说什么? --> 指令:丘丘翻译/丘丘一下/丘丘语翻译', 'query_resource_points': '地图资源速速查看 --> 指令:原神资源查询xx/原神资源列表/哪里有xx/xx在哪(xx=资源名称)', + 'russian': '紧张刺激的俄罗斯轮盘 --> 指令:俄罗斯轮盘帮助', + 'gold_redbag': '运气项目又来啦! --> 指令:塞红包/ 抢红包指令: 开/抢/戳一戳真寻/ 退回:退回未抢完的红包' } # 其他 other_help = [ diff --git a/plugins/help/data_source.py b/plugins/help/data_source.py index 04787fce..95e24f3d 100644 --- a/plugins/help/data_source.py +++ b/plugins/help/data_source.py @@ -5,6 +5,8 @@ import os from .config import * from nonebot import require from configs.config import INITIAL_OPEN_CASE_COUNT, INITIAL_SETU_PROBABILITY, ADMIN_DEFAULT_AUTH +from configs.config import plugins2name_dict +import nonebot export = require("nonebot_plugin_manager") @@ -48,11 +50,10 @@ def create_help_img(): A.paste(u, (0, u_height)) A.paste(o, (0, o_height)) A.text((10, h * 0.76), '大部分交互功能可以通过输入‘取消’,‘算了’来取消当前交互\n对我说 “指令名 帮助” 获取对应详细帮助\n' - '可以通过 “滴滴滴- 后接内容” 联系管理员(有趣的想法尽管来吧!<还有Bug和建议>)\n[群管理员请看 管理员帮助(群主与管理员自带 5 级权限)]') - A.text((10, h * 0.81), f"【注】「色图概率:好感度 + 70%\n" - f"\t\t每 3 点好感度 + 1次开箱,初始 20 次\n" - f"\t\t开启/关闭功能只需输入‘开启/关闭 指令名’(每个功能的第一个指令)」\n" - f"\t\t示例:开启签到") + '可以通过 “滴滴滴- 后接内容” 联系管理员(有趣的想法尽管来吧!<还有Bug和建议>)' + '\n[群管理员请看 管理员帮助(群主与管理员自带 5 级权限)]\n\n' + '\t「如果真寻回复了一些不符合人设的话,那是因为每日白嫖的图灵次数已用完,使用的是备用接口【QAQ】」') + A.save(IMAGE_PATH + 'help.png') @@ -106,7 +107,8 @@ def create_group_help_img(group_id: int): f"\t\t开启/关闭功能只需输入‘开启/关闭 指令名’(每个功能的第一个指令)」\n" f"\t\t示例:开启签到\n" f"\t\t可以通过管理员开关自动发送消息(早晚安等)\n" - f"\t\t^请查看管理员帮助^") + f"\t\t^请查看管理员帮助^\n\n" + f"\t「如果真寻回复了一些不符合人设的话,那是因为每日白嫖的图灵次数已用完,使用的是备用接口【QAQ】」") A.save(DATA_PATH + f'group_help/{group_id}.png') @@ -140,4 +142,15 @@ def rcmd(dfg): return 'pixiv_s' +def get_plugin_help(msg: str) -> str: + plugin = None + for p in plugins2name_dict.keys(): + if msg in plugins2name_dict[p]: + plugin = nonebot.plugin.get_plugin(p) + break + if plugin: + result = plugin.module.__getattribute__("__plugin_usage__") + return result + else: + return '没有此功能的帮助信息...' diff --git a/plugins/hook.py b/plugins/hook.py index 07eb21ff..258f1b67 100644 --- a/plugins/hook.py +++ b/plugins/hook.py @@ -96,7 +96,7 @@ async def _(matcher: Matcher, bot: Bot, event: MessageEvent, state: T_State): # 为什么AI会自己和自己聊天 @run_preprocessor async def _(matcher: Matcher, bot: Bot, event: PrivateMessageEvent, state: T_State): - if matcher.type == 'message' and event.user_id == int(bot.self_id): + if event.user_id == int(bot.self_id): raise IgnoredException('为什么AI会自己和自己聊天') diff --git a/plugins/jitang.py b/plugins/jitang.py index 5ac4f1de..f0d98b82 100644 --- a/plugins/jitang.py +++ b/plugins/jitang.py @@ -1,18 +1,20 @@ from nonebot import on_command from util.user_agent import get_user_agent -from bs4 import BeautifulSoup from services.log import logger from nonebot.adapters.cqhttp import Bot, Event from nonebot.typing import T_State import aiohttp from asyncio.exceptions import TimeoutError - +try: + import ujson as json +except ModuleNotFoundError: + import json __plugin_name__ = '鸡汤' -__plugin_usage__ = '用法: 要喝一点鸡汤吗?' +__plugin_usage__ = '用法: 发送’鸡汤‘,真寻亲自为你喝鸡汤' -url = "https://new.toodo.fun/funs/content?type=du" +url = "https://v2.alapi.cn/api/soul" jitang = on_command("鸡汤", aliases={"毒鸡汤"}, priority=5, block=True) @@ -20,19 +22,23 @@ jitang = on_command("鸡汤", aliases={"毒鸡汤"}, priority=5, block=True) @jitang.handle() async def _(bot: Bot, event: Event, state: T_State): - if str(event.get_message()) in ['帮助']: - await jitang.finish(__plugin_usage__) + params = { + "format": "json", + "token": "h0KuF6qNniMHGUtA" + } try: async with aiohttp.ClientSession(headers=get_user_agent()) as session: - async with session.get(url, timeout=7) as response: - soup = BeautifulSoup(await response.text(), 'lxml') - result = (soup.find_all('h3', {'class': 'text-center'}))[0].text - await jitang.send(result) - logger.info( - f"(USER {event.user_id}, GROUP {event.group_id if event.message_type != 'private' else 'private'})" - f" 发送鸡汤:" + result) + async with session.get(url, timeout=7, params=params) as response: + if response.status == 200: + data = await response.json() + await jitang.send(data['data']['content']) + logger.info( + f"(USER {event.user_id}, GROUP {event.group_id if event.message_type != 'private' else 'private'})" + f" 发送鸡汤:" + data['data']['content']) + else: + await jitang.send('鸡汤煮坏掉了...') except TimeoutError: await jitang.send("鸡汤煮超时了##", at_sender=True) - except Exception as e: - await jitang.send("出错啦!再试一次吧!", at_sender=True) - logger.info(f'鸡汤error e:{e}') + # except Exception as e: + # await jitang.send("出错啦!再试一次吧!", at_sender=True) + # logger.info(f'鸡汤error e:{e}') diff --git a/plugins/last_chat/__init__.py b/plugins/last_chat/__init__.py index 169a7496..042bc0ef 100644 --- a/plugins/last_chat/__init__.py +++ b/plugins/last_chat/__init__.py @@ -9,6 +9,8 @@ from services.log import logger __plugin_name__ = '查看群最后聊天时间 [Hidden]' +__plugin_usage__ = '用法:无' + last_chat = on_message(priority=1, block=False, permission=GROUP) diff --git a/plugins/luxun/__init__.py b/plugins/luxun/__init__.py index 985f1d55..add6ab97 100644 --- a/plugins/luxun/__init__.py +++ b/plugins/luxun/__init__.py @@ -9,6 +9,10 @@ from services.log import logger from util.utils import UserExistLimiter, get_message_text from util.img_utils import pic2b64 +__plugin_name__ = '鲁迅说' + +__plugin_usage__ = '用法:鲁迅说 [消息]' + _ulmt = UserExistLimiter() diff --git a/plugins/move_img/__init__.py b/plugins/move_img/__init__.py index 6f3f593d..2f3f3e79 100644 --- a/plugins/move_img/__init__.py +++ b/plugins/move_img/__init__.py @@ -11,8 +11,8 @@ from configs.path_config import IMAGE_PATH __plugin_name__ = '移动图片' __plugin_usage__ = '移动图片帮助:\n\t' \ - '1.查看列表 --> 指令: 移动图片 列表/目录\n\t' \ - '2.移动图片 源 目的 id\n\t\t示例: 移动图片 色图 美图 1234' + '1.查看列表 --> 指令: 移动图片 列表/目录\n\t' \ + '2.移动图片 源 目的 id\n\t\t示例: 移动图片 色图 美图 1234' move_img = on_command('移动图片', priority=5, rule=to_me(), block=True) diff --git a/plugins/mute.py b/plugins/mute.py index e7a7b1ad..4ed0497e 100644 --- a/plugins/mute.py +++ b/plugins/mute.py @@ -18,6 +18,8 @@ except ModuleNotFoundError: __plugin_name__ = '刷屏禁言' +__plugin_usage__ = '刷屏禁言检测' + mute = on_message(priority=1, block=False) mute_setting = on_command('mute_setting', aliases={'设置检测时间', '设置检测次数', '设置禁言时长', '刷屏检测设置'}, permission=GROUP, block=True) diff --git a/plugins/nickname.py b/plugins/nickname.py index d15c695c..f1280a39 100644 --- a/plugins/nickname.py +++ b/plugins/nickname.py @@ -9,6 +9,13 @@ import random from models.ban_user import BanUser from services.log import logger + +__plugin_name__ = '昵称系统' + +__plugin_usage__ = '用法:\n' \ + '以后叫我 [名称]\n' \ + '真寻我是谁' + nickname = on_command('nickname', aliases={'以后叫我', '以后请叫我', '称呼我', '以后请称呼我', '以后称呼我', '叫我', '请叫我'}, rule=to_me(), priority=5, block=True) diff --git a/plugins/nonebot_plugin_cocdicer/__init__.py b/plugins/nonebot_plugin_cocdicer/__init__.py deleted file mode 100644 index 5dae4b6f..00000000 --- a/plugins/nonebot_plugin_cocdicer/__init__.py +++ /dev/null @@ -1,72 +0,0 @@ -from .data_source import rd, help_message, st, en -from .madness import ti, li -from .create import Investigator -from .san_check import sc - -from nonebot.plugin import on_startswith -from nonebot.adapters.cqhttp import Bot, Event - -rdhelp = on_startswith("骰子娘帮助", priority=2) -stcommand = on_startswith(".st", priority=2) -encommand = on_startswith(".en", priority=2) -ticommand = on_startswith(".ti", priority=2) -licommand = on_startswith(".li", priority=2) -coc = on_startswith(".coc", priority=2) -sccommand = on_startswith(".sc", priority=2) -rdcommand = on_startswith(".r", priority=3) - - -@rdhelp.handle() -async def rdhelphandler(bot: Bot): - await rdhelp.finish(help_message()) - - -@stcommand.handle() -async def stcommandhandler(bot: Bot): - await rdhelp.finish(st()) - - -@encommand.handle() -async def enhandler(bot: Bot, event: Event): - args = str(event.get_message())[3:].strip() - await encommand.finish(en(args)) - - -@rdcommand.handle() -async def rdcommandhandler(bot: Bot, event: Event): - args = str(event.get_message())[2:].strip() - uid = event.get_session_id() - if args and not("." in args): - rrd = rd(args) - if type(rrd) == str: - await rdcommand.finish(rrd) - elif type(rrd) == list: - await bot.send_private_msg(user_id=uid, message=rrd[0]) - - -@coc.handle() -async def cochandler(bot: Bot, event: Event): - args = str(event.get_message())[4:].strip() - try: - args = int(args) - except: - args = 20 - inv = Investigator() - inv.age_change(args) - await coc.finish(inv.output()) - - -@ticommand.handle() -async def ticommandhandler(bot: Bot): - await ticommand.finish(ti()) - - -@licommand.handle() -async def licommandhandler(bot: Bot): - await licommand.finish(li()) - - -@sccommand.handle() -async def schandler(bot: Bot, event: Event): - args = str(event.get_message())[3:].strip() - await sccommand.finish(sc(args.lower())) diff --git a/plugins/nonebot_plugin_cocdicer/create.py b/plugins/nonebot_plugin_cocdicer/create.py deleted file mode 100644 index 30b66d78..00000000 --- a/plugins/nonebot_plugin_cocdicer/create.py +++ /dev/null @@ -1,147 +0,0 @@ -import random - - -build_dict = {64: -2, 84: -1, 124: 0, 164: 1, - 204: 2, 284: 3, 364: 4, 444: 5, 524: 6} -db_dict = {-2: "-2", -1: "-1", 0: "0", 1: "1d4", - 2: "1d6", 3: "2d6", 4: "3d6", 5: "4d6", 6: "5d6"} - - -def randattr(time: int = 3, ex: int = 0): - r = 0 - for _ in range(time): - r += random.randint(1, 6) - return (r+ex)*5 - - -class Investigator(object): - def __init__(self) -> None: - self.age = 20 - self.str = randattr() - self.con = randattr() - self.siz = randattr(2, 6) - self.dex = randattr() - self.app = randattr() - self.int = randattr(2, 6) - self.pow = randattr() - self.edu = randattr(2, 6) - self.luc = randattr() - - def body_build(self) -> int: - build = self.str + self.con - for i, j in build_dict.items(): - if build <= i: - return j - return - - def db(self) -> str: - return db_dict[self.body_build()] - - def lp_max(self) -> int: - return (self.con+self.siz)//10 - - def mov(self) -> int: - r = 8 - if self.age >= 80: - r -= 5 - elif self.age >= 70: - r -= 4 - elif self.age >= 60: - r -= 3 - elif self.age >= 50: - r -= 2 - elif self.age >= 40: - r -= 1 - if self.str < self.siz and self.dex < self.siz: - return r-1 - elif self.str > self.siz and self.dex > self.siz: - return r+1 - else: - return r - - def edu_up(self) -> str: - edu_check = random.randint(1, 100) - if edu_check > self.edu: - edu_en = random.randint(1, 10) - self.edu += edu_en - else: - return "教育成长检定D100=%d,小于%d,无增长。" % (edu_check, self.edu) - if self.edu > 99: - self.edu = 99 - return "教育成长检定D100=%d,成长1D10=%d,成长到了最高值99!" % (edu_check, edu_en) - else: - return "教育成长检定D100=%d,成长1D10=%d,成长到了%d" % (edu_check, edu_en, self.edu) - - def edu_ups(self, times) -> str: - r = "" - for _ in range(times): - r += self.edu_up() - return r - - def sum_down(self, sum) -> str: - if self.str + self.con + self.dex-45 < sum: - self.str = 15 - self.con = 15 - self.dex = 15 - else: - str_lost = random.randint(0, min(sum, self.str-15)) - while sum - str_lost > self.con + self.dex-30: - str_lost = random.randint(0, min(sum, self.str-15)) - self.str -= str_lost - sum -= str_lost - con_lost = random.randint(0, min(sum, self.con-15)) - while sum - con_lost > self.dex-15: - con_lost = random.randint(0, min(sum, self.con-15)) - self.con -= con_lost - sum -= con_lost - self.dex -= sum - return - - def age_change(self, age: int = 20) -> str: - if age < 15: - return "年龄过小,无法担当调查员" - elif age >= 90: - return "该调查员已经作古。" - self.age = age - if 15 <= age < 20: - self.str -= 5 - self.siz -= 5 - self.edu -= 5 - luc = randattr() - self.luc = luc if luc > self.luc else self.luc - return "力量、体型、教育值-5,幸运增强判定一次" - elif age < 40: - self.edu_up() - return "教育增强判定一次" - elif age < 50: - self.app -= 5 - self.sum_down(5) - self.edu_ups(2) - return "外貌-5,力量、体型、敏捷合计降低5,教育增强判定两次" - elif age < 60: - self.app -= 10 - self.sum_down(10) - self.edu_ups(3) - return "外貌-10,力量、体型、敏捷合计降低10,教育增强判定三次" - elif age < 70: - self.app -= 15 - self.sum_down(20) - self.edu_ups(4) - return "外貌-15,力量、体型、敏捷合计降低20,教育增强判定四次" - elif age < 80: - self.app -= 20 - self.sum_down(40) - self.edu_ups(4) - return "外貌-20,力量、体型、敏捷合计降低40,教育增强判定四次" - elif age < 90: - self.app -= 25 - self.sum_down(80) - self.edu_ups(4) - return "外貌-25,力量、体型、敏捷合计降低80,教育增强判定四次" - - def __repr__(self) -> str: - return "调查员 年龄:%d\n力量:%d 体质:%d 体型:%d\n敏捷:%d 外貌:%d 智力:%d\n意志:%d 教育:%d 幸运:%d\nDB:%s 生命值:%d 移动速度:%d" % ( - self.age, self.str, self.con, self.siz, self.dex, self.app, self.int, self.pow, self.edu, self.luc, self.db(), self.lp_max(), self.mov()) - - def output(self) -> str: - return self.__repr__() diff --git a/plugins/nonebot_plugin_cocdicer/data_source.py b/plugins/nonebot_plugin_cocdicer/data_source.py deleted file mode 100644 index 3e2bb074..00000000 --- a/plugins/nonebot_plugin_cocdicer/data_source.py +++ /dev/null @@ -1,249 +0,0 @@ -# 参考[OlivaDiceDocs](https://oliva.dicer.wiki/userdoc)实现的nonebot2骰娘插件 -import re -import random -from .messages import * - - -class Mylist(list): - def next(self, index: int): - if index < self.__len__()-1: - return self[index+1] - else: - return "" - - -def help_message(): - return main_help_message - - -def dhr(t, o): - if t == 0 and o == 0: - return 100 - else: - return t*10+o - - -def st(): - result = random.randint(1, 20) - if result < 4: - rstr = "右腿" - elif result < 7: - rstr = "左腿" - elif result < 11: - rstr = "腹部" - elif result < 16: - rstr = "胸部" - elif result < 18: - rstr = "右臂" - elif result < 20: - rstr = "左臂" - elif result < 21: - rstr = "头部" - return "D20=%d:命中了%s" % (result, rstr) - - -def en(arg: str) -> str: - try: - arg = int(arg) - except: - return en_help_message - check = random.randint(1, 100) - if check > arg or check > 95: - plus = random.randint(1, 10) - r = "判定值%d,判定成功,技能成长%d+%d=%d" % (check, arg, plus, arg+plus) - return r + "\n温馨提示:如果技能提高到90%或更高,增加2D6理智点数。" - else: - return "判定值%d,判定失败,技能无成长。" % check - - -class Dices(object): - def __init__(self): - self.dices = 1 - self.faces = 100 - self.a = False - self.anum = 0 - self.h = False - self.times = 1 - self.bp = 0 - self._bp_result = "" - self._tens_place = None - self._ones_place = None - self._head = "" - self._mid = "" - self._end = "" - self.result = 0 - self.a_check_mode = self.a_check - self._a_check_result = "" - self.ex_dice = None - self.ex_dice_type = 1 - self._ex_result = "" - - def real_dice(self): - if self.faces == 100: - self._tens_place = random.randint(0, 9) - self._ones_place = random.randint(0, 9) - self.result += dhr(self._tens_place, self._ones_place) - return dhr(self._tens_place, self._ones_place) - else: - rint = random.randint(1, self.faces) - self.result += rint - return rint - - def bp_dice(self): - if not self.bp or self.faces != 100 or self.dices != 1: - self._bp_result = "" - return self._bp_result - self._bp_result = " -> 十位:%d,个位:%d" % ( - self._tens_place, self._ones_place) - bp = self.bp - while bp > 0: - bd = random.randint(0, 9) - self._bp_result += ",奖励:%d" % bd - if dhr(bd, self._ones_place) < dhr(self._tens_place, self._ones_place): - self._tens_place = bd - self.result = dhr(self._tens_place, self._ones_place) - bp -= 1 - while bp < 0: - bd = random.randint(0, 9) - self._bp_result += ",惩罚:%d" % bd - if dhr(bd, self._ones_place) > dhr(self._tens_place, self._ones_place): - self._tens_place = bd - self.set_result() - bp += 1 - return self._bp_result - - def a_check(self): - if not (self.a and self.anum and self.faces == 100 and self.dices == 1): - self._a_check_result = "" - return self._a_check_result - if self.result == 100: - self._a_check_result = " 大失败!" - elif self.anum < 50 and self.result > 95: - self._a_check_result = "\n检定值%d %d>95 大失败!" % ( - self.anum, self.result) - elif self.result == 1: - self._a_check_result = " 大成功!" - elif self.result <= self.anum // 5: - self._a_check_result = "\n检定值%d %d≤%d 极难成功" % ( - self.anum, self.result, self.anum // 5) - elif self.result <= self.anum // 2: - self._a_check_result = "\n检定值%d %d≤%d 困难成功" % ( - self.anum, self.result, self.anum // 2) - elif self.result <= self.anum: - self._a_check_result = "\n检定值%d %d≤%d 成功" % ( - self.anum, self.result, self.anum) - else: - self._a_check_result = "\n检定值%d %d>%d 失败" % ( - self.anum, self.result, self.anum) - return self._a_check_result - - def xdy(self): - self.result = 0 - if self.dices == 1: - self.real_dice() - self.bp_dice() - self.a_check() - return "" - else: - dice_results = [] - for _ in range(self.dices): - dice_result = self.real_dice() - dice_results.append(str(dice_result)) - return "(%s)" % "+".join(dice_results) - - def _ex_handle(self): - if not self.ex_dice: - self._ex_result = "" - elif type(self.ex_dice) == int: - ex_result = self.ex_dice_type*self.ex_dice - self._ex_result = "%s%s%d" % (str( - self.result) if self.dices == 1 else "", "+" if self.ex_dice_type == 1 else "-", self.ex_dice) - self.result += ex_result - elif type(self.ex_dice) == Dices: - self.ex_dice.roll - ex_result = self.ex_dice_type*self.ex_dice.result - self._ex_result = "%s%s%d" % (str( - self.result) if self.dices == 1 else "", "+" if self.ex_dice_type == 1 else "-", self.ex_dice) - self.result += ex_result - return self._ex_result - - def roll(self): - r = "%d次投掷:" % self.times - if self.times != 1: - r += "\n" - for _ in range(self.times): - xdyr = self.xdy() - self._ex_handle() - self._head = "%sD%d%s=" % ( - "" if self.dices == 1 else str(self.dices), - self.faces, - "" if not self.ex_dice else ( - ("+" if self.ex_dice_type == 1 else "-") + str(self.ex_dice) if type(self.ex_dice) == int else (str(self.ex_dice.dices)+"D"+self.ex_dice.faces)) - ) - self._mid = "%s%s=" % (xdyr, self._ex_result) - self._end = "%d%s%s" % ( - self.result, self._bp_result, self._a_check_result) - r += "%s%s%s" % (self._head, self._mid if self.dices != - 1 or self.ex_dice else "", self._end) - self.times -= 1 - if self.times: - r += "\n" - return r - - -def prework(args: list, start=0): - for i in range(start, len(args), 1): - if not re.search("\\d+", args[i]) and len(args[i]) > 1: - p = args.pop(i) - for j in list(p): - args.insert(i, j) - i += 1 - if prework(args, i): - break - return True - - -def rd(arg: str): - try: - h = False - dices = Dices() - args = re.split("(\\d+)", arg.lower()) - prework(args) - args = Mylist(args) - for i in range(len(args)): - if args[i] == "a": - dices.a = True - elif args[i] == "#" and re.search("\\d+", args.next(i)): - dices.times = int(args[i+1]) - elif args[i] == "b": - dices.bp += 1 - elif args[i] == "p": - dices.bp -= 1 - elif args[i] == "d" and re.search("\\d+", args.next(i)): - dices.faces = int(args[i+1]) - elif args[i] == " " and re.search("\\d+", args.next(i)) and dices.a: - dices.anum = int(args[i+1]) - elif args[i] == "h": - h = True - elif re.search("\\d+", args[i]): - if args.next(i) == "d": - dices.dices = int(args[i]) - elif args[i-1] == " " and dices.a: - dices.anum = int(args[i]) - elif args[i] in ["-", "+"]: - dices.ex_dice_type = (-1 if args[i] == "-" else 1) - if args.next(i+1) == "d": - dices.ex_dice = Dices() - dices.ex_dice.dices = int(args.next(i)) - dices.ex_dice.faces = int(args.next(i+2)) - elif args.next(i): - dices.ex_dice = int(args.next(i)) - if h: - return [dices.roll()] - return dices.roll() - except: - return r_help_message - - -if __name__ == "__main__": - rd("2d100") diff --git a/plugins/nonebot_plugin_cocdicer/madness.py b/plugins/nonebot_plugin_cocdicer/madness.py deleted file mode 100644 index 6fd85bb2..00000000 --- a/plugins/nonebot_plugin_cocdicer/madness.py +++ /dev/null @@ -1,36 +0,0 @@ -import random - -from .messages import temporary_madness, madness_end, phobias, manias - - -def ti(): - i = random.randint(1, 10) - r = "临时疯狂判定1D10=%d\n" % i - r += temporary_madness[i-1] - if i == 9: - j = random.randint(1, 100) - r += "\n恐惧症状为:\n" - r += phobias[j-1] - elif i == 10: - j = random.randint(1, 100) - r += "\n狂躁症状为:\n" - r += manias[j-1] - r += "\n该症状将会持续1D10=%d" % random.randint(1, 10) - return r - - -def li(): - i = random.randint(1, 10) - r = "总结疯狂判定1D10=%d\n" % i - r += madness_end[i-1] - if i in [2, 3, 6, 9, 10]: - r += "\n调查员将在1D10=%d小时后醒来" % random.randint(1, 10) - if i == 9: - j = random.randint(1, 100) - r += "\n恐惧症状为:\n" - r += phobias[j-1] - elif i == 10: - j = random.randint(1, 100) - r += "\n狂躁症状为:\n" - r += manias[j-1] - return r diff --git a/plugins/nonebot_plugin_cocdicer/messages.py b/plugins/nonebot_plugin_cocdicer/messages.py deleted file mode 100644 index 20883424..00000000 --- a/plugins/nonebot_plugin_cocdicer/messages.py +++ /dev/null @@ -1,258 +0,0 @@ -main_help_message: str = "本骰娘由nonebot2强力驱动\n" \ - ".r 投掷指令 todo\n" \ - " d 制定骰子面数\n" \ - " a 检定\n" \ - " h 暗骰\n" \ - " # 多轮检定\n" \ - " bp 奖励骰&惩罚骰\n" \ - " +/- 附加计算 todo\n" \ - ".sc 疯狂检定\n" \ - ".st 射击命中判定\n" \ - ".ti 临时疯狂症状\n" \ - ".li 总结疯狂症状\n" \ - ".coc coc角色作成\n" \ - ".en 技能成长" -r_help_message: str = ".r[dah#bp] a_number [+/-]ex_number\n" \ - "d:骰子设定指令,标准格式为xdy,x为骰子数量y为骰子面数;\n" \ - "a:检定指令,根据后续a_number设定数值检定;\n" \ - "h:暗骰指令,骰子结构将会私聊发送给该指令者;\n" \ - "#:多轮投掷指令,#后接数字即可设定多轮投掷;\n" \ - "bp:奖励骰与惩罚骰;\n" \ - "+/-:附加计算指令,目前仅支持数字\n" \ - "示例:\n" \ - ".r#2bba 70:两次投掷 1D100 ,附加两个奖励骰,判定值为70\n" \ - ".rah:D100暗骰,由于没有 a_number 参数,判定将被忽略\n" \ - ".ra2d8+10 70:2D8+10,由于非D100,判定将被忽略" -sc_help_message: str = ".sc success/failure san_number\n" \ - "success:判定成功降低 san 值,支持 x 或 xdy 语法( x 与 y 为数字);\n" \ - "failure:判定失败降低 san 值,支持语法如上;\n" \ - "san_number:当前 san 值。" -en_help_message: str = ".en skill_level\nskill_level:需要成长的技能当前等级。" -temporary_madness = [ - "1) 失忆: 调查员会发现自己身处于一个安全的地点却没有任何来到这里的记忆。例如,调查员前一刻还在家中吃着早饭,下一刻就已经直面着不知名的怪物。这将会持续1D10轮。", - "2) 假性残疾:调查员陷入了心理性的失明,失聪以及躯体缺失感中,持续1D10轮。", - "3) 暴力倾向: 调查员陷入了六亲不认的暴力行为中,对周围的敌人与友方进行着无差别的攻击,持续1D10轮。", - "4) 偏执: 调查员陷入了严重的偏执妄想之中,持续1D10轮。有人在暗中窥视着他们,同伴中有人背叛了他们,没有人可以信任,万事皆虚。", - "5) 人际依赖: 守密人适当参考调查员的背景中重要之人的条目,调查员因为一些原因而降他人误认为了他重要的人并且努力的会与那个人保持那种关系,持续1D10轮。", - "6) 昏厥: 调查员当场昏倒,并需要1D10轮才能苏醒。", - "7) 逃避行为: 调查员会用任何的手段试图逃离现在所处的位置,即使这意味着开走唯一一辆交通工具并将其它人抛诸脑后,调查员会试图逃离1D10轮。", - "8) 竭嘶底里:调查员表现出大笑,哭泣,嘶吼,害怕等的极端情绪表现,持续1D10轮。", - "9) 恐惧: 调查员通过一次D100或者由守密人选择,来从恐惧症状表中选择一个恐惧源,就算这一恐惧的事物是并不存在的,调查员的症状会持续1D10轮。", - "10) 躁狂: 调查员通过一次D100或者由守密人选择,来从躁狂症状表中选择一个躁狂的诱因,这个症状将会持续1D10轮。" -] -madness_end = [ - "1) 失忆(Amnesia):回过神来,调查员们发现自己身处一个陌生的地方,并忘记了自己是谁。记忆会随时间恢复。", - "2) 被窃(Robbed):调查员在1D10小时后恢复清醒,发觉自己被盗,身体毫发无损。如果调查员携带着宝贵之物(见调查员背景),做幸运检定来决定其是否被盗。所有有价值的东西无需检定自动消失。", - "3) 遍体鳞伤(Battered):调查员在1D10小时后恢复清醒,发现自己身上满是拳痕和瘀伤。生命值减少到疯狂前的一半,但这不会造成重伤。调查员没有被窃。这种伤害如何持续到现在由守秘人决定。", - "4) 暴力倾向(Violence):调查员陷入强烈的暴力与破坏欲之中。调查员回过神来可能会理解自己做了什么也可能毫无印象。调查员对谁或何物施以暴力,他们是杀人还是仅仅造成了伤害,由守秘人决定。", - "5) 极端信念(Ideology/Beliefs):查看调查员背景中的思想信念,调查员会采取极端和疯狂的表现手段展示他们的思想信念之一。比如一个信教者会在地铁上高声布道。", - "6) 重要之人(Significant People):考虑调查员背景中的重要之人,及其重要的原因。在1D10小时或更久的时间中,调查员将不顾一切地接近那个人,并为他们之间的关系做出行动。", - "7) 被收容(Institutionalized):调查员在精神病院病房或警察局牢房中回过神来,他们可能会慢慢回想起导致自己被关在这里的事情。", - "8) 逃避行为(Flee in panic):调查员恢复清醒时发现自己在很远的地方,也许迷失在荒郊野岭,或是在驶向远方的列车或长途汽车上。", - "9) 恐惧(Phobia):调查员患上一个新的恐惧症状。在表Ⅸ:恐惧症状表上骰1个D100来决定症状,或由守秘人选择一个。调查员在1D10小时后回过神来,并开始为避开恐惧源而采取任何措施。", - "10) 狂躁(Mania):调查员患上一个新的狂躁症状。在表Ⅹ:狂躁症状表上骰1个D100来决定症状,或由守秘人选择一个。调查员会在1D10小时后恢复理智。在这次疯狂发作中,调查员将完全沉浸于其新的狂躁症状。这症状是否会表现给旁人则取决于守秘人和此调查员。" -] -phobias = [ - "1) 洗澡恐惧症(Ablutophobia):对于洗涤或洗澡的恐惧。", - "2) 恐高症(Acrophobia):对于身处高处的恐惧。", - "3) 飞行恐惧症(Aerophobia):对飞行的恐惧。", - "4) 广场恐惧症(Agoraphobia):对于开放的(拥挤)公共场所的恐惧。", - "5) 恐鸡症(Alektorophobia):对鸡的恐惧。", - "6) 大蒜恐惧症(Alliumphobia):对大蒜的恐惧。", - "7) 乘车恐惧症(Amaxophobia):对于乘坐地面载具的恐惧。", - "8) 恐风症(Ancraophobia):对风的恐惧。", - "9) 男性恐惧症(Androphobia):对于成年男性的恐惧。", - "10) 恐英症(Anglophobia):对英格兰或英格兰文化的恐惧。", - "11) 恐花症(Anthophobia):对花的恐惧。", - "12) 截肢者恐惧症(Apotemnophobia):对截肢者的恐惧。", - "13) 蜘蛛恐惧症(Arachnophobia):对蜘蛛的恐惧。", - "14) 闪电恐惧症(Astraphobia):对闪电的恐惧。", - "15) 废墟恐惧症(Atephobia):对遗迹或残址的恐惧。", - "16) 长笛恐惧症(Aulophobia):对长笛的恐惧。", - "17) 细菌恐惧症(Bacteriophobia):对细菌的恐惧。", - "18) 导弹/子弹恐惧症(Ballistophobia):对导弹或子弹的恐惧。", - "19) 跌落恐惧症(Basophobia):对于跌倒或摔落的恐惧。", - "20) 书籍恐惧症(Bibliophobia):对书籍的恐惧。", - "21) 植物恐惧症(Botanophobia):对植物的恐惧。", - "22) 美女恐惧症(Caligynephobia):对美貌女性的恐惧。", - "23) 寒冷恐惧症(Cheimaphobia):对寒冷的恐惧。", - "24) 恐钟表症(Chronomentrophobia):对于钟表的恐惧。", - "25) 幽闭恐惧症(Claustrophobia):对于处在封闭的空间中的恐惧。", - "26) 小丑恐惧症(Coulrophobia):对小丑的恐惧。", - "27) 恐犬症(Cynophobia):对狗的恐惧。", - "28) 恶魔恐惧症(Demonophobia):对邪灵或恶魔的恐惧。", - "29) 人群恐惧症(Demophobia):对人群的恐惧。", - "30) 牙科恐惧症①(Dentophobia):对牙医的恐惧。", - "31) 丢弃恐惧症(Disposophobia):对于丢弃物件的恐惧(贮藏癖)。", - "32) 皮毛恐惧症(Doraphobia):对动物皮毛的恐惧。", - "33) 过马路恐惧症(Dromophobia):对于过马路的恐惧。", - "34) 教堂恐惧症(Ecclesiophobia):对教堂的恐惧。", - "35) 镜子恐惧症(Eisoptrophobia):对镜子的恐惧。", - "36) 针尖恐惧症(Enetophobia):对针或大头针的恐惧。", - "37) 昆虫恐惧症(Entomophobia):对昆虫的恐惧。", - "38) 恐猫症(Felinophobia):对猫的恐惧。", - "39) 过桥恐惧症(Gephyrophobia):对于过桥的恐惧。", - "40) 恐老症(Gerontophobia):对于老年人或变老的恐惧。", - "41) 恐女症(Gynophobia):对女性的恐惧。", - "42) 恐血症(Haemaphobia):对血的恐惧。", - "43) 宗教罪行恐惧症(Hamartophobia):对宗教罪行的恐惧。", - "44) 触摸恐惧症(Haphophobia):对于被触摸的恐惧。", - "45) 爬虫恐惧症(Herpetophobia):对爬行动物的恐惧。", - "46) 迷雾恐惧症(Homichlophobia):对雾的恐惧。", - "47) 火器恐惧症(Hoplophobia):对火器的恐惧。", - "48) 恐水症(Hydrophobia):对水的恐惧。", - "49) 催眠恐惧症(Hypnophobia):对于睡眠或被催眠的恐惧。", - "50) 白袍恐惧症(Iatrophobia):对医生的恐惧。", - "51) 鱼类恐惧症(Ichthyophobia):对鱼的恐惧。", - "52) 蟑螂恐惧症(Katsaridaphobia):对蟑螂的恐惧。", - "53) 雷鸣恐惧症(Keraunophobia):对雷声的恐惧。", - "54) 蔬菜恐惧症(Lachanophobia):对蔬菜的恐惧。", - "55) 噪音恐惧症(Ligyrophobia):对刺耳噪音的恐惧。", - "56) 恐湖症(Limnophobia):对湖泊的恐惧。", - "57) 机械恐惧症(Mechanophobia):对机器或机械的恐惧。", - "58) 巨物恐惧症(Megalophobia):对于庞大物件的恐惧。", - "59) 捆绑恐惧症(Merinthophobia):对于被捆绑或紧缚的恐惧。", - "60) 流星恐惧症(Meteorophobia):对流星或陨石的恐惧。", - "61) 孤独恐惧症(Monophobia):对于一人独处的恐惧。", - "62) 不洁恐惧症(Mysophobia):对污垢或污染的恐惧。", - "63) 黏液恐惧症(Myxophobia):对黏液(史莱姆)的恐惧。", - "64) 尸体恐惧症(Necrophobia):对尸体的恐惧。", - "65) 数字8恐惧症(Octophobia):对数字8的恐惧。", - "66) 恐牙症(Odontophobia):对牙齿的恐惧。", - "67) 恐梦症(Oneirophobia):对梦境的恐惧。", - "68) 称呼恐惧症(Onomatophobia):对于特定词语的恐惧。", - "69) 恐蛇症(Ophidiophobia):对蛇的恐惧。", - "70) 恐鸟症(Ornithophobia):对鸟的恐惧。", - "71) 寄生虫恐惧症(Parasitophobia):对寄生虫的恐惧。", - "72) 人偶恐惧症(Pediophobia):对人偶的恐惧。", - "73) 吞咽恐惧症(Phagophobia):对于吞咽或被吞咽的恐惧。", - "74) 药物恐惧症(Pharmacophobia):对药物的恐惧。", - "75) 幽灵恐惧症(Phasmophobia):对鬼魂的恐惧。", - "76) 日光恐惧症(Phenogophobia):对日光的恐惧。", - "77) 胡须恐惧症(Pogonophobia):对胡须的恐惧。", - "78) 河流恐惧症(Potamophobia):对河流的恐惧。", - "79) 酒精恐惧症(Potophobia):对酒或酒精的恐惧。", - "80) 恐火症(Pyrophobia):对火的恐惧。", - "81) 魔法恐惧症(Rhabdophobia):对魔法的恐惧。", - "82) 黑暗恐惧症(Scotophobia):对黑暗或夜晚的恐惧。", - "83) 恐月症(Selenophobia):对月亮的恐惧。", - "84) 火车恐惧症(Siderodromophobia):对于乘坐火车出行的恐惧。", - "85) 恐星症(Siderophobia):对星星的恐惧。", - "86) 狭室恐惧症(Stenophobia):对狭小物件或地点的恐惧。", - "87) 对称恐惧症(Symmetrophobia):对对称的恐惧。", - "88) 活埋恐惧症(Taphephobia):对于被活埋或墓地的恐惧。", - "89) 公牛恐惧症(Taurophobia):对公牛的恐惧。", - "90) 电话恐惧症(Telephonophobia):对电话的恐惧。", - "91) 怪物恐惧症①(Teratophobia):对怪物的恐惧。", - "92) 深海恐惧症(Thalassophobia):对海洋的恐惧。", - "93) 手术恐惧症(Tomophobia):对外科手术的恐惧。", - "94) 十三恐惧症(Triskadekaphobia):对数字13的恐惧症。", - "95) 衣物恐惧症(Vestiphobia):对衣物的恐惧。", - "96) 女巫恐惧症(Wiccaphobia):对女巫与巫术的恐惧。", - "97) 黄色恐惧症(Xanthophobia):对黄色或“黄”字的恐惧。", - "98) 外语恐惧症(Xenoglossophobia):对外语的恐惧。", - "99) 异域恐惧症(Xenophobia):对陌生人或外国人的恐惧。", - "100) 动物恐惧症(Zoophobia):对动物的恐惧。" -] -manias = [ - "1) 沐浴癖(Ablutomania):执着于清洗自己。", - "2) 犹豫癖(Aboulomania):病态地犹豫不定。", - "3) 喜暗狂(Achluomania):对黑暗的过度热爱。", - "4) 喜高狂(Acromaniaheights):狂热迷恋高处。", - "5) 亲切癖(Agathomania):病态地对他人友好。", - "6) 喜旷症(Agromania):强烈地倾向于待在开阔空间中。", - "7) 喜尖狂(Aichmomania):痴迷于尖锐或锋利的物体。", - "8) 恋猫狂(Ailuromania):近乎病态地对猫友善。", - "9) 疼痛癖(Algomania):痴迷于疼痛。", - "10) 喜蒜狂(Alliomania):痴迷于大蒜。", - "11) 乘车癖(Amaxomania):痴迷于乘坐车辆。", - "12) 欣快癖(Amenomania):不正常地感到喜悦。", - "13) 喜花狂(Anthomania):痴迷于花朵。", - "14) 计算癖(Arithmomania):狂热地痴迷于数字。", - "15) 消费癖(Asoticamania):鲁莽冲动地消费。", - "16) 隐居癖(Automania):过度地热爱独自隐居(原文如此,存疑,Automania实际上是恋车癖)。", - "17) 芭蕾癖(Balletmania):痴迷于芭蕾舞。", - "18) 窃书癖(Biliokleptomania):无法克制偷窃书籍的冲动。", - "19) 恋书狂(Bibliomania):痴迷于书籍和/或阅读。", - "20) 磨牙癖(Bruxomania):无法克制磨牙的冲动。", - "21) 灵臆症(Cacodemomania):病态地坚信自己已被一个邪恶的灵体占据。", - "22) 美貌狂(Callomania):痴迷于自身的美貌。", - "23) 地图狂(Cartacoethes):在何时何处都无法控制查阅地图的冲动。", - "24) 跳跃狂(Catapedamania):痴迷于从高处跳下。", - "25) 喜冷症(Cheimatomania):对寒冷或寒冷的物体的反常喜爱。", - "26) 舞蹈狂(Choreomania):无法控制地起舞或发颤。", - "27) 恋床癖(Clinomania):过度地热爱待在床上。", - "28) 恋墓狂(Coimetormania):痴迷于墓地。", - "29) 色彩狂(Coloromania):痴迷于某种颜色。", - "30) 小丑狂(Coulromania):痴迷于小丑。", - "31) 恐惧狂(Countermania):执着于经历恐怖的场面。", - "32) 杀戮癖(Dacnomania):痴迷于杀戮。", - "33) 魔臆症(Demonomania):病态地坚信自己已被恶魔附身。", - "34) 抓挠癖(Dermatillomania):执着于抓挠自己的皮肤。", - "35) 正义狂(Dikemania):痴迷于目睹正义被伸张。", - "36) 嗜酒狂(Dipsomania):反常地渴求酒精。", - "37) 毛皮狂(Doramania):痴迷于拥有毛皮。(存疑)", - "38) 赠物癖(Doromania):痴迷于赠送礼物。", - "39) 漂泊症(Drapetomania):执着于逃离。", - "40) 漫游癖(Ecdemiomania):执着于四处漫游。", - "41) 自恋狂(Egomania):近乎病态地以自我为中心或自我崇拜。", - "42) 职业狂(Empleomania):对于工作的无尽病态渴求。", - "43) 臆罪症(Enosimania):病态地坚信自己带有罪孽。", - "44) 学识狂(Epistemomania):痴迷于获取学识。", - "45) 静止癖(Eremiomania):执着于保持安静。", - "46) 乙醚上瘾(Etheromania):渴求乙醚。", - "47) 求婚狂(Gamomania):痴迷于进行奇特的求婚。", - "48) 狂笑癖(Geliomania):无法自制地,强迫性的大笑。", - "49) 巫术狂(Goetomania):痴迷于女巫与巫术。", - "50) 写作癖(Graphomania):痴迷于将每一件事写下来。", - "51) 裸体狂(Gymnomania):执着于裸露身体。", - "52) 妄想狂(Habromania):近乎病态地充满愉快的妄想(而不顾现实状况如何)。", - "53) 蠕虫狂(Helminthomania):过度地喜爱蠕虫。", - "54) 枪械狂(Hoplomania):痴迷于火器。", - "55) 饮水狂(Hydromania):反常地渴求水分。", - "56) 喜鱼癖(Ichthyomania):痴迷于鱼类。", - "57) 图标狂(Iconomania):痴迷于图标与肖像。", - "58) 偶像狂(Idolomania):痴迷于甚至愿献身于某个偶像。", - "59) 信息狂(Infomania):痴迷于积累各种信息与资讯。", - "60) 射击狂(Klazomania):反常地执着于射击。", - "61) 偷窃癖(Kleptomania):反常地执着于偷窃。", - "62) 噪音癖(Ligyromania):无法自制地执着于制造响亮或刺耳的噪音。", - "63) 喜线癖(Linonomania):痴迷于线绳。", - "64) 彩票狂(Lotterymania):极端地执着于购买彩票。", - "65) 抑郁症(Lypemania):近乎病态的重度抑郁倾向。", - "66) 巨石狂(Megalithomania):当站在石环中或立起的巨石旁时,就会近乎病态地写出各种奇怪的创意。", - "67) 旋律狂(Melomania):痴迷于音乐或一段特定的旋律。", - "68) 作诗癖(Metromania):无法抑制地想要不停作诗。", - "69) 憎恨癖(Misomania):憎恨一切事物,痴迷于憎恨某个事物或团体。", - "70) 偏执狂(Monomania):近乎病态地痴迷与专注某个特定的想法或创意。", - "71) 夸大癖(Mythomania):以一种近乎病态的程度说谎或夸大事物。", - "72) 臆想症(Nosomania):妄想自己正在被某种臆想出的疾病折磨。", - "73) 记录癖(Notomania):执着于记录一切事物(例如摄影)。", - "74) 恋名狂(Onomamania):痴迷于名字(人物的、地点的、事物的)。", - "75) 称名癖(Onomatomania):无法抑制地不断重复某个词语的冲动。", - "76) 剔指癖(Onychotillomania):执着于剔指甲。", - "77) 恋食癖(Opsomania):对某种食物的病态热爱。", - "78) 抱怨癖(Paramania):一种在抱怨时产生的近乎病态的愉悦感。", - "79) 面具狂(Personamania):执着于佩戴面具。", - "80) 幽灵狂(Phasmomania):痴迷于幽灵。", - "81) 谋杀癖(Phonomania):病态的谋杀倾向。", - "82) 渴光癖(Photomania):对光的病态渴求。", - "83) 背德癖(Planomania):病态地渴求违背社会道德(原文如此,存疑,Planomania实际上是漂泊症)。", - "84) 求财癖(Plutomania):对财富的强迫性的渴望。", - "85) 欺骗狂(Pseudomania):无法抑制的执着于撒谎。", - "86) 纵火狂(Pyromania):执着于纵火。", - "87) 提问狂(Questiong-Asking Mania):执着于提问。", - "88) 挖鼻癖(Rhinotillexomania):执着于挖鼻子。", - "89) 涂鸦癖(Scribbleomania):沉迷于涂鸦。", - "90) 列车狂(Siderodromomania):认为火车或类似的依靠轨道交通的旅行方式充满魅力。", - "91) 臆智症(Sophomania):臆想自己拥有难以置信的智慧。", - "92) 科技狂(Technomania):痴迷于新的科技。", - "93) 臆咒狂(Thanatomania):坚信自己已被某种死亡魔法所诅咒。", - "94) 臆神狂(Theomania):坚信自己是一位神灵。", - "95) 抓挠癖(Titillomaniac):抓挠自己的强迫倾向。", - "96) 手术狂(Tomomania):对进行手术的不正常爱好。", - "97) 拔毛癖(Trichotillomania):执着于拔下自己的头发。", - "98) 臆盲症(Typhlomania):病理性的失明。", - "99) 嗜外狂(Xenomania):痴迷于异国的事物。", - "100) 喜兽癖(Zoomania):对待动物的态度近乎疯狂地友好。" -] diff --git a/plugins/nonebot_plugin_cocdicer/san_check.py b/plugins/nonebot_plugin_cocdicer/san_check.py deleted file mode 100644 index 1b8b2570..00000000 --- a/plugins/nonebot_plugin_cocdicer/san_check.py +++ /dev/null @@ -1,38 +0,0 @@ -from .data_source import Dices -from .messages import sc_help_message - -import re - - -def number_or_dice(arg: str): - if "d" in arg: - d = Dices() - if dices := re.search(r"\d+d", arg): - d.dices = int(dices.group()[:-1]) - if faces := re.search(r"d\d+", arg): - d.faces = int(faces.group()[1:]) - d.roll() - return d - else: - return int(arg) - - -def sc(arg: str) -> str: - a_num = re.search(r" \d+", arg) - success = re.search(r"\d*d\d+|\d+", arg) - failure = re.search(r"[\/]+(\d*d\d+|\d+)", arg) - if not (a_num and success and failure): - return sc_help_message - check_dice = Dices() - check_dice.a = True - check_dice.anum = int(a_num.group()[1:]) - success = number_or_dice(success.group()) - failure = number_or_dice(failure.group()[1:]) - r = "San Check" + check_dice.roll()[4:] - result = success if check_dice.result <= check_dice.anum else failure - r += "\n理智降低了" - if type(result) == int: - r += "%d点" % result - else: - r = r + result._head + str(result.result) - return r diff --git a/plugins/nonebot_plugin_picsearcher/__init__.py b/plugins/nonebot_plugin_picsearcher/__init__.py index 37ac4de9..9f97fd15 100644 --- a/plugins/nonebot_plugin_picsearcher/__init__.py +++ b/plugins/nonebot_plugin_picsearcher/__init__.py @@ -19,6 +19,14 @@ from .trace import get_des as get_des_trace from .yandex import get_des as get_des_yandex +__plugin_name__ = '识图' + +__plugin_usage__ = '用法:识图 [参数](默认nao) [图片]\n' \ + '参数列表:\n' \ + '\t1.nao\n' \ + '\t2.asc' + + async def get_des(url: str, mode: str, user_id: int): """ :param url: 图片链接 diff --git a/plugins/nonebot_plugin_withdraw/__init__.py b/plugins/nonebot_plugin_withdraw/__init__.py index bdcb27e0..657e118b 100644 --- a/plugins/nonebot_plugin_withdraw/__init__.py +++ b/plugins/nonebot_plugin_withdraw/__init__.py @@ -12,6 +12,14 @@ msg_ids = {} max_size = withdraw_config.withdraw_max_size +__plugin_name__ = '撤回' + +__plugin_usage__ = '用法:撤回 [消息位置](默认0)\n' \ + '示例:\n' \ + '\t撤回0 -> 撤回倒数第一条消息(即最新发送的消息)' \ + '\t撤回1 -> 撤回倒数第2条消息' + + def get_key(msg_type, id): return f'{msg_type}_{id}' diff --git a/plugins/one_friend/__init__.py b/plugins/one_friend/__init__.py index 3aa6cc28..492370a6 100644 --- a/plugins/one_friend/__init__.py +++ b/plugins/one_friend/__init__.py @@ -1,4 +1,4 @@ -import json + import os import aiohttp from util.user_agent import get_user_agent @@ -14,6 +14,10 @@ from configs.path_config import TTF_PATH import re from nonebot.adapters.cqhttp import MessageSegment +__plugin_name__ = '我有一个朋友' + +__plugin_usage__ = '用法:我有一个朋友说/问 [消息] [at](不艾特则群员随机)' + one_friend = on_regex('^我.*?朋友.*?(想问问|说|让我问问|想问|让我问|想知道|让我帮他问问|让我' '帮他问|让我帮忙问|让我帮忙问问|问).*', priority=5, block=True) diff --git a/plugins/open_cases/__init__.py b/plugins/open_cases/__init__.py index 45e920de..ac0fa8e8 100644 --- a/plugins/open_cases/__init__.py +++ b/plugins/open_cases/__init__.py @@ -19,7 +19,7 @@ __plugin_usage__ = ( '2.突围大行动武器箱\n\t' '3.命悬一线武器箱\n\t' '4.裂空武器箱\n\t' - '5.光谱武器箱\n\t' + '5.光谱武器箱\n' '示例:小真寻开箱 突围大行动(不输入指定武器箱则随机)\n' '示例:我的开箱(开箱统计)\n' '示例:群开箱统计\n' diff --git a/plugins/parse_bilibili_json.py b/plugins/parse_bilibili_json.py index 4a7f2f4d..7538f377 100644 --- a/plugins/parse_bilibili_json.py +++ b/plugins/parse_bilibili_json.py @@ -12,10 +12,9 @@ from models.group_remind import GroupRemind from nonebot.adapters.cqhttp.exception import ActionFailed import time import aiohttp -import bilibili_api +from bilibili_api import settings if get_local_proxy(): - proxy_ip_port = get_local_proxy().split("//", maxsplit=1)[1] - bilibili_api.request_settings["proxies"] = {'http': f'http://{proxy_ip_port}', 'https': f'https://{proxy_ip_port}'} + settings.proxy = get_local_proxy() parse_bilibili_json = on_message(priority=1, permission=GROUP, block=False) @@ -30,9 +29,8 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State): async with aiohttp.ClientSession(headers=get_user_agent()) as session: async with session.get(data['meta']['detail_1']['qqdocurl'], proxy=get_local_proxy(), timeout=7) as response: url = str(response.url).split("?")[0] - print(url) bvid = url.split('/')[-1] - vd_info = video.get_video_info(bvid=bvid) + vd_info = await video.Video(bvid=bvid).get_info() aid = vd_info['aid'] title = vd_info['title'] author = vd_info['owner']['name'] @@ -54,10 +52,6 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State): except ActionFailed: logger.warning(f'{event.group_id} 发送bilibili解析失败') logger.info(f'USER {event.user_id} GROUP {event.group_id} 解析bilibili转发 {url}') - else: - return - else: - return diff --git a/plugins/pixiv/__init__.py b/plugins/pixiv/__init__.py index 67f93605..b946bf42 100644 --- a/plugins/pixiv/__init__.py +++ b/plugins/pixiv/__init__.py @@ -7,7 +7,10 @@ import time from services.log import logger from nonebot.adapters.cqhttp.exception import NetworkError -__plugin_usage__1 = '''P站排行榜帮助: + +__plugin_name__ = 'P站' + +__plugin_usage__ = '''P站排行榜帮助: 可选参数: 类型: 1. 日排行 @@ -20,27 +23,26 @@ __plugin_usage__1 = '''P站排行榜帮助: 8. R18受男性欢迎排行 9. R18重口排行【慎重!】 【使用时选择参数序号即可,R18仅可私聊】 -p站排行榜 类型 数量(可选) 日期(可选) +p站排行榜 [参数] [数量](可选) [日期](可选) 示例: p站排行榜 (无参数默认为日榜) p站排行榜 1 p站排行榜 1 5 p站排行榜 1 5 2018-4-25 【注意空格!!】【在线搜索会较慢】 -''' - -__plugin_usage__2 = '''P站搜图帮助: -可选参数: - 1.热度排序 - 2.时间排序 -【使用时选择参数序号即可,R18仅可私聊】 -搜图 关键词 数量(可选) 排序方式(可选) r18(可选) -示例: - 搜图 樱岛麻衣 - 搜图 樱岛麻衣 5 1 - 搜图 樱岛麻衣 5 2 r18 -【默认为 热度排序】 -【注意空格!!】【在线搜索会较慢】【数量可能不符】 +--------------------------------- +'P站搜图帮助: + 可选参数: + 1.热度排序 + 2.时间排序 + 【使用时选择参数序号即可,R18仅可私聊】 + 搜图 [关键词] [数量](可选) [排序方式](可选) [r18](可选) + 示例: + 搜图 樱岛麻衣 + 搜图 樱岛麻衣 5 1 + 搜图 樱岛麻衣 5 2 r18 + 【默认为 热度排序】 + 【注意空格!!】【在线搜索会较慢】【数量可能不符】 ''' rank_dict = { @@ -64,8 +66,6 @@ pixiv_keyword = on_command('搜图', priority=5, block=True) @pixiv_rank.handle() async def _(bot: Bot, event: MessageEvent, state: T_State): msg = get_message_text(event.json()).strip() - if msg in ['帮助']: - await pixiv_rank.finish(__plugin_usage__1) msg = msg.split(' ') msg = [m for m in msg if m] if not msg: @@ -111,8 +111,6 @@ async def _(bot: Bot, event: MessageEvent, state: T_State): @pixiv_keyword.handle() async def _(bot: Bot, event: MessageEvent, state: T_State): msg = get_message_text(event.json()).strip() - if msg in ['帮助'] or not msg: - await pixiv_keyword.finish(__plugin_usage__2) if event.message_type == 'group': if msg.find('r18') != -1: await pixiv_keyword.finish('(脸红#) 你不会害羞的 八嘎!', at_sender=True) diff --git a/plugins/poke/__init__.py b/plugins/poke/__init__.py index e893f43e..c6a2720e 100644 --- a/plugins/poke/__init__.py +++ b/plugins/poke/__init__.py @@ -9,7 +9,9 @@ import random from util.utils import CountLimiter from models.ban_user import BanUser -# 戳 一 戳 +__plugin_name__ = '戳一戳 [Hidden]' + +__plugin_usage__ = '用法:无' poke__reply = [ "lsp你再戳?", "连个可爱美少女都要戳的肥宅真恶心啊。", @@ -21,12 +23,12 @@ poke__reply = [ _clmt = CountLimiter(3) -poke_ = on_notice(priority=5) +poke_ = on_notice(priority=5, block=False) @poke_.handle() -async def _poke_(bot: Bot, event: PokeNotifyEvent, state: T_State) -> None: - if event.notice_type == 'notify' and event.sub_type == 'poke' and event.self_id == event.target_id: +async def _poke_(bot: Bot, event: PokeNotifyEvent, state: T_State): + if event.self_id == event.target_id: _clmt.add(event.user_id) if _clmt.check(event.user_id) or random.random() < 0.3: rst = '' @@ -36,7 +38,7 @@ async def _poke_(bot: Bot, event: PokeNotifyEvent, state: T_State) -> None: await poke_.finish(rst + random.choice(poke__reply), at_sender=True) rand = random.random() if rand <= 0.3: - path = random.choice(['loli/', 'meitu/']) + path = random.choice(['luoli/', 'meitu/']) index = random.randint(0, len(os.listdir(IMAGE_PATH + path))) result = f'id:{index}' + image(f'{index}.jpg', path) await poke_.send(result) diff --git a/plugins/quotations.py b/plugins/quotations.py index cf9df91b..86cd3c18 100644 --- a/plugins/quotations.py +++ b/plugins/quotations.py @@ -17,8 +17,6 @@ url = 'https://international.v1.hitokoto.cn/?c=a' @quotations.handle() async def _(bot: Bot, event: MessageEvent, state: T_State): - if str(event.get_message()) in ['帮助']: - await quotations.finish(__plugin_usage__) async with aiohttp.ClientSession() as session: async with session.get(url, proxy=get_local_proxy(), timeout=5) as response: data = await response.json() diff --git a/plugins/russian/__init__.py b/plugins/russian/__init__.py new file mode 100644 index 00000000..7243290e --- /dev/null +++ b/plugins/russian/__init__.py @@ -0,0 +1,348 @@ +from nonebot import on_command +import random +import asyncio +from nonebot.adapters.cqhttp import GROUP, Bot, GroupMessageEvent, Message +from nonebot.typing import T_State +from util.utils import get_message_text, is_number, get_message_at +from models.group_member_info import GroupInfoUser +from util.init_result import at +from models.russian_user import RussianUser +from models.bag_user import BagUser +from services.log import logger +import time +from .data_source import rank + +__plugin_name__ = '俄罗斯轮盘' + +__plugin_usage__ = '''俄罗斯轮盘帮助: + 开启游戏:装弹 [子弹数] [金额](默认200金币) [at](指定决斗对象,为空则所有群友都可接受决斗) + 示例:装弹 1 10 + 接受对决:接受对决/拒绝决斗 + 开始对决:开枪(轮流开枪,30秒未开枪另一方可使用‘结算’命令结束对决并胜利) + 结算:结算(当某一方30秒未开枪,可使用该命令强行结束对决并胜利) + 我的战绩:我的战绩 + 排行榜:胜场排行/败场排行/欧洲人排行/慈善家排行 + 【注:同一时间群内只能有一场对决】 +''' + +rs_player = {} + +rssian = on_command('俄罗斯轮盘', aliases={'装弹', '俄罗斯转盘'}, permission=GROUP, priority=5, block=True) + +accept = on_command('接受对决', aliases={'接受决斗', '接受挑战'}, permission=GROUP, priority=5, block=True) + +refuse = on_command('拒绝对决', aliases={'拒绝决斗', '拒绝挑战'}, permission=GROUP, priority=5, block=True) + +shot = on_command('开枪', aliases={'咔', '嘭', '嘣'}, permission=GROUP, priority=5, block=True) + +settlement = on_command('结算', permission=GROUP, priority=5, block=True) + +record = on_command('我的战绩', permission=GROUP, priority=5, block=True) + +rssian_rank = on_command('胜场排行', aliases={'胜利排行', '败场排行', '失败排行', + '欧洲人排行', '慈善家排行'}, permission=GROUP, priority=5, block=True) + + +@accept.handle() +async def _(bot: Bot, event: GroupMessageEvent, state: T_State): + global rs_player + try: + if rs_player[event.group_id][1] == 0: + await accept.finish('目前没有发起对决,你接受个啥?速速装弹!', at_sender=True) + except KeyError: + await accept.finish('目前没有进行的决斗,请发送 装弹 开启决斗吧!', at_sender=True) + if rs_player[event.group_id][2] != 0: + if rs_player[event.group_id][1] == event.user_id or rs_player[event.group_id][2] == event.user_id: + await accept.finish(f'你已经身处决斗之中了啊,给我认真一点啊!', at_sender=True) + else: + await accept.finish('已经有人接受对决了,你还是乖乖等待下一场吧!', at_sender=True) + if rs_player[event.group_id][1] == event.user_id: + await accept.finish('请不要自己枪毙自己!换人来接受对决...', at_sender=True) + if rs_player[event.group_id]['at'] != 0 and rs_player[event.group_id]['at'] != event.user_id: + await accept.finish(Message(f'这场对决是邀请 {at(rs_player[event.group_id]["at"])}的,不要捣乱!'), at_sender=True) + if time.time() - rs_player[event.group_id]['time'] > 30: + rs_player[event.group_id] = {} + await accept.finish('这场对决邀请已经过时了,请重新发起决斗...', at_sender=True) + + user_money = await BagUser.get_gold(event.user_id, event.group_id) + if user_money < rs_player[event.group_id]['money']: + if rs_player[event.group_id]['at'] != 0 and rs_player[event.group_id]['at'] == event.user_id: + rs_player[event.group_id] = {} + await accept.finish('你的金币不足以接受这场对决!对决还未开始便结束了,请重新装弹!', at_sender=True) + else: + await accept.finish('你的金币不足以接受这场对决!', at_sender=True) + + player2_name = (await GroupInfoUser.select_member_info(event.user_id, event.group_id)).user_name + + rs_player[event.group_id][2] = event.user_id + rs_player[event.group_id]['player2'] = player2_name + rs_player[event.group_id]['time'] = time.time() + + await accept.send(Message(f'{player2_name}接受了对决!\n' + f'请{at(rs_player[event.group_id][1])}先开枪!')) + + +@refuse.handle() +async def _(bot: Bot, event: GroupMessageEvent, state: T_State): + global rs_player + try: + if rs_player[event.group_id][1] == 0: + await accept.finish('你要拒绝啥?明明都没有人发起对决的说!', at_sender=True) + except KeyError: + await refuse.finish('目前没有进行的决斗,请发送 装弹 开启决斗吧!', at_sender=True) + if rs_player[event.group_id]['at'] != 0 and event.user_id != rs_player[event.group_id]['at']: + await accept.finish('又不是找你决斗,你拒绝什么啊!气!', at_sender=True) + if rs_player[event.group_id]['at'] == event.user_id: + at_player_name = (await GroupInfoUser.select_member_info(event.user_id, event.group_id)).user_name + await accept.send(Message(f'{at(rs_player[event.group_id][1])}\n' + f'{at_player_name}拒绝了你的对决!')) + rs_player[event.group_id] = {} + + +@settlement.handle() +async def _(bot: Bot, event: GroupMessageEvent, state: T_State): + global rs_player + if not rs_player.get(event.group_id) or rs_player[event.group_id][1] == 0 or rs_player[event.group_id][2] == 0: + await settlement.finish('比赛并没有开始...无法结算...', at_sender=True) + if event.user_id != rs_player[event.group_id][1] and event.user_id != rs_player[event.group_id][2]: + await settlement.finish('吃瓜群众不要捣乱!黄牌警告!', at_sender=True) + if time.time() - rs_player[event.group_id]['time'] <= 30: + await settlement.finish(f'{rs_player[event.group_id]["player1"]} 和' + f' {rs_player[event.group_id]["player2"]} 比赛并未超时,请继续比赛...') + win_name = rs_player[event.group_id]["player1"] if \ + rs_player[event.group_id][2] == rs_player[event.group_id]['next'] else \ + rs_player[event.group_id]["player2"] + await settlement.send(f'这场对决是 {win_name} 胜利了') + await end_game(bot, event) + + +@rssian.args_parser +async def _(bot: Bot, event: GroupMessageEvent, state: T_State): + msg = get_message_text(event.json()) + if msg in ['取消', '算了']: + await rssian.finish('已取消操作...') + try: + if rs_player[event.group_id][1] != 0: + await rssian.finish('决斗已开始...', at_sender=True) + except KeyError: + pass + if not is_number(msg): + await rssian.reject('输入子弹数量必须是数字啊喂!') + if int(msg) < 1 or int(msg) > 6: + await rssian.reject('子弹数量必须大于0小于7!') + state['bullet_num'] = int(msg) + + +@rssian.handle() +async def _(bot: Bot, event: GroupMessageEvent, state: T_State): + global rs_player + msg = get_message_text(event.json()) + if msg == '帮助': + await rssian.finish(__plugin_usage__) + try: + if rs_player[event.group_id][1] and not rs_player[event.group_id][2] and \ + time.time() - rs_player[event.group_id]['time'] <= 30: + await rssian.finish(f'现在是 {rs_player[event.group_id]["player1"]} 发起的对决\n请等待比赛结束后再开始下一轮...') + if rs_player[event.group_id][1] and rs_player[event.group_id][2] and\ + time.time() - rs_player[event.group_id]['time'] <= 30: + await rssian.finish(f'{rs_player[event.group_id]["player1"]} 和' + f' {rs_player[event.group_id]["player2"]}的对决还未结束!') + if rs_player[event.group_id][1] and rs_player[event.group_id][2] and\ + time.time() - rs_player[event.group_id]['time'] > 30: + await shot.send('决斗已过时,强行结算...') + await end_game(bot, event) + return + if not rs_player[event.group_id][2] and time.time() - rs_player[event.group_id]['time'] > 30: + rs_player[event.group_id][1] = 0 + rs_player[event.group_id][2] = 0 + rs_player[event.group_id]['at'] = 0 + except KeyError: + pass + if msg: + msg = msg.split(' ') + if len(msg) == 1: + msg = msg[0] + if is_number(msg) and not (int(msg) < 1 or int(msg) > 6): + state['bullet_num'] = int(msg) + else: + money = msg[1].strip() + msg = msg[0].strip() + if is_number(msg) and not (int(msg) < 1 or int(msg) > 6): + state['bullet_num'] = int(msg) + if is_number(money) and 0 < int(money) <= 1000: + state['money'] = int(money) + state['at'] = get_message_at(event.json()) + + +@rssian.got("bullet_num", prompt='请输入装填子弹的数量!(最多6颗)') +async def _(bot: Bot, event: GroupMessageEvent, state: T_State): + global rs_player + bullet_num = state['bullet_num'] + at_ = state['at'] + money = state['money'] if state.get('money') else 200 + user_money = await BagUser.get_gold(event.user_id, event.group_id) + if bullet_num < 0 or bullet_num > 6: + await rssian.reject('子弹数量必须大于0小于7!速速重新装弹!') + if money > 1000: + await rssian.finish('太多了!单次金额不能超过1000!', at_sender=True) + if money > user_money: + await rssian.finish('你没有足够的钱支撑起这场挑战', at_sender=True) + + player1_name = (await GroupInfoUser.select_member_info(event.user_id, event.group_id)).user_name + + if at_: + at_ = at_[0] + at_player_name = (await GroupInfoUser.select_member_info(at_, event.group_id)).user_name + msg = f'{player1_name} 向 {at(at_)} 发起了决斗!请 {at_player_name} 在30秒内回复‘接受对决’ or ‘拒绝对决’,超时此次决斗作废!' + else: + at_ = 0 + msg = '若30秒内无人接受挑战则此次对决作废【首次游玩请发送 ’俄罗斯轮盘帮助‘ 来查看命令】' + + rs_player[event.group_id] = {1: event.user_id, + 'player1': player1_name, + 2: 0, + 'player2': '', + 'at': at_, + 'next': event.user_id, + 'money': money, + 'bullet': random_bullet(bullet_num), + 'bullet_num': bullet_num, + 'null_bullet_num': 7 - bullet_num, + 'index': 0, + 'time': time.time()} + + await rssian.send(Message(('咔 ' * bullet_num)[:-1] + f',装填完毕\n挑战金额:{money}\n' + f'第一枪的概率为:{str(float(bullet_num) / 7.0 * 100)[:5]}%\n' + f'{msg}')) + + +@shot.handle() +async def _(bot: Bot, event: GroupMessageEvent, state: T_State): + global rs_player + try: + if time.time() - rs_player[event.group_id]['time'] > 30: + if rs_player[event.group_id][2] == 0: + rs_player[event.group_id][1] = 0 + await shot.finish('这场对决已经过时了,请重新装弹吧!', at_sender=True) + else: + await shot.send('决斗已过时,强行结算...') + await end_game(bot, event) + return + except KeyError: + await shot.finish('目前没有进行的决斗,请发送 装弹 开启决斗吧!', at_sender=True) + if rs_player[event.group_id][1] == 0: + await shot.finish('没有对决,也还没装弹呢,请先输入 装弹 吧!', at_sender=True) + if rs_player[event.group_id][1] == event.user_id and rs_player[event.group_id][2] == 0: + await shot.finish('baka,你是要枪毙自己嘛笨蛋!', at_sender=True) + if rs_player[event.group_id][2] == 0: + await shot.finish('请这位勇士先发送 接受对决 来站上擂台...', at_sender=True) + player1_name = rs_player[event.group_id]['player1'] + player2_name = rs_player[event.group_id]['player2'] + if rs_player[event.group_id]['next'] != event.user_id: + if event.user_id != rs_player[event.group_id][1] and event.user_id != rs_player[event.group_id][2]: + await shot.finish(random.choice([ + f'不要打扰 {player1_name} 和 {player2_name} 的决斗啊!', + '给我好好做好一个观众!不然小真寻就要生气了', + f'不要捣乱啊baka{(await GroupInfoUser.select_member_info(event.user_id, event.group_id)).user_name}!' + ]), at_sender=True) + await shot.finish(f'你的左轮不是连发的!该 ' + f'{(await GroupInfoUser.select_member_info(int(rs_player[event.group_id]["next"]), event.group_id)).user_name} 开枪了') + if rs_player[event.group_id]['bullet'][rs_player[event.group_id]['index']] != 1: + await shot.send(Message(random.choice([ + '呼呼,没有爆裂的声响,你活了下来', + '虽然黑洞洞的枪口很恐怖,但好在没有子弹射出来,你活下来了', + '\"咔\",你没死,看来运气不错', + ]) + f'\n下一枪中弹的概率' + f':{str(float((rs_player[event.group_id]["bullet_num"])) / float(rs_player[event.group_id]["null_bullet_num"] - 1 + rs_player[event.group_id]["bullet_num"]) * 100)[:5]}%\n' + f'轮到 {at(rs_player[event.group_id][1] if event.user_id == rs_player[event.group_id][2] else rs_player[event.group_id][2])}了')) + rs_player[event.group_id]["null_bullet_num"] -= 1 + rs_player[event.group_id]['next'] = rs_player[event.group_id][1] if \ + event.user_id == rs_player[event.group_id][2] else rs_player[event.group_id][2] + rs_player[event.group_id]['time'] = time.time() + rs_player[event.group_id]['index'] += 1 + else: + await shot.send(random.choice([ + '\"嘭!\",你直接去世了', + '眼前一黑,你直接穿越到了异世界...(死亡)', + '终究还是你先走一步...', + ]) + f'\n第 {rs_player[event.group_id]["index"] + 1} 发子弹送走了你...', at_sender=True) + win_name = player1_name if event.user_id == rs_player[event.group_id][2] else player2_name + await asyncio.sleep(0.5) + await shot.send(f'这场对决是 {win_name} 胜利了') + await end_game(bot, event) + + +async def end_game(bot: Bot, event: GroupMessageEvent): + global rs_player + player1_name = rs_player[event.group_id]['player1'] + player2_name = rs_player[event.group_id]['player2'] + if rs_player[event.group_id]['next'] == rs_player[event.group_id][1]: + win_user_id = rs_player[event.group_id][2] + lose_user_id = rs_player[event.group_id][1] + win_name = player2_name + lose_name = player1_name + else: + win_user_id = rs_player[event.group_id][1] + lose_user_id = rs_player[event.group_id][2] + win_name = player1_name + lose_name = player2_name + rand = random.randint(0, 5) + money = rs_player[event.group_id]['money'] + fee = int(money * float(rand) / 100) + fee = 1 if fee < 1 and rand != 0 else fee + await RussianUser.add_count(win_user_id, event.group_id, 'win') + await RussianUser.add_count(lose_user_id, event.group_id, 'lose') + await RussianUser.money(win_user_id, event.group_id, 'win', money - fee) + await RussianUser.money(lose_user_id, event.group_id, 'lose', money) + await BagUser.add_gold(win_user_id, event.group_id, money - fee) + await BagUser.spend_gold(lose_user_id, event.group_id, money) + win_user = await RussianUser.ensure(win_user_id, event.group_id) + lose_user = await RussianUser.ensure(lose_user_id, event.group_id) + bullet_str = '' + for x in rs_player[event.group_id]['bullet']: + bullet_str += '__ ' if x == 0 else '| ' + logger.info(f'俄罗斯轮盘:胜者:{win_name} - 败者:{lose_name} - 金币:{money}') + await bot.send(event, message=f'结算:\n' + f'\t胜者:{win_name}\n' + f'\t赢取金币:{money - fee}\n' + f'\t累计胜场:{win_user.win_count}\n' + f'\t累计赚取金币:{win_user.make_money}\n' + f'-------------------\n' + f'\t败者:{lose_name}\n' + f'\t输掉金币:{money}\n' + f'\t累计败场:{lose_user.fail_count}\n' + f'\t累计输掉金币:{lose_user.lose_money}\n' + f'-------------------\n' + f'哼哼,真寻从中收取了 {float(rand)}%({fee}金币) 作为手续费!\n' + f'子弹排列:{bullet_str[:-1]}') + rs_player[event.group_id] = {} + + +@record.handle() +async def _(bot: Bot, event: GroupMessageEvent, state: T_State): + user = await RussianUser.ensure(event.user_id, event.group_id) + await record.send(f'俄罗斯轮盘\n' + f'胜利场次:{user.win_count}\n' + f'失败场次:{user.fail_count}\n' + f'赚取金币:{user.make_money}\n' + f'输掉金币:{user.lose_money}', at_sender=True) + + +@rssian_rank.handle() +async def _(bot: Bot, event: GroupMessageEvent, state: T_State): + if state["_prefix"]["raw_command"] in ['胜场排行', '胜利排行']: + await rssian_rank.finish(await rank(event.group_id, 'win_rank')) + if state["_prefix"]["raw_command"] in ['败场排行', '失败排行']: + await rssian_rank.finish(await rank(event.group_id, 'lose_rank')) + if state["_prefix"]["raw_command"] == '欧洲人排行': + await rssian_rank.finish(await rank(event.group_id, 'make_money')) + if state["_prefix"]["raw_command"] == '慈善家排行': + await rssian_rank.finish(await rank(event.group_id, 'spend_money')) + + +# 随机子弹排列 +def random_bullet(num: int) -> list: + bullet_lst = [0, 0, 0, 0, 0, 0, 0] + for i in random.sample([0, 1, 2, 3, 4, 5, 6], num): + bullet_lst[i] = 1 + return bullet_lst diff --git a/plugins/russian/data_source.py b/plugins/russian/data_source.py new file mode 100644 index 00000000..b79a0fae --- /dev/null +++ b/plugins/russian/data_source.py @@ -0,0 +1,33 @@ +from models.russian_user import RussianUser +from util.data_utils import init_rank + + +async def rank(group_id: int, itype) -> str: + users = await RussianUser.all_user(group_id) + if itype == 'win_rank': + rank_name = '\t胜场排行榜\n' + all_user_data = [user.win_count for user in users] + elif itype == 'lose_rank': + rank_name = '\t败场排行榜\n' + all_user_data = [user.fail_count for user in users] + elif itype == 'make_money': + rank_name = '\t赢取金币排行榜\n' + all_user_data = [user.make_money for user in users] + else: + rank_name = '\t输掉金币排行榜\n' + all_user_data = [user.lose_money for user in users] + rst = '' + if users: + rst = await init_rank(users, all_user_data, group_id) + return rank_name + rst + + + + + + + + + + + diff --git a/plugins/search_anime/__init__.py b/plugins/search_anime/__init__.py index 387ea5c3..c383dbeb 100644 --- a/plugins/search_anime/__init__.py +++ b/plugins/search_anime/__init__.py @@ -29,8 +29,6 @@ async def _(bot: Bot, event: Event, state: T_State): @search_anime.handle() async def _(bot: Bot, event: Event, state: T_State): - if get_message_text(event.json()) in ['帮助'] or get_message_text(event.json()) == '': - await search_anime.finish(__plugin_usage__) if _ulmt.check(event.user_id): await search_anime.finish('您有动漫正在搜索,请稍等...', at_sender=True) _ulmt.set_True(event.user_id) diff --git a/plugins/search_buff_skin_price/__init__.py b/plugins/search_buff_skin_price/__init__.py index 4ecc2846..60c5bca7 100644 --- a/plugins/search_buff_skin_price/__init__.py +++ b/plugins/search_buff_skin_price/__init__.py @@ -10,8 +10,8 @@ from util.utils import UserExistLimiter, get_message_text __plugin_name__ = '查询皮肤' __plugin_usage__ = '查询皮肤帮助:\n\t' \ - '对我说 "查询皮肤 xxx yyyy",我会回复xxx的底价哦\n\t' \ - '示例: 查询皮肤 awp 二西莫夫' + '查询皮肤 [枪械名] [皮肤]\n\t' \ + '示例: 查询皮肤 awp 二西莫夫' _ulmt = UserExistLimiter() diff --git a/plugins/send_img/__init__.py b/plugins/send_img/__init__.py index 204ba4db..4348cf39 100644 --- a/plugins/send_img/__init__.py +++ b/plugins/send_img/__init__.py @@ -54,7 +54,7 @@ async def _(bot: Bot, event: Event, state: T_State): await send_img.finish(f"不想给你看Ov|") -pa = on_keyword({"爬"}, priority=1, block=True) +pa = on_keyword({"爬", "爪巴"}, priority=1, block=True) @pa.handle() diff --git a/plugins/send_setu/__init__.py b/plugins/send_setu/__init__.py index d0eed4fc..54d4cfe7 100644 --- a/plugins/send_setu/__init__.py +++ b/plugins/send_setu/__init__.py @@ -20,7 +20,7 @@ __plugin_usage__ = f'''示例: 2. 色图r (随机在线十张r18涩图) 3. 色图 666 (本地色图id) 4. 色图 xx (在线搜索xx色图) - 5. 色图r xx (搜索十张xx的r18涩图,注意空格)(仅私聊) + 5. 色图r xx (搜索十张xx的r18涩图,注意空格)(仅私聊,每日限制5次) 6. 来n张涩图 (本地涩图连发)(1<=n<=9) 7. 来n张xx的涩图 (在线搜索xx涩图)(较慢,看网速) 注:【色图r每日提供{MAX_SETU_R_COUNT}次 @@ -84,6 +84,7 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State): try: urls, text_list, code = await get_setu_urls(keyword, num, r18=r18) except ClientConnectorError: + _ulmt.set_False(event.user_id) await setu.finish('网络失败了..别担心!正在靠运气上网!', at_sender=True) else: if code == 200: @@ -128,6 +129,8 @@ async def _(bot: Bot, event: PrivateMessageEvent, state: T_State): if await UserCount.check_count(event.user_id, 'setu_r18', MAX_SETU_R_COUNT): _ulmt.set_False(event.user_id) await setu.finish('要节制啊,请明天再来...\n【每日提供5次】', at_sender=True) + else: + await UserCount.add_count(event.user_id, 'setu_r18', count=1) try: urls, text_list, code = await get_setu_urls(keyword, num, r18=r18) except ClientConnectorError: diff --git a/plugins/send_setu/data_source.py b/plugins/send_setu/data_source.py index e28d6a41..5a2d90d2 100644 --- a/plugins/send_setu/data_source.py +++ b/plugins/send_setu/data_source.py @@ -24,19 +24,20 @@ path = 'setu/' async def get_setu_urls(keyword: str, num: int = 1, r18: int = 0): # print(keyword) if r18 == 1: - file_name = 'setu_r18_url.txt' + file_name = 'setu_r18_url.json' else: - file_name = 'setu_url.txt' + file_name = 'setu_url.json' try: - with open(TXT_PATH + file_name, 'r') as f: - txt_data = f.read() - except FileNotFoundError: - txt_data = '' + with open(TXT_PATH + file_name, 'r', encoding='utf8') as f: + txt_data = json.load(f) + except (FileNotFoundError, ValueError): + txt_data = {} + txt_urls = [txt_data[x]['img_url'] for x in txt_data.keys()] params = { "apikey": LOLICON_KEY, # 添加apikey 'r18': r18, # 添加r18参数 0为否,1为是,2为混合 'keyword': keyword, # 若指定关键字,将会返回从插画标题、作者、标签中模糊搜索的结果 - 'num': num, # 一次返回的结果数量,范围为1到10,不提供 APIKEY 时固定为1 + 'num': 100, # 一次返回的结果数量,范围为1到10,不提供 APIKEY 时固定为1 'size1200': 1, # 是否使用 master_1200 缩略图,以节省流量或提升加载速度 } urls = [] @@ -53,7 +54,6 @@ async def get_setu_urls(keyword: str, num: int = 1, r18: int = 0): if response.status == 200: data = await response.json() if data['code'] == 0: - # print(len(data['data'])) for i in range(len(data['data'])): img_url = data['data'][i]['url'] title = data['data'][i]['title'] @@ -61,12 +61,29 @@ async def get_setu_urls(keyword: str, num: int = 1, r18: int = 0): pid = data['data'][i]['pid'] urls.append(img_url) text_list.append(f'title:{title}\nauthor:{author}\nPID:{pid}') - img_url = str(img_url).replace('img-master', 'img-original').replace('_master1200', '') - txt_data += img_url + ',' + tags = [] + for j in range(len(data['data'][i]['tags'])): + tags.append(data['data'][i]['tags'][j]) + if img_url not in txt_urls: + save_setu_dict = { + 'title': title, + 'author': author, + 'pid': pid, + 'img_url': img_url, + 'tags': tags + } + if str(pid) not in txt_data.keys(): + txt_data[pid] = save_setu_dict if DOWNLOAD_SETU: - with open(TXT_PATH + file_name, 'w') as f: - f.write(txt_data) - return urls, text_list, 200 + with open(TXT_PATH + file_name, 'w', encoding='utf8') as f: + json.dump(txt_data, f, ensure_ascii=False, indent=4) + random_idx = random.sample(range(len(data['data'])), num) + x_urls = [] + x_text_lst = [] + for x in random_idx: + x_urls.append(urls[x]) + x_text_lst.append(text_list[x]) + return x_urls, x_text_lst, 200 else: return "没找到符合条件的色图...", '', 401 except TimeoutError: @@ -145,17 +162,20 @@ async def check_r18_and_keyword(msg: str, user_id) -> 'str, int, int': async def find_img_index(img_url, user_id): try: - setu_hash_dict = json.load(open(TXT_PATH + 'setu_img_hash.json')) + setu_data = json.load(open(TXT_PATH + 'setu_data.json', encoding='utf8')) except (FileNotFoundError, ValueError): - setu_hash_dict = {} + setu_data = {} async with aiohttp.ClientSession() as session: async with session.get(img_url, proxy=get_local_proxy(), timeout=5) as res: async with aiofiles.open(IMAGE_PATH + f"temp/{user_id}_find_setu_index.jpg", 'wb') as f: await f.write(await res.read()) img_hash = str(get_img_hash(IMAGE_PATH + f"temp/{user_id}_find_setu_index.jpg")) try: - tp = list(setu_hash_dict.keys())[list(setu_hash_dict.values()).index(img_hash)] - return "id --> " + str(tp) + index = str([setu_data[x]['img_hash'] for x in setu_data.keys()].index(img_hash)) + return f"id:{index}\n" \ + f"title:{setu_data[index]['title']}\n" \ + f"author:{setu_data[index]['author']}\n" \ + f"PID:{setu_data[index]['pid']}" except ValueError: return "该图不在色图库中!" @@ -167,10 +187,10 @@ def delete_img(_id: int): try: os.remove(IMAGE_PATH + path + f'{_id}.jpg') if _id != lens: - setu_hash_dict = json.load(open(TXT_PATH + 'setu_img_hash.json')) + setu_hash_dict = json.load(open(TXT_PATH + 'setu_data.json', encoding='utf8')) setu_hash_dict[str(_id)] = setu_hash_dict[str(lens)] os.rename(IMAGE_PATH + path + f'{lens}.jpg', IMAGE_PATH + path + f'{_id}.jpg') - with open(TXT_PATH + 'setu_img_hash.json', 'w') as f: + with open(TXT_PATH + 'setu_data.json', 'w', encoding='utf8') as f: json.dump(setu_hash_dict, f, ensure_ascii=False, indent=4) return True, '' except Exception as e: @@ -183,7 +203,7 @@ async def add_img(imgs: list): index = 0 lens = len(os.listdir(IMAGE_PATH + path)) add_count = 0 - setu_hash_dict = json.load(open(TXT_PATH + 'setu_img_hash.json')) + setu_data_dict = json.load(open(TXT_PATH + 'setu_data.json', encoding='utf8')) async with aiohttp.ClientSession() as session: for img in imgs: async with session.get(img, proxy=get_local_proxy(), timeout=5) as res: @@ -193,16 +213,20 @@ async def add_img(imgs: list): index -= 1 for i in range(index, -1, -1): img_hash = str(get_img_hash(IMAGE_PATH + f"temp/add_setu_check_{index}.jpg")) - print(f'img_hash: {img_hash}') - if img_hash not in setu_hash_dict.values(): + if img_hash not in [setu_data_dict[x]['img_hash'] for x in setu_data_dict.keys()]: os.rename(IMAGE_PATH + f"temp/add_setu_check_{index}.jpg", IMAGE_PATH + path + f'/{lens}.jpg') - print(f'{lens}: {img_hash}') - setu_hash_dict[lens] = img_hash + setu_data_dict[lens] = { + 'title': 'not title', + 'author': 'not author', + 'pid': 'not pid', + 'img_hash': img_hash, + 'img_url': 'not url', + } lens += 1 add_count += 1 if add_count: - with open(TXT_PATH + 'setu_img_hash.json', 'w') as f: - json.dump(setu_hash_dict, f, ensure_ascii=False, indent=4) + with open(TXT_PATH + 'setu_data.json', 'w', encoding='utf8') as f: + json.dump(setu_data_dict, f, ensure_ascii=False, indent=4) return lens, add_count diff --git a/plugins/server_ip.py b/plugins/server_ip.py index 6daaad7e..52f2f085 100644 --- a/plugins/server_ip.py +++ b/plugins/server_ip.py @@ -13,7 +13,7 @@ server_ip = on_command("服务器", aliases={'ip'}, rule=to_me(), priority=5, bl @server_ip.handle() async def _(bot: Bot, event: PrivateMessageEvent, state: T_State): await server_ip.finish("|* 请不要发给其他人! *|\n" - "\t*************\n" + "\t121.40.195.22\n" "|* 请不要发给其他人! *|\n" "csgo ~号键控制台输入 connect 121.40.195.22 进入服务器\n" "然后再公屏输入 !diy 来使用皮肤(英文感叹号,注意)\n" @@ -24,7 +24,8 @@ async def _(bot: Bot, event: PrivateMessageEvent, state: T_State): async def _(bot: Bot, event: GroupMessageEvent, state: T_State): if event.group_id == 698279647: await server_ip.finish("嗨呀!当前服务器地址是:" - "*************") + "\ncsgo:\n\tay: 121.40.195.22\n\t" + "wzt: 101.200.199.143\n\t夜之北枭: 101.132.170.254\n我的世界:\n\t47.111.1.220:25565") elif event.group_id == 1046451860: await server_ip.finish("嗨呀!当前服务器地址是:\n121.40.195.22\n !diy") else: diff --git a/plugins/shop/buy.py b/plugins/shop/buy.py index 9531b9b9..4a9b961e 100644 --- a/plugins/shop/buy.py +++ b/plugins/shop/buy.py @@ -3,71 +3,61 @@ from services.log import logger from nonebot.adapters.cqhttp import Bot, GroupMessageEvent from nonebot.typing import T_State from util.utils import get_message_text, is_number -from models.bag_user import UserBag +from models.bag_user import BagUser from services.db_context import db from nonebot.adapters.cqhttp.permission import GROUP +from models.goods_info import GoodsInfo __plugin_name__ = '商店购买' -__plugin_usage__ = '格式:购买 名称或序号 数量(选填,默认为1)\n\t示例:购买 好感双倍加持卡Ⅰ\n\t示例:购买 1 4' +__plugin_usage__ = '格式:购买 [名称或序号] [数量](默认1)\n\t示例:购买 好感双倍加持卡Ⅰ\n\t示例:购买 1 4' buy = on_command("购买", aliases={'购买道具'}, priority=5, block=True, permission=GROUP) -goods = [ - '好感双倍加持卡Ⅰ\t\t售价:30金币\n\t\t今日双倍好感度的概率 + 10%(谁才是真命天子?)(同类道具将覆盖)', - '好感双倍加持卡Ⅱ\t\t售价:140金币\n\t\t今日双倍好感度的概率 + 20%(平平庸庸~)(同类道具将覆盖)', - '好感双倍加持卡Ⅲ\t\t售价:250金币\n\t\t今日双倍好感度的概率 + 30%(金币才是真命天子!)(同类道具将覆盖)' -] -glist = [] -plist = [] -for i in range(len(goods)): - glist.append(goods[i].split('\t\t')[0]) - plist.append(int(goods[i].split('\t\t')[1].split(':')[1].split('金币')[0])) - @buy.handle() async def _(bot: Bot, event: GroupMessageEvent, state: T_State): - if get_message_text(event.json()) in ['', '帮助']: - await buy.finish(__plugin_usage__) if get_message_text(event.json()) in ['神秘药水']: await buy.finish("你们看看就好啦,这是不可能卖给你们的~", at_sender=True) + goods_lst = await GoodsInfo.get_all_goods() + goods_name_lst = [x.goods_name for x in goods_lst] msg = get_message_text(event.json()).strip().split(' ') - index = -1 num = 1 if len(msg) > 1: if is_number(msg[1]): num = int(msg[1]) - print(msg, num) + else: + await buy.finish('购买的数量要是数字!', at_sender=True) + # print(msg, num) if is_number(msg[0]): msg = int(msg[0]) - if msg > len(goods) or msg < 1: + if msg > len(goods_lst) or msg < 1: await buy.finish('请输入正确的商品id!', at_sender=True) - index = msg - 1 + goods = goods_lst[msg - 1] else: - if msg[0] in glist: - for i in range(len(glist)): - if msg == glist[i]: - index = i + if msg[0] in goods_name_lst: + for i in range(len(goods_name_lst)): + if msg[0] == goods_name_lst[i]: + goods = goods_lst[i] break + else: + await buy.finish('请输入正确的商品名称!') else: await buy.finish('请输入正确的商品名称!', at_sender=True) async with db.transaction(): - if index != -1: - if (await UserBag.get_gold(event.user_id, event.group_id)) < plist[index] * num: - await buy.finish('您的金币好像不太够哦', at_sender=True) - if await UserBag.spend_glod(event.user_id, event.group_id, plist[index] * num): - for _ in range(num): - await UserBag.add_props(event.user_id, event.group_id, glist[index]) - await buy.send(f'花费 {plist[index]*num} 金币购买 {glist[index]} ×{num} 成功!', at_sender=True) - logger.info(f'USER {event.user_id} GROUP {event.group_id} ' - f'花费 {plist[index]*num} 金币购买 {glist[index]} ×{num} 成功!') - else: - await buy.send(f'{glist[index]} 购买失败!', at_sender=True) - logger.info(f'USER {event.user_id} GROUP {event.group_id} ' - f'花费 {plist[index]*num} 金币购买 {glist[index]} ×{num} 失败!') - - + if (await BagUser.get_gold(event.user_id, event.group_id)) < goods.goods_price * num: + await buy.finish('您的金币好像不太够哦', at_sender=True) + if await BagUser.spend_gold(event.user_id, event.group_id, goods.goods_price * num): + for _ in range(num): + await BagUser.add_props(event.user_id, event.group_id, goods.goods_name) + await buy.send(f'花费 {goods.goods_price*num} 金币购买 {goods.goods_name} ×{num} 成功!', at_sender=True) + logger.info(f'USER {event.user_id} GROUP {event.group_id} ' + f'花费 {goods.goods_price*num} 金币购买 {goods.goods_name} ×{num} 成功!') + else: + await buy.send(f'{goods.goods_name} 购买失败!', at_sender=True) + logger.info(f'USER {event.user_id} GROUP {event.group_id} ' + f'花费 {goods.goods_price*num} 金币购买 {goods.goods_name} ×{num} 失败!') diff --git a/plugins/shop/gold.py b/plugins/shop/gold.py new file mode 100644 index 00000000..ece5df74 --- /dev/null +++ b/plugins/shop/gold.py @@ -0,0 +1,28 @@ +from nonebot import on_command +from nonebot.adapters.cqhttp import Bot, GroupMessageEvent +from nonebot.typing import T_State +from nonebot.adapters.cqhttp.permission import GROUP +from util.data_utils import init_rank +from models.bag_user import BagUser + + +my_gold = on_command("我的金币", priority=5, block=True, permission=GROUP) + +gold_rank = on_command('金币排行', priority=5, block=True, permission=GROUP) + + +@my_gold.handle() +async def _(bot: Bot, event: GroupMessageEvent, state: T_State): + await my_gold.finish(await BagUser.get_my_total_gold(event.user_id, event.group_id)) + + +@gold_rank.handle() +async def _(bot: Bot, event: GroupMessageEvent, state: T_State): + users = await BagUser.get_user_all(event.group_id) + all_user_data = [user.gold for user in users] + await gold_rank.finish(await init_rank(users, all_user_data, event.group_id)) + + + + + diff --git a/plugins/shop/gold_redbag/__init__.py b/plugins/shop/gold_redbag/__init__.py new file mode 100644 index 00000000..7f460502 --- /dev/null +++ b/plugins/shop/gold_redbag/__init__.py @@ -0,0 +1,310 @@ +from nonebot import on_command, on_notice +from nonebot.adapters.cqhttp import Bot, GroupMessageEvent, PokeNotifyEvent, MessageEvent +from nonebot.typing import T_State +from .data_source import check_gold, generate_send_redbag_pic, open_redbag, generate_open_redbag_pic, return_gold +from nonebot.adapters.cqhttp.permission import GROUP +from nonebot.message import run_preprocessor, IgnoredException +from nonebot.matcher import Matcher +from util.utils import get_message_text, is_number, scheduler +from util.init_result import image +from services.log import logger +from nonebot.permission import SUPERUSER +from nonebot.rule import to_me +from datetime import datetime, timedelta +import random +import time + + +__plugin_name__ = '金币红包' + +__plugin_usage__ = '金币红包帮助:\n' \ + '\t塞红包 [金币数] [红包个数](默认5)\n' \ + '示例:\n' \ + '\t塞红包 500 5\n' \ + '抢红包 --> 戳一戳,开' \ + '退还剩余红包 --> 退还' + +gold_redbag = on_command('塞红包', aliases={'金币红包'}, priority=5, block=True, permission=GROUP) + +open_ = on_command('开', aliases={'抢'}, priority=5, block=True, permission=GROUP) + +poke_ = on_notice(priority=6, block=False) + +return_ = on_command('退回', aliases={'退还'}, priority=5, block=True, permission=GROUP) + +festive_redbag = on_command('节日红包', priority=5, block=True, permission=SUPERUSER, rule=to_me()) + +redbag_data = {} + +festive_redbag_data = {} + + +# 阻断其他poke +@run_preprocessor +async def _(matcher: Matcher, bot: Bot, event: PokeNotifyEvent, state: T_State): + try: + if matcher.type == 'notice' and event.self_id == event.target_id: + flag1 = True + flag2 = True + try: + if festive_redbag_data[event.group_id]['user_id']: + if event.user_id in festive_redbag_data[event.group_id]['open_user']: + flag1 = False + except KeyError: + flag1 = False + try: + if redbag_data[event.group_id]['user_id']: + if event.user_id in redbag_data[event.group_id]['open_user']: + flag2 = False + except KeyError: + flag2 = False + if flag1 or flag2: + if matcher.module == 'poke': + raise IgnoredException('目前正在抢红包...') + else: + if matcher.module == 'gold_redbag': + raise IgnoredException('目前没有红包...') + # for data in [festive_redbag_data, redbag_data]: + # if data.get(event.group_id): + # if data[event.group_id].get('user_id') != 0: + # if event.user_id not in data[event.group_id]['open_user']: + # if matcher.module == 'poke': + # raise IgnoredException('目前正在抢红包...') + # else: + # open_flag = True + # if open_flag: + # if matcher.module == 'gold_redbag': + # raise IgnoredException('目前没有红包...') + except AttributeError: + pass + + +@gold_redbag.handle() +async def _(bot: Bot, event: GroupMessageEvent, state: T_State): + global redbag_data, festive_redbag_data + try: + if time.time() - redbag_data[event.group_id]['time'] > 60: + amount = redbag_data[event.group_id]['amount'] - redbag_data[event.group_id]['open_amount'] + await gold_redbag.send(f'{redbag_data[event.group_id]["nickname"]}的红包过时未开完,退还{amount}金币...') + redbag_data[event.group_id] = {} + else: + await gold_redbag.finish(f'目前 {redbag_data[event.group_id]["nickname"]} 的红包还没有开完噢,' + f'还剩下 {len(redbag_data[event.group_id]["redbag"])} 个红包!' + f'(或等待{str(60 - time.time() + redbag_data[event.group_id]["time"])[:2]}秒红包过时)') + except KeyError: + pass + msg = get_message_text(event.json()) + msg = msg.split(' ') + if len(msg) == 1: + flag, amount = await check_gold(event.user_id, event.group_id, msg[0]) + if not flag: + await gold_redbag.finish(amount) + num = 5 + else: + amount = msg[0] + num = msg[1] + flag, amount = await check_gold(event.user_id, event.group_id, amount) + if not flag: + await gold_redbag.finish(amount, at_sender=True) + if not is_number(num): + await gold_redbag.finish('红包个数给我输正确啊!', at_sender=True) + num = int(num) + nickname = event.sender.card if event.sender.card else event.sender.nickname + flag, result = init_redbag(event.user_id, event.group_id, nickname, amount, num, int(bot.self_id)) + if not flag: + await gold_redbag.finish(result, at_sender=True) + else: + await gold_redbag.send(f'{nickname}发起了金币红包\n金额:{amount}\n数量:{num}\n' + + image(b64=await generate_send_redbag_pic(redbag_data[event.group_id]['user_id']))) + logger.info(f"USER {event.user_id} GROUP {event.group_id} 塞入 {num} 个红包,共 {amount} 金币") + + +@open_.handle() +async def _(bot: Bot, event: GroupMessageEvent, state: T_State): + global redbag_data, festive_redbag_data + flag1 = True + flag2 = True + open_flag1 = True + open_flag2 = True + try: + if festive_redbag_data[event.group_id]['user_id']: + if event.user_id in festive_redbag_data[event.group_id]['open_user']: + open_flag1 = False + except KeyError: + open_flag1 = False + flag1 = False + try: + if redbag_data[event.group_id]['user_id']: + if event.user_id in redbag_data[event.group_id]['open_user']: + open_flag2 = False + except KeyError: + flag2 = False + if not flag1 and not flag2: + await open_.finish('目前没有红包可以开...', at_sender=True) + if open_flag1 or open_flag2: + try: + await open_.send(image(b64=await get_redbag_img(event.user_id, event.group_id)), at_sender=True) + except KeyError: + await open_.finish('真贪心,明明已经开过这个红包了的说...', at_sender=True) + else: + await open_.finish('真贪心,明明已经开过这个红包了的说...', at_sender=True) + + +@poke_.handle() +async def _poke_(bot: Bot, event: PokeNotifyEvent, state: T_State): + global redbag_data, festive_redbag_data + if event.self_id == event.target_id: + flag1 = True + flag2 = True + try: + if event.user_id in festive_redbag_data[event.group_id]['open_user']: + flag1 = False + except KeyError: + flag1 = False + try: + if event.user_id in redbag_data[event.group_id]['open_user']: + flag2 = False + except KeyError: + flag2 = False + if not flag1 and not flag2: + return + await poke_.send(image(b64=await get_redbag_img(event.user_id, event.group_id)), at_sender=True) + + +@return_.handle() +async def _(bot: Bot, event: GroupMessageEvent, state: T_State): + global redbag_data + try: + if redbag_data[event.group_id]['user_id'] != event.user_id: + await return_.finish('不是你的红包你退回什么!', at_sender=True) + if time.time() - redbag_data[event.group_id]['time'] <= 60: + await return_.finish(f'你的红包还没有过时,在 {str(60 - time.time() + redbag_data[event.group_id]["time"])[:2]} ' + f'秒后可以退回..', at_sender=True) + await return_gold(event.user_id, event.group_id, + redbag_data[event.group_id]['amount'] - redbag_data[event.group_id]['open_amount']) + await return_.send(f"已成功退还了 " + f"{redbag_data[event.group_id]['amount'] - redbag_data[event.group_id]['open_amount']} " + f"金币", at_sender=True) + logger.info(f"USER {event.user_id} GROUP {event.group_id} 退回了" + f"红包 {redbag_data[event.group_id]['amount'] - redbag_data[event.group_id]['open_amount']} 金币") + redbag_data[event.group_id] = {} + except KeyError: + await return_.finish('目前没有红包可以退回...', at_sender=True) + + +@festive_redbag.handle() +async def _(bot: Bot, event: MessageEvent, state: T_State): + global redbag_data + msg = get_message_text(event.json()) + if msg: + msg = msg.split(' ') + amount = 0 + num = 0 + greetings = '恭喜发财 大吉大利' + gl = [] + if (lens := len(msg)) < 2: + await festive_redbag.finish('参数不足,格式:节日红包 [金额] [数量] [祝福语](可省) [指定群](可省)') + if lens > 1: + if not is_number(msg[0]): + await festive_redbag.finish('金额必须要是数字!', at_sender=True) + amount = int(msg[0]) + if not is_number(msg[1]): + await festive_redbag.finish('数量必须要是数字!', at_sender=True) + num = int(msg[1]) + if lens > 2: + greetings = msg[2] + if lens > 3: + for i in range(3, lens): + if not is_number(msg[i]): + await festive_redbag.finish('指定的群号必须要是数字啊!', at_sender=True) + gl.append(int(msg[i])) + if not gl: + gl = await bot.get_group_list(self_id=int(bot.self_id)) + gl = [g['group_id'] for g in gl] + for g in gl: + init_redbag(int(bot.self_id), g, '可爱的小真寻', amount, num, int(bot.self_id), 1) + scheduler.add_job(end_festive_redbag, "date", + run_date=str(datetime.now() + timedelta(hours=24)).split('.')[0], + id=f'festive_redbag_{g}', args=[bot, g]) + try: + await bot.send_group_msg(group_id=g, message=f'可爱的小真寻发起了金币红包\n金额:{amount}\n数量:{num}\n' + image( + b64=await generate_send_redbag_pic(int(bot.self_id), greetings))) + except AttributeError: + pass + + +# 红包数据初始化 +def init_redbag(user_id: int, group_id: int, nickname: str, amount: int, num: int, bot_self_id: int, mode: int = 0): + global redbag_data, festive_redbag_data + data = redbag_data if mode == 0 else festive_redbag_data + if not data.get(group_id): + data[group_id] = {} + try: + if data[group_id]['user_id'] and user_id != bot_self_id: + return False, f'{data[group_id]["nickname"]}的红包还没抢完呢...' + except KeyError: + pass + data[group_id]['user_id'] = user_id + data[group_id]['nickname'] = nickname + data[group_id]['amount'] = amount + data[group_id]['num'] = num + data[group_id]['open_amount'] = 0 + data[group_id]['time'] = time.time() + data[group_id]['redbag'] = random_redbag(amount, num) + data[group_id]['open_user'] = [] + if mode == 0: + redbag_data = data + else: + festive_redbag_data = data + return True, '' + + +# 随机红包排列 +def random_redbag(amount: int, num: int) -> list: + redbag_lst = [] + for _ in range(num - 1): + tmp = int(amount / random.choice(range(3, num + 3))) + redbag_lst.append(tmp) + amount -= tmp + redbag_lst.append(amount) + return redbag_lst + + +# 返回开红包图片 +async def get_redbag_img(user_id: int, group_id: int): + global redbag_data, festive_redbag_data + data = redbag_data + mode = 0 + if festive_redbag_data.get(group_id): + try: + if user_id not in festive_redbag_data[group_id]['open_user']: + data = festive_redbag_data + mode = 1 + except KeyError: + pass + amount, data = await open_redbag(user_id, group_id, data) + text = f'已领取' \ + f'{data[group_id]["num"] - len(data[group_id]["redbag"])}' \ + f'/{data[group_id]["num"]}个,' \ + f'共{data[group_id]["open_amount"]}/{data[group_id]["amount"]}金币' + logger.info(f"USER {user_id} GROUP {group_id} 抢到了 {data[group_id]['user_id']} 的红包,获取了{amount}金币") + b64 = await generate_open_redbag_pic(data[group_id]['user_id'], + data[group_id]['nickname'], amount, text) + if data[group_id]["open_amount"] == data[group_id]["amount"]: + data[group_id] = {} + if mode == 0: + redbag_data = data + else: + festive_redbag_data = data + return b64 + + +async def end_festive_redbag(bot: Bot, group_id: int): + global festive_redbag_data + message = f"真寻的节日红包过时了,一共开启了 " \ + f"{festive_redbag_data[group_id]['num'] - len(festive_redbag_data[group_id]['redbag'])}" \ + f" 个红包,共 {festive_redbag_data[group_id]['open_amount']} 金币" + await bot.send_group_msg(group_id=group_id, message=message) + festive_redbag_data[group_id] = {} + + diff --git a/plugins/shop/gold_redbag/data_source.py b/plugins/shop/gold_redbag/data_source.py new file mode 100644 index 00000000..6bb5105f --- /dev/null +++ b/plugins/shop/gold_redbag/data_source.py @@ -0,0 +1,96 @@ +from models.bag_user import BagUser +from util.utils import is_number, get_local_proxy +from util.img_utils import CreateImg +from util.user_agent import get_user_agent +from configs.path_config import IMAGE_PATH +from models.redbag_user import RedbagUser +import random +import os +import aiohttp +from io import BytesIO +import asyncio + + +# 检查金币数量合法性,并添加记录数据 +async def check_gold(user_id: int, group_id: int, amount: str): + if is_number(amount): + amount = int(amount) + user_gold = await BagUser.get_gold(user_id, group_id) + if amount < 1: + return False, '小气鬼,要别人倒贴金币给你嘛!' + if user_gold < amount: + return False, '没有金币的话请不要发红包...' + await BagUser.spend_gold(user_id, group_id, amount) + await RedbagUser.add_redbag_data(user_id, group_id, 'send', amount) + return True, amount + else: + return False, '给我好好的输入红包里金币的数量啊喂!' + + +# 金币退回 +async def return_gold(user_id: int, group_id: int, amount: int): + await BagUser.add_gold(user_id, group_id, amount) + + +# 开红包 +async def open_redbag(user_id: int, group_id: int, redbag_data: dict): + amount = random.choice(redbag_data[group_id]['redbag']) + redbag_data[group_id]['redbag'].remove(amount) + redbag_data[group_id]['open_user'].append(user_id) + redbag_data[group_id]['open_amount'] += amount + await RedbagUser.add_redbag_data(user_id, group_id, 'get', amount) + await BagUser.add_gold(user_id, group_id, amount) + return amount, redbag_data + + +# 随机红包图片 +async def generate_send_redbag_pic(user_id: int, msg: str = '恭喜发财 大吉大利'): + random_redbag = random.choice(os.listdir(f"{IMAGE_PATH}/prts/redbag_2")) + redbag = CreateImg(0, 0, font_size=38, background=f'{IMAGE_PATH}/prts/redbag_2/{random_redbag}') + ava = CreateImg(65, 65, background=BytesIO(await get_pic(user_id))) + await asyncio.get_event_loop().run_in_executor(None, ava.circle) + redbag.text((int((redbag.size[0] - redbag.getsize(msg)[0]) / 2), 210), msg, (240, 218, 164)) + redbag.paste(ava, (int((redbag.size[0] - ava.size[0])/2), 130), True) + return redbag.pic2bs4() + + +# 开红包图片 +async def generate_open_redbag_pic(user_id: int, send_user_nickname: str, amount: int, text: str): + return await asyncio.create_task(_generate_open_redbag_pic(user_id, send_user_nickname, amount, text)) + + +# 获取QQ头像 +async def get_pic(qq): + url = f'http://q1.qlogo.cn/g?b=qq&nk={qq}&s=160' + async with aiohttp.ClientSession(headers=get_user_agent()) as session: + async with session.get(url, proxy=get_local_proxy(), timeout=5) as response: + return await response.read() + + +# 开红包图片 +async def _generate_open_redbag_pic(user_id: int, send_user_nickname: str, amount: int, text: str): + send_user_nickname += '的红包' + amount = str(amount) + head = CreateImg(1000, 980, font_size=30, background=f'{IMAGE_PATH}/prts/redbag_12.png') + size = CreateImg(0, 0, font_size=50).getsize(send_user_nickname) + # QQ头像 + ava_bk = CreateImg(100 + size[0], 66, color='white', font_size=50) + ava = CreateImg(66, 66, background=BytesIO(await get_pic(user_id))) + ava_bk.paste(ava) + ava_bk.text((100, 7), send_user_nickname) + # ava_bk.show() + ava_bk_w, ava_bk_h = ava_bk.size + head.paste(ava_bk, (int((1000 - ava_bk_w) / 2), 300)) + # 金额 + size = CreateImg(0, 0, font_size=150).getsize(amount) + price = CreateImg(size[0], size[1], font_size=150) + price.text((0, 0), amount, fill=(209, 171, 108)) + # 金币中文 + head.paste(price, (int((1000 - size[0]) / 2) - 50, 460)) + head.text((int((1000 - size[0]) / 2 + size[0]) - 50, 500 + size[1] - 70), '金币', fill=(209, 171, 108)) + # 剩余数量和金额 + head.text((350, 900), text, (198, 198, 198)) + return head.pic2bs4() + + + diff --git a/plugins/shop/my_gold.py b/plugins/shop/my_gold.py deleted file mode 100644 index 5306d345..00000000 --- a/plugins/shop/my_gold.py +++ /dev/null @@ -1,26 +0,0 @@ -from nonebot import on_command -from nonebot.adapters.cqhttp import Bot, GroupMessageEvent -from nonebot.typing import T_State -from models.bag_user import UserBag -from nonebot.adapters.cqhttp.permission import GROUP - - -__plugin_name__ = '我的金币' - - -my_gold = on_command("我的金币", priority=5, block=True, permission=GROUP) - - -@my_gold.handle() -async def _(bot: Bot, event: GroupMessageEvent, state: T_State): - await my_gold.finish(await UserBag.get_my_total_gold(event.user_id, event.group_id)) - - - - - - - - - - diff --git a/plugins/shop/my_props.py b/plugins/shop/my_props.py index 959ac07c..c2020769 100644 --- a/plugins/shop/my_props.py +++ b/plugins/shop/my_props.py @@ -2,7 +2,7 @@ from nonebot import on_command from services.log import logger from nonebot.adapters.cqhttp import Bot, GroupMessageEvent from nonebot.typing import T_State -from models.bag_user import UserBag +from models.bag_user import BagUser from nonebot.adapters.cqhttp.permission import GROUP @@ -14,7 +14,7 @@ my_props = on_command("我的道具", priority=5, block=True, permission=GROUP) @my_props.handle() async def _(bot: Bot, event: GroupMessageEvent, state: T_State): - props = await UserBag.get_props(event.user_id, event.group_id) + props = await BagUser.get_props(event.user_id, event.group_id) if props: pname_list = [] pnum_list = [] diff --git a/plugins/shop/reset_today_gold.py b/plugins/shop/reset_today_gold.py index 7d76a2f6..487c4515 100644 --- a/plugins/shop/reset_today_gold.py +++ b/plugins/shop/reset_today_gold.py @@ -1,5 +1,5 @@ from util.utils import scheduler -from models.bag_user import UserBag +from models.bag_user import BagUser from services.log import logger @@ -20,13 +20,12 @@ from services.log import logger ) async def _(): try: - user_list = await UserBag.get_user_all() - if user_list: - for user in user_list: - await user.update( - get_today_gold=0, - spend_today_gold=0, - ).apply() + user_list = await BagUser.get_user_all() + for user in user_list: + await user.update( + get_today_gold=0, + spend_today_gold=0, + ).apply() except Exception as e: logger.error(f'重置每日金币错误 e:{e}') diff --git a/plugins/shop/shop_handle/__init__.py b/plugins/shop/shop_handle/__init__.py new file mode 100644 index 00000000..8412a0d2 --- /dev/null +++ b/plugins/shop/shop_handle/__init__.py @@ -0,0 +1,125 @@ +from nonebot import on_command +from nonebot.adapters.cqhttp import Bot, GroupMessageEvent, MessageEvent +from nonebot.typing import T_State +from configs.path_config import IMAGE_PATH +from util.init_result import image +from .data_source import create_shop_help, add_goods, del_goods, update_goods +from nonebot.permission import SUPERUSER +from util.utils import get_message_text, is_number +from services.log import logger +import os +import time + + +__plugin_name__ = '商店' + + +shop_help = on_command("商店", priority=5, block=True) + +shop_add_goods = on_command('添加商品', priority=5, permission=SUPERUSER, block=True) + +shop_del_goods = on_command('删除商品', priority=5, permission=SUPERUSER, block=True) + +shop_update_goods = on_command('修改商品', priority=5, permission=SUPERUSER, block=True) + + +@shop_help.handle() +async def _(bot: Bot, event: GroupMessageEvent, state: T_State): + if not os.path.exists(f'{IMAGE_PATH}/shop_help.png'): + await create_shop_help() + await shop_help.send(image('shop_help.png')) + + +@shop_add_goods.handle() +async def _(bot: Bot, event: MessageEvent, state: T_State): + msg = get_message_text(event.json()) + if msg: + msg = msg.split('-') + if len(msg) < 3: + await shop_add_goods.finish('商品参数不完全...', at_sender=True) + if not is_number(msg[1]): + await shop_add_goods.finish('商品的价格必须是合法数字!', at_sender=True) + msg[1] = int(msg[1]) + if len(msg) > 3: + if not is_number(msg[3]): + await shop_add_goods.finish('商品的折扣要小数啊!', at_sender=True) + msg[3] = float(msg[3]) + if len(msg) > 4: + if not is_number(msg[4]): + await shop_add_goods.finish('商品的限时时间是要写多少分钟噢!', at_sender=True) + msg[4] = time.time() + int(msg[4]) * 60 + if await add_goods(msg): + await shop_add_goods.send(f'添加商品 {msg[0]} 成功...', at_sender=True) + if os.path.exists(f'{IMAGE_PATH}/shop_help.png'): + os.remove(f'{IMAGE_PATH}/shop_help.png') + logger.info(f'USER {event.user_id} 上传商品 {msg} 成功') + else: + await shop_add_goods.send(f'添加商品 {msg[0]} 失败了...', at_sender=True) + logger.warning(f'USER {event.user_id} 上传商品 {msg} 失败') + + +@shop_del_goods.handle() +async def _(bot: Bot, event: MessageEvent, state: T_State): + msg = get_message_text(event.json()) + if msg: + name = '' + id_ = 0 + if is_number(msg): + id_ = int(msg) + else: + name = msg + rst, goods_name, code = await del_goods(name, id_) + await shop_del_goods.send(rst, at_sender=True) + if code == 200: + await shop_del_goods.send(f'删除商品 {goods_name} 成功了...', at_sender=True) + if os.path.exists(f'{IMAGE_PATH}/shop_help.png'): + os.remove(f'{IMAGE_PATH}/shop_help.png') + logger.info(f'USER {event.user_id} 删除商品 {goods_name} 成功') + else: + await shop_del_goods.send(f'删除商品 {goods_name} 失败了...', at_sender=True) + logger.info(f'USER {event.user_id} 删除商品 {goods_name} 失败') + + +@shop_update_goods.handle() +async def _(bot: Bot, event: MessageEvent, state: T_State): + msg = get_message_text(event.json()) + if msg: + tmp = {} + msg = msg.split('-') + for x in msg: + if x.find('name') != -1: + tmp['name'] = x.split(' ')[1].strip() + elif x.find('price') != -1: + tmp['price'] = x.split(' ')[1].strip() + if not is_number(tmp['price']): + await shop_update_goods.finish('价格必须是数字啊!', at_sender=True) + tmp['price'] = int(tmp['price']) + elif x.find('des') != -1: + tmp['des'] = x.split(' ')[1].strip() + elif x.find('discount') != -1: + tmp['discount'] = x.split(' ')[1].strip() + if not is_number(tmp['discount']): + await shop_update_goods.finish('折扣必须是数字啊!', at_sender=True) + tmp['discount'] = float(tmp['discount']) + elif x.find('time') != -1: + tmp['time'] = x.split(' ')[1].strip() + if not is_number(tmp['time']): + await shop_update_goods.finish('限时时间必须是数字啊!', at_sender=True) + tmp['time'] = time.time() + tmp['time'] * 60 + if not tmp.get('name'): + await shop_update_goods.finish('未指定商品名称(序号也可)!', at_sender=True) + if is_number(tmp['name']): + tmp['name'] = int(tmp['name']) + flag, name, text = await update_goods(tmp) + if flag: + await shop_update_goods.send(f'修改商品 {name} 成功了...\n{text}', at_sender=True) + if os.path.exists(f'{IMAGE_PATH}/shop_help.png'): + os.remove(f'{IMAGE_PATH}/shop_help.png') + logger.info(f'USER {event.user_id} 修改商品 {name} 数据 {tmp} 成功') + else: + await shop_update_goods.send(f'修改商品 {name} 失败了...', at_sender=True) + logger.info(f'USER {event.user_id} 修改商品 {name} 数据 {tmp} 失败') + + + + diff --git a/plugins/shop/shop_handle/data_source.py b/plugins/shop/shop_handle/data_source.py new file mode 100644 index 00000000..203ed4c3 --- /dev/null +++ b/plugins/shop/shop_handle/data_source.py @@ -0,0 +1,99 @@ +from models.goods_info import GoodsInfo +from util.img_utils import CreateImg +from util.utils import is_number +from configs.path_config import IMAGE_PATH +import time + + +async def create_shop_help(): + goods_lst = await GoodsInfo.get_all_goods() + tmp = '' + idx = 1 + for goods in goods_lst: + tmp += f'{idx}.{goods.goods_name}\t\t售价:{goods.goods_price}金币\n' \ + f'\t\t{goods.goods_description}\n' + idx += 1 + w = 1000 + h = 400 + len(goods_lst) * 40 + h = 1000 if h < 1000 else h + shop_logo = CreateImg(100, 100, background=f'{IMAGE_PATH}/other/shop_text.png') + shop = CreateImg(w, h, font_size=20) + zhenxun_img = CreateImg(525, 581, background=f'{IMAGE_PATH}/zhenxun/toukan_2.png') + shop.paste(zhenxun_img, (780, 100)) + shop.paste(shop_logo, (450, 30), True) + shop.text((int((1000 - shop.getsize('注【通过 序号 或者 商品名称 购买】')[0]) / 2), 170), '注【通过 序号 或者 商品名称 购买】') + shop.text((20, 230), tmp[:-1]) + shop.text((20, h - 100), '神秘药水\t\t售价:9999999金币\n\t\t鬼知道会有什么效果~') + shop.save(f'{IMAGE_PATH}/shop_help.png') + + +async def add_goods(msg: list): + data = { + '名称': None, + '价格': None, + '描述': None, + '折扣': 1, + '限时': 0, + } + keys = list(data.keys()) + idx = 0 + for x in msg: + data[keys[idx]] = x + idx += 1 + return await GoodsInfo.add_goods(data['名称'], data['价格'], data['描述'], data['折扣'], data['限时']) + + +async def del_goods(name: str, id_: int): + goods_lst = await GoodsInfo.get_all_goods() + if id_: + if id_ < 1 or id_ > len(goods_lst): + return '序号错误,没有该序号商品...', '', 999 + goods_name = goods_lst[id_ - 1].goods_name + if await GoodsInfo.del_goods(goods_name): + return f'删除商品 {goods_name} 成功!', goods_name, 200 + else: + return f'删除商品 {goods_name} 失败!', goods_name, 999 + if name: + if await GoodsInfo.del_goods(name): + return f'删除商品 {name} 成功!', name, 200 + else: + return f'删除商品 {name} 失败!', name, 999 + + +async def update_goods(data: dict): + goods_lst = await GoodsInfo.get_all_goods() + if is_number(data['name']): + if data['name'] < 1 or data['name'] > len(goods_lst): + return '序号错误,没有该序号的商品...', '', 999 + goods = goods_lst[data['name'] - 1] + else: + goods = await GoodsInfo.get_goods_info(data['name']) + if not goods: + return '名称错误,没有该名称的商品...', '', 999 + name = goods.goods_name + price = goods.goods_price + des = goods.goods_description + discount = goods.goods_discount + limit_time = goods.goods_limit_time + tmp = '' + if data.get('price'): + tmp += f'价格:{price} --> {data["price"]}\n' + price = data['price'] + if data.get('des'): + tmp += f'描述:{des} --> {data["des"]}\n' + des = data['des'] + if data.get('discount'): + tmp += f'折扣:{discount} --> {data["discount"]}\n' + discount = data['discount'] + if data.get('time'): + old_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(limit_time)) + new_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(data['time'])) + tmp += f'折扣:{old_time} --> {new_time}\n' + limit_time = data['time'] + return await GoodsInfo.update_goods(name, price, des, discount, limit_time), name, tmp[:-1] + + + + + + diff --git a/plugins/shop/shop_help.py b/plugins/shop/shop_help.py deleted file mode 100644 index bb402085..00000000 --- a/plugins/shop/shop_help.py +++ /dev/null @@ -1,41 +0,0 @@ -from nonebot import on_command -from nonebot.adapters.cqhttp import Bot, GroupMessageEvent -from nonebot.typing import T_State -from util.img_utils import CreateImg -from configs.path_config import IMAGE_PATH -from util.init_result import image - - -__plugin_name__ = '商店' - - -shop_help = on_command("商店", priority=5, block=True) - -goods = [ - '好感双倍加持卡Ⅰ\t\t售价:30金币\n\t\t下次签到双倍好感度的概率 + 10%(谁才是真命天子?)(同类商品将覆盖)', - '好感双倍加持卡Ⅱ\t\t售价:150金币\n\t\t下次签到双倍好感度的概率 + 20%(平平庸庸~)(同类商品将覆盖)', - '好感双倍加持卡Ⅲ\t\t售价:250金币\n\t\t下次签到双倍好感度的概率 + 30%(金币才是真命天子!)(同类商品将覆盖)' -] - -result = '' -for i in range(len(goods)): - result += f'{i + 1}.{goods[i]}\n' -shop = CreateImg(1000, 1000, background=IMAGE_PATH + 'other/shop.png', font_size=20) -shop.text((100, 170), '注【通过 数字 或者 商品名称 购买】') -shop.text((20, 230), result) -shop.text((20, 900), '神秘药水\t\t售价:9999999金币\n\t\t鬼知道会有什么效果~') -shop.save(IMAGE_PATH + 'shop.png') - - -@shop_help.handle() -async def _(bot: Bot, event: GroupMessageEvent, state: T_State): - await shop_help.send(image('shop.png')) - - - - - - - - - diff --git a/plugins/shop/use/__init__.py b/plugins/shop/use/__init__.py index 2bb30df2..76b683db 100644 --- a/plugins/shop/use/__init__.py +++ b/plugins/shop/use/__init__.py @@ -3,7 +3,7 @@ from services.log import logger from nonebot.adapters.cqhttp import Bot, GroupMessageEvent from nonebot.typing import T_State from util.utils import is_number, get_message_text -from models.bag_user import UserBag +from models.bag_user import BagUser from nonebot.adapters.cqhttp.permission import GROUP from services.db_context import db from .data_source import effect @@ -21,7 +21,7 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State): msg = get_message_text(event.json()) if msg in ['', '帮助']: await use_props.finish(__plugin_usage__) - props = await UserBag.get_props(event.user_id, event.group_id) + props = await BagUser.get_props(event.user_id, event.group_id) if props: async with db.transaction(): pname_list = [] @@ -39,7 +39,7 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State): if msg not in pname_list: await use_props.finish('道具名称错误!', at_sender=True) name = msg - if await UserBag.del_props(event.user_id, event.group_id, name) and\ + if await BagUser.del_props(event.user_id, event.group_id, name) and\ await effect(event.user_id, event.group_id, name): await use_props.send(f'使用道具 {name} 成功!', at_sender=True) logger.info(f'USER {event.user_id} GROUP {event.group_id} 使用道具 {name} 成功') diff --git a/plugins/sign_in/__init__.py b/plugins/sign_in/__init__.py index f771f839..70dcb346 100644 --- a/plugins/sign_in/__init__.py +++ b/plugins/sign_in/__init__.py @@ -1,6 +1,6 @@ from .group_user_checkin import group_user_check_in, group_user_check, group_impression_rank from nonebot.typing import T_State -from nonebot.adapters.cqhttp import Bot, Event, GroupMessageEvent +from nonebot.adapters.cqhttp import Bot, GroupMessageEvent from nonebot.adapters.cqhttp.permission import GROUP from util.utils import get_message_text from nonebot.plugin import MatcherGroup @@ -24,8 +24,6 @@ sign = sign_match_group.on_command("签到") @sign.handle() async def _(bot: Bot, event: GroupMessageEvent, state: T_State): - if get_message_text(event.json()) in ['帮助']: - await sign.finish(__plugin_usage__) await sign.send( await group_user_check_in(event.user_id, event.group_id), at_sender=True, diff --git a/plugins/sign_in/group_user_checkin.py b/plugins/sign_in/group_user_checkin.py index 4bb50531..4d6290f6 100644 --- a/plugins/sign_in/group_user_checkin.py +++ b/plugins/sign_in/group_user_checkin.py @@ -5,7 +5,7 @@ from services.log import logger from services.db_context import db from models.sigin_group_user import SignGroupUser from models.group_member_info import GroupInfoUser -from models.bag_user import UserBag +from models.bag_user import BagUser from configs.config import MAX_SIGN_GOLD @@ -57,7 +57,7 @@ async def _handle_check_in(user_qq: int, group: int, present: datetime) -> str: imgold = random.randint(1, int(impression)) if imgold > MAX_SIGN_GOLD: imgold = MAX_SIGN_GOLD - await UserBag.add_glod(user_qq, group, gold + imgold) + await BagUser.add_gold(user_qq, group, gold + imgold) if critx2 + add_probability > 0.97 or critx2 < specify_probability: logger.info(f'(USER {user.user_qq}, GROUP {user.belonging_group})' f' CHECKED IN successfully. score: {new_impression:.2f} (+{impression_added * 2:.2f}).获取金币:{gold+imgold}') @@ -71,10 +71,10 @@ async def _handle_check_in(user_qq: int, group: int, present: datetime) -> str: async def group_user_check(user_qq: int, group: int) -> str: # heuristic: if users find they have never checked in they are probable to check in user = await SignGroupUser.ensure(user_qq, group) - glod = await UserBag.get_gold(user_qq, group) + gold = await BagUser.get_gold(user_qq, group) return '好感度:{:.2f}\n金币:{}\n历史签到数:{}\n上次签到日期:{}'.format( user.impression, - glod, + gold, user.checkin_count, user.checkin_time_last.date() if user.checkin_time_last != datetime.min else '从未', ) @@ -85,13 +85,12 @@ async def group_impression_rank(group: int) -> str: user_qq_list, impression_list = await SignGroupUser.query_impression_all(group) _count = 11 if user_qq_list and impression_list: - for i in range(1, 100): + for i in range(1, len(user_qq_list)): if len(user_qq_list) == 0 or len(impression_list) == 0 or i == _count: break impression = max(impression_list) index = impression_list.index(impression) user_qq = user_qq_list[index] - print(user_qq, group) try: user_name = (await GroupInfoUser.select_member_info(user_qq, group)).user_name except Exception as e: @@ -106,12 +105,12 @@ async def group_impression_rank(group: int) -> str: return result[:-1] -async def random_glod(user_id, group_id, impression): +async def random_gold(user_id, group_id, impression): if impression < 1: impression = 1 - glod = random.randint(1, 100) + random.randint(1, int(impression)) - if await UserBag.add_glod(user_id, group_id, glod): - return glod + gold = random.randint(1, 100) + random.randint(1, int(impression)) + if await BagUser.add_gold(user_id, group_id, gold): + return gold else: return 0 diff --git a/plugins/songpicker2/__init__.py b/plugins/songpicker2/__init__.py index bd001da0..8f19cc4d 100644 --- a/plugins/songpicker2/__init__.py +++ b/plugins/songpicker2/__init__.py @@ -3,6 +3,9 @@ from nonebot.adapters import Bot, Event from nonebot.typing import T_State from nonebot import on_command +__plugin_name__ = '点歌' + +__plugin_usage__ = '用法:点歌 [歌名]' dataget = dataGet() diff --git a/plugins/songpicker2/data_source.py b/plugins/songpicker2/data_source.py index fe60031e..33515a70 100644 --- a/plugins/songpicker2/data_source.py +++ b/plugins/songpicker2/data_source.py @@ -98,8 +98,7 @@ class dataGet(dataApi): r = await self.api.getSongInfo(songId) if r is None: raise WrongDataError - print(r) - if r['code'] == '-460': + if r['code'] == -460: return '网易云网络繁忙!' songInfo["songName"] = r["songs"][0]["name"] diff --git a/plugins/super_cmd/__init__.py b/plugins/super_cmd/__init__.py index 18c4e547..b057aaaf 100644 --- a/plugins/super_cmd/__init__.py +++ b/plugins/super_cmd/__init__.py @@ -37,7 +37,7 @@ async def _(bot: Bot, event: Event, state: T_State): else: result = "管理已存在, 更新权限: " + str(level) else: - if await LevelUser.delete_level(qq, event.group_id, True): + if await LevelUser.delete_level(qq, event.group_id): result = "删除管理成功!" else: result = "该账号无管理权限!" diff --git a/plugins/super_help/__init__.py b/plugins/super_help/__init__.py index 057234f8..bfcd5318 100644 --- a/plugins/super_help/__init__.py +++ b/plugins/super_help/__init__.py @@ -16,10 +16,18 @@ async def _(bot: Bot, event: Event, state: T_State): 3.广播 --> 指令:广播- 4.更新色图 5.回复 --> 指令:/t 用户 群号 - 6.更新cookie --> 指令:更新cookie text - 7.开启广播通知 --> 指令:开启广播通知 群号 + 6.更新cookie --> 指令:更新cookie [cookie] + 7.开启广播通知 --> 指令:开启广播通知 [群号] 8.退群 --> 指令:退群 群号 9.自检 10.更新好友信息 - 11.更新群群信息''' - await super_help.finish(result, at_sender=True) \ No newline at end of file + 11.更新群群信息 + 12.重载原神/方舟卡池 + 13.添加商品 [名称] [价格] [描述] [折扣] [限时时间] + 14.删除商品 [名称(序号)] + 15.修改商品 -name [名称(序号)] -price [价格] -des [描述] -discount [折扣] -time [限时] + 16.节日红包 [金额] [数量] [祝福语](可省) [指定群](可省) [指定群]...''' + await super_help.finish(result, at_sender=True) + + + diff --git a/plugins/test.py b/plugins/test.py index 4fa87c0c..ded064a0 100644 --- a/plugins/test.py +++ b/plugins/test.py @@ -13,21 +13,28 @@ from util.init_result import * from nonebot.adapters.cqhttp.message import MessageSegment import requests import aiohttp -from models.bag_user import UserBag +from models.bag_user import BagUser from nonebot.adapters.cqhttp.message import Message import asyncio from models.group_member_info import GroupInfoUser # erm = on_command('异世相遇,尽享美味', aliases={'异世相遇 尽享美味', '异世相遇,尽享美味'}, priority=5, block=True) -matcher = on_keyword({"test"}) - - -@matcher.handle() -async def _(bot: Bot, event: MessageEvent, state: T_State): - for i in range(1001, len(os.listdir(IMAGE_PATH + 'setu/'))): - await matcher.send(f"id:{i}" + image(f'{i}.jpg', 'setu')) - await asyncio.sleep(0.5) +# matcher = on_keyword({"test"}) +# +# +# @matcher.handle() +# async def _(bot: Bot, event: MessageEvent, state: T_State): +# await matcher.send(json( +# {"app": "com.tencent.gxhServiceIntelligentTip", "desc": "", "view": "gxhServiceIntelligentTip", +# "ver": "", "prompt": "[QQ红包]", "appID": "", "sourceName": "", "actionData": "", "actionData_A": "", +# "sourceUrl": "", "meta": {"gxhServiceIntelligentTip": { +# "bgImg": "http:\/\/ptlogin2.qq.com\/ho_cross_domain?tourl=https:\/\/gxh.vip.qq.com\/\/qqshow" +# "\/admindata\/comdata\/vipActTpl_mobile_zbltyxn\/dddb247a4a9c6d34757c160f9e0b6669.gif", +# "appid": "gxhServiceIntelligentTip", "reportParams": 'null', "action": ""}}, +# "config": {"forward": 1, "height": 240, "type": "normal", "autoSize": 0, "width": 180}, "text": "", +# "sourceAd": ""} +# )) # @erm.handle() diff --git a/plugins/translate/__init__.py b/plugins/translate/__init__.py index 95d27ff0..b51748b8 100644 --- a/plugins/translate/__init__.py +++ b/plugins/translate/__init__.py @@ -8,6 +8,11 @@ from .data_source import translate_msg __plugin_name__ = '翻译' +__plugin_usage__ = '用法:\n' \ + '英翻 [英文] 翻英 [中文]\n' \ + '日翻 [日文] 翻日 [中文]\n' \ + '韩翻 [韩文] 翻韩 [中文]' + translate = on_command("translate", aliases={'英翻', '翻英', '日翻', '翻日', diff --git a/plugins/update_gocqhttp/__init__.py b/plugins/update_gocqhttp/__init__.py index 79b2596f..bfc6826b 100644 --- a/plugins/update_gocqhttp/__init__.py +++ b/plugins/update_gocqhttp/__init__.py @@ -9,6 +9,10 @@ from util.utils import scheduler, get_bot, UserExistLimiter from configs.config import UPDATE_GOCQ_GROUP from pathlib import Path +__plugin_name__ = '更新gocq' + +__plugin_usage__ = '用法:发送’更新gocq‘,指定群 自动检测最新版gocq下载并上传' + path = str((Path() / "resources" / "gocqhttp_file").absolute()) + '/' lasted_gocqhttp = on_command("更新gocq", permission=GROUP, priority=5, block=True) diff --git a/plugins/update_info.py b/plugins/update_info.py index 5d75ebab..13f2f006 100644 --- a/plugins/update_info.py +++ b/plugins/update_info.py @@ -5,6 +5,8 @@ from util.init_result import image __plugin_name__ = '更新信息' +__plugin_usage__ = '无' + update_info = on_command("更新信息", priority=5, block=True) diff --git a/plugins/update_setu/__init__.py b/plugins/update_setu/__init__.py index c101bc2e..662085dc 100644 --- a/plugins/update_setu/__init__.py +++ b/plugins/update_setu/__init__.py @@ -8,7 +8,9 @@ from .data_source import update_setu_img from configs.config import DOWNLOAD_SETU -__name__ = "更新色图 [Hidden]" +__plugin_name__ = "更新色图 [Hidden]" + +__plugin_usage__ = '无' update_setu = on_command("更新色图", rule=to_me(), permission=SUPERUSER, priority=1, block=True) diff --git a/plugins/update_setu/data_source.py b/plugins/update_setu/data_source.py index 761e1427..bd7a5f35 100644 --- a/plugins/update_setu/data_source.py +++ b/plugins/update_setu/data_source.py @@ -8,6 +8,8 @@ from util.utils import get_bot, get_local_proxy from asyncio.exceptions import TimeoutError import aiofiles import aiohttp +from aiohttp.client_exceptions import ClientConnectorError + try: import ujson as json except ModuleNotFoundError: @@ -16,71 +18,97 @@ except ModuleNotFoundError: async def update_setu_img(): async with aiohttp.ClientSession(headers=get_user_agent()) as session: - for file_name in ['setu_url.txt', 'setu_r18_url.txt']: - if file_name == 'setu_url.txt': - json_name = 'setu_img_hash.json' - path = 'setu/' + for file_name in ['setu_url.json', 'setu_r18_url.json']: + if file_name == 'setu_url.json': + json_name = 'setu_data.json' + path = '_setu/' + rar_path = 'setu_rar/' else: - json_name = 'r18_setu_img_hash.json' - path = 'r18/' + json_name = 'r18_setu_data.json' + path = '_r18/' + rar_path = 'r18_rar/' + if not os.path.exists(IMAGE_PATH + path): + os.mkdir(IMAGE_PATH + path) + if not os.path.exists(IMAGE_PATH + rar_path): + os.mkdir(IMAGE_PATH + rar_path) try: - data = json.load(open(TXT_PATH + json_name)) + data = json.load(open(TXT_PATH + json_name, encoding='utf8')) if not data: - continue + data = {} except (FileNotFoundError, TypeError): - continue + data = {} _success = 0 _similar = 0 try: - with open(TXT_PATH + file_name, 'r') as f: - txt_data = f.read() + with open(TXT_PATH + file_name, 'r', encoding='utf8') as f: + txt_data = json.load(f) if not txt_data: continue - except FileNotFoundError: + except (FileNotFoundError, ValueError): continue - urls = list(set(txt_data[:-1].split(','))) - total = len(urls) - for url in urls: + total = len(txt_data) + urls = [data[x]['img_url'] for x in data.keys()] + for pid in txt_data.keys(): index = str(len(os.listdir(IMAGE_PATH + path))) + url = txt_data[pid]["img_url"].replace('img-master', 'img-original').replace('_master1200', '') + if url in urls or txt_data[pid]["img_url"] in urls: + continue logger.info(f'开始更新 index:{index} --> {url}') for _ in range(3): try: async with session.get(url, proxy=get_local_proxy(), timeout=15) as response: if response.status == 200: - async with aiofiles.open(IMAGE_PATH + 'rar/' + index + ".jpg", 'wb') as f: + async with aiofiles.open(IMAGE_PATH + rar_path + index + ".jpg", 'wb') as f: await f.write(await response.read()) _success += 1 else: - logger.info(f'{url} 不存在,跳过更新') - break - if os.path.getsize(IMAGE_PATH + 'rar/' + str(index) + ".jpg") > 1024 * 1024 * 1.5: + logger.info(f'{url} 不存在,使用更新原url') + url = txt_data[pid]["img_url"] + async with session.get(txt_data[pid]["img_url"], proxy=get_local_proxy(), + timeout=15) as response: + if response.status == 200: + async with aiofiles.open(IMAGE_PATH + rar_path + index + ".jpg", 'wb') as f: + await f.write(await response.read()) + _success += 1 + if os.path.getsize(IMAGE_PATH + rar_path + str(index) + ".jpg") > 1024 * 1024 * 1.5: rar_imgs( - 'rar/', + rar_path, path, in_file_name=index, out_file_name=index ) else: - logger.info('不需要压缩,移动图片 ' + IMAGE_PATH + 'rar/' + index + ".jpg --> " + logger.info('不需要压缩,移动图片 ' + IMAGE_PATH + rar_path + index + ".jpg --> " + IMAGE_PATH + path + index + ".jpg") - os.rename(IMAGE_PATH + 'rar/' + index + ".jpg", + os.rename(IMAGE_PATH + rar_path + index + ".jpg", IMAGE_PATH + path + index + ".jpg") img_hash = str(get_img_hash(f'{IMAGE_PATH}{path}{index}.jpg')) - if img_hash in data.values(): + if img_hash in [data[x]['img_hash'] for x in data.keys()]: logger.info(f'index:{index} 与 ' - f'{list(data.keys())[list(data.values()).index(img_hash)]} 存在重复,删除') + f'{[data[x]["img_hash"] for x in data.keys()].index(img_hash)} 存在重复,删除') os.remove(IMAGE_PATH + path + index + ".jpg") _similar += 1 - data[index] = img_hash + else: + data[index] = { + 'title': txt_data[pid]['title'], + 'author': txt_data[pid]['author'], + 'pid': txt_data[pid]['pid'], + 'img_hash': img_hash, + 'img_url': url, + 'tags': txt_data[pid]['tags'], + } break - except TimeoutError: + except (TimeoutError, ClientConnectorError) as e: + logger.warning(f'{url} 更新失败 ..{type(e)}:{e}') continue with open(TXT_PATH + json_name, 'w', encoding='utf-8') as f: - json.dump(data, f, indent=4) + json.dump(data, f, indent=4, ensure_ascii=False) open(TXT_PATH + file_name, 'w') logger.info( - f'{str(datetime.now()).split(".")[0]} 更新 {file_name.split(".")[0]}完成,预计更新 {total} 张,实际更新 {_success} 张,相似 {_similar} 张,实际存入 {_success - _similar} 张') + f'{str(datetime.now()).split(".")[0]} 更新 {file_name.split(".")[0]}完成,预计更新 {total} 张,' + f'实际更新 {_success} 张,相似 {_similar} 张,实际存入 {_success - _similar} 张') await get_bot().send_private_msg( - user_id=775757368, - message=f'{str(datetime.now()).split(".")[0]} 更新{file_name.split(".")[0]}完成,预计更新 {total} 张,实际更新 {_success} 张,相似 {_similar} 张,实际存入 {_success - _similar} 张' + user_id=list(get_bot().config.superusers)[0], + message=f'{str(datetime.now()).split(".")[0]} 更新{file_name.split(".")[0]}完成,预计更新 {total} 张,' + f'实际更新 {_success} 张,相似 {_similar} 张,实际存入 {_success - _similar} 张' ) diff --git a/plugins/upload_img/__init__.py b/plugins/upload_img/__init__.py index 1d473109..e9ae2169 100644 --- a/plugins/upload_img/__init__.py +++ b/plugins/upload_img/__init__.py @@ -13,8 +13,8 @@ from configs.config import IMAGE_DIR_LIST __plugin_name__ = '上传图片' __plugin_usage__ = '上传图片帮助:\n\t' \ - '1.查看列表 --> 指令: 上传图片 列表/目录\n\t' \ - '2.上传图片 序号 图片(在文字后跟图片即可), 即在相应目录下添加图片\n\t\t示例: 上传图片 1 图片(在文字后跟图片即可)' + '1.查看列表 --> 指令: 上传图片 列表/目录\n\t' \ + '2.上传图片 序号 图片(在文字后跟图片即可), 即在相应目录下添加图片\n\t\t示例: 上传图片 1 图片(在文字后跟图片即可)' upload_img = on_command("上传图片", rule=to_me(), priority=5, block=True) diff --git a/plugins/weather/__init__.py b/plugins/weather/__init__.py index edd85186..ee3f22ae 100644 --- a/plugins/weather/__init__.py +++ b/plugins/weather/__init__.py @@ -1,4 +1,4 @@ -from nonebot import on_keyword, on_regex +from nonebot import on_regex from .data_source import get_weather_of_city from nonebot.adapters.cqhttp import Bot, Event from jieba import posseg @@ -17,8 +17,6 @@ weather = on_regex(r".*?(.*)市?的?天气.*?", priority=5, block=True) @weather.handle() async def _(bot: Bot, event: Event, state: T_State): - if str(event.get_message()) in ['帮助']: - await weather.finish(__plugin_usage__) msg = get_message_text(event.json()) msg = re.search(r'.*?(.*)市?的?天气.*?', msg) msg = msg.group(1) @@ -28,10 +26,14 @@ async def _(bot: Bot, event: Event, state: T_State): msg += '市' city = '' if msg: + citys = [] + for x in city_list.keys(): + for city in city_list[x]: + citys.append(city) for word in posseg.lcut(msg): if word.word in city_list.keys(): await weather.finish("不要查一个省的天气啊,这么大查起来很累人的..", at_sender=True) - if word.flag == 'ns': + if word.flag == 'ns' or word.word[:-1] in citys: city = str(word.word).strip() break if word.word == '火星': diff --git a/plugins/white2black_img.py b/plugins/white2black_img.py index ef5cea6a..9e51ecf0 100644 --- a/plugins/white2black_img.py +++ b/plugins/white2black_img.py @@ -23,16 +23,15 @@ from services.log import logger # RU2ZH_CN 俄语 » 中文 # SP2ZH_CN 西语 » 中文 +__plugin_name__ = '黑白草图' -__plugin_usage__ = '用法: \n\t黑白图 文字 图片\n示例:黑白草图 没有人不喜欢萝莉 (图片)' +__plugin_usage__ = '用法: \n\t黑白图 [文字] [图片]\n示例:黑白草图 没有人不喜欢萝莉 [图片]' w2b_img = on_command('黑白草图', aliases={'黑白图'}, priority=5, block=True) @w2b_img.handle() async def _(bot: Bot, event: MessageEvent, state: T_State): - if not get_message_text(event.json()) or get_message_text(event.json()) in ['帮助']: - await w2b_img.finish(__plugin_usage__) # try: img = get_message_imgs(event.json()) msg = get_message_text(event.json()) diff --git a/requirements.txt b/requirements.txt index 0de28733..3c0d9469 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,7 +5,7 @@ async-timeout==3.0.1 asyncpg==0.22.0 attrs==20.3.0 beautifulsoup4==4.9.3 -bilibili-api==4.0.4 +bilibili-api==5.1.1 bleach==3.3.0 certifi==2020.12.5 chardet==4.0.0 @@ -31,8 +31,10 @@ loguru==0.5.3 lxml==4.6.3 matplotlib==3.4.1 multidict==5.1.0 +nest-asyncio==1.5.1 nonebot-adapter-cqhttp==2.0.0a12 nonebot-plugin-apscheduler==0.1.2 +nonebot-plugin-gamedraw==0.1.6.6.6 nonebot-plugin-picsearcher==0.1.4 nonebot-plugin-wordbank==1.0.1 nonebot2==2.0.0a13.post1 diff --git a/resources/img/other/shop_text.png b/resources/img/other/shop_text.png new file mode 100644 index 00000000..af5a2413 Binary files /dev/null and b/resources/img/other/shop_text.png differ diff --git a/resources/img/prts/redbag_12.png b/resources/img/prts/redbag_12.png new file mode 100644 index 00000000..05325c48 Binary files /dev/null and b/resources/img/prts/redbag_12.png differ diff --git a/resources/img/prts/redbag_2/chen_00.png b/resources/img/prts/redbag_2/chen_00.png new file mode 100644 index 00000000..9c6ded6e Binary files /dev/null and b/resources/img/prts/redbag_2/chen_00.png differ diff --git a/resources/img/prts/redbag_2/dusk_00.png b/resources/img/prts/redbag_2/dusk_00.png new file mode 100644 index 00000000..ce1c2551 Binary files /dev/null and b/resources/img/prts/redbag_2/dusk_00.png differ diff --git a/resources/img/prts/redbag_2/jessica_00.png b/resources/img/prts/redbag_2/jessica_00.png new file mode 100644 index 00000000..21413f70 Binary files /dev/null and b/resources/img/prts/redbag_2/jessica_00.png differ diff --git a/resources/img/prts/redbag_2/nian_00.png b/resources/img/prts/redbag_2/nian_00.png new file mode 100644 index 00000000..fe2c8f83 Binary files /dev/null and b/resources/img/prts/redbag_2/nian_00.png differ diff --git a/resources/img/prts/redbag_2/sikadi_00.png b/resources/img/prts/redbag_2/sikadi_00.png new file mode 100644 index 00000000..151e6724 Binary files /dev/null and b/resources/img/prts/redbag_2/sikadi_00.png differ diff --git a/resources/img/prts/redbag_2/tknogi_00.png b/resources/img/prts/redbag_2/tknogi_00.png new file mode 100644 index 00000000..ad4b87b2 Binary files /dev/null and b/resources/img/prts/redbag_2/tknogi_00.png differ diff --git a/resources/img/zhenxun/toukan.png b/resources/img/zhenxun/toukan.png new file mode 100644 index 00000000..1ad98ca1 Binary files /dev/null and b/resources/img/zhenxun/toukan.png differ diff --git a/resources/img/zhenxun/toukan_2.png b/resources/img/zhenxun/toukan_2.png new file mode 100644 index 00000000..088907a9 Binary files /dev/null and b/resources/img/zhenxun/toukan_2.png differ diff --git a/util/data_utils.py b/util/data_utils.py new file mode 100644 index 00000000..fe9987b8 --- /dev/null +++ b/util/data_utils.py @@ -0,0 +1,24 @@ +from models.group_member_info import GroupInfoUser + + +# 生成通用排行榜 +async def init_rank(users: list, all_user_data: list, group_id: int): + all_user_id = [user.user_qq for user in users] + rst = '' + for i in range(len(all_user_id) if len(all_user_id) < 10 else 10): + max_gold = max(all_user_data) + max_user_id = all_user_id[all_user_data.index(max_gold)] + all_user_id.remove(max_user_id) + all_user_data.remove(max_gold) + try: + user_name = (await GroupInfoUser.select_member_info(max_user_id, group_id)).user_name + except AttributeError: + user_name = f'{max_user_id}' + rst += f'{user_name}: {max_gold}\n' + return rst[:-1] + + + + + + diff --git a/util/get_bilibili_img.py b/util/get_bilibili_img.py new file mode 100644 index 00000000..19348e0b --- /dev/null +++ b/util/get_bilibili_img.py @@ -0,0 +1,140 @@ +import requests +from util.user_agent import get_user_agent +from bs4 import BeautifulSoup +from time import sleep +import threading +import os +from configs.path_config import IMAGE_PATH + +lock = threading.Lock() + +url = "https://search.bilibili.com/article" +# path = IMAGE_PATH + "setu/" + +index = 1 +THREAD_SUM_REMAINDER = 2 # 越小线程越多 + + +class bilibiliThread (threading.Thread): + def __init__(self, threadId, url_list, path, nolist): + threading.Thread.__init__(self) + self.threadId = threadId + self.url_list = url_list + self.path = path + self.nolist = nolist + def run(self): + print("开始线程<><><><><><><><><> " + self.threadId) + thread_get_url(self.threadId, self.url_list, self.path, self.nolist) + + +def get_bilibili_img(name, path, nolist=None): + global index + index = get_dirfile_len(path) + print("index===", index) + threadId = 1 + params = { + 'keyword': name, + 'page': '1' + } + res = requests.get(url, headers=get_user_agent(), params=params) + sleep(8) + soup = BeautifulSoup(res.text, 'html.parser') + # print(soup.text) + try: + total_page = soup.find_all('button', {'class': 'pagination-btn'})[-1].text.strip() + print("1 try") + except: + try: + total_page = soup.find_all('button', {'class': 'pagination-btn num-btn'})[-1].text.strip() + print("2 try") + except: + total_page = 1 + print("3 except") + print(total_page) + url_list = [] + for page in range(1, int(total_page)+1): + url_r = "https://search.bilibili.com/article?keyword=" + name + "&page=" + str(page) + url_list.append(url_r) + if page % THREAD_SUM_REMAINDER == 0: + print('-----> ' + str(page) + " =======>", url_list) + # _thread.start_new_thread(thread_get_url, (url_list, path,)) + bilibiliThread(str(threadId), url_list, path, nolist).start() + threadId += 1 + sleep(0.5) + url_list = [] + if url_list: + print("=========================最后一个线程启动========================= url数量: ", len(url_list)) + bilibiliThread(str(threadId), url_list, path, nolist).start() + + +def thread_get_url(threadId, url_list, path, nolist): + for url in url_list: + res = requests.get(url, headers=get_user_agent()) + sleep(2) + soup = BeautifulSoup(res.text, 'lxml') + alist = soup.find_all('a', {'class': 'poster'}) + img_content_page = [] + # print(alist) + for a in alist: + if nolist != None: + if a.get('href') not in nolist: + img_content_page.append("https://" + a.get('href')[2:]) + else: + img_content_page.append("https://" + a.get('href')[2:]) + pic_url = [] + for img_content in img_content_page: + print("开始获取---------->", img_content) + res = requests.get(img_content, headers=get_user_agent()) + sleep(2) + soup = BeautifulSoup(res.text, 'lxml') + figure_ls = soup.body.find_all('figure') + # print(figure_ls) + for figure in figure_ls: + try: + _ = figure.img.attrs['class'] + except: + data_src = figure.img.attrs['data-src'] + pic_url.append('https:' + data_src) + print("线程 " + threadId + " 获取完毕------> 开始存储") + for url in pic_url: + print("线程 " + threadId + "正在存储---------------->", url) + res = requests.get(url, headers=get_user_agent()) + save_img(res.content, path, threadId) + pic_url = [] + print("线程 " + threadId + " ---------------->执行完毕") + + +def save_img(img, path, threadId): + global index + try: + lock.acquire() + img_index = index + finally: + lock.release() + try: + with open(path + str(img_index) + ".jpg", 'wb') as f: + f.write(img) + lock.acquire() + index += 1 + except: + print("线程 " + threadId + "存储失败-------->" + str(img_index) + ".jpg") + finally: + lock.release() + + +def get_dirfile_len(path): + return len(os.listdir(path)) + + +if __name__ == '__main__': + # url = "https://search.bilibili.com" \ + # "/article?keyword=%23%E4%BB%8A%E6%97%A5%E4%BB%BD%E7%9A%84%E5%8F%AF%E7%88%B1%" \ + # "E5%B0%8F%E8%90%9D%E8%8E%89%EF%BC%8C%E8%BF%9B%E6%9D%A5%E7%9C%8B%E7%9C%8B%EF%BC%8C%E" \ + # "6%8F%90%E7%A5%9E%E9%86%92%E8%84%91%EF%BC%81" + # res = requests.get(url, headers=get_user_agent()) + # sleep(2) + # soup = BeautifulSoup(res.text, 'lxml') + # alist = soup.find_all('button', {'class': 'pagination-btn num-btn'}) + # total_page = soup.find_all('button', {'class': 'pagination-btn num-btn'})[-1].text.strip() + # print(total_page) + get_bilibili_img("精选动漫壁纸手机电脑壁纸&动漫游戏专题", IMAGE_PATH + "bizhi/") \ No newline at end of file diff --git a/util/img_utils.py b/util/img_utils.py index 5e4528bd..b2c0859a 100644 --- a/util/img_utils.py +++ b/util/img_utils.py @@ -246,8 +246,13 @@ class CreateImg: self.markImg.show(self.markImg) # 压缩 - def resize(self, ratio): - self.markImg = self.markImg.resize((int(self.w * ratio), int(self.h * ratio)), Image.ANTIALIAS) + def resize(self, ratio=0, w=0, h=0): + if not w and not h and not ratio: + raise Exception('缺少参数...') + if not w and not h and ratio: + w = int(self.w * ratio) + h = int(self.h * ratio) + self.markImg = self.markImg.resize((w, h), Image.ANTIALIAS) self.w, self.h = self.markImg.size self.size = self.w, self.h self.draw = ImageDraw.Draw(self.markImg) @@ -273,12 +278,33 @@ class CreateImg: buf = BytesIO() self.markImg.save(buf, format='PNG') base64_str = base64.b64encode(buf.getvalue()).decode() - return 'base64://' + base64_str + return base64_str # def convert(self, itype): self.markImg = self.markImg.convert(itype) + # 变圆 + def circle(self): + self.convert('RGBA') + r2 = min(self.w, self.h) + if self.w != self.h: + self.resize(w=r2, h=r2) + r3 = int(r2 / 2) + imb = Image.new('RGBA', (r3 * 2, r3 * 2), (255, 255, 255, 0)) + pima = self.markImg.load() # 像素的访问对象 + pimb = imb.load() + r = float(r2 / 2) + for i in range(r2): + for j in range(r2): + lx = abs(i - r) # 到圆心距离的横坐标 + ly = abs(j - r) # 到圆心距离的纵坐标 + l = (pow(lx, 2) + pow(ly, 2)) ** 0.5 # 三角函数 半径 + if l < r3: + pimb[i - (r - r3), j - (r - r3)] = pima[i, j] + self.markImg = imb + + if __name__ == '__main__': pass diff --git a/util/init_result.py b/util/init_result.py index 3b369ddf..92d4b0d0 100644 --- a/util/init_result.py +++ b/util/init_result.py @@ -2,6 +2,7 @@ from configs.path_config import IMAGE_PATH, VOICE_PATH from nonebot.adapters.cqhttp.message import MessageSegment import os from services.log import logger +import ujson def image(img_name: str = None, path: str = '', abspath: str = None, b64: str = None): @@ -68,6 +69,7 @@ def xml(data): def json(data): + data = ujson.dumps(data) return MessageSegment.json(data)