gold_readbag and russian

This commit is contained in:
hibiki 2021-06-15 10:57:08 +08:00
parent 95209093de
commit ea620fdae9
125 changed files with 2106 additions and 1244 deletions

View File

@ -11,21 +11,21 @@ USE_CONFIG_FILE = False
# API KEY必要 # API KEY必要
LOLICON_KEY: str = "" # lolicon LOLICON_KEY: str = "336595836015174952daa2" # lolicon
RSSHUBAPP: str = "https://docs.rsshub.app/" # rsshub RSSHUBAPP: str = "https://docs.rsshub.app/" # rsshub
# 图灵 # 图灵
TL_KEY: List[str] = [] TL_KEY: List[str] = ["4474710fabbf4540bfaa569c192bb457", "6f4c0920d2ff4962b5cbd8148aef771b",
"f5595738894042fb9fad88ecdc4acf41", "c24400595fed48f9a5c5bc3ff03a3267", "efab135b75d84b02a59115f5b571f277"]
# 数据库(必要) # 数据库(必要)
# 如果填写了bind就不需要再填写后面的字段了# # 如果填写了bind就不需要再填写后面的字段了#
# bind示例"bind": "postgresql://user:password@127.0.0.1:5432/database" bind: str = 'postgresql://hibiki:Dimension130123@hibiki0v0.cn:6666/hibikibot'
bind: str = '' # 数据库连接url sql_name: str = ''
sql_name: str = 'postgresql' user: str = ''
user: str = '' # 数据库用户名 password: str = ''
password: str = '' # 数据库密码 address: str = ''
address: str = '' # 数据库地址 port: str = ''
port: str = '' # 数据库端口 database: str = ''
database: str = '' # 数据库名称
# 公开图库列表 # 公开图库列表
@ -35,19 +35,6 @@ IMAGE_DIR_LIST: List[str] = ["色图", "美图", "萝莉", "壁纸"]
BAN_RESULT: str = "才不会给你发消息." 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是否开启台服卡池
# 插件配置 # 插件配置
MAXINFO_REIMU: int = 7 # 上车(reimu)功能查找目的地的最大数 MAXINFO_REIMU: int = 7 # 上车(reimu)功能查找目的地的最大数
COUNT_PER_DAY_REIMU: int = 5 # 每日上车(reimu)次数限制 COUNT_PER_DAY_REIMU: int = 5 # 每日上车(reimu)次数限制
@ -57,6 +44,18 @@ MAXINFO_GROUP_ANIME: int = 5 # 群搜索动漫返回的最大数量
MAX_FIND_IMG_COUNT: int = 3 # 识图最大返回数 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 # 默认群管理员权限 ADMIN_DEFAULT_AUTH: int = 5 # 默认群管理员权限
MAX_SIGN_GOLD: int = 200 # 签到好感度加成额外获得的最大金币数 MAX_SIGN_GOLD: int = 200 # 签到好感度加成额外获得的最大金币数
@ -85,11 +84,11 @@ MUTE_LEVEL: int = 5 # 更改禁言设置权限
# 需要为哪些群更新最新版gocq吗上传最新版gocq # 需要为哪些群更新最新版gocq吗上传最新版gocq
# 示例:[434995955, 239483248] # 示例:[434995955, 239483248]
UPDATE_GOCQ_GROUP: List[int] = [] UPDATE_GOCQ_GROUP: List[int] = [774261838]
# 代理 # 代理
system_proxy: str = '' # 系统代理 示例:'http:127.0.0.1:9999' system_proxy: str = 'http://127.0.0.1:7890'
buff_proxy: str = '' # buff代理 buff_proxy: str = ''
# 是否存储色图 # 是否存储色图
DOWNLOAD_SETU: bool = True DOWNLOAD_SETU: bool = True
@ -114,7 +113,7 @@ plugins2name_dict = {
'buy': ['购买', '购买道具'], 'buy': ['购买', '购买道具'],
'my_gold': ['我的金币'], 'my_gold': ['我的金币'],
'my_props': ['我的道具'], 'my_props': ['我的道具'],
'shop_help': ['商店'], 'shop_handle': ['商店'],
'nonebot_plugin_cocdicer': ['骰子娘'], 'nonebot_plugin_cocdicer': ['骰子娘'],
'update_pic': ['图片', '操作图片', '修改图片'], 'update_pic': ['图片', '操作图片', '修改图片'],
'search_buff_skin_price': ['查询皮肤'], 'search_buff_skin_price': ['查询皮肤'],
@ -125,8 +124,8 @@ plugins2name_dict = {
'songpicker2': ['点歌'], 'songpicker2': ['点歌'],
'epic': ['epic'], 'epic': ['epic'],
'pixiv': ['pixiv', 'p站排行', '搜图'], 'pixiv': ['pixiv', 'p站排行', '搜图'],
'poke': ['戳一戳'], 'poke': ['戳一戳', '拍一拍'],
'draw_card': ['游戏抽卡', '原神一井', '原神来一井', '方舟一井', '方舟来一井'], 'draw_card': ['抽卡', '游戏抽卡', '原神抽卡', '方舟抽卡', '坎公骑冠剑抽卡', 'pcr抽卡', 'fgo抽卡', '碧蓝抽卡', '碧蓝航线抽卡', '阴阳师抽卡'],
'ai': ['ai', 'Ai', 'AI', 'aI'], 'ai': ['ai', 'Ai', 'AI', 'aI'],
'one_friend': ['我有一个朋友', '我有一个朋友想问问'], 'one_friend': ['我有一个朋友', '我有一个朋友想问问'],
'translate': ['翻译', '英翻', '翻英', '日翻', '翻日', '韩翻', '翻韩'], 'translate': ['翻译', '英翻', '翻英', '日翻', '翻日', '韩翻', '翻韩'],
@ -135,6 +134,8 @@ plugins2name_dict = {
'material_remind': ['今日素材', '天赋材料'], 'material_remind': ['今日素材', '天赋材料'],
'qiu_qiu_translation': ['丘丘翻译', '丘丘一下', '丘丘语翻译'], 'qiu_qiu_translation': ['丘丘翻译', '丘丘一下', '丘丘语翻译'],
'query_resource_points': ['原神资源查询', '原神资源列表'], 'query_resource_points': ['原神资源查询', '原神资源列表'],
'russian': ['俄罗斯轮盘', '俄罗斯转盘', '装弹'],
'gold_redbag': ['塞红包', '红包', '抢红包']
} }
# 群管理员功能 与 对应权限 # 群管理员功能 与 对应权限

View File

@ -14,14 +14,12 @@ LOG_PATH = Path("log/")
TTF_PATH = Path("resources/ttf/") TTF_PATH = Path("resources/ttf/")
# 数据路径 # 数据路径
DATA_PATH = Path("data/") DATA_PATH = Path("data/")
# 抽卡数据路径
DRAW_PATH = Path("data/draw_card/")
# 临时图片路径 # 临时图片路径
TEMP_PATH = Path("resources/img/temp/") TEMP_PATH = Path("resources/img/temp/")
def init_path(): 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: if USE_CONFIG_FILE:
data = get_config_data() data = get_config_data()
if data.get('IMAGE_PATH'): if data.get('IMAGE_PATH'):
@ -46,7 +44,6 @@ def init_path():
LOG_PATH.mkdir(parents=True, exist_ok=True) LOG_PATH.mkdir(parents=True, exist_ok=True)
TTF_PATH.mkdir(parents=True, exist_ok=True) TTF_PATH.mkdir(parents=True, exist_ok=True)
DATA_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) TEMP_PATH.mkdir(parents=True, exist_ok=True)
IMAGE_PATH = str(IMAGE_PATH.absolute()) + '/' IMAGE_PATH = str(IMAGE_PATH.absolute()) + '/'
@ -55,7 +52,6 @@ def init_path():
LOG_PATH = str(LOG_PATH.absolute()) + '/' LOG_PATH = str(LOG_PATH.absolute()) + '/'
TTF_PATH = str(TTF_PATH.absolute()) + '/' TTF_PATH = str(TTF_PATH.absolute()) + '/'
DATA_PATH = str(DATA_PATH.absolute()) + '/' DATA_PATH = str(DATA_PATH.absolute()) + '/'
DRAW_PATH = str(DRAW_PATH.absolute()) + '/'
TEMP_PATH = str(TEMP_PATH.absolute()) + '/' TEMP_PATH = str(TEMP_PATH.absolute()) + '/'

View File

@ -9,7 +9,7 @@ except ModuleNotFoundError:
base_config = Path() / 'config.json' base_config = Path() / 'config.json'
plugins_cmd_config = Path() / 'configs' / 'plugins2cmd_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(): def init_config():
@ -50,6 +50,18 @@ def init_config():
'OC_LEVEL': 2, 'OC_LEVEL': 2,
'MUTE_LEVEL': 5, '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: with open(base_config, 'w', encoding='utf8') as f:
json.dump(config_dict, f, indent=4, ensure_ascii=False) json.dump(config_dict, f, indent=4, ensure_ascii=False)
@ -71,7 +83,7 @@ def init_config():
'buy': ['购买', '购买道具'], 'buy': ['购买', '购买道具'],
'my_gold': ['我的金币'], 'my_gold': ['我的金币'],
'my_props': ['我的道具'], 'my_props': ['我的道具'],
'shop_help': ['商店'], 'shop_handle': ['商店'],
'nonebot_plugin_cocdicer': ['骰子娘'], 'nonebot_plugin_cocdicer': ['骰子娘'],
'update_pic': ['图片', '操作图片', '修改图片'], 'update_pic': ['图片', '操作图片', '修改图片'],
'search_buff_skin_price': ['查询皮肤'], 'search_buff_skin_price': ['查询皮肤'],
@ -96,30 +108,49 @@ def init_config():
} }
with open(plugins_cmd_config, 'w', encoding='utf8') as f: with open(plugins_cmd_config, 'w', encoding='utf8') as f:
json.dump(config_dict, f, indent=4, ensure_ascii=False) json.dump(config_dict, f, indent=4, ensure_ascii=False)
if not other_config.exists(): if not plugins_setting.exists():
other_config.parent.mkdir(parents=True, exist_ok=True) plugins_setting.parent.mkdir(parents=True, exist_ok=True)
config_dict = { config_dict = {
'base': { 'base': {
'IMAGE_DIR_LIST': ["色图", "美图", "萝莉", "壁纸"], 'IMAGE_DIR_LIST': ["色图", "美图", "萝莉", "壁纸"],
'BAN_RESULT': "才不会给你发消息.", 'BAN_RESULT': "才不会给你发消息.",
}, },
'bool': { 'draw_card': {
'AUTO_ADD_FRIEND': True, 'PRTS_FLAG': True, # 明日方舟
'DOWNLOAD_SETU': 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': { 'fudu': {
'INITIAL_SETU_PROBABILITY': 0.7,
'FUDU_PROBABILITY': 0.7, 'FUDU_PROBABILITY': 0.7,
}, },
'max_count': { 'reimu': {
'MAXINFO_REIMU': 7, 'MAXINFO_REIMU': 7,
'COUNT_PER_DAY_REIMU': 5, 'COUNT_PER_DAY_REIMU': 5,
},
'bt': {
'MAXINFO_BT': 10, 'MAXINFO_BT': 10,
},
'search_anime': {
'MAXINFO_PRIVATE_ANIME': 20, 'MAXINFO_PRIVATE_ANIME': 20,
'MAXINFO_GROUP_ANIME': 5, 'MAXINFO_GROUP_ANIME': 5,
},
'picsearcher': {
'MAX_FIND_IMG_COUNT': 3, 'MAX_FIND_IMG_COUNT': 3,
},
'sign': {
'MAX_SIGN_GOLD': 200, 'MAX_SIGN_GOLD': 200,
},
'send_setu': {
'INITIAL_SETU_PROBABILITY': 0.7,
'MAX_SETU_R_COUNT': 5, 'MAX_SETU_R_COUNT': 5,
'DOWNLOAD_SETU': True,
}, },
'malicious_ban': { 'malicious_ban': {
'MALICIOUS_BAN_TIME': 30, 'MALICIOUS_BAN_TIME': 30,
@ -134,23 +165,11 @@ def init_config():
'MUTE_DEFAULT_TIME': 7, 'MUTE_DEFAULT_TIME': 7,
'MUTE_DEFAULT_DURATION': 10, 'MUTE_DEFAULT_DURATION': 10,
}, },
'other': { 'update_gocq': {
'UPDATE_GOCQ_GROUP': [], '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) json.dump(config_dict, f, indent=4, ensure_ascii=False)

View File

@ -2,7 +2,7 @@
from services.db_context import db from services.db_context import db
class UserBag(db.Model): class BagUser(db.Model):
__tablename__ = 'bag_users' __tablename__ = 'bag_users'
id = db.Column(db.Integer(), primary_key=True) id = db.Column(db.Integer(), primary_key=True)
@ -63,7 +63,7 @@ class UserBag(db.Model):
return '' return ''
@classmethod @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( query = cls.query.where(
(cls.user_qq == user_qq) & (cls.belonging_group == belonging_group) (cls.user_qq == user_qq) & (cls.belonging_group == belonging_group)
) )
@ -89,7 +89,7 @@ class UserBag(db.Model):
return False return False
@classmethod @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( query = cls.query.where(
(cls.user_qq == user_qq) & (cls.belonging_group == belonging_group) (cls.user_qq == user_qq) & (cls.belonging_group == belonging_group)
) )
@ -170,16 +170,13 @@ class UserBag(db.Model):
@classmethod @classmethod
async def get_user_all(cls, group_id: int = None) -> list: async def get_user_all(cls, group_id: int = None) -> list:
user_list = []
if not group_id: if not group_id:
query = await cls.query.gino.all() query = await cls.query.gino.all()
else: else:
query = await cls.query.where( query = await cls.query.where(
(cls.belonging_group == group_id) (cls.belonging_group == group_id)
).gino.all() ).gino.all()
for user in query: return query
user_list.append(user)
return user_list

View File

@ -42,16 +42,15 @@ class BanUser(db.Model):
if await cls.check_ban_time(user_qq): if await cls.check_ban_time(user_qq):
return True return True
else: else:
await cls.unban(user_qq, True) await cls.unban(user_qq)
return False return False
@classmethod @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( query = cls.query.where(
(cls.user_qq == user_qq) (cls.user_qq == user_qq)
) )
if for_update: query = query.with_for_update()
query = await query.with_for_update()
user = await query.gino.first() user = await query.gino.first()
if not await cls.check_ban_time(user_qq): if not await cls.check_ban_time(user_qq):
await cls.unban(user_qq) await cls.unban(user_qq)
@ -68,12 +67,11 @@ class BanUser(db.Model):
return False return False
@classmethod @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( query = cls.query.where(
(cls.user_qq == user_qq) (cls.user_qq == user_qq)
) )
if for_update: query = query.with_for_update()
query = query.with_for_update()
user = await query.gino.first() user = await query.gino.first()
if user is None: if user is None:
return False return False

View File

@ -1,4 +1,5 @@
from datetime import datetime from datetime import datetime
from datetime import datetime
from services.db_context import db from services.db_context import db

View File

@ -60,7 +60,7 @@ class FriendUser(db.Model):
query = cls.query.where( query = cls.query.where(
cls.user_id == user_id cls.user_id == user_id
) )
user = await query.with_for_update().gino.first() user = await query.gino.first()
if user: if user:
if user.nickname: if user.nickname:
return user.nickname return user.nickname

92
models/goods_info.py Normal file
View File

@ -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

View File

@ -73,7 +73,7 @@ class GroupInfoUser(db.Model):
query = cls.query.where( query = cls.query.where(
(cls.user_qq == user_qq) & (cls.belonging_group == belonging_group) (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: if user:
await user.update( await user.update(
nickname=nickname nickname=nickname

View File

@ -48,7 +48,7 @@ class GroupRemind(db.Model):
try: try:
group = await cls.query.where( group = await cls.query.where(
(cls.group_id == group_id) (cls.group_id == group_id)
).gino.first() ).with_for_update().gino.first()
if not group: if not group:
group = await cls.create( group = await cls.create(
group_id=group_id, group_id=group_id,

View File

@ -43,12 +43,11 @@ class LevelUser(db.Model):
return False return False
@classmethod @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( query = cls.query.where(
(cls.user_qq == user_qq) & (cls.group_id == group_id) (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() user = await query.gino.first()
if user is None: if user is None:
return False return False

65
models/redbag_user.py Normal file
View File

@ -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

80
models/russian_user.py Normal file
View File

@ -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

View File

@ -12,7 +12,7 @@ from util.utils import FreqLimiter
__plugin_name__ = '基本设置 [Hidden]' __plugin_name__ = '基本设置 [Hidden]'
__plugin_usage__ = '用法: 基本' __plugin_usage__ = '用法: '
_flmt = FreqLimiter(300) _flmt = FreqLimiter(300)

View File

@ -9,9 +9,10 @@ from services.log import logger
from configs.config import plugins2name_dict from configs.config import plugins2name_dict
from nonebot.plugin import export from nonebot.plugin import export
__plugin_usage__ = '''自定义进群欢迎消息: __plugin_name__ = '自定义进群欢迎消息'
自定义进群欢迎消息 xxxx图片
示例自定义进群欢迎消息 欢迎新人后面可以跟一张图片噢''' __plugin_usage__ = '''自定义进群欢迎消息 [消息] [图片](可省略)
\t示例自定义进群欢迎消息 欢迎新人[图片]'''
export = export() export = export()
export.update_member_info = update_member_info export.update_member_info = update_member_info
@ -55,8 +56,6 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
@custom_welcome.handle() @custom_welcome.handle()
async def _(bot: Bot, event: GroupMessageEvent, state: T_State): 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()) msg = get_message_text(event.json())
imgs = get_message_imgs(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) await custom_welcome.finish(await custom_group_welcome(msg, imgs, event.user_id, event.group_id), at_sender=True)

View File

@ -7,6 +7,11 @@ from models.group_member_info import GroupInfoUser
from configs.config import ADMIN_DEFAULT_AUTH from configs.config import ADMIN_DEFAULT_AUTH
__plugin_name__ = '群管理员监测'
__plugin_usage__ = ''
admin_notice = on_notice(priority=5) admin_notice = on_notice(priority=5)

View File

@ -29,15 +29,15 @@ passive_help = '''【被动技能开关(2)
开启/关闭b站转发解析 开启/关闭b站转发解析
开启/关闭丢人爬 开启/关闭丢人爬
开启/关闭epic通知 开启/关闭epic通知
开启/关闭全部通知 开启/关闭原神黄历提醒
开启/关闭原神黄历提醒 开启/关闭全部通知
''' '''
admin_help = on_command("管理员帮助", aliases={"管理帮助"}, priority=5, block=True) admin_help = on_command("管理员帮助", aliases={"管理帮助"}, priority=5, block=True)
admin_help_img = CreateImg(1000, 600, font_size=24) admin_help_img = CreateImg(1000, 600, font_size=24)
admin_help_img.text((10, 10), __plugin_usage__) 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') admin_help_img.save(IMAGE_PATH + 'admin_help_img.png')

View File

@ -8,7 +8,7 @@ from util.utils import get_message_text, get_message_imgs
from models.friend_user import FriendUser from models.friend_user import FriendUser
from models.group_member_info import GroupInfoUser from models.group_member_info import GroupInfoUser
__plugin_name__ = 'AI' __plugin_name__ = 'AI [Hidden]'
ai = on_message(rule=to_me(), priority=8) 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: if str(event.get_message()).find('CQ:xml') != -1:
return return
# 打招呼 # 打招呼
if not msg and not imgs: if (not msg and not imgs) or msg in ['你好啊', '你好', '在吗', '在不在', '您好', '您好啊', '你好', '']:
await ai.finish(hello()) await ai.finish(hello())
img = imgs[0] if imgs else '' img = imgs[0] if imgs else ''
nickname = await FriendUser.get_friend_nickname(event.user_id) nickname = await FriendUser.get_friend_nickname(event.user_id)

View File

@ -82,7 +82,7 @@ async def get_qqbot_chat_result(text: str, img_url: str, user_id: int, user_name
return '' return ''
resp_payload = json.loads(await response.text()) resp_payload = json.loads(await response.text())
if resp_payload['intent']: if resp_payload['intent']:
if resp_payload['intent']['code'] != 0: if int(resp_payload['intent']['code']) in [4003]:
index += 1 index += 1
# 该AI很屑 # 该AI很屑
async with sess.get(f'http://api.qingyunke.com/api.php?key=free&appid=0&msg={text}') as res: async with sess.get(f'http://api.qingyunke.com/api.php?key=free&appid=0&msg={text}') as res:

View File

@ -5,7 +5,7 @@ from datetime import datetime
from configs.config import AUTO_ADD_FRIEND from configs.config import AUTO_ADD_FRIEND
from nonebot.adapters.cqhttp.exception import ActionFailed from nonebot.adapters.cqhttp.exception import ActionFailed
__plugin_name__ = '处理请求' __plugin_name__ = '好友群聊处理请求 [Hidden]'
friend_req = on_request(priority=5) friend_req = on_request(priority=5)

View File

@ -11,11 +11,13 @@ from models.group_member_info import GroupInfoUser
__plugin_name__ = 'Ban/unBan' __plugin_name__ = 'Ban/unBan'
__plugin_usage__ = f'用法: 封禁/解封用户不是禁言是针对bot是否处理封禁用户消息\n' \ __plugin_usage__ = '用法:\n' \
'示例:.ban @djdsk\n' \ '(不是禁言!是针对真寻是否处理封禁用户消息)\n' \
'示例:.ban @djdsk 0(小时) 30(分钟)\n' \ '封禁/解封用户 [小时] [分钟]\n' \
'示例:.ban @sdasf 4(小时)\n' \ '示例:.ban @djdsk\n' \
'示例:.unban @sdasf' '示例:.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) 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() @ban.handle()
async def _(bot: Bot, event: GroupMessageEvent, state: T_State): 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: # try:
result = '' result = ''
qq = int(get_message_at(event.json())[0]) qq = int(get_message_at(event.json())[0])

View File

@ -8,6 +8,10 @@ from services.log import logger
from models.group_remind import GroupRemind from models.group_remind import GroupRemind
from util.init_result import image from util.init_result import image
__plugin_name__ = "广播 [Hidden]"
__plugin_usage__ = '广播- [消息] or [图片]'
broadcast = on_command("广播-", priority=1, permission=SUPERUSER, block=True) broadcast = on_command("广播-", priority=1, permission=SUPERUSER, block=True)

View File

@ -37,8 +37,6 @@ async def _(bot: Bot, event: PrivateMessageEvent, state: T_State):
@bt.handle() @bt.handle()
async def _(bot: Bot, event: PrivateMessageEvent, state: T_State): 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): if _ulmt.check(event.user_id):
await bt.finish('您有bt任务正在进行请等待结束.', at_sender=True) await bt.finish('您有bt任务正在进行请等待结束.', at_sender=True)
mp = get_message_text(event.json()).split(" ") mp = get_message_text(event.json()).split(" ")

View File

@ -7,7 +7,9 @@ from nonebot.rule import to_me
from nonebot.permission import SUPERUSER from nonebot.permission import SUPERUSER
__plugin_name__ = '自我检查' __plugin_name__ = '自我检查 [Hidden]'
__plugin_usage__ = '用法:自检'
check = Check() check = Check()

View File

@ -6,7 +6,9 @@ from services.log import logger
from util.init_result import image from util.init_result import image
import requests import requests
__plugin_usage_coser__ = '不得看看可爱的coser发送coser' __plugin_name__ = 'coser'
__plugin_usage__ = '用法发送coser'
coser = on_command('cos', aliases={'coser', '括丝'}, priority=5, block=True) coser = on_command('cos', aliases={'coser', '括丝'}, priority=5, block=True)
@ -17,8 +19,6 @@ url_2 = 'http://api.rosysun.cn/cos'
@coser.handle() @coser.handle()
async def _(bot: Bot, event: Event, state: T_State): 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 img_url = requests.get(url_2).text
await coser.send(image(img_url)) await coser.send(image(img_url))
logger.info( logger.info(

View File

@ -11,8 +11,8 @@ from util.utils import is_number, cn2py
__plugin_name__ = '删除图片' __plugin_name__ = '删除图片'
__plugin_usage__ = '删除图片帮助:\n\t' \ __plugin_usage__ = '删除图片帮助:\n\t' \
'1.查看列表 --> 指令: 删除图片 列表/目录\n\t' \ '1.查看列表 --> 指令: 删除图片 列表/目录\n\t' \
'2.删除图片 图库 id, 即在相应目录下删除图片\n\t\t示例: 删除图片 色图 1 ' '2.删除图片 图库 id, 即在相应目录下删除图片\n\t\t示例: 删除图片 色图 1 '
delete_img = on_command("删除图片", priority=5, rule=to_me(), block=True) delete_img = on_command("删除图片", priority=5, rule=to_me(), block=True)

View File

@ -8,7 +8,7 @@ from util.init_result import at
__plugin_name__ = '联系管理员' __plugin_name__ = '联系管理员'
__plugin_usage__ = '滴滴滴- 后接内容 联系管理员' __plugin_usage__ = '用法:滴滴滴- [消息]'
dialogue = on_command("[滴滴滴]", aliases={"滴滴滴-"}, priority=1, block=True) dialogue = on_command("[滴滴滴]", aliases={"滴滴滴-"}, priority=1, block=True)

View File

@ -20,6 +20,9 @@ import asyncio
from util.utils import scheduler from util.utils import scheduler
from services.log import logger 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 = 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_update = on_keyword({'更新方舟信息', '更新明日方舟信息'}, permission=SUPERUSER, priority=1, block=True)
prts_up_reload = on_keyword({'重载方舟卡池'}, priority=1, block=True) prts_up_reload = on_keyword({'重载方舟卡池'}, priority=1, block=True)

View File

@ -26,7 +26,7 @@ def is_expired(data: dict):
start_date = datetime.strptime(times[0], '%Y-%m-%d').date() start_date = datetime.strptime(times[0], '%Y-%m-%d').date()
end_date = datetime.strptime(times[1], '%Y-%m-%d').date() end_date = datetime.strptime(times[1], '%Y-%m-%d').date()
now = datetime.now().date() now = datetime.now().date()
return start_date < now < end_date return start_date <= now <= end_date
# 检查写入 # 检查写入

View File

@ -2,14 +2,17 @@ import os
from nonebot.adapters.cqhttp import MessageSegment from nonebot.adapters.cqhttp import MessageSegment
import nonebot import nonebot
import random import random
from configs.path_config import IMAGE_PATH
from .update_game_info import update_info 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, \ 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 DRAW_PATH, GENSHIN_FLAG
from dataclasses import dataclass from dataclasses import dataclass
from .init_card_pool import init_game_pool from .init_card_pool import init_game_pool
from .announcement import GenshinAnnouncement from .announcement import GenshinAnnouncement
from services.log import logger from services.log import logger
from util.init_result import image
try: try:
import ujson as json import ujson as json
except ModuleNotFoundError: except ModuleNotFoundError:
@ -27,7 +30,6 @@ ALL_ARMS = []
UP_CHAR = [] UP_CHAR = []
UP_ARMS = [] UP_ARMS = []
_CURRENT_CHAR_POOL_TITLE = '' _CURRENT_CHAR_POOL_TITLE = ''
_CURRENT_ARMS_POOL_TITLE = '' _CURRENT_ARMS_POOL_TITLE = ''
POOL_IMG = '' 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 '' pool_info = f'当前up池{title}\n{tmp}' if title else ''
if count > 90: if count > 90:
char_list = set_list(char_list) 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 "^"}' \ 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%" + "\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() up_char_dict = await GenshinAnnouncement.update_up_char()
_CURRENT_CHAR_POOL_TITLE = up_char_dict['char']['title'] _CURRENT_CHAR_POOL_TITLE = up_char_dict['char']['title']
_CURRENT_ARMS_POOL_TITLE = up_char_dict['arms']['title'] _CURRENT_ARMS_POOL_TITLE = up_char_dict['arms']['title']
if _CURRENT_CHAR_POOL_TITLE and _CURRENT_ARMS_POOL_TITLE: if _CURRENT_CHAR_POOL_TITLE and _CURRENT_ARMS_POOL_TITLE:
POOL_IMG = MessageSegment.image(up_char_dict['char']['pool_img']) + \ await download_img(up_char_dict['char']['pool_img'], 'genshin', 'up_char_pool_img')
MessageSegment.image(up_char_dict['arms']['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}') logger.info(f'成功获取原神当前up信息...当前up池: {_CURRENT_CHAR_POOL_TITLE} & {_CURRENT_ARMS_POOL_TITLE}')
for key in up_char_dict.keys(): for key in up_char_dict.keys():
for star in up_char_dict[key]['up_char'].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(): async def reload_genshin_pool():
await _init_up_char() await _init_up_char()
return f'当前UP池子{_CURRENT_CHAR_POOL_TITLE} & {_CURRENT_ARMS_POOL_TITLE} {POOL_IMG}' return f'当前UP池子{_CURRENT_CHAR_POOL_TITLE} & {_CURRENT_ARMS_POOL_TITLE} {POOL_IMG}'

View File

@ -86,7 +86,7 @@ def _get_guardian_card(pool_name: str):
if pool_name != 'arms': if pool_name != 'arms':
star = get_star([3, 2, 1], [GUARDIAN_THREE_CHAR_P, GUARDIAN_TWO_CHAR_P, GUARDIAN_ONE_CHAR_P]) 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] chars = [x for x in ALL_CHAR if x.star == star]
return random.choice(chars), 3- star return random.choice(chars), 3 - star
else: else:
star = get_star([5, 4, 3, 2], [GUARDIAN_FIVE_ARMS_P, GUARDIAN_FOUR_ARMS_P, star = get_star([5, 4, 3, 2], [GUARDIAN_FIVE_ARMS_P, GUARDIAN_FOUR_ARMS_P,
GUARDIAN_THREE_ARMS_P, GUARDIAN_TWO_ARMS_P]) GUARDIAN_THREE_ARMS_P, GUARDIAN_TWO_ARMS_P])

View File

@ -10,11 +10,13 @@ def init_game_pool(game: str, data: dict, Operator: Any):
event_only = False event_only = False
if '限定寻访' in data[key]['获取途径']: if '限定寻访' in data[key]['获取途径']:
limited = True limited = True
if len(data[key]['获取途径']) == 1 and data[key]['获取途径'][0] == '公开招募': if '干员寻访' not in data[key]['获取途径'] and '公开招募' in data[key]['获取途径']:
recruit_only = True recruit_only = True
if '活动获取' in data[key]['获取途径']: if '活动获取' in data[key]['获取途径']:
event_only = True 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 limited = True
if key.find('阿米娅') != -1: if key.find('阿米娅') != -1:
continue continue

View File

@ -4,7 +4,7 @@ import nonebot
import random import random
from .config import PRTS_FIVE_P, PRTS_FOUR_P, PRTS_SIX_P, PRTS_THREE_P, DRAW_PATH, PRTS_FLAG 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 .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 .init_card_pool import init_game_pool
from pathlib import Path from pathlib import Path
from .announcement import PrtsAnnouncement from .announcement import PrtsAnnouncement
@ -36,8 +36,7 @@ class Operator(BaseData):
async def prts_draw(count: int = 300): async def prts_draw(count: int = 300):
cnlist = ['★★★★★★', '★★★★★', '★★★★', '★★★'] cnlist = ['★★★★★★', '★★★★★', '★★★★', '★★★']
star_list = [0, 0, 0, 0] star_list = [0, 0, 0, 0]
operator_list, operator_dict, six_list, star_list, six_index_list = format_card_information(count, star_list, operator_list, operator_dict, six_list, star_list, six_index_list = format_card_information(count, star_list)
_get_operator_card)
up_list = [] up_list = []
if _CURRENT_POOL_TITLE: if _CURRENT_POOL_TITLE:
for x in UP_OPERATOR: for x in UP_OPERATOR:
@ -73,8 +72,8 @@ async def init_prts_data():
# 抽取干员 # 抽取干员
def _get_operator_card(): def _get_operator_card(add: float):
star = get_star([6, 5, 4, 3], [PRTS_SIX_P, PRTS_FIVE_P, PRTS_FOUR_P, PRTS_THREE_P]) star = get_star([6, 5, 4, 3], [PRTS_SIX_P + add, PRTS_FIVE_P, PRTS_FOUR_P, PRTS_THREE_P])
if _CURRENT_POOL_TITLE: if _CURRENT_POOL_TITLE:
zooms = [x.zoom for x in UP_OPERATOR if x.star == star] zooms = [x.zoom for x in UP_OPERATOR if x.star == star]
zoom = 0 zoom = 0
@ -107,6 +106,33 @@ def _get_operator_card():
return acquire_operator, 6 - star 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干员和概率 # 获取up干员和概率
async def _init_up_char(): async def _init_up_char():
global _CURRENT_POOL_TITLE, POOL_IMG, UP_OPERATOR global _CURRENT_POOL_TITLE, POOL_IMG, UP_OPERATOR

View File

@ -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): async def _last_check(data: dict, game_name: str, session: aiohttp.ClientSession):
if game_name == 'prts': # if game_name == 'prts':
url = 'https://wiki.biligame.com/arknights/' # url = 'https://wiki.biligame.com/arknights/'
tasks = [] # tasks = []
for key in data.keys(): # for key in data.keys():
tasks.append(asyncio.ensure_future(_async_update_prts_extra_info(url, key, session))) # tasks.append(asyncio.ensure_future(_async_update_prts_extra_info(url, key, session)))
asyResult = await asyncio.gather(*tasks) # asyResult = await asyncio.gather(*tasks)
for x in asyResult: # for x in asyResult:
for key in x.keys(): # for key in x.keys():
data[key]['获取途径'] = x[key]['获取途径'] # data[key]['获取途径'] = x[key]['获取途径']
if game_name == 'genshin': if game_name == 'genshin':
for key in data.keys(): for key in data.keys():
async with session.get(f'https://wiki.biligame.com/ys/{key}', timeout=7) as res: 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): def intermediate_check(member_dict: dict, key: str, game_name: str, td: bs4.element.Tag):
if game_name == 'prts':
if key == '获取途径':
msg = re.search('<td.*?>([\\s\\S]*)</td>', str(td)).group(1).strip()
msg = msg[:-1] if msg[-1] == '\n' else msg
if msg.find('<a') != -1:
for a in td.find_all('a'):
msg = msg.replace(str(a), a.text)
member_dict['获取途径'] = msg.split('<br/>')
if game_name == 'pretty': if game_name == 'pretty':
if key == '初始星级': if key == '初始星级':
member_dict['初始星级'] = len(td.find_all('img')) member_dict['初始星级'] = len(td.find_all('img'))

View File

@ -7,6 +7,7 @@ from .util import remove_prohibited_str
from urllib.parse import unquote from urllib.parse import unquote
from services.log import logger from services.log import logger
import bs4 import bs4
import asyncio
try: try:
import ujson as json import ujson as json
@ -35,7 +36,7 @@ async def update_simple_info(url: str, game_name: str) -> 'dict, int':
for char in contents: for char in contents:
data = await retrieve_char_data(char, game_name, data, index) data = await retrieve_char_data(char, game_name, data, index)
index += 1 index += 1
data = await _last_check(data, game_name) data = await _last_check(data, game_name, session)
except TimeoutError: except TimeoutError:
logger.warning(f'更新 {game_name} 超时...') logger.warning(f'更新 {game_name} 超时...')
return {}, 999 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': if game_name == 'azur':
idx = 1 idx = 1
for url in [ 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') await download_img(url, 'azur', f'{idx}_star')
idx += 1 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 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 data[member_dict['名称']] = member_dict
logger.info(f'{member_dict["名称"]} is update...') logger.info(f'{member_dict["名称"]} is update...')
return data 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 {}

View File

@ -7,7 +7,9 @@ from .data_source import get_epic_game
from models.group_remind import GroupRemind from models.group_remind import GroupRemind
from nonebot.adapters.cqhttp.exception import ActionFailed from nonebot.adapters.cqhttp.exception import ActionFailed
__plugin_usage__ = 'epic免费游戏提醒' __plugin_name__ = 'epic免费游戏提醒'
__plugin_usage__ = '用法发送epic'
epic = on_command("epic", priority=5, block=True) epic = on_command("epic", priority=5, block=True)
@ -16,8 +18,6 @@ epic = on_command("epic", priority=5, block=True)
@epic.handle() @epic.handle()
async def _(bot: Bot, event: MessageEvent, state: T_State): async def _(bot: Bot, event: MessageEvent, state: T_State):
# try: # try:
if str(event.get_message()) in ['帮助']:
await epic.finish(__plugin_usage__)
try: try:
result = await get_epic_game() result = await get_epic_game()
except: except:

View File

@ -6,7 +6,10 @@ from util.init_result import share
from services.log import logger 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) 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): async def _(bot: Bot, event: MessageEvent, state: T_State):
msg = get_message_text(event.json()).split(' ') msg = get_message_text(event.json()).split(' ')
img = get_message_imgs(event.json()) 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) > 1:
if len(msg) == 2: if len(msg) == 2:
url = msg[0] url = msg[0]

View File

@ -9,6 +9,7 @@ from util.init_result import image
from services.log import logger from services.log import logger
from models.group_remind import GroupRemind from models.group_remind import GroupRemind
FILE_PATH = os.path.dirname(__file__) FILE_PATH = os.path.dirname(__file__)
almanac = on_command('原神黄历', priority=5, block=True) almanac = on_command('原神黄历', priority=5, block=True)

View File

@ -5,6 +5,9 @@ from nonebot import on_command
from util.utils import get_message_text from util.utils import get_message_text
from services.log import logger from services.log import logger
__plugin_name__ = '丘丘语翻译'
__plugin_usage__ = '用法:丘丘翻译 [消息]'
qiuqiu = on_command("丘丘语翻译", aliases={"丘丘一下", "丘丘翻译"}, priority=5, block=True) qiuqiu = on_command("丘丘语翻译", aliases={"丘丘一下", "丘丘翻译"}, priority=5, block=True)

View File

@ -12,6 +12,15 @@ try:
except ModuleNotFoundError: except ModuleNotFoundError:
import json import json
__plugin_name__ = '原神资源查询'
__plugin_usage__ = '用法:\n' \
'\t原神资源查询 [消息]\n' \
'\t原神资源列表\n' \
'\t[消息]在哪\n' \
'\t哪有[消息]\n' \
'[消息] = 资源名称'
qr = on_command("原神资源查询", priority=5, block=True) qr = on_command("原神资源查询", priority=5, block=True)
qr_lst = 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) rex_qr = on_regex('.*?(在哪|在哪里|哪有|哪里有).*?', rule=to_me(), priority=5, block=True)

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View File

@ -7,6 +7,10 @@ import time
import base64 import base64
from configs.path_config import IMAGE_PATH from configs.path_config import IMAGE_PATH
from util.init_result import image 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' 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' 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__) FILE_PATH = os.path.dirname(__file__)
MAP_PATH = os.path.join(IMAGE_PATH, "genshin", "seek_god_eye", "icon", "map_icon.jpg") MAP_PATH = None
MAP_IMAGE = Image.open(MAP_PATH) MAP_IMAGE = None
MAP_SIZE = MAP_IMAGE.size MAP_SIZE = None
# resource_point里记录的坐标是相对坐标是以蒙德城的大雕像为中心的所以图片合成时需要转换坐标 # resource_point里记录的坐标是相对坐标是以蒙德城的大雕像为中心的所以图片合成时需要转换坐标
CENTER = (3505, 1907) CENTER = (3505, 1907)
@ -26,6 +30,16 @@ CENTER = (3505, 1907)
zoom = 0.75 zoom = 0.75
resource_icon_offset = (-int(150 * 0.5 * zoom), -int(150 * zoom)) 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 = { data = {
"all_resource_type": { "all_resource_type": {
# 这个字典保存所有资源类型, # 这个字典保存所有资源类型,
@ -142,7 +156,6 @@ def up_label_and_point_list():
# 初始化 # 初始化
# load_resource_type_id() # load_resource_type_id()
up_label_and_point_list()
class Resource_map(object): class Resource_map(object):

View File

@ -17,6 +17,11 @@ except ModuleNotFoundError:
import json import json
__plugin_name__ = '群事件处理 [Hidden]'
__usage__ = '用法:无'
export = require("admin_bot_manage") export = require("admin_bot_manage")
# 群员增加处理 # 群员增加处理

View File

@ -11,6 +11,10 @@ try:
except ModuleNotFoundError: except ModuleNotFoundError:
import json import json
__plugin_name__ = '查看群欢迎消息'
__plugin_usage__ = ''
view_custom_welcome = on_command('群欢迎消息', aliases={'查看群欢迎消息', '查看当前群欢迎消息'}, permission=GROUP, priority=5, block=True) view_custom_welcome = on_command('群欢迎消息', aliases={'查看群欢迎消息', '查看当前群欢迎消息'}, permission=GROUP, priority=5, block=True)

View File

@ -5,8 +5,10 @@ from nonebot.rule import to_me
from configs.path_config import DATA_PATH from configs.path_config import DATA_PATH
from util.init_result import image from util.init_result import image
import os 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 nonebot import require
from util.utils import get_message_text
export = require("nonebot_plugin_manager") export = require("nonebot_plugin_manager")
@ -19,17 +21,25 @@ create_help_img()
for file in os.listdir(DATA_PATH + 'group_help/'): for file in os.listdir(DATA_PATH + 'group_help/'):
os.remove(DATA_PATH + 'group_help/' + file) 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() @_help.handle()
async def _(bot: Bot, event: GroupMessageEvent, state: T_State): async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
if not os.path.exists(DATA_PATH + f'group_help/{event.group_id}.png'): msg = get_message_text(event.json())
create_group_help_img(event.group_id) if not msg:
await _help.finish(image(abspath=DATA_PATH + f'group_help/{event.group_id}.png')) 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() @_help.handle()
async def _(bot: Bot, event: PrivateMessageEvent, state: T_State): 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))

View File

@ -29,7 +29,7 @@ entertainment_help = {
'open_cases': '模拟开箱(戒赌) --> 指令:开箱(N连开箱[N<=30])/我的开箱/群开箱统计/我的金色', 'open_cases': '模拟开箱(戒赌) --> 指令:开箱(N连开箱[N<=30])/我的开箱/群开箱统计/我的金色',
'luxun': '鲁迅说过 --> 指令:鲁迅说', 'luxun': '鲁迅说过 --> 指令:鲁迅说',
'fake_msg': '构造一个假消息 --> 指令:假消息', 'fake_msg': '构造一个假消息 --> 指令:假消息',
'shop': '商店系统初始送100金币 --> 指令:商店/我的金币/购买道具/使用道具', 'shop_handle': '商店系统(初始送100金币) --> 指令:商店/我的金币/购买道具/使用道具',
'draw_card_prts': '换个地方当非酋TvT... --> 指令:方舟一井/方舟N抽0<N<300', 'draw_card_prts': '换个地方当非酋TvT... --> 指令:方舟一井/方舟N抽0<N<300',
'draw_card_genshin': '提瓦特是个好地方! --> 指令:原神一井/原神N抽0<N<180/原神武器/角色N抽/重置原神抽卡次数', 'draw_card_genshin': '提瓦特是个好地方! --> 指令:原神一井/原神N抽0<N<180/原神武器/角色N抽/重置原神抽卡次数',
'draw_card_pretty': '赛马娘!!!! --> 指令:赛马娘一井/赛马娘N抽/赛马娘卡一井/赛马娘卡N抽(0<N<200)', 'draw_card_pretty': '赛马娘!!!! --> 指令:赛马娘一井/赛马娘N抽/赛马娘卡一井/赛马娘卡N抽(0<N<200)',
@ -44,6 +44,8 @@ entertainment_help = {
'material_remind': '看看原神今天要刷什么 --> 指令:今日素材/天赋材料', 'material_remind': '看看原神今天要刷什么 --> 指令:今日素材/天赋材料',
'qiu_qiu_translation': '这家伙到底在说什么? --> 指令:丘丘翻译/丘丘一下/丘丘语翻译', 'qiu_qiu_translation': '这家伙到底在说什么? --> 指令:丘丘翻译/丘丘一下/丘丘语翻译',
'query_resource_points': '地图资源速速查看 --> 指令:原神资源查询xx/原神资源列表/哪里有xx/xx在哪(xx=资源名称)', 'query_resource_points': '地图资源速速查看 --> 指令:原神资源查询xx/原神资源列表/哪里有xx/xx在哪(xx=资源名称)',
'russian': '紧张刺激的俄罗斯轮盘 --> 指令:俄罗斯轮盘帮助',
'gold_redbag': '运气项目又来啦! --> 指令:塞红包/ 抢红包指令: 开/抢/戳一戳真寻/ 退回:退回未抢完的红包'
} }
# 其他 # 其他
other_help = [ other_help = [

View File

@ -5,6 +5,8 @@ import os
from .config import * from .config import *
from nonebot import require from nonebot import require
from configs.config import INITIAL_OPEN_CASE_COUNT, INITIAL_SETU_PROBABILITY, ADMIN_DEFAULT_AUTH 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") export = require("nonebot_plugin_manager")
@ -48,11 +50,10 @@ def create_help_img():
A.paste(u, (0, u_height)) A.paste(u, (0, u_height))
A.paste(o, (0, o_height)) A.paste(o, (0, o_height))
A.text((10, h * 0.76), '大部分交互功能可以通过输入‘取消’,‘算了’来取消当前交互\n对我说 “指令名 帮助” 获取对应详细帮助\n' A.text((10, h * 0.76), '大部分交互功能可以通过输入‘取消’,‘算了’来取消当前交互\n对我说 “指令名 帮助” 获取对应详细帮助\n'
'可以通过 “滴滴滴- 后接内容” 联系管理员(有趣的想法尽管来吧!<还有Bug和建议>\n[群管理员请看 管理员帮助(群主与管理员自带 5 级权限)]') '可以通过 “滴滴滴- 后接内容” 联系管理员(有趣的想法尽管来吧!<还有Bug和建议>'
A.text((10, h * 0.81), f"【注】「色图概率:好感度 + 70%\n" '\n[群管理员请看 管理员帮助(群主与管理员自带 5 级权限)]\n\n'
f"\t\t每 3 点好感度 + 1次开箱初始 20 次\n" '\t「如果真寻回复了一些不符合人设的话那是因为每日白嫖的图灵次数已用完使用的是备用接口【QAQ】」')
f"\t\t开启/关闭功能只需输入‘开启/关闭 指令名’(每个功能的第一个指令)」\n"
f"\t\t示例:开启签到")
A.save(IMAGE_PATH + 'help.png') 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示例:开启签到\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') A.save(DATA_PATH + f'group_help/{group_id}.png')
@ -140,4 +142,15 @@ def rcmd(dfg):
return 'pixiv_s' 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 '没有此功能的帮助信息...'

View File

@ -96,7 +96,7 @@ async def _(matcher: Matcher, bot: Bot, event: MessageEvent, state: T_State):
# 为什么AI会自己和自己聊天 # 为什么AI会自己和自己聊天
@run_preprocessor @run_preprocessor
async def _(matcher: Matcher, bot: Bot, event: PrivateMessageEvent, state: T_State): 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会自己和自己聊天') raise IgnoredException('为什么AI会自己和自己聊天')

View File

@ -1,18 +1,20 @@
from nonebot import on_command from nonebot import on_command
from util.user_agent import get_user_agent from util.user_agent import get_user_agent
from bs4 import BeautifulSoup
from services.log import logger from services.log import logger
from nonebot.adapters.cqhttp import Bot, Event from nonebot.adapters.cqhttp import Bot, Event
from nonebot.typing import T_State from nonebot.typing import T_State
import aiohttp import aiohttp
from asyncio.exceptions import TimeoutError from asyncio.exceptions import TimeoutError
try:
import ujson as json
except ModuleNotFoundError:
import json
__plugin_name__ = '鸡汤' __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) jitang = on_command("鸡汤", aliases={"毒鸡汤"}, priority=5, block=True)
@ -20,19 +22,23 @@ jitang = on_command("鸡汤", aliases={"毒鸡汤"}, priority=5, block=True)
@jitang.handle() @jitang.handle()
async def _(bot: Bot, event: Event, state: T_State): async def _(bot: Bot, event: Event, state: T_State):
if str(event.get_message()) in ['帮助']: params = {
await jitang.finish(__plugin_usage__) "format": "json",
"token": "h0KuF6qNniMHGUtA"
}
try: try:
async with aiohttp.ClientSession(headers=get_user_agent()) as session: async with aiohttp.ClientSession(headers=get_user_agent()) as session:
async with session.get(url, timeout=7) as response: async with session.get(url, timeout=7, params=params) as response:
soup = BeautifulSoup(await response.text(), 'lxml') if response.status == 200:
result = (soup.find_all('h3', {'class': 'text-center'}))[0].text data = await response.json()
await jitang.send(result) await jitang.send(data['data']['content'])
logger.info( logger.info(
f"(USER {event.user_id}, GROUP {event.group_id if event.message_type != 'private' else 'private'})" f"(USER {event.user_id}, GROUP {event.group_id if event.message_type != 'private' else 'private'})"
f" 发送鸡汤:" + result) f" 发送鸡汤:" + data['data']['content'])
else:
await jitang.send('鸡汤煮坏掉了...')
except TimeoutError: except TimeoutError:
await jitang.send("鸡汤煮超时了##", at_sender=True) await jitang.send("鸡汤煮超时了##", at_sender=True)
except Exception as e: # except Exception as e:
await jitang.send("出错啦!再试一次吧!", at_sender=True) # await jitang.send("出错啦!再试一次吧!", at_sender=True)
logger.info(f'鸡汤error e:{e}') # logger.info(f'鸡汤error e:{e}')

View File

@ -9,6 +9,8 @@ from services.log import logger
__plugin_name__ = '查看群最后聊天时间 [Hidden]' __plugin_name__ = '查看群最后聊天时间 [Hidden]'
__plugin_usage__ = '用法:无'
last_chat = on_message(priority=1, block=False, permission=GROUP) last_chat = on_message(priority=1, block=False, permission=GROUP)

View File

@ -9,6 +9,10 @@ from services.log import logger
from util.utils import UserExistLimiter, get_message_text from util.utils import UserExistLimiter, get_message_text
from util.img_utils import pic2b64 from util.img_utils import pic2b64
__plugin_name__ = '鲁迅说'
__plugin_usage__ = '用法:鲁迅说 [消息]'
_ulmt = UserExistLimiter() _ulmt = UserExistLimiter()

View File

@ -11,8 +11,8 @@ from configs.path_config import IMAGE_PATH
__plugin_name__ = '移动图片' __plugin_name__ = '移动图片'
__plugin_usage__ = '移动图片帮助:\n\t' \ __plugin_usage__ = '移动图片帮助:\n\t' \
'1.查看列表 --> 指令: 移动图片 列表/目录\n\t' \ '1.查看列表 --> 指令: 移动图片 列表/目录\n\t' \
'2.移动图片 源 目的 id\n\t\t示例: 移动图片 色图 美图 1234' '2.移动图片 源 目的 id\n\t\t示例: 移动图片 色图 美图 1234'
move_img = on_command('移动图片', priority=5, rule=to_me(), block=True) move_img = on_command('移动图片', priority=5, rule=to_me(), block=True)

View File

@ -18,6 +18,8 @@ except ModuleNotFoundError:
__plugin_name__ = '刷屏禁言' __plugin_name__ = '刷屏禁言'
__plugin_usage__ = '刷屏禁言检测'
mute = on_message(priority=1, block=False) mute = on_message(priority=1, block=False)
mute_setting = on_command('mute_setting', aliases={'设置检测时间', '设置检测次数', '设置禁言时长', '刷屏检测设置'}, permission=GROUP, block=True) mute_setting = on_command('mute_setting', aliases={'设置检测时间', '设置检测次数', '设置禁言时长', '刷屏检测设置'}, permission=GROUP, block=True)

View File

@ -9,6 +9,13 @@ import random
from models.ban_user import BanUser from models.ban_user import BanUser
from services.log import logger from services.log import logger
__plugin_name__ = '昵称系统'
__plugin_usage__ = '用法:\n' \
'以后叫我 [名称]\n' \
'真寻我是谁'
nickname = on_command('nickname', nickname = on_command('nickname',
aliases={'以后叫我', '以后请叫我', '称呼我', '以后请称呼我', '以后称呼我', '叫我', '请叫我'}, aliases={'以后叫我', '以后请叫我', '称呼我', '以后请称呼我', '以后称呼我', '叫我', '请叫我'},
rule=to_me(), priority=5, block=True) rule=to_me(), priority=5, block=True)

View File

@ -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()))

View File

@ -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__()

View File

@ -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")

View File

@ -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

View File

@ -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骰子设定指令,标准格式为xdyx为骰子数量y为骰子面数\n" \
"a检定指令根据后续a_number设定数值检定\n" \
"h暗骰指令骰子结构将会私聊发送给该指令者\n" \
"#:多轮投掷指令,#后接数字即可设定多轮投掷;\n" \
"bp奖励骰与惩罚骰\n" \
"+/-:附加计算指令,目前仅支持数字\n" \
"示例:\n" \
".r#2bba 70两次投掷 1D100 附加两个奖励骰判定值为70\n" \
".rahD100暗骰由于没有 a_number 参数,判定将被忽略\n" \
".ra2d8+10 702D8+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对待动物的态度近乎疯狂地友好。"
]

View File

@ -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

View File

@ -19,6 +19,14 @@ from .trace import get_des as get_des_trace
from .yandex import get_des as get_des_yandex 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): async def get_des(url: str, mode: str, user_id: int):
""" """
:param url: 图片链接 :param url: 图片链接

View File

@ -12,6 +12,14 @@ msg_ids = {}
max_size = withdraw_config.withdraw_max_size 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): def get_key(msg_type, id):
return f'{msg_type}_{id}' return f'{msg_type}_{id}'

View File

@ -1,4 +1,4 @@
import json
import os import os
import aiohttp import aiohttp
from util.user_agent import get_user_agent from util.user_agent import get_user_agent
@ -14,6 +14,10 @@ from configs.path_config import TTF_PATH
import re import re
from nonebot.adapters.cqhttp import MessageSegment from nonebot.adapters.cqhttp import MessageSegment
__plugin_name__ = '我有一个朋友'
__plugin_usage__ = '用法:我有一个朋友说/问 [消息] [at](不艾特则群员随机)'
one_friend = on_regex('^我.*?朋友.*?(想问问|说|让我问问|想问|让我问|想知道|让我帮他问问|让我' one_friend = on_regex('^我.*?朋友.*?(想问问|说|让我问问|想问|让我问|想知道|让我帮他问问|让我'
'帮他问|让我帮忙问|让我帮忙问问|问).*', priority=5, block=True) '帮他问|让我帮忙问|让我帮忙问问|问).*', priority=5, block=True)

View File

@ -19,7 +19,7 @@ __plugin_usage__ = (
'2.突围大行动武器箱\n\t' '2.突围大行动武器箱\n\t'
'3.命悬一线武器箱\n\t' '3.命悬一线武器箱\n\t'
'4.裂空武器箱\n\t' '4.裂空武器箱\n\t'
'5.光谱武器箱\n\t' '5.光谱武器箱\n'
'示例:小真寻开箱 突围大行动(不输入指定武器箱则随机)\n' '示例:小真寻开箱 突围大行动(不输入指定武器箱则随机)\n'
'示例:我的开箱(开箱统计)\n' '示例:我的开箱(开箱统计)\n'
'示例:群开箱统计\n' '示例:群开箱统计\n'

View File

@ -12,10 +12,9 @@ from models.group_remind import GroupRemind
from nonebot.adapters.cqhttp.exception import ActionFailed from nonebot.adapters.cqhttp.exception import ActionFailed
import time import time
import aiohttp import aiohttp
import bilibili_api from bilibili_api import settings
if get_local_proxy(): if get_local_proxy():
proxy_ip_port = get_local_proxy().split("//", maxsplit=1)[1] settings.proxy = get_local_proxy()
bilibili_api.request_settings["proxies"] = {'http': f'http://{proxy_ip_port}', 'https': f'https://{proxy_ip_port}'}
parse_bilibili_json = on_message(priority=1, permission=GROUP, block=False) 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 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: async with session.get(data['meta']['detail_1']['qqdocurl'], proxy=get_local_proxy(), timeout=7) as response:
url = str(response.url).split("?")[0] url = str(response.url).split("?")[0]
print(url)
bvid = url.split('/')[-1] 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'] aid = vd_info['aid']
title = vd_info['title'] title = vd_info['title']
author = vd_info['owner']['name'] author = vd_info['owner']['name']
@ -54,10 +52,6 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
except ActionFailed: except ActionFailed:
logger.warning(f'{event.group_id} 发送bilibili解析失败') logger.warning(f'{event.group_id} 发送bilibili解析失败')
logger.info(f'USER {event.user_id} GROUP {event.group_id} 解析bilibili转发 {url}') logger.info(f'USER {event.user_id} GROUP {event.group_id} 解析bilibili转发 {url}')
else:
return
else:
return

View File

@ -7,7 +7,10 @@ import time
from services.log import logger from services.log import logger
from nonebot.adapters.cqhttp.exception import NetworkError from nonebot.adapters.cqhttp.exception import NetworkError
__plugin_usage__1 = '''P站排行榜帮助
__plugin_name__ = 'P站'
__plugin_usage__ = '''P站排行榜帮助
可选参数 可选参数
类型 类型
1. 日排行 1. 日排行
@ -20,27 +23,26 @@ __plugin_usage__1 = '''P站排行榜帮助
8. R18受男性欢迎排行 8. R18受男性欢迎排行
9. R18重口排行慎重 9. R18重口排行慎重
使用时选择参数序号即可R18仅可私聊 使用时选择参数序号即可R18仅可私聊
p站排行榜 类型 数量(可选) 日期(可选) p站排行榜 [参数] [数量](可选) [日期](可选)
示例 示例
p站排行榜 无参数默认为日榜 p站排行榜 无参数默认为日榜
p站排行榜 1 p站排行榜 1
p站排行榜 1 5 p站排行榜 1 5
p站排行榜 1 5 2018-4-25 p站排行榜 1 5 2018-4-25
注意空格在线搜索会较慢 注意空格在线搜索会较慢
''' ---------------------------------
'P站搜图帮助
__plugin_usage__2 = '''P站搜图帮助 可选参数
可选参数 1.热度排序
1.热度排序 2.时间排序
2.时间排序 使用时选择参数序号即可R18仅可私聊
使用时选择参数序号即可R18仅可私聊 搜图 [关键词] [数量](可选) [排序方式](可选) [r18](可选)
搜图 关键词 数量(可选) 排序方式(可选) r18(可选) 示例
示例 搜图 樱岛麻衣
搜图 樱岛麻衣 搜图 樱岛麻衣 5 1
搜图 樱岛麻衣 5 1 搜图 樱岛麻衣 5 2 r18
搜图 樱岛麻衣 5 2 r18 默认为 热度排序
默认为 热度排序 注意空格在线搜索会较慢数量可能不符
注意空格在线搜索会较慢数量可能不符
''' '''
rank_dict = { rank_dict = {
@ -64,8 +66,6 @@ pixiv_keyword = on_command('搜图', priority=5, block=True)
@pixiv_rank.handle() @pixiv_rank.handle()
async def _(bot: Bot, event: MessageEvent, state: T_State): async def _(bot: Bot, event: MessageEvent, state: T_State):
msg = get_message_text(event.json()).strip() msg = get_message_text(event.json()).strip()
if msg in ['帮助']:
await pixiv_rank.finish(__plugin_usage__1)
msg = msg.split(' ') msg = msg.split(' ')
msg = [m for m in msg if m] msg = [m for m in msg if m]
if not msg: if not msg:
@ -111,8 +111,6 @@ async def _(bot: Bot, event: MessageEvent, state: T_State):
@pixiv_keyword.handle() @pixiv_keyword.handle()
async def _(bot: Bot, event: MessageEvent, state: T_State): async def _(bot: Bot, event: MessageEvent, state: T_State):
msg = get_message_text(event.json()).strip() 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 event.message_type == 'group':
if msg.find('r18') != -1: if msg.find('r18') != -1:
await pixiv_keyword.finish('(脸红#) 你不会害羞的 八嘎!', at_sender=True) await pixiv_keyword.finish('(脸红#) 你不会害羞的 八嘎!', at_sender=True)

View File

@ -9,7 +9,9 @@ import random
from util.utils import CountLimiter from util.utils import CountLimiter
from models.ban_user import BanUser from models.ban_user import BanUser
# 戳 一 戳 __plugin_name__ = '戳一戳 [Hidden]'
__plugin_usage__ = '用法:无'
poke__reply = [ poke__reply = [
"lsp你再戳", "连个可爱美少女都要戳的肥宅真恶心啊。", "lsp你再戳", "连个可爱美少女都要戳的肥宅真恶心啊。",
@ -21,12 +23,12 @@ poke__reply = [
_clmt = CountLimiter(3) _clmt = CountLimiter(3)
poke_ = on_notice(priority=5) poke_ = on_notice(priority=5, block=False)
@poke_.handle() @poke_.handle()
async def _poke_(bot: Bot, event: PokeNotifyEvent, state: T_State) -> None: async def _poke_(bot: Bot, event: PokeNotifyEvent, state: T_State):
if event.notice_type == 'notify' and event.sub_type == 'poke' and event.self_id == event.target_id: if event.self_id == event.target_id:
_clmt.add(event.user_id) _clmt.add(event.user_id)
if _clmt.check(event.user_id) or random.random() < 0.3: if _clmt.check(event.user_id) or random.random() < 0.3:
rst = '' 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) await poke_.finish(rst + random.choice(poke__reply), at_sender=True)
rand = random.random() rand = random.random()
if rand <= 0.3: if rand <= 0.3:
path = random.choice(['loli/', 'meitu/']) path = random.choice(['luoli/', 'meitu/'])
index = random.randint(0, len(os.listdir(IMAGE_PATH + path))) index = random.randint(0, len(os.listdir(IMAGE_PATH + path)))
result = f'id{index}' + image(f'{index}.jpg', path) result = f'id{index}' + image(f'{index}.jpg', path)
await poke_.send(result) await poke_.send(result)

View File

@ -17,8 +17,6 @@ url = 'https://international.v1.hitokoto.cn/?c=a'
@quotations.handle() @quotations.handle()
async def _(bot: Bot, event: MessageEvent, state: T_State): 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 aiohttp.ClientSession() as session:
async with session.get(url, proxy=get_local_proxy(), timeout=5) as response: async with session.get(url, proxy=get_local_proxy(), timeout=5) as response:
data = await response.json() data = await response.json()

348
plugins/russian/__init__.py Normal file
View File

@ -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

View File

@ -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

View File

@ -29,8 +29,6 @@ async def _(bot: Bot, event: Event, state: T_State):
@search_anime.handle() @search_anime.handle()
async def _(bot: Bot, event: Event, state: T_State): 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): if _ulmt.check(event.user_id):
await search_anime.finish('您有动漫正在搜索,请稍等...', at_sender=True) await search_anime.finish('您有动漫正在搜索,请稍等...', at_sender=True)
_ulmt.set_True(event.user_id) _ulmt.set_True(event.user_id)

View File

@ -10,8 +10,8 @@ from util.utils import UserExistLimiter, get_message_text
__plugin_name__ = '查询皮肤' __plugin_name__ = '查询皮肤'
__plugin_usage__ = '查询皮肤帮助:\n\t' \ __plugin_usage__ = '查询皮肤帮助:\n\t' \
'对我说 "查询皮肤 xxx yyyy"我会回复xxx的底价哦\n\t' \ '查询皮肤 [枪械名] [皮肤]\n\t' \
'示例: 查询皮肤 awp 二西莫夫' '示例: 查询皮肤 awp 二西莫夫'
_ulmt = UserExistLimiter() _ulmt = UserExistLimiter()

View File

@ -54,7 +54,7 @@ async def _(bot: Bot, event: Event, state: T_State):
await send_img.finish(f"不想给你看Ov|") await send_img.finish(f"不想给你看Ov|")
pa = on_keyword({""}, priority=1, block=True) pa = on_keyword({"", "爪巴"}, priority=1, block=True)
@pa.handle() @pa.handle()

View File

@ -20,7 +20,7 @@ __plugin_usage__ = f'''示例:
2. 色图r 随机在线十张r18涩图 2. 色图r 随机在线十张r18涩图
3. 色图 666 本地色图id 3. 色图 666 本地色图id
4. 色图 xx 在线搜索xx色图 4. 色图 xx 在线搜索xx色图
5. 色图r xx 搜索十张xx的r18涩图注意空格仅私聊 5. 色图r xx 搜索十张xx的r18涩图注意空格仅私聊每日限制5次
6. 来n张涩图 本地涩图连发1<=n<=9 6. 来n张涩图 本地涩图连发1<=n<=9
7. 来n张xx的涩图 在线搜索xx涩图较慢看网速 7. 来n张xx的涩图 在线搜索xx涩图较慢看网速
色图r每日提供{MAX_SETU_R_COUNT} 色图r每日提供{MAX_SETU_R_COUNT}
@ -84,6 +84,7 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
try: try:
urls, text_list, code = await get_setu_urls(keyword, num, r18=r18) urls, text_list, code = await get_setu_urls(keyword, num, r18=r18)
except ClientConnectorError: except ClientConnectorError:
_ulmt.set_False(event.user_id)
await setu.finish('网络失败了..别担心!正在靠运气上网!', at_sender=True) await setu.finish('网络失败了..别担心!正在靠运气上网!', at_sender=True)
else: else:
if code == 200: 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): if await UserCount.check_count(event.user_id, 'setu_r18', MAX_SETU_R_COUNT):
_ulmt.set_False(event.user_id) _ulmt.set_False(event.user_id)
await setu.finish('要节制啊,请明天再来...\n【每日提供5次】', at_sender=True) await setu.finish('要节制啊,请明天再来...\n【每日提供5次】', at_sender=True)
else:
await UserCount.add_count(event.user_id, 'setu_r18', count=1)
try: try:
urls, text_list, code = await get_setu_urls(keyword, num, r18=r18) urls, text_list, code = await get_setu_urls(keyword, num, r18=r18)
except ClientConnectorError: except ClientConnectorError:

View File

@ -24,19 +24,20 @@ path = 'setu/'
async def get_setu_urls(keyword: str, num: int = 1, r18: int = 0): async def get_setu_urls(keyword: str, num: int = 1, r18: int = 0):
# print(keyword) # print(keyword)
if r18 == 1: if r18 == 1:
file_name = 'setu_r18_url.txt' file_name = 'setu_r18_url.json'
else: else:
file_name = 'setu_url.txt' file_name = 'setu_url.json'
try: try:
with open(TXT_PATH + file_name, 'r') as f: with open(TXT_PATH + file_name, 'r', encoding='utf8') as f:
txt_data = f.read() txt_data = json.load(f)
except FileNotFoundError: except (FileNotFoundError, ValueError):
txt_data = '' txt_data = {}
txt_urls = [txt_data[x]['img_url'] for x in txt_data.keys()]
params = { params = {
"apikey": LOLICON_KEY, # 添加apikey "apikey": LOLICON_KEY, # 添加apikey
'r18': r18, # 添加r18参数 0为否1为是2为混合 'r18': r18, # 添加r18参数 0为否1为是2为混合
'keyword': keyword, # 若指定关键字,将会返回从插画标题、作者、标签中模糊搜索的结果 'keyword': keyword, # 若指定关键字,将会返回从插画标题、作者、标签中模糊搜索的结果
'num': num, # 一次返回的结果数量范围为1到10不提供 APIKEY 时固定为1 'num': 100, # 一次返回的结果数量范围为1到10不提供 APIKEY 时固定为1
'size1200': 1, # 是否使用 master_1200 缩略图,以节省流量或提升加载速度 'size1200': 1, # 是否使用 master_1200 缩略图,以节省流量或提升加载速度
} }
urls = [] urls = []
@ -53,7 +54,6 @@ async def get_setu_urls(keyword: str, num: int = 1, r18: int = 0):
if response.status == 200: if response.status == 200:
data = await response.json() data = await response.json()
if data['code'] == 0: if data['code'] == 0:
# print(len(data['data']))
for i in range(len(data['data'])): for i in range(len(data['data'])):
img_url = data['data'][i]['url'] img_url = data['data'][i]['url']
title = data['data'][i]['title'] 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'] pid = data['data'][i]['pid']
urls.append(img_url) urls.append(img_url)
text_list.append(f'title{title}\nauthor{author}\nPID{pid}') text_list.append(f'title{title}\nauthor{author}\nPID{pid}')
img_url = str(img_url).replace('img-master', 'img-original').replace('_master1200', '') tags = []
txt_data += img_url + ',' 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: if DOWNLOAD_SETU:
with open(TXT_PATH + file_name, 'w') as f: with open(TXT_PATH + file_name, 'w', encoding='utf8') as f:
f.write(txt_data) json.dump(txt_data, f, ensure_ascii=False, indent=4)
return urls, text_list, 200 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: else:
return "没找到符合条件的色图...", '', 401 return "没找到符合条件的色图...", '', 401
except TimeoutError: 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): async def find_img_index(img_url, user_id):
try: 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): except (FileNotFoundError, ValueError):
setu_hash_dict = {} setu_data = {}
async with aiohttp.ClientSession() as session: async with aiohttp.ClientSession() as session:
async with session.get(img_url, proxy=get_local_proxy(), timeout=5) as res: 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: async with aiofiles.open(IMAGE_PATH + f"temp/{user_id}_find_setu_index.jpg", 'wb') as f:
await f.write(await res.read()) await f.write(await res.read())
img_hash = str(get_img_hash(IMAGE_PATH + f"temp/{user_id}_find_setu_index.jpg")) img_hash = str(get_img_hash(IMAGE_PATH + f"temp/{user_id}_find_setu_index.jpg"))
try: try:
tp = list(setu_hash_dict.keys())[list(setu_hash_dict.values()).index(img_hash)] index = str([setu_data[x]['img_hash'] for x in setu_data.keys()].index(img_hash))
return "id --> " + str(tp) 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: except ValueError:
return "该图不在色图库中!" return "该图不在色图库中!"
@ -167,10 +187,10 @@ def delete_img(_id: int):
try: try:
os.remove(IMAGE_PATH + path + f'{_id}.jpg') os.remove(IMAGE_PATH + path + f'{_id}.jpg')
if _id != lens: 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)] setu_hash_dict[str(_id)] = setu_hash_dict[str(lens)]
os.rename(IMAGE_PATH + path + f'{lens}.jpg', IMAGE_PATH + path + f'{_id}.jpg') 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) json.dump(setu_hash_dict, f, ensure_ascii=False, indent=4)
return True, '' return True, ''
except Exception as e: except Exception as e:
@ -183,7 +203,7 @@ async def add_img(imgs: list):
index = 0 index = 0
lens = len(os.listdir(IMAGE_PATH + path)) lens = len(os.listdir(IMAGE_PATH + path))
add_count = 0 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: async with aiohttp.ClientSession() as session:
for img in imgs: for img in imgs:
async with session.get(img, proxy=get_local_proxy(), timeout=5) as res: 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 index -= 1
for i in range(index, -1, -1): for i in range(index, -1, -1):
img_hash = str(get_img_hash(IMAGE_PATH + f"temp/add_setu_check_{index}.jpg")) 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_data_dict[x]['img_hash'] for x in setu_data_dict.keys()]:
if img_hash not in setu_hash_dict.values():
os.rename(IMAGE_PATH + f"temp/add_setu_check_{index}.jpg", IMAGE_PATH + path + f'/{lens}.jpg') os.rename(IMAGE_PATH + f"temp/add_setu_check_{index}.jpg", IMAGE_PATH + path + f'/{lens}.jpg')
print(f'{lens}: {img_hash}') setu_data_dict[lens] = {
setu_hash_dict[lens] = img_hash 'title': 'not title',
'author': 'not author',
'pid': 'not pid',
'img_hash': img_hash,
'img_url': 'not url',
}
lens += 1 lens += 1
add_count += 1 add_count += 1
if add_count: if add_count:
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) json.dump(setu_data_dict, f, ensure_ascii=False, indent=4)
return lens, add_count return lens, add_count

View File

@ -13,7 +13,7 @@ server_ip = on_command("服务器", aliases={'ip'}, rule=to_me(), priority=5, bl
@server_ip.handle() @server_ip.handle()
async def _(bot: Bot, event: PrivateMessageEvent, state: T_State): async def _(bot: Bot, event: PrivateMessageEvent, state: T_State):
await server_ip.finish("|* 请不要发给其他人! *|\n" await server_ip.finish("|* 请不要发给其他人! *|\n"
"\t*************\n" "\t121.40.195.22\n"
"|* 请不要发给其他人! *|\n" "|* 请不要发给其他人! *|\n"
"csgo ~号键控制台输入 connect 121.40.195.22 进入服务器\n" "csgo ~号键控制台输入 connect 121.40.195.22 进入服务器\n"
"然后再公屏输入 !diy 来使用皮肤(英文感叹号,注意)\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): async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
if event.group_id == 698279647: if event.group_id == 698279647:
await server_ip.finish("嗨呀!当前服务器地址是:" 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.22025565")
elif event.group_id == 1046451860: elif event.group_id == 1046451860:
await server_ip.finish("嗨呀!当前服务器地址是:\n121.40.195.22\n !diy") await server_ip.finish("嗨呀!当前服务器地址是:\n121.40.195.22\n !diy")
else: else:

View File

@ -3,71 +3,61 @@ from services.log import logger
from nonebot.adapters.cqhttp import Bot, GroupMessageEvent from nonebot.adapters.cqhttp import Bot, GroupMessageEvent
from nonebot.typing import T_State from nonebot.typing import T_State
from util.utils import get_message_text, is_number 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 services.db_context import db
from nonebot.adapters.cqhttp.permission import GROUP from nonebot.adapters.cqhttp.permission import GROUP
from models.goods_info import GoodsInfo
__plugin_name__ = '商店购买' __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) 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() @buy.handle()
async def _(bot: Bot, event: GroupMessageEvent, state: T_State): 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 ['神秘药水']: if get_message_text(event.json()) in ['神秘药水']:
await buy.finish("你们看看就好啦,这是不可能卖给你们的~", at_sender=True) 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(' ') msg = get_message_text(event.json()).strip().split(' ')
index = -1
num = 1 num = 1
if len(msg) > 1: if len(msg) > 1:
if is_number(msg[1]): if is_number(msg[1]):
num = int(msg[1]) num = int(msg[1])
print(msg, num) else:
await buy.finish('购买的数量要是数字!', at_sender=True)
# print(msg, num)
if is_number(msg[0]): if is_number(msg[0]):
msg = int(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) await buy.finish('请输入正确的商品id', at_sender=True)
index = msg - 1 goods = goods_lst[msg - 1]
else: else:
if msg[0] in glist: if msg[0] in goods_name_lst:
for i in range(len(glist)): for i in range(len(goods_name_lst)):
if msg == glist[i]: if msg[0] == goods_name_lst[i]:
index = i goods = goods_lst[i]
break break
else:
await buy.finish('请输入正确的商品名称!')
else: else:
await buy.finish('请输入正确的商品名称!', at_sender=True) await buy.finish('请输入正确的商品名称!', at_sender=True)
async with db.transaction(): async with db.transaction():
if index != -1: if (await BagUser.get_gold(event.user_id, event.group_id)) < goods.goods_price * num:
if (await UserBag.get_gold(event.user_id, event.group_id)) < plist[index] * num: await buy.finish('您的金币好像不太够哦', at_sender=True)
await buy.finish('您的金币好像不太够哦', at_sender=True) if await BagUser.spend_gold(event.user_id, event.group_id, goods.goods_price * num):
if await UserBag.spend_glod(event.user_id, event.group_id, plist[index] * num): for _ in range(num):
for _ in range(num): await BagUser.add_props(event.user_id, event.group_id, goods.goods_name)
await UserBag.add_props(event.user_id, event.group_id, glist[index]) await buy.send(f'花费 {goods.goods_price*num} 金币购买 {goods.goods_name} ×{num} 成功!', at_sender=True)
await buy.send(f'花费 {plist[index]*num} 金币购买 {glist[index]} ×{num} 成功!', at_sender=True) logger.info(f'USER {event.user_id} GROUP {event.group_id} '
logger.info(f'USER {event.user_id} GROUP {event.group_id} ' f'花费 {goods.goods_price*num} 金币购买 {goods.goods_name} ×{num} 成功!')
f'花费 {plist[index]*num} 金币购买 {glist[index]} ×{num} 成功!') else:
else: await buy.send(f'{goods.goods_name} 购买失败!', at_sender=True)
await buy.send(f'{glist[index]} 购买失败!', at_sender=True) logger.info(f'USER {event.user_id} GROUP {event.group_id} '
logger.info(f'USER {event.user_id} GROUP {event.group_id} ' f'花费 {goods.goods_price*num} 金币购买 {goods.goods_name} ×{num} 失败!')
f'花费 {plist[index]*num} 金币购买 {glist[index]} ×{num} 失败!')

28
plugins/shop/gold.py Normal file
View File

@ -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))

View File

@ -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] = {}

View File

@ -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()

View File

@ -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))

View File

@ -2,7 +2,7 @@ from nonebot import on_command
from services.log import logger from services.log import logger
from nonebot.adapters.cqhttp import Bot, GroupMessageEvent from nonebot.adapters.cqhttp import Bot, GroupMessageEvent
from nonebot.typing import T_State 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 from nonebot.adapters.cqhttp.permission import GROUP
@ -14,7 +14,7 @@ my_props = on_command("我的道具", priority=5, block=True, permission=GROUP)
@my_props.handle() @my_props.handle()
async def _(bot: Bot, event: GroupMessageEvent, state: T_State): 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: if props:
pname_list = [] pname_list = []
pnum_list = [] pnum_list = []

View File

@ -1,5 +1,5 @@
from util.utils import scheduler from util.utils import scheduler
from models.bag_user import UserBag from models.bag_user import BagUser
from services.log import logger from services.log import logger
@ -20,13 +20,12 @@ from services.log import logger
) )
async def _(): async def _():
try: try:
user_list = await UserBag.get_user_all() user_list = await BagUser.get_user_all()
if user_list: for user in user_list:
for user in user_list: await user.update(
await user.update( get_today_gold=0,
get_today_gold=0, spend_today_gold=0,
spend_today_gold=0, ).apply()
).apply()
except Exception as e: except Exception as e:
logger.error(f'重置每日金币错误 e:{e}') logger.error(f'重置每日金币错误 e:{e}')

View File

@ -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} 失败')

View File

@ -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]

View File

@ -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'))

View File

@ -3,7 +3,7 @@ from services.log import logger
from nonebot.adapters.cqhttp import Bot, GroupMessageEvent from nonebot.adapters.cqhttp import Bot, GroupMessageEvent
from nonebot.typing import T_State from nonebot.typing import T_State
from util.utils import is_number, get_message_text 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 nonebot.adapters.cqhttp.permission import GROUP
from services.db_context import db from services.db_context import db
from .data_source import effect from .data_source import effect
@ -21,7 +21,7 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
msg = get_message_text(event.json()) msg = get_message_text(event.json())
if msg in ['', '帮助']: if msg in ['', '帮助']:
await use_props.finish(__plugin_usage__) 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: if props:
async with db.transaction(): async with db.transaction():
pname_list = [] pname_list = []
@ -39,7 +39,7 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
if msg not in pname_list: if msg not in pname_list:
await use_props.finish('道具名称错误!', at_sender=True) await use_props.finish('道具名称错误!', at_sender=True)
name = msg 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 effect(event.user_id, event.group_id, name):
await use_props.send(f'使用道具 {name} 成功!', at_sender=True) await use_props.send(f'使用道具 {name} 成功!', at_sender=True)
logger.info(f'USER {event.user_id} GROUP {event.group_id} 使用道具 {name} 成功') logger.info(f'USER {event.user_id} GROUP {event.group_id} 使用道具 {name} 成功')

View File

@ -1,6 +1,6 @@
from .group_user_checkin import group_user_check_in, group_user_check, group_impression_rank from .group_user_checkin import group_user_check_in, group_user_check, group_impression_rank
from nonebot.typing import T_State 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 nonebot.adapters.cqhttp.permission import GROUP
from util.utils import get_message_text from util.utils import get_message_text
from nonebot.plugin import MatcherGroup from nonebot.plugin import MatcherGroup
@ -24,8 +24,6 @@ sign = sign_match_group.on_command("签到")
@sign.handle() @sign.handle()
async def _(bot: Bot, event: GroupMessageEvent, state: T_State): 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 sign.send(
await group_user_check_in(event.user_id, event.group_id), await group_user_check_in(event.user_id, event.group_id),
at_sender=True, at_sender=True,

View File

@ -5,7 +5,7 @@ from services.log import logger
from services.db_context import db from services.db_context import db
from models.sigin_group_user import SignGroupUser from models.sigin_group_user import SignGroupUser
from models.group_member_info import GroupInfoUser 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 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)) imgold = random.randint(1, int(impression))
if imgold > MAX_SIGN_GOLD: if imgold > MAX_SIGN_GOLD:
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: if critx2 + add_probability > 0.97 or critx2 < specify_probability:
logger.info(f'(USER {user.user_qq}, GROUP {user.belonging_group})' 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}') 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: 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 # heuristic: if users find they have never checked in they are probable to check in
user = await SignGroupUser.ensure(user_qq, group) 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( return '好感度:{:.2f}\n金币:{}\n历史签到数:{}\n上次签到日期:{}'.format(
user.impression, user.impression,
glod, gold,
user.checkin_count, user.checkin_count,
user.checkin_time_last.date() if user.checkin_time_last != datetime.min else '从未', 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) user_qq_list, impression_list = await SignGroupUser.query_impression_all(group)
_count = 11 _count = 11
if user_qq_list and impression_list: 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: if len(user_qq_list) == 0 or len(impression_list) == 0 or i == _count:
break break
impression = max(impression_list) impression = max(impression_list)
index = impression_list.index(impression) index = impression_list.index(impression)
user_qq = user_qq_list[index] user_qq = user_qq_list[index]
print(user_qq, group)
try: try:
user_name = (await GroupInfoUser.select_member_info(user_qq, group)).user_name user_name = (await GroupInfoUser.select_member_info(user_qq, group)).user_name
except Exception as e: except Exception as e:
@ -106,12 +105,12 @@ async def group_impression_rank(group: int) -> str:
return result[:-1] return result[:-1]
async def random_glod(user_id, group_id, impression): async def random_gold(user_id, group_id, impression):
if impression < 1: if impression < 1:
impression = 1 impression = 1
glod = random.randint(1, 100) + random.randint(1, int(impression)) gold = random.randint(1, 100) + random.randint(1, int(impression))
if await UserBag.add_glod(user_id, group_id, glod): if await BagUser.add_gold(user_id, group_id, gold):
return glod return gold
else: else:
return 0 return 0

View File

@ -3,6 +3,9 @@ from nonebot.adapters import Bot, Event
from nonebot.typing import T_State from nonebot.typing import T_State
from nonebot import on_command from nonebot import on_command
__plugin_name__ = '点歌'
__plugin_usage__ = '用法:点歌 [歌名]'
dataget = dataGet() dataget = dataGet()

View File

@ -98,8 +98,7 @@ class dataGet(dataApi):
r = await self.api.getSongInfo(songId) r = await self.api.getSongInfo(songId)
if r is None: if r is None:
raise WrongDataError raise WrongDataError
print(r) if r['code'] == -460:
if r['code'] == '-460':
return '网易云网络繁忙!' return '网易云网络繁忙!'
songInfo["songName"] = r["songs"][0]["name"] songInfo["songName"] = r["songs"][0]["name"]

View File

@ -37,7 +37,7 @@ async def _(bot: Bot, event: Event, state: T_State):
else: else:
result = "管理已存在, 更新权限: " + str(level) result = "管理已存在, 更新权限: " + str(level)
else: else:
if await LevelUser.delete_level(qq, event.group_id, True): if await LevelUser.delete_level(qq, event.group_id):
result = "删除管理成功!" result = "删除管理成功!"
else: else:
result = "该账号无管理权限!" result = "该账号无管理权限!"

Some files were not shown because too many files have changed in this diff Show More