discord.py 为不同的用户添加不同的str对象

discord.py add different str object to different users

所以我正在尝试制作一个命令,将歌曲的名称添加到用户。我只是不明白我应该怎么做。我试着查看字典文档,但在任何地方都找不到如何将变量附加到某个人。这是我当前的代码,尽管我认为它是完全错误的:

@commands.command()
    async def quote(self, ctx):
        await ctx.send("add your quote")
        msg = await self.client.wait_for('message', check=lambda message: message.author == ctx.author)
        quote = msg.content
        with open('quotes.json', 'r') as f:
            quotes = json.load(f)
        quotes.append(quote)
        with open('quotes.json', 'w') as f:
            json.dump(quotes, f)
        await ctx.send("quote added!")

如果你想让用户可以以队列类型的方式请求多首歌曲,我会创建一个字典,将用户(消息的作者)的 ( ctx.author.id) 并将该值设置为空列表,然后将用户请求的歌曲名称附加到该列表。

另一方面,如果您更喜欢每个用户一首歌,只需将值设置为用户 ID 键的歌曲。

这通常只对字典使用随意的键分配。

如何工作的示例(假设这是在您的命令中):

songs = {};

# This code if you'd like multiple songs per user.
songs[ctx.author.id] = [];
songs[ctx.author.id].append("SONG VALUE HERE");

# This code if you'd like one.
songs[ctx.author.id] = "SONG VALUE HERE";

您可以将其与字典一起使用并通过 ID 跟踪它们。小心这一点,因为 JSON 不允许您使用整数作为任何东西的键。只允许使用字符串。

    @commands.command()
    async def quote(self, ctx):
        await ctx.send("add your quote")
        msg = await self.client.wait_for('message', check=lambda message: message.author == ctx.author)
        quote = msg.content
        with open('quotes.json', 'r') as f:
            quotes = json.load(f)

        strid = str(msg.author.id)  # this is necessary for json
        if strid not in quotes.keys():
            quotes[strid] = []
        quotes[strid].append('My quote, or put whatever you need to add in here')

        with open('quotes.json', 'w') as f:
            json.dump(quotes, f)
        await ctx.send("quote added!")

作为旁注,多次打开并关闭文件是个坏主意。相反,您可以尝试这样的构造,然后您将免于打开文件这么多:

client = commands.Bot(...)
with open('quotes.json', 'r'):
    client.quotes_data = json.load(f)

@tasks.loop(minutes=3.0)  # adjust this at your liking, or execute it manually
async def save_all():
    with open('quotes.json', 'w'):
        json.dump(client.quotes_data, f)
save_all.start()