aboutsummaryrefslogtreecommitdiffstats
path: root/api/models.py
blob: 4e4de9e00e802ee66a129d2b1d4e4f1f29eadc69 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
from django.core.validators import MaxValueValidator, MinValueValidator, RegexValidator
from django.db import models


class DocumentationLink(models.Model):
    """A documentation link used by the `!docs` command of the bot."""

    package = models.CharField(primary_key=True, max_length=50)
    base_url = models.URLField()
    inventory_url = models.URLField()


class OffTopicChannelName(models.Model):
    name = models.CharField(
        primary_key=True,
        max_length=96,
        validators=(RegexValidator(regex=r'^[a-z0-9-]+$'),)
    )


class SnakeName(models.Model):
    """A snake name used by the bot's snake cog."""

    name = models.CharField(primary_key=True, max_length=100)
    scientific = models.CharField(max_length=150)


class Role(models.Model):
    """A role on our Discord server."""

    id = models.BigIntegerField(  # noqa
        primary_key=True,
        validators=(
            MinValueValidator(
                limit_value=0,
                message="Role IDs cannot be negative."
            ),
        ),
        help_text="The role ID, taken from Discord."
    )
    name = models.CharField(
        max_length=100,
        help_text="The role name, taken from Discord."
    )
    colour = models.IntegerField(
        validators=(
            MinValueValidator(
                limit_value=0,
                message="Colour hex cannot be negative."
            ),
        ),
        help_text="The integer value of the colour of this role from Discord."
    )
    permissions = models.IntegerField(
        validators=(
            MinValueValidator(
                limit_value=0,
                message="Role permissions cannot be negative."
            ),
            MaxValueValidator(
                limit_value=2 << 32,
                message="Role permission bitset exceeds value of having all permissions"
            )
        ),
        help_text="The integer value of the permission bitset of this role from Discord."
    )


class Member(models.Model):
    """A member of our Discord server."""

    id = models.BigIntegerField(  # noqa
        primary_key=True,
        validators=(
            MinValueValidator(
                limit_value=0,
                message="User IDs cannot be negative."
            ),
        ),
        help_text="The ID of this user, taken from Discord."
    )
    name = models.CharField(
        max_length=32,
        help_text="The username, taken from Discord."
    )
    discriminator = models.PositiveSmallIntegerField(
        validators=(
            MaxValueValidator(
                limit_value=9999,
                message="Discriminators may not exceed `9999`."
            ),
        ),
        help_text="The discriminator of this user, taken from Discord."
    )
    avatar_hash = models.CharField(
        max_length=100,
        help_text=(
            "The user's avatar hash, taken from Discord. "
            "Null if the user does not have any custom avatar."
        ),
        null=True
    )
    roles = models.ManyToManyField(
        Role,
        help_text="Any roles this user has on our server."
    )


class Tag(models.Model):
    """A tag providing (hopefully) useful content, shown by the bot."""

    author = models.ForeignKey(
        Member,
        help_text="The user that originally created this tag.",
        on_delete=models.CASCADE
    )
    title = models.CharField(
        max_length=256,
        help_text="The title of this tag, displayed in the Embed.",
        unique=True
    )
    content = models.CharField(
        max_length=2048,
        help_text="The content of this tag, displayed in the Embed."
    )
    image_url = models.URLField(
        null=True,
        help_text="An optional image to display in the tag embed."
    )
    thumbnail_url = models.URLField(
        null=True,
        help_text="An optional thumbnail to display in the tag embed."
    )