Delete database directory
This commit is contained in:
1 parent
4c51a1b3cb
commit
3de81e01af
4 files changed
-163
No files matched your search
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
74CC1F_0D3AA40F2B3A0_000 2 0 0 0 0 0 0
|
|
||||||
@@ -1,161 +0,0 @@
|
|||||||
from __future__ import annotations
|
|
||||||
|
|
||||||
import atexit
|
|
||||||
import os
|
|
||||||
|
|
||||||
try:
|
|
||||||
from twisted.internet import reactor
|
|
||||||
except ImportError: # Allows the database module to be used/tested without Twisted installed.
|
|
||||||
reactor = None
|
|
||||||
|
|
||||||
from Hatenatools import TMB
|
|
||||||
|
|
||||||
|
|
||||||
class Database:
|
|
||||||
"""Plain-text Flipnote database used by the original server.
|
|
||||||
|
|
||||||
This backend is intentionally single-process, matching the original design.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
newest_path = "database/new_flipnotes.dat"
|
|
||||||
if os.path.exists(newest_path):
|
|
||||||
with open(newest_path, "r", encoding="utf-8", newline="") as f:
|
|
||||||
raw = f.read()
|
|
||||||
else:
|
|
||||||
raw = ""
|
|
||||||
|
|
||||||
self.Newest = [tuple(line.split("\t")) for line in raw.splitlines() if line] if raw else []
|
|
||||||
self.Creator = {}
|
|
||||||
|
|
||||||
self.new = False
|
|
||||||
self.Views = 0
|
|
||||||
self.Stars = 0
|
|
||||||
self.Downloads = 0
|
|
||||||
|
|
||||||
if reactor is not None:
|
|
||||||
reactor.callLater(60 * 3, self.flusher)
|
|
||||||
atexit.register(self.write)
|
|
||||||
|
|
||||||
def flusher(self):
|
|
||||||
if reactor is not None:
|
|
||||||
reactor.callLater(60 * 3, self.flusher)
|
|
||||||
self.write()
|
|
||||||
|
|
||||||
def write(self):
|
|
||||||
if self.new:
|
|
||||||
if len(self.Newest) > 5000:
|
|
||||||
self.Newest = self.Newest[:5000]
|
|
||||||
with open("database/new_flipnotes.dat", "w", encoding="utf-8", newline="") as f:
|
|
||||||
f.write("\n".join("\t".join(map(str, row)) for row in self.Newest))
|
|
||||||
self.new = False
|
|
||||||
|
|
||||||
for creator_id in list(self.Creator.keys()):
|
|
||||||
creator_dir = os.path.join("database", "Creators", creator_id)
|
|
||||||
os.makedirs(creator_dir, exist_ok=True)
|
|
||||||
with open(os.path.join(creator_dir, "flipnotes.dat"), "w", encoding="utf-8", newline="") as f:
|
|
||||||
f.write("\n".join("\t".join(map(str, row)) for row in self.Creator[creator_id]))
|
|
||||||
del self.Creator[creator_id]
|
|
||||||
|
|
||||||
def CreatorExists(self, CreatorID):
|
|
||||||
return os.path.exists(os.path.join("database", "Creators", CreatorID)) or CreatorID in self.Creator
|
|
||||||
|
|
||||||
def FlipnoteExists(self, CreatorID, filename):
|
|
||||||
return os.path.exists(self.FlipnotePath(CreatorID, filename))
|
|
||||||
|
|
||||||
def GetCreator(self, CreatorID, Store=False):
|
|
||||||
if CreatorID in self.Creator:
|
|
||||||
return self.Creator[CreatorID]
|
|
||||||
|
|
||||||
creator_dir = os.path.join("database", "Creators", CreatorID)
|
|
||||||
if not os.path.exists(creator_dir):
|
|
||||||
return None
|
|
||||||
|
|
||||||
with open(os.path.join(creator_dir, "flipnotes.dat"), "r", encoding="utf-8", newline="") as f:
|
|
||||||
raw = f.read()
|
|
||||||
ret = [line.split("\t") for line in raw.splitlines() if line]
|
|
||||||
|
|
||||||
# Current format:
|
|
||||||
# filename, views, stars, green, red, blue, purple, channel, downloads
|
|
||||||
for row in ret:
|
|
||||||
filename = row[0]
|
|
||||||
defaults = (filename, 0, 0, 0, 0, 0, 0, "", 0)
|
|
||||||
while len(row) < len(defaults):
|
|
||||||
row.append(defaults[len(row)])
|
|
||||||
|
|
||||||
if Store:
|
|
||||||
self.Creator[CreatorID] = ret
|
|
||||||
return ret
|
|
||||||
|
|
||||||
def GetFlipnote(self, CreatorID, filename, Store=False):
|
|
||||||
for row in self.GetCreator(CreatorID, Store) or []:
|
|
||||||
if row[0] == filename:
|
|
||||||
return row
|
|
||||||
return False
|
|
||||||
|
|
||||||
def GetFlipnotePPM(self, CreatorID, filename):
|
|
||||||
with open(self.FlipnotePath(CreatorID, filename), "rb") as f:
|
|
||||||
return f.read()
|
|
||||||
|
|
||||||
def GetFlipnoteTMB(self, CreatorID, filename):
|
|
||||||
with open(self.FlipnotePath(CreatorID, filename), "rb") as f:
|
|
||||||
return f.read(0x6A0)
|
|
||||||
|
|
||||||
def AddFlipnote(self, content, Channel=""):
|
|
||||||
content = bytes(content)
|
|
||||||
tmb = TMB().Read(content)
|
|
||||||
if not tmb:
|
|
||||||
return False
|
|
||||||
|
|
||||||
CreatorID = tmb.EditorAuthorID
|
|
||||||
filename = tmb.CurrentFilename[:-4]
|
|
||||||
if self.FlipnoteExists(CreatorID, filename):
|
|
||||||
return False
|
|
||||||
|
|
||||||
self.new = True
|
|
||||||
self.Newest.insert(0, (CreatorID, filename))
|
|
||||||
|
|
||||||
if not self.GetCreator(CreatorID, True):
|
|
||||||
self.Creator[CreatorID] = [[filename, 0, 0, 0, 0, 0, 0, Channel, 0]]
|
|
||||||
else:
|
|
||||||
self.Creator[CreatorID].append([filename, 0, 0, 0, 0, 0, 0, Channel, 0])
|
|
||||||
|
|
||||||
creator_dir = os.path.join("database", "Creators", CreatorID)
|
|
||||||
os.makedirs(creator_dir, exist_ok=True)
|
|
||||||
with open(self.FlipnotePath(CreatorID, filename), "wb") as f:
|
|
||||||
f.write(content)
|
|
||||||
return CreatorID, filename
|
|
||||||
|
|
||||||
def AddView(self, CreatorID, filename):
|
|
||||||
for i, flipnote in enumerate(self.GetCreator(CreatorID, True) or []):
|
|
||||||
if flipnote[0] == filename:
|
|
||||||
self.Creator[CreatorID][i][1] = int(flipnote[1]) + 1
|
|
||||||
self.Views += 1
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
def AddStar(self, CreatorID, filename, amount=1, color="yellow"):
|
|
||||||
starindices = {"yellow": 2, "green": 3, "red": 4, "blue": 5, "purple": 6}
|
|
||||||
if color not in starindices:
|
|
||||||
return False
|
|
||||||
for i, flipnote in enumerate(self.GetCreator(CreatorID, True) or []):
|
|
||||||
if flipnote[0] == filename:
|
|
||||||
idx = starindices[color]
|
|
||||||
self.Creator[CreatorID][i][idx] = int(flipnote[idx]) + amount
|
|
||||||
self.Stars += 1
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
def AddDownload(self, CreatorID, filename):
|
|
||||||
for i, flipnote in enumerate(self.GetCreator(CreatorID, True) or []):
|
|
||||||
if flipnote[0] == filename:
|
|
||||||
self.Creator[CreatorID][i][8] = int(flipnote[8]) + 1
|
|
||||||
self.Downloads += 1
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
def FlipnotePath(self, CreatorID, filename):
|
|
||||||
return os.path.join("database", "Creators", CreatorID, filename + ".ppm")
|
|
||||||
|
|
||||||
|
|
||||||
Database = Database()
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
913304C0CC74CC1F 74CC1F_0D3AA40F2B3A0_000
|
|
||||||
Reference in new issue
Block a user
