数据未在 github 上为 discord.py bot 保存

Posted

技术标签:

【中文标题】数据未在 github 上为 discord.py bot 保存【英文标题】:Data not saving for discord.py bot on github 【发布时间】:2021-07-27 18:33:23 【问题描述】:

我制作了一个不和谐机器人并使用 Github 将其托管在 Heroku 上。机器人的一部分是一个调平系统,它将信息保存到名为 users.json 的文件夹中。由于我已经从本地托管切换到在 Heroku 上托管它,所以它没有保存。我的代码如下:

@client.event
async def on_member_join(member):
    with open('users.json', 'r') as f:
        users = json.load(f)

    await update_data(users, member)

    with open('users.json', 'w') as f:
        json.dump(users, f)


@client.event
async def on_message(message):
    if message.author.bot == False:
        with open('users.json', 'r') as f:
            users = json.load(f)

        await update_data(users, message.author)
        await add_experience(users, message.author, 5)
        await level_up(users, message.author, message)

        with open('users.json', 'w') as f:
            json.dump(users, f)

    await client.process_commands(message)


async def update_data(users, user):
    if not f'user.id' in users:
        users[f'user.id'] = 
        users[f'user.id']['experience'] = 0
        users[f'user.id']['level'] = 1


async def add_experience(users, user, exp):
    users[f'user.id']['experience'] += exp


async def level_up(users, user, message):
    with open('levels.json', 'r') as g:
        levels = json.load(g)
    experience = users[f'user.id']['experience']
    lvl_start = users[f'user.id']['level']
    lvl_end = int(experience ** (1 / 4))
    if lvl_start < lvl_end:
        await message.channel.send(f'user.mention has leveled up to level lvl_end')
        users[f'user.id']['level'] = lvl_end

@client.command()
async def level(ctx, member: discord.Member = None):
    if not member:
        id = ctx.message.author.id
        with open('users.json', 'r') as f:
            users = json.load(f)
        lvl = users[str(id)]['level']
        await ctx.send(f'You are at level lvl!')
    else:
        id = member.id
        with open('users.json', 'r') as f:
            users = json.load(f)
        lvl = users[str(id)]['level']
        await ctx.send(f'member is at level lvl!')

【问题讨论】:

如果您通过 Heroku 托管,据我所知,Github 上没有任何更新。我相信这通常是不可能的。 【参考方案1】:

Heroku 只托管静态应用程序,这意味着您不能在那里修改文件。

【讨论】:

哦,好的,谢谢,但是我还有其他方法可以更新它吗?喜欢另一种托管机器人的方式吗? 我认为你应该使用python字典而不是json文件,可以修改数据。,但是当你重新启动应用程序时它会重置。【参考方案2】:

在 Heroku 上托管 Discord Bot 仍然是最佳选择,但考虑到 ephemeral file system,您需要使用外部存储来保存数据。

假设您仍想存储文件(即不将应用程序转换为使用数据库),您有多种选择:

Amazon S3(使用 Python boto3 模块) Dropbox GitHub 本身(将 users.json 与源代码一起保存)

请参阅Files on Heroku以了解每个选项的详细信息。

【讨论】:

谢谢,这应该可以帮助我解决我的问题 我在 github 方式上遇到了一些问题,您发送给我的网站上的解释并没有很好地解释您需要做什么。如果你不能帮助我完全理解,它有点匆忙。 您是否也查看了 GitHub 存储库?有一个关于如何创建或更新文件的 Python 示例。每个文件更改都是一次提交。基本上,您将 json 文件与源代码一起存储。也许它并不理想,但它非常简单 示例链接:github.com/gcatanese/HerokuFiles/blob/main/app/github_api.py 在这一点上,我只是觉得我很愚蠢,呃:faceplam:我根本不明白,哈哈我想明白了

以上是关于数据未在 github 上为 discord.py bot 保存的主要内容,如果未能解决你的问题,请参考以下文章

通过在 top.gg / discordbotlist 上投票获得机器人奖励 (discord.py)

使用 Heroku 时如何从 Discord.py 异步更改为重写?

Discord.Py Opus Heroku 问题

如何在 Heroku 上安装 discord.py-rewrite 依赖项以进行 Discord 机器人托管?

IBM MobileFirst Platform 未在 iOS 上为混合应用程序触发远程禁用消息

未在 Aws Ec2 实例上为 PHP 7.2 执行 PHP 代码