python-3.x - 不同公会的不同档案
问题描述
如何在不同的公会中制作不同的玩家信息?我的代码最初用于单个服务器。但现在我需要做更多。我试图通过 WHERE AND 进行检查,但没有成功。
@client.event
async def on_ready():
await client.change_presence(activity=discord.Activity(type=discord.ActivityType.watching, name="!help"))
cursor.execute("""CREATE TABLE IF NOT EXISTS users (
name TEXT,
id INT,
cash BIGINT,
rep INT,
lvl INT,
exp INT,
hp INT,
mana INT,
maxattack INT,
minattack INT,
server_id INT
)""")
for guild in client.guilds:
for member in guild.members:
if cursor.execute(f"SELECT id FROM users WHERE id = {member.id} AND server_id = {guild.id}").fetchone() is None:
cursor.execute(f"INSERT INTO users VALUES ('{member}', {member.id}, 0, 0, 1, 0, 100, 30, 50, 39, {guild.id})")
connection.commit()
else:
pass
玩家信息:
@client.command(aliases = ['playerinfo'])
async def __playerinfo(ctx, member: discord.Member = None):
if member is None:
await ctx.send(embed = discord.Embed(
description = f"""Характеристики пользователя **{ctx.author}**
Репутация: **{cursor.execute("SELECT rep FROM users WHERE id = {ctx.author.id} AND server_id = {ctx.guild.id}").fetchone()[0]}**
Уровень: **{cursor.execute("SELECT lvl FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]}**
Кол-во опыта: **{cursor.execute("SELECT exp FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]}**
Кол-во хп: **{cursor.execute("SELECT hp FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]}**
Кол-во маны: **{cursor.execute("SELECT mana FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]}**
Кол-во денег: **{cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]}**
Максимальная Атака: **{cursor.execute("SELECT maxattack FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]}**
Минимальная Атака: **{cursor.execute("SELECT minattack FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]}**
"""
))
如您所见,我尝试过,但没有用(
解决方案
有 2 种非常常见的方式为多个服务器存储数据,类存储和 JSON 文件。首先,我将向您展示如何使用类存储来存储和调用数据。您想创建一个字典来存储类会话以及一个类来存储数据。请注意,使用此方法重新启动脚本时,所有数据都会丢失。
playerinfo = {}
class Player:
def __init__(self, variable):
self.variable = variable
然后,您可以在加入服务器时将数据添加到字典中。
@client.event
async def on_guild_join(guild):
playerinfo[guild.id] = Player(variable)
现在你可以在任何地方为特定的公会调用它!
@client.command()
async def getplayerinfo(ctx):
info = playerinfo[ctx.guild.id].variable
await ctx.send(f"Player info: {info}")
第二个选项是使用 JSON 文件存储您的数据。只要确保您已将 JSON 模块导入脚本!您可以使用以下内容创建一个新的 TXT 文件。
{playerinfo: []}
现在您可以在加入公会时添加您的公会 ID。
@client.event
async def on_guild_join(guild):
with open("data.txt") as json_file:
data = json.load(json_file)
data["playerdata"].append({
"id" = guild.id,
"variable" = variable
})
with open("data.txt", "w") as outfile:
json.dump(data, outfile)
现在我们可以从任何地方调用这些数据了!
@client.command()
async def getplayerinfo(ctx):
with open("data.txt") as json_file:
data = json.load(json_file)
for guild in data["playerdata"]:
if guild["id"] == ctx.guild.id:
info = guild["variable"]
await ctx.send(f"Player info: {info}")
我知道这是一个相当长的帖子,但没有人说这种事情是一个短暂的过程。如果您有任何问题,请随时在这篇文章中发表评论,别担心,我会看到的!