feat(shard): Lots of code.
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
from tortoise import BaseDBAsyncClient
|
||||
|
||||
|
||||
async def upgrade(db: BaseDBAsyncClient) -> str:
|
||||
return """
|
||||
DROP INDEX "idx_channel_server__d940e4";
|
||||
DROP INDEX "idx_ban_user_id_37a9cf";
|
||||
ALTER TABLE "report" ADD "user_avatar_url" TEXT NOT NULL;
|
||||
ALTER TABLE "report" ADD "user_name" TEXT NOT NULL;
|
||||
CREATE INDEX "idx_ban_user_id_37a9cf" ON "ban" ("user_id", "expires_at");;
|
||||
CREATE INDEX "idx_channel_server__d940e4" ON "channel" ("server_id", "is_enabled");;"""
|
||||
|
||||
|
||||
async def downgrade(db: BaseDBAsyncClient) -> str:
|
||||
return """
|
||||
DROP INDEX "idx_channel_server__d940e4";
|
||||
DROP INDEX "idx_ban_user_id_37a9cf";
|
||||
ALTER TABLE "report" DROP COLUMN "user_avatar_url";
|
||||
ALTER TABLE "report" DROP COLUMN "user_name";
|
||||
CREATE INDEX "idx_ban_user_id_37a9cf" ON "ban" ("user_id", "expires_at");;
|
||||
CREATE INDEX "idx_channel_server__d940e4" ON "channel" ("server_id", "is_enabled");;"""
|
||||
@@ -0,0 +1,21 @@
|
||||
from tortoise import BaseDBAsyncClient
|
||||
|
||||
|
||||
async def upgrade(db: BaseDBAsyncClient) -> str:
|
||||
return """
|
||||
DROP INDEX "idx_channel_server__d940e4";
|
||||
DROP INDEX "idx_ban_user_id_37a9cf";
|
||||
ALTER TABLE "user" ADD "warns_count" INT NOT NULL DEFAULT 0;
|
||||
ALTER TABLE "user" ADD "bans_count" INT NOT NULL DEFAULT 0;
|
||||
CREATE INDEX "idx_ban_user_id_37a9cf" ON "ban" ("user_id", "expires_at");;
|
||||
CREATE INDEX "idx_channel_server__d940e4" ON "channel" ("server_id", "is_enabled");;"""
|
||||
|
||||
|
||||
async def downgrade(db: BaseDBAsyncClient) -> str:
|
||||
return """
|
||||
DROP INDEX "idx_channel_server__d940e4";
|
||||
DROP INDEX "idx_ban_user_id_37a9cf";
|
||||
ALTER TABLE "user" DROP COLUMN "warns_count";
|
||||
ALTER TABLE "user" DROP COLUMN "bans_count";
|
||||
CREATE INDEX "idx_ban_user_id_37a9cf" ON "ban" ("user_id", "expires_at");;
|
||||
CREATE INDEX "idx_channel_server__d940e4" ON "channel" ("server_id", "is_enabled");;"""
|
||||
@@ -0,0 +1,24 @@
|
||||
from tortoise import BaseDBAsyncClient
|
||||
|
||||
|
||||
async def upgrade(db: BaseDBAsyncClient) -> str:
|
||||
return """
|
||||
DROP INDEX "idx_channel_server__d940e4";
|
||||
DROP INDEX "idx_ban_user_id_37a9cf";
|
||||
CREATE TABLE IF NOT EXISTS "server" (
|
||||
"id" BIGSERIAL NOT NULL PRIMARY KEY,
|
||||
"prefix" TEXT NOT NULL,
|
||||
"language" TEXT NOT NULL
|
||||
);
|
||||
COMMENT ON TABLE "server" IS 'A server.';;
|
||||
CREATE INDEX "idx_ban_user_id_37a9cf" ON "ban" ("user_id", "expires_at");;
|
||||
CREATE INDEX "idx_channel_server__d940e4" ON "channel" ("server_id", "is_enabled");;"""
|
||||
|
||||
|
||||
async def downgrade(db: BaseDBAsyncClient) -> str:
|
||||
return """
|
||||
DROP INDEX "idx_channel_server__d940e4";
|
||||
DROP INDEX "idx_ban_user_id_37a9cf";
|
||||
DROP TABLE IF EXISTS "server";
|
||||
CREATE INDEX "idx_ban_user_id_37a9cf" ON "ban" ("user_id", "expires_at");;
|
||||
CREATE INDEX "idx_channel_server__d940e4" ON "channel" ("server_id", "is_enabled");;"""
|
||||
@@ -0,0 +1,19 @@
|
||||
from tortoise import BaseDBAsyncClient
|
||||
|
||||
|
||||
async def upgrade(db: BaseDBAsyncClient) -> str:
|
||||
return """
|
||||
DROP INDEX "idx_channel_server__d940e4";
|
||||
DROP INDEX "idx_ban_user_id_37a9cf";
|
||||
ALTER TABLE "server" ADD "name" TEXT NOT NULL;
|
||||
CREATE INDEX "idx_ban_user_id_37a9cf" ON "ban" ("user_id", "expires_at");;
|
||||
CREATE INDEX "idx_channel_server__d940e4" ON "channel" ("server_id", "is_enabled");;"""
|
||||
|
||||
|
||||
async def downgrade(db: BaseDBAsyncClient) -> str:
|
||||
return """
|
||||
DROP INDEX "idx_channel_server__d940e4";
|
||||
DROP INDEX "idx_ban_user_id_37a9cf";
|
||||
ALTER TABLE "server" DROP COLUMN "name";
|
||||
CREATE INDEX "idx_ban_user_id_37a9cf" ON "ban" ("user_id", "expires_at");;
|
||||
CREATE INDEX "idx_channel_server__d940e4" ON "channel" ("server_id", "is_enabled");;"""
|
||||
+100
-2
@@ -4,6 +4,10 @@ import enum
|
||||
|
||||
from tortoise import models, fields
|
||||
|
||||
import redis.asyncio as redis
|
||||
|
||||
import orjson
|
||||
|
||||
|
||||
class Report(models.Model):
|
||||
"""
|
||||
@@ -14,6 +18,8 @@ class Report(models.Model):
|
||||
message_content = fields.TextField()
|
||||
channel_id = fields.BigIntField()
|
||||
user_id = fields.BigIntField()
|
||||
user_name = fields.TextField()
|
||||
user_avatar_url = fields.TextField()
|
||||
created_at = fields.DatetimeField(auto_now_add=True)
|
||||
resolved = fields.BooleanField(default=False, index=True)
|
||||
resolved_at = fields.DatetimeField(null=True)
|
||||
@@ -37,12 +43,15 @@ class User(models.Model):
|
||||
|
||||
id = fields.BigIntField(pk=True)
|
||||
|
||||
warns_count: int = fields.IntField(default=0)
|
||||
bans_count: int = fields.IntField(default=0)
|
||||
|
||||
is_masked = fields.BooleanField(default=False)
|
||||
is_moderator = fields.BooleanField(default=False)
|
||||
is_supporter_until = fields.DatetimeField(null=True)
|
||||
|
||||
@property
|
||||
def flags(self) -> UserFlag:
|
||||
def flag(self) -> UserFlag:
|
||||
"""
|
||||
The flags of the user.
|
||||
"""
|
||||
@@ -60,6 +69,69 @@ class User(models.Model):
|
||||
|
||||
return flags
|
||||
|
||||
@classmethod
|
||||
async def get_cache_or_db(cls, redis_client: redis.Redis, user_id: int) -> "User":
|
||||
"""
|
||||
Returns the user from the cache or the database.
|
||||
|
||||
Args:
|
||||
redis_client (redis.Redis): The Redis client.
|
||||
user_id (int): The user ID.
|
||||
|
||||
Returns:
|
||||
(User): The user.
|
||||
"""
|
||||
|
||||
cache = await redis_client.get(f"user:{user_id}")
|
||||
|
||||
instance = User(id=user_id)
|
||||
|
||||
if cache is not None:
|
||||
cache = orjson.loads(cache)
|
||||
|
||||
instance.warns_count = cache["warns_count"]
|
||||
instance.bans_count = cache["bans_count"]
|
||||
instance.is_masked = cache["is_masked"]
|
||||
instance.is_moderator = cache["is_moderator"]
|
||||
instance.is_supporter_until = (
|
||||
datetime.fromisoformat(cache["is_supporter_until"])
|
||||
if cache["is_supporter_until"] is not None
|
||||
else None
|
||||
)
|
||||
|
||||
else:
|
||||
instance, _ = await User.update_or_create(id=user_id)
|
||||
|
||||
await instance.set_cache(redis_client)
|
||||
|
||||
return instance
|
||||
|
||||
async def set_cache(self, redis_client: redis.Redis) -> None:
|
||||
"""
|
||||
Sets the user in the cache.
|
||||
|
||||
Args:
|
||||
redis_client (redis.Redis): The Redis client.
|
||||
"""
|
||||
|
||||
await redis_client.set(
|
||||
f"user:{self.id}",
|
||||
orjson.dumps(
|
||||
{
|
||||
"warns_count": self.warns_count,
|
||||
"bans_count": self.bans_count,
|
||||
"is_masked": self.is_masked,
|
||||
"is_moderator": self.is_moderator,
|
||||
"is_supporter_until": (
|
||||
self.is_supporter_until.timestamp()
|
||||
if self.is_supporter_until
|
||||
else None
|
||||
),
|
||||
}
|
||||
),
|
||||
ex=60 * 15,
|
||||
)
|
||||
|
||||
|
||||
class Ban(models.Model):
|
||||
"""
|
||||
@@ -91,7 +163,7 @@ class Channel(models.Model):
|
||||
id = fields.BigIntField(pk=True)
|
||||
server_id = fields.BigIntField(index=True)
|
||||
|
||||
is_enabled = fields.BooleanField(default=True)
|
||||
is_enabled = fields.BooleanField(null=True)
|
||||
|
||||
class Meta:
|
||||
"""
|
||||
@@ -101,3 +173,29 @@ class Channel(models.Model):
|
||||
indexes = [
|
||||
models.Index(fields=["server_id", "is_enabled"]),
|
||||
]
|
||||
|
||||
|
||||
class Server(models.Model):
|
||||
"""
|
||||
A server.
|
||||
"""
|
||||
|
||||
id = fields.BigIntField(pk=True)
|
||||
name = fields.TextField()
|
||||
prefix = fields.TextField(default="p.")
|
||||
language = fields.TextField(default="en")
|
||||
|
||||
async def set_prefix(self, redis_client: redis.Redis, prefix: str) -> None:
|
||||
"""
|
||||
Sets the prefix of the server.
|
||||
|
||||
Args:
|
||||
redis_client (redis.Redis): The Redis client.
|
||||
prefix (str): The prefix.
|
||||
"""
|
||||
|
||||
self.prefix = prefix
|
||||
|
||||
await self.save()
|
||||
|
||||
await redis_client.set(f"prefix:{self.id}", prefix, ex=60 * 60 * 24)
|
||||
|
||||
Reference in New Issue
Block a user