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