プロジェクトで TinyDB を使用して、不和ボットの情報を保存しています。ユーザーが「ロール」を更新するたびに、変更された値がキャッシュされますが、ドキュメントは変更を反映して更新されません。これにより、ボットが再起動するたびにデータが保存されなくなります。
ユーザーデータは次のようになります。
{
"id": "some guid",
"userId": discordId,
"guildId": guildId,
"data": {
"rolls": {},
"bonus": {}
},
"active": true,
"first": "john",
"last": "doe"
}
「ロール」ディクショナリにキーと値を追加するコマンドがあります。コードは次のとおりです。
handler.py
def save_dice(ctx, key, value):
for x in ['+','-','*','/']:
value = x.join(value.split(x))
value = value.replace(x, f" {x} ")
character = database.get_active_character(ctx.author.id, ctx.guild.id)
character["data"]["rolls"][key] = value
database.update_character(character["id"], {"data": character["data"]})
return f"roll \"{key}\" set to \"{value}\""
データベース.py
from tinydb import TinyDB, Query
from difflib import SequenceMatcher
from pprint import pprint
from uuid import uuid4
import json
import os
script_dir = os.path.dirname(__file__) #<-- absolute dir the script is in
Row = Query()
...
# id: uuid
# guildId: discord guildid
# userId: discord userid
# data: dict containing character stuff
# active: bool
# first: first name
# last: last name
characterTable = TinyDB(os.path.join(script_dir, 'data/characters.json'))
...
def update_character(id, changedValues):
userTable.update(changedValues, (Row.id == id))