Heimdallr/database.py

251 lines
6.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import datetime
import os
from dotenv import load_dotenv
from peewee import (
SqliteDatabase,
PostgresqlDatabase,
Model,
BigIntegerField,
CharField,
TextField,
DateTimeField,
AutoField,
FloatField,
BooleanField,
CompositeKey,
ForeignKeyField,
IntegerField,
)
db = None
"""The database connection."""
load_dotenv()
if (postgres_url := os.getenv("HEIMDALLR_POSTGRES_URL")) is not None:
db = PostgresqlDatabase(postgres_url)
else:
db = SqliteDatabase("heimdallr.db")
class Infractions(Model):
"""A model for infractions."""
id = AutoField()
"""The ID of the infraction."""
guild_id = BigIntegerField()
"""The guild ID of the infraction."""
user_id = BigIntegerField()
"""The user ID of the user receiving the infraction."""
at_time = DateTimeField(default=datetime.datetime.now)
"""The time at which the infraction was received."""
weight = FloatField(default=1.0)
"""The weight/severity of the infraction."""
reason = TextField(null=True)
"""The reason for the infraction."""
given_by = BigIntegerField()
"""The user ID of the user giving the infraction."""
silent = BooleanField(default=False)
"""Whether the infraction should be silent."""
class Meta:
table_name = "Infractions"
database = db
class GuildSettings(Model):
"""A model for guild settings."""
guild_id = BigIntegerField(primary_key=True)
"""The guild ID of the guild settings."""
admin_channel = BigIntegerField(null=True)
"""The channel ID of the admin channel."""
use_name_filter = BooleanField(default=False)
"""Whether the bot should use a name filter."""
use_gatekeep = BooleanField(default=False)
"""Whether the bot should use gatekeep."""
use_logging = BooleanField(default=False)
"""Whether the bot should use logging."""
class Meta:
table_name = "GuildSettings"
database = db
class JoinLeave(Model):
"""A model for join/leave messages."""
guild_id = BigIntegerField(primary_key=True)
"""The guild ID of the guild settings."""
join_message = TextField(null=True)
"""The join message."""
leave_message = TextField(null=True)
"""The leave message."""
message_channel = BigIntegerField(null=True)
"""The channel ID of the channel to send the message in."""
join_message_enabled = BooleanField(default=True)
"""Whether the join message is enabled."""
leave_message_enabled = BooleanField(default=False)
"""Whether the leave message is enabled."""
class Meta:
table_name = "JoinLeave"
database = db
class SelfRoles(Model):
"""A model for self-assignable roles."""
guild_id = BigIntegerField()
"""The guild ID of the guild for the self-role."""
role_id = BigIntegerField()
"""The role ID of the self-role."""
role_name = TextField()
"""The name of the self-role."""
role_description = TextField(null=True)
"""The description of the self-role."""
requires = BigIntegerField(null=True)
"""The role ID of the role required to assign the self-role, if any."""
class Meta:
primary_key = CompositeKey("guild_id", "role_id")
table_name = "SelfRoles"
database = db
class SelfRoleGroups(Model):
"""A model for self-role groups."""
guild_id = BigIntegerField()
"""The guild ID of the guild for the self-role group."""
group_name = TextField()
"""The name of the self-role group."""
group_description = TextField(null=True)
"""The description of the self-role group."""
exclusive = BooleanField(default=False)
"""Whether the self-role group is exclusive."""
class Meta:
primary_key = CompositeKey("guild_id", "group_name")
table_name = "SelfRoleGroups"
database = db
class SelfRoleGroupRelations(Model):
"""A model for self-role group relations."""
guild_id = ForeignKeyField(SelfRoleGroups, field="guild_id", backref="GuildRelation")
"""The guild ID of the guild for the self-role group."""
group_name = ForeignKeyField(SelfRoleGroups, field="group_name", backref="GroupRelation")
"""The name of the self-role group."""
role_id = BigIntegerField()
"""The role ID of the self-role."""
class Meta:
primary_key = CompositeKey("guild_id", "group_name", "role_id")
table_name = "SelfRoleGroupRelations"
database = db
class ConditionalRoles(Model):
"""A model for conditional roles."""
guild_id = BigIntegerField()
"""The guild ID of the guild for the conditional role."""
role_id = BigIntegerField()
"""The role ID of the conditional role."""
condition = CharField(max_length=16)
"""The condition for the conditional role."""
condition_data = TextField()
"""The data for the condition."""
class Meta:
primary_key = CompositeKey("guild_id", "role_id")
table_name = "ConditionalRoles"
database = db
class BotMessages(Model):
guild_id = BigIntegerField()
channel_id = BigIntegerField()
message_id = BigIntegerField()
class Meta:
primary_key = CompositeKey("guild_id", "channel_id", "message_id")
table_name = "BotMessages"
database = db
class BadNames(Model):
id = AutoField()
guild_id = BigIntegerField()
regex = TextField()
class Meta:
table_name = "BadNames"
database = db
class Gatekeep(Model):
guild_id = BigIntegerField(primary_key=True)
gatekeep_method = TextField(null=True)
gatekeep_approve_role = BigIntegerField(null=True)
gatekeep_approve_message = TextField(null=True)
class Meta:
table_name = "Gatekeep"
database = db
class GatekeepCaptchas(Model):
guild_id = BigIntegerField()
user_id = BigIntegerField()
captcha = TextField(null=True)
class Meta:
primary_key = CompositeKey("guild_id", "user_id")
table_name = "GatekeepCaptchas"
database = db
class Polls(Model):
id = AutoField()
guild_id = BigIntegerField()
channel_id = BigIntegerField(null=True)
message_id = BigIntegerField(null=True)
author_id = BigIntegerField()
title = TextField()
options = TextField()
no_options = IntegerField()
multiple_choice = BooleanField()
expires = DateTimeField(null=True)
class Meta:
table_name = "Polls"
database = db
class PollVotes(Model):
id = AutoField()
poll_id = ForeignKeyField(Polls, to_field="id")
user_id = BigIntegerField()
option = IntegerField()
class Meta:
table_name = "PollVotes"
database = db
class KeywordNotify(Model):
"""ID of the keyword notify entry"""
id = AutoField()
"""ID of the guild this belongs to"""
guild_id = BigIntegerField()
"""ID of the user this belongs to"""
user_id = BigIntegerField()
"""The keyword to match in lower case"""
keyword = CharField(max_length=24)
class Meta:
table_name = "KeywordNotify"
database = db