271 lines
7.9 KiB
Python
271 lines
7.9 KiB
Python
![]() |
import os
|
|||
|
import sqlite3
|
|||
|
|
|||
|
import aiohttp
|
|||
|
|
|||
|
# 路径设置
|
|||
|
_path = os.path.dirname(__file__).replace("\\", "/")
|
|||
|
|
|||
|
DATABASE = _path + '/data/user.db'
|
|||
|
|
|||
|
_database = None
|
|||
|
|
|||
|
|
|||
|
def get_db():
|
|||
|
global _database
|
|||
|
if _database is None:
|
|||
|
_database = sqlite3.connect(DATABASE)
|
|||
|
return _database
|
|||
|
|
|||
|
|
|||
|
def close_db(exception):
|
|||
|
global _database
|
|||
|
if _database is not None:
|
|||
|
_database.close()
|
|||
|
|
|||
|
|
|||
|
# 添加名单表结构
|
|||
|
async def add_user_bind(bot, ev):
|
|||
|
uid = ev.user_id
|
|||
|
if uid == bot.config.SUPERUSERS[0]:
|
|||
|
connect = get_db()
|
|||
|
cursor = connect.cursor()
|
|||
|
sql = """CREATE TABLE user_bind(
|
|||
|
ID INTEGER PRIMARY KEY AUTOINCREMENT,
|
|||
|
player TEXT NOT NULL,
|
|||
|
platform TEXT NOT NULL,
|
|||
|
qq_id TEXT NOT NULL,
|
|||
|
nucleusId TEXT,
|
|||
|
personaId TEXT,
|
|||
|
support INTEGER NOT NULL
|
|||
|
);"""
|
|||
|
res = cursor.execute(sql)
|
|||
|
cursor.close()
|
|||
|
connect.commit()
|
|||
|
connect.close()
|
|||
|
if res.rowcount > 0:
|
|||
|
await bot.send(ev, "创建成功!")
|
|||
|
else:
|
|||
|
await bot.send(ev, "无权限")
|
|||
|
|
|||
|
|
|||
|
# 查询白名单
|
|||
|
async def query_user_bind(bot, ev, page_number=1, page_size=10):
|
|||
|
uid = ev.user_id
|
|||
|
mes = "=====名单=====\n"
|
|||
|
if uid == bot.config.SUPERUSERS[0]:
|
|||
|
connect = get_db()
|
|||
|
cursor = connect.cursor()
|
|||
|
offset = (page_number - 1) * page_size
|
|||
|
# 获取总记录数
|
|||
|
cursor.execute("SELECT COUNT(*) FROM user_bind")
|
|||
|
total_count = cursor.fetchone()[0]
|
|||
|
# 执行查询
|
|||
|
sql = f"SELECT player as 玩家名称, qq_id as QQ, platform as 平台 FROM user_bind LIMIT {page_size} OFFSET {offset}"
|
|||
|
cursor.execute(sql)
|
|||
|
users = cursor.fetchall()
|
|||
|
connect.commit()
|
|||
|
for user in users:
|
|||
|
mes += "玩家名称:" + user[0] + "\n" + "QQ:" + user[1] + "\n" + "平台:" + user[2] + "\n\n"
|
|||
|
# 添加总记录数信息
|
|||
|
mes += f"\n 当前页为{page_number},总记录数为{total_count}"
|
|||
|
await bot.send(ev, mes)
|
|||
|
else:
|
|||
|
await bot.send(ev, "无权限")
|
|||
|
|
|||
|
|
|||
|
# 绑定用户
|
|||
|
async def bind_user(uid, player, platform):
|
|||
|
mes = ''
|
|||
|
connect = get_db()
|
|||
|
cursor = connect.cursor()
|
|||
|
try:
|
|||
|
info = await get_user_info(player, uid, platform)
|
|||
|
print(info)
|
|||
|
except KeyError as e:
|
|||
|
mes += f"异常:{e}\n"
|
|||
|
return mes
|
|||
|
sql = 'INSERT INTO user_bind(player,platform,qq_id,nucleusId,personaId,support) VALUES (?,?,?,?,?,?);'
|
|||
|
cursor.execute(sql, info)
|
|||
|
|
|||
|
connect.commit()
|
|||
|
if cursor.rowcount > 0:
|
|||
|
mes += f"绑定成功,用户{uid}当前绑定的游戏id为:{player}"
|
|||
|
return mes
|
|||
|
|
|||
|
|
|||
|
async def get_user_info(player_name, uid, platform):
|
|||
|
url = f'https://api.gametools.network/bf2042/stats/' \
|
|||
|
f'?raw=false&format_values=true&name={player_name}&platform={platform}&skip_battlelog=false'
|
|||
|
headers = {
|
|||
|
'accept': 'application/json'
|
|||
|
}
|
|||
|
async with aiohttp.ClientSession() as session:
|
|||
|
try:
|
|||
|
async with session.get(url, headers=headers) as response:
|
|||
|
result = await response.json()
|
|||
|
except aiohttp.ClientError as e:
|
|||
|
# 处理网络请求异常
|
|||
|
print(f"网络请求异常: {e}")
|
|||
|
return None
|
|||
|
player_name = player_name.upper()
|
|||
|
if "userName" in result:
|
|||
|
if player_name == result['userName'].upper():
|
|||
|
nucleusId = result["userId"]
|
|||
|
personaId = result["id"]
|
|||
|
platform = platform
|
|||
|
name = result["userName"]
|
|||
|
info = (name, platform, uid, nucleusId, personaId, 0)
|
|||
|
return info
|
|||
|
else:
|
|||
|
raise ValueError("玩家数据不存在")
|
|||
|
else:
|
|||
|
# 抛出自定义异常
|
|||
|
raise KeyError("玩家数据不存在")
|
|||
|
|
|||
|
|
|||
|
# 添加支援者专属
|
|||
|
async def add_support_user(bot, ev):
|
|||
|
# 获取指令发送者的qq
|
|||
|
su_uid = ev.user_id
|
|||
|
# 获取当前群号
|
|||
|
cu_gid = ev.group_id
|
|||
|
# 判断是否为bot管理员
|
|||
|
if su_uid == bot.config.SUPERUSERS[0]:
|
|||
|
# 判断是否为at消息
|
|||
|
if ev.message[0].type == 'at':
|
|||
|
white_id = ev.message[0].data['qq']
|
|||
|
data1 = await bot.get_group_member_info(group_id=cu_gid, user_id=white_id)
|
|||
|
nickname = data1['card'] if len(data1['card']) != 0 else data1['nickname']
|
|||
|
if await update_support(white_id, 1):
|
|||
|
await bot.send(ev, f"添加 {nickname}->成功")
|
|||
|
else:
|
|||
|
await bot.finish(ev, '添加失败')
|
|||
|
else:
|
|||
|
await bot.send(ev, "无权限")
|
|||
|
|
|||
|
|
|||
|
# 添加支援者专属
|
|||
|
async def update_support(uid, support):
|
|||
|
flag = False
|
|||
|
connect = get_db()
|
|||
|
cursor = connect.cursor()
|
|||
|
data = (support, uid)
|
|||
|
sql = 'UPDATE user_bind SET support =? WHERE qq_id =?'
|
|||
|
cursor.execute(sql, data)
|
|||
|
|
|||
|
connect.commit()
|
|||
|
save_path_dir = _path + f'/img/bg/user/{uid}'
|
|||
|
if cursor.rowcount > 0:
|
|||
|
if not os.path.exists(save_path_dir):
|
|||
|
os.makedirs(save_path_dir)
|
|||
|
flag = True
|
|||
|
else:
|
|||
|
print("更新失败")
|
|||
|
return flag
|
|||
|
|
|||
|
|
|||
|
# 移除白名单
|
|||
|
async def delete_user_bind(bot, ev):
|
|||
|
# 获取指令发送者的qq
|
|||
|
su_uid = ev.user_id
|
|||
|
# 获取当前群号
|
|||
|
cu_gid = ev.group_id
|
|||
|
# 判断是否为bot管理员
|
|||
|
if su_uid == bot.config.SUPERUSERS[0]:
|
|||
|
# 判断是否为at消息
|
|||
|
if ev.message[0].type == 'at':
|
|||
|
white_id = ev.message[0].data['qq']
|
|||
|
data1 = await bot.get_group_member_info(group_id=cu_gid, user_id=white_id)
|
|||
|
nickname = data1['card'] if len(data1['card']) != 0 else data1['nickname']
|
|||
|
connect = get_db()
|
|||
|
cursor = connect.cursor()
|
|||
|
sql = "DELETE FROM user_bind WHERE qq_id = ?"
|
|||
|
result = cursor.execute(sql, (white_id,))
|
|||
|
|
|||
|
connect.commit()
|
|||
|
if cursor.rowcount > 0:
|
|||
|
await bot.send(ev, f"{nickname}->移除成功")
|
|||
|
else:
|
|||
|
await bot.send(ev, "无权限")
|
|||
|
|
|||
|
|
|||
|
async def change_bind(uid, player, platform):
|
|||
|
flag = False
|
|||
|
connect = get_db()
|
|||
|
cursor = connect.cursor()
|
|||
|
try:
|
|||
|
info = await get_user_info(player, uid)
|
|||
|
except Exception as e:
|
|||
|
print(f"异常:{e}\n")
|
|||
|
return e
|
|||
|
name = info[0]
|
|||
|
nucleusId = info[3]
|
|||
|
personaId = info[4]
|
|||
|
data = (name, nucleusId, personaId, platform, uid)
|
|||
|
sql = 'UPDATE user_bind SET player = ?, nucleusId = ?, personaId = ?,platform = ? WHERE qq_id = ?'
|
|||
|
cursor.execute(sql, data)
|
|||
|
|
|||
|
connect.commit()
|
|||
|
if cursor.rowcount > 0:
|
|||
|
flag = True
|
|||
|
else:
|
|||
|
print("更新失败")
|
|||
|
return flag
|
|||
|
|
|||
|
|
|||
|
# 绑定检查
|
|||
|
async def check_user_bind(uid):
|
|||
|
flag = False
|
|||
|
connect = get_db()
|
|||
|
cursor = connect.cursor()
|
|||
|
data = (uid,)
|
|||
|
sql = "SELECT player,platform FROM user_bind WHERE qq_id =?"
|
|||
|
result = cursor.execute(sql, data)
|
|||
|
users = result.fetchall()
|
|||
|
player = ""
|
|||
|
platform = 'pc'
|
|||
|
if len(users) > 0:
|
|||
|
player = users[0][0]
|
|||
|
platform = users[0][0]
|
|||
|
flag = True
|
|||
|
connect.commit()
|
|||
|
res = (player, flag, platform)
|
|||
|
return res
|
|||
|
|
|||
|
|
|||
|
# 支援者检查
|
|||
|
async def check_user_support(uid):
|
|||
|
flag = False
|
|||
|
connect = get_db()
|
|||
|
cursor = connect.cursor()
|
|||
|
data = (uid,)
|
|||
|
sql = "SELECT support FROM user_bind WHERE qq_id =?"
|
|||
|
result = cursor.execute(sql, data)
|
|||
|
users = result.fetchall()
|
|||
|
if len(users) > 0:
|
|||
|
if users[0][0] == 1:
|
|||
|
flag = True
|
|||
|
connect.commit()
|
|||
|
return flag
|
|||
|
|
|||
|
|
|||
|
# 支援者检查2
|
|||
|
async def check_user_support2(uid, user_name):
|
|||
|
flag = False
|
|||
|
connect = get_db()
|
|||
|
cursor = connect.cursor()
|
|||
|
data = (uid,)
|
|||
|
sql = "SELECT support,player FROM user_bind WHERE qq_id =?"
|
|||
|
result = cursor.execute(sql, data)
|
|||
|
users = result.fetchall()
|
|||
|
if len(users) > 0:
|
|||
|
if users[0][0] == 1:
|
|||
|
db_user = users[0][1]
|
|||
|
db_user = db_user.upper()
|
|||
|
data_user = user_name.upper()
|
|||
|
if db_user == data_user:
|
|||
|
flag = True
|
|||
|
connect.commit()
|
|||
|
return flag
|