HEXI/hexi/plugins/battlefield2042status/user_manager.py

271 lines
7.9 KiB
Python
Raw Normal View History

2023-11-02 11:57:54 +08:00
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