Проблема заключается в сохранении данных в файлах json, скажем, они сохраняются так:
{"discordid1": {"username": "discorduser1", "roblox_username": "robloxuser1"}, "discordid2": {"username": "discorduser2", "roblox_username": "robloxuser2"}, "discordid3": { "username": "discorduser3", "roblox_username": "robloxuser3"}} вот что он видит сейчас, когда я выполняю команду, и через некоторое время (несколько часов) он показывает только 2 пользователей и указывает на то, что 1 отсутствующий пользователь исчезает (еще один файл json)
COOLDOWNS_FILE = 'cooldowns.json'
SECOND_COOLDOWNS_FILE = 'second_cooldowns.json'
USER_LOGS_FILE = "user_logs.json"
USER_REGISTRATION_FILE = "user_registration.json"
def load_json_file(file_path):
try:
with open(file_path, 'r') as f:
return json.load(f)
except FileNotFoundError:
return {}
except json.JSONDecodeError:
print(f"Error loading {file_path}: file is empty or invalid JSON")
return {}
def save_json_file(data, file_path):
with open(file_path, "w") as f:
json.dump(data, f, indent=4)
def load_cooldowns(file_path):
if not os.path.exists(file_path):
return {}
try:
with open(file_path, "r") as f:
data = json.load(f)
data_to_return = {}
for user_id, cooldown_time in data.items():
data_to_return[user_id] = dt.datetime.fromisoformat(cooldown_time.replace("Z", "+00:00"))
return data_to_return
except json.JSONDecodeError:
return {}
def save_cooldowns(cooldowns):
data_to_save = {}
for user_id, cooldown_time in cooldowns.items():
data_to_save[user_id] = cooldown_time.isoformat()
with open("cooldowns.json", "w") as f:
json.dump(data_to_save, f, indent=4)
def load_second_cooldowns():
if not os.path.exists(SECOND_COOLDOWNS_FILE):
return {}
try:
with open(SECOND_COOLDOWNS_FILE, "r") as f:
data = json.load(f)
data_to_return = {}
for user_id, cooldown_time in data.items():
data_to_return[user_id] = dt.datetime.fromisoformat(cooldown_time)
return data_to_return
except json.JSONDecodeError:
return {}
def save_second_cooldowns(second_cooldowns):
data_to_save = {}
for user_id, cooldown_time in second_cooldowns.items():
data_to_save[user_id] = cooldown_time.isoformat()
with open(SECOND_COOLDOWNS_FILE, "w") as f:
json.dump(data_to_save, f, indent=4)
cooldowns = load_cooldowns(COOLDOWNS_FILE)
second_cooldowns = load_second_cooldowns()
и вот как он сохраняет файлы
я также попробовал метод добавления, но безуспешно. он не должен сбрасывать баллы или пользователей. в таблице лидеров они все отображаются, но через некоторое время исчезают, и их очки сбрасываются, чего не должно происходить. любая помощь будет очень признательна
Вот что мы можем сделать, чтобы решить проблему:
Сначала сохраните данные во временный файл, а затем переименуйте его. Таким образом, вы не потеряете данные, если во время записи что-то пойдет не так. Если ваша программа использует несколько потоков, убедитесь, что они не взаимодействуют с файлами одновременно. Выявляйте и обрабатывайте ошибки более корректно, чтобы избежать потери данных.
Улучшенный код должен выглядеть примерно так:
import json
import os
import datetime as dt
import threading
# File paths
COOLDOWNS_FILE = 'cooldowns.json'
SECOND_COOLDOWNS_FILE = 'second_cooldowns.json'
USER_LOGS_FILE = "user_logs.json"
USER_REGISTRATION_FILE = "user_registration.json"
# Lock for safety when using threads
lock = threading.Lock()
def load_json_file(file_path):
"""Load data from a JSON file."""
with lock:
try:
if not os.path.exists(file_path):
return {}
with open(file_path, 'r') as f:
return json.load(f)
except (FileNotFoundError, json.JSONDecodeError):
return {}
def save_json_file(data, file_path):
"""Save data to a JSON file safely."""
with lock:
temp_file_path = file_path + '.tmp'
with open(temp_file_path, "w") as f:
json.dump(data, f, indent=4)
os.replace(temp_file_path, file_path)
def load_cooldowns(file_path):
"""Load cooldown times from a JSON file."""
data = load_json_file(file_path)
data_to_return = {}
for user_id, cooldown_time in data.items():
data_to_return[user_id] = dt.datetime.fromisoformat(cooldown_time.replace("Z", "+00:00"))
return data_to_return
def save_cooldowns(cooldowns):
"""Save cooldown times to a JSON file."""
data_to_save = {user_id: cooldown_time.isoformat() for user_id, cooldown_time in cooldowns.items()}
save_json_file(data_to_save, COOLDOWNS_FILE)
def load_second_cooldowns():
"""Load second cooldown times from a JSON file."""
data = load_json_file(SECOND_COOLDOWNS_FILE)
data_to_return = {}
for user_id, cooldown_time in data.items():
data_to_return[user_id] = dt.datetime.fromisoformat(cooldown_time)
return data_to_return
def save_second_cooldowns(second_cooldowns):
"""Save second cooldown times to a JSON file."""
data_to_save = {user_id: cooldown_time.isoformat() for user_id, cooldown_time in second_cooldowns.items()}
save_json_file(data_to_save, SECOND_COOLDOWNS_FILE)
# Load initial data
cooldowns = load_cooldowns(COOLDOWNS_FILE)
second_cooldowns = load_second_cooldowns()