Files
ByteDiceAssistant/src/python/data.py
T

139 lines
3.9 KiB
Python

import os
import json
from typing import Final
import bot as botPy
from macros import *
BK_WEEKLY: Final[str] = "bk_weekly_art_posts"
class PostData:
def __init__(
self,
url: str,
title: str,
upvotes: int,
date_unix: int,
media_type: str,
media_urls: list[str],
nominated_by_human: bool = False,
added_by_human: bool = False,
added_by_bot: bool = False,
approved_by_human: bool = False,
approved_by_ris: bool = False
):
self.url = url
self.title = title
self.upvotes = upvotes
self.date_unix = date_unix
self.media_type = media_type
self.media_urls = media_urls
self.nominated_by_human = nominated_by_human
self.added_by_human = added_by_human
self.added_by_bot = added_by_bot
self.approved_by_human = approved_by_human
self.approved_by_ris = approved_by_ris
def to_json(self):
return {
"post_data": {
"title": self.title,
"upvotes": self.upvotes,
"date_unix": self.date_unix,
"media_type": self.media_type,
"media_urls": self.media_urls
},
"nominated_by_human": self.nominated_by_human,
"added": {
"by_human": self.added_by_human,
"by_bot": self.added_by_bot
},
"approved": {
"by_human": self.approved_by_human,
"by_ris": self.approved_by_ris
}
}
def read_data(bot: botPy.Bot) -> bool:
# Intentionally unreadable >:]
data_path = os.path.abspath(os.path.join(os.path.join(os.getcwd(), "data")))
if os.path.isfile(data_path + "\\reddit_data.json"):
bot.data_f = open(data_path + "\\reddit_data.json", "r+")
else:
if not bot.args["py"]:
return False
py_print("reddit_data.json not found, creating new from preset...")
with open(data_path + "\\reddit_data_preset.json", "r") as f:
data_preset_json = json.load(f)
data_preset_json[BK_WEEKLY].pop("EXAMPLE VALUE", None)
data_preset_json[BK_WEEKLY].pop("EXAMPLE VALUE DELETED", None)
with open(data_path + "\\reddit_data.json", "w") as f:
json.dump(data_preset_json, f, indent = 2)
bot.data_f = open(data_path + "\\reddit_data.json", "r+")
data_str = bot.data_f.read()
json_data = json.loads(data_str)
bot.data = json_data
if not bot.data["file_created_correctly"]:
raise Exception("reddit_data.json file wasn't created properly. Delete the file and retry.")
return True
def write_data(bot: botPy.Bot) -> bool:
bot.data_f.seek(0)
json.dump(bot.data, bot.data_f, indent=2)
bot.data_f.truncate()
return True
def add_post_to_data(bot: botPy.Bot, new_data: PostData, bypass_conditions: bool = False) -> bool:
if bypass_conditions:
bot.data[BK_WEEKLY][new_data.url] = new_data.to_json()
if bot.args["dev"]:
py_print(f"Added post \"{new_data.url}\" (Conditions bypassed)")
return True
updated = False
if "removed" not in bot.data[BK_WEEKLY][new_data.url]:
updated = new_data.upvotes != bot.data[BK_WEEKLY][new_data.url]["post_data"]
if new_data.url not in bot.data[BK_WEEKLY] or updated:
bot.data[BK_WEEKLY][new_data.url] = new_data.to_json()
if bot.args["dev"]:
py_print(f"Added post \"{new_data.url}\"")
return True
elif "removed" in bot.data[BK_WEEKLY][new_data.url]:
py_print(f"Failed to add post \"{new_data.url}\": Removed flag is True.")
return False
else:
py_print(f"Failed to add post \"{new_data.url}\": Already exists.")
return False
def set_approve_post(bot: botPy.Bot, approved: bool, url: str) -> bool:
if not hasattr(bot.data[BK_WEEKLY][url], "removed"):
bot.data[BK_WEEKLY][url]["approved"]["by_human"] = approved
return True
return False
def remove_post(bot: botPy.Bot, url: str, removed_by: str = "UNKNOWN") -> bool:
if url in bot.data[BK_WEEKLY]:
bot.data[BK_WEEKLY][url] = { "removed": True, "removed_by": removed_by }
return True
else:
return False