首页 > 解决方案 > 不同公会的不同档案

问题描述

如何在不同的公会中制作不同的玩家信息?我的代码最初用于单个服务器。但现在我需要做更多。我试图通过 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]}**
            """
        ))

如您所见,我尝试过,但没有用(

标签: python-3.xsqlitediscorddiscord.py

解决方案


有 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}")

我知道这是一个相当长的帖子,但没有人说这种事情是一个短暂的过程。如果您有任何问题,请随时在这篇文章中发表评论,别担心,我会看到的!


推荐阅读