summaryrefslogtreecommitdiff
path: root/ATRI/database
diff options
context:
space:
mode:
authorYuki-Asuuna <[email protected]>2022-02-25 21:22:48 +0800
committerYuki-Asuuna <[email protected]>2022-02-25 21:22:48 +0800
commit920173c8faaab5a65459ce176d36812bac6feb08 (patch)
tree5b6925acd2804af1b64b729d50174926420c2835 /ATRI/database
parent1b5e5de6bcb0b76d432bf0d9e1a6fb9bba510e52 (diff)
downloadATRI-920173c8faaab5a65459ce176d36812bac6feb08.tar.gz
ATRI-920173c8faaab5a65459ce176d36812bac6feb08.tar.bz2
ATRI-920173c8faaab5a65459ce176d36812bac6feb08.zip
feat: 添加b站动态订阅功能
Change-Id: I8b74e3a286901379b8337e33d1b581524cb80d97
Diffstat (limited to 'ATRI/database')
-rw-r--r--ATRI/database/__init__.py1
-rw-r--r--ATRI/database/db.py77
-rw-r--r--ATRI/database/models.py22
3 files changed, 100 insertions, 0 deletions
diff --git a/ATRI/database/__init__.py b/ATRI/database/__init__.py
new file mode 100644
index 0000000..6840881
--- /dev/null
+++ b/ATRI/database/__init__.py
@@ -0,0 +1 @@
+from .db import DB
diff --git a/ATRI/database/db.py b/ATRI/database/db.py
new file mode 100644
index 0000000..c2aa015
--- /dev/null
+++ b/ATRI/database/db.py
@@ -0,0 +1,77 @@
+from tortoise import Tortoise
+
+from ATRI.database import models
+from nonebot import get_driver
+
+
+# 关于数据库的操作类,只实现与数据库有关的CRUD
+# 请不要把业务逻辑写进去
+class DB:
+ async def __aenter__(self):
+ return self
+
+ async def __aexit__(self, exc_type, exc_val, exc_tb):
+ pass
+
+ async def init(self):
+ from ATRI.database import models
+
+ await Tortoise.init(
+ db_url="sqlite://ATRI/database/db.sqlite3",
+ modules={"models": [locals()["models"]]},
+ )
+ # Generate the schema
+ await Tortoise.generate_schemas()
+
+ async def add_subscription(self, uid: int, groupid: int) -> bool:
+ try:
+ _ = await models.Subscription.create(uid=uid, groupid=groupid)
+ return True
+ except:
+ return False
+
+ async def get_all_subscriptions_by_gid(self, groupid: int) -> list:
+ try:
+ subs = await self.get_subscriptions(query_map={"groupid": groupid})
+ return subs
+ except:
+ return []
+
+ async def remove_subscription(self, query_map: dict) -> bool:
+ try:
+ ret = await models.Subscription.filter(**query_map).delete()
+ return True
+ except:
+ return False
+
+ async def get_subscriptions(self, query_map: dict) -> list:
+ try:
+ ret = await models.Subscription.filter(**query_map)
+ return ret
+ except:
+ return []
+
+ async def get_all_subscriptions(self) -> list:
+ try:
+ ret = await models.Subscription.all()
+ return ret
+ except:
+ return []
+
+ async def update_subscriptions_by_uid(self, uid: int, update_map: dict) -> bool:
+ try:
+ # why use ** ?
+ # Reference: https://stackoverflow.com/questions/5710391/converting-python-dict-to-kwargs
+ _ = await models.Subscription.filter(uid=uid).update(**update_map)
+ return True
+ except:
+ return False
+
+
+async def init():
+ async with DB() as db:
+ await db.init()
+
+
+driver = get_driver()
+driver.on_startup(init)
diff --git a/ATRI/database/models.py b/ATRI/database/models.py
new file mode 100644
index 0000000..b3953df
--- /dev/null
+++ b/ATRI/database/models.py
@@ -0,0 +1,22 @@
+"""
+ 定义SQLITE数据库的关系模式(表)
+ 数据库采用了tortoise orm,可以很好地支持异步
+"""
+
+from tortoise.models import Model
+from tortoise import fields
+from datetime import datetime
+
+# b站订阅表
+class Subscription(Model):
+ uid = fields.IntField(pk=True) # up的uid
+ groupid = fields.IntField() # 群号
+ nickname = fields.TextField(null=True) # 订阅up的名称
+ last_update = fields.DatetimeField(
+ default=datetime.fromordinal(1)
+ ) # 上一条动态更新时间 默认0001-01-01 00:00:00
+
+ def __str__(self):
+ return "[{nickname}|{uid}|{groupid}]".format(
+ nickname=self.nickname, uid=self.uid, groupid=self.groupid
+ )