bot.constants#

Loads bot configuration from environment variables and .env files.

By default, the values defined in the classes are used, these can be overridden by an env var with the same name.

.env and .env.server files are used to populate env vars, if present.

Module Contents#

Classes#

EnvConfig

Our default configuration for models that should load from .env files.

_Miscellaneous

Miscellaneous configuration.

_Bot

Bot data.

_Sentry

Sentry configuration.

_Channels

Channel constants.

_Roles

Role constants.

_Guild

Guild constants.

_BaseURLs

Base URLs.

_URLs

Base URLs.

_Tokens

Authentication tokens for external services.

_Emojis

Named emoji constants.

_Icons

Our default configuration for models that should load from .env files.

_Colours

Named color constants.

Attributes#

class bot.constants.EnvConfig(_case_sensitive: bool | None = None, _env_prefix: str | None = None, _env_file: pydantic_settings.sources.DotenvType | None = ENV_FILE_SENTINEL, _env_file_encoding: str | None = None, _env_ignore_empty: bool | None = None, _env_nested_delimiter: str | None = None, _env_parse_none_str: str | None = None, _secrets_dir: str | pathlib.Path | None = None, **values: Any)[source]#

Bases: pydantic_settings.BaseSettings

Our default configuration for models that should load from .env files.

model_config[source]#
class bot.constants._Miscellaneous(_case_sensitive: bool | None = None, _env_prefix: str | None = None, _env_file: pydantic_settings.sources.DotenvType | None = ENV_FILE_SENTINEL, _env_file_encoding: str | None = None, _env_ignore_empty: bool | None = None, _env_nested_delimiter: str | None = None, _env_parse_none_str: str | None = None, _secrets_dir: str | pathlib.Path | None = None, **values: Any)[source]#

Bases: EnvConfig

Miscellaneous configuration.

debug: bool = True[source]#
file_logs: bool = False[source]#
bot.constants.Miscellaneous[source]#
bot.constants.FILE_LOGS[source]#
bot.constants.DEBUG_MODE[source]#
class bot.constants._Bot(_case_sensitive: bool | None = None, _env_prefix: str | None = None, _env_file: pydantic_settings.sources.DotenvType | None = ENV_FILE_SENTINEL, _env_file_encoding: str | None = None, _env_ignore_empty: bool | None = None, _env_nested_delimiter: str | None = None, _env_parse_none_str: str | None = None, _secrets_dir: str | pathlib.Path | None = None, **values: Any)[source]#

Bases: EnvConfig

Bot data.

prefix: str = '!'[source]#
database_dsn: str = 'postgresql+psycopg://postgres:postgres@localhost:5432/anubis'[source]#
token: str = ''[source]#
trace_loggers: str = '*'[source]#
bot.constants.Bot[source]#
class bot.constants._Sentry(_case_sensitive: bool | None = None, _env_prefix: str | None = None, _env_file: pydantic_settings.sources.DotenvType | None = ENV_FILE_SENTINEL, _env_file_encoding: str | None = None, _env_ignore_empty: bool | None = None, _env_nested_delimiter: str | None = None, _env_parse_none_str: str | None = None, _secrets_dir: str | pathlib.Path | None = None, **values: Any)[source]#

Bases: EnvConfig

Sentry configuration.

dsn: str = ''[source]#
environment: str = 'production'[source]#
release_prefix: str = 'bot'[source]#
bot.constants.Sentry[source]#
class bot.constants._Channels(_case_sensitive: bool | None = None, _env_prefix: str | None = None, _env_file: pydantic_settings.sources.DotenvType | None = ENV_FILE_SENTINEL, _env_file_encoding: str | None = None, _env_ignore_empty: bool | None = None, _env_nested_delimiter: str | None = None, _env_parse_none_str: str | None = None, _secrets_dir: str | pathlib.Path | None = None, **values: Any)[source]#

Bases: EnvConfig

Channel constants.

dev_alerts: int = 1087922776024830075[source]#
mod_alerts: int = 1087908228978966669[source]#
soc_alerts: int = 1087922465021370388[source]#
dev_log: int = 1012202489342345246[source]#
mod_log: int = 1087901347040465006[source]#
soc_log: int = 1087901419132170260[source]#
soc_category: int = 1086886764255395900[source]#
bot.constants.Channels[source]#
class bot.constants._Roles(_case_sensitive: bool | None = None, _env_prefix: str | None = None, _env_file: pydantic_settings.sources.DotenvType | None = ENV_FILE_SENTINEL, _env_file_encoding: str | None = None, _env_ignore_empty: bool | None = None, _env_nested_delimiter: str | None = None, _env_parse_none_str: str | None = None, _secrets_dir: str | pathlib.Path | None = None, **values: Any)[source]#

Bases: EnvConfig

Role constants.

administrators: int = 1033457487359250524[source]#
moderators: int = 1087224451571142716[source]#
core_developers: int = 1090530634457436180[source]#
staff: int = 1038207235437887519[source]#
security: int = 1086881843636359188[source]#
bot.constants.Roles[source]#
class bot.constants._Guild(_case_sensitive: bool | None = None, _env_prefix: str | None = None, _env_file: pydantic_settings.sources.DotenvType | None = ENV_FILE_SENTINEL, _env_file_encoding: str | None = None, _env_ignore_empty: bool | None = None, _env_nested_delimiter: str | None = None, _env_parse_none_str: str | None = None, _secrets_dir: str | pathlib.Path | None = None, **values: Any)[source]#

Bases: EnvConfig

Guild constants.

id: int = 1033456860864466995[source]#
moderation_roles: tuple[int, Ellipsis] = ()[source]#
staff_roles: tuple[int, Ellipsis] = ()[source]#
bot.constants.Guild[source]#
class bot.constants._BaseURLs(_case_sensitive: bool | None = None, _env_prefix: str | None = None, _env_file: pydantic_settings.sources.DotenvType | None = ENV_FILE_SENTINEL, _env_file_encoding: str | None = None, _env_ignore_empty: bool | None = None, _env_nested_delimiter: str | None = None, _env_parse_none_str: str | None = None, _secrets_dir: str | pathlib.Path | None = None, **values: Any)[source]#

Bases: EnvConfig

Base URLs.

snekbox_eval_api: str = 'http://localhost:8060/eval'[source]#
discord_api: str = 'https://discordapp.com/api/v7/'[source]#
bot_avatar: str = 'https://raw.githubusercontent.com/python-discord/branding/main/logos/logo_circle/logo_circle.png'[source]#
github_bot_repo: str = 'https://github.com/letsbuilda/anubis'[source]#
paste: str = 'https://paste.pythondiscord.com'[source]#
bot.constants.BaseURLs[source]#
class bot.constants._URLs(_case_sensitive: bool | None = None, _env_prefix: str | None = None, _env_file: pydantic_settings.sources.DotenvType | None = ENV_FILE_SENTINEL, _env_file_encoding: str | None = None, _env_ignore_empty: bool | None = None, _env_nested_delimiter: str | None = None, _env_parse_none_str: str | None = None, _secrets_dir: str | pathlib.Path | None = None, **values: Any)[source]#

Bases: _BaseURLs

Base URLs.

discord_invite_api: str[source]#
connect_max_retries: int = 3[source]#
connect_cooldown: int = 5[source]#
paste_service: str[source]#
site_logs_view: str = 'https://pythondiscord.com/staff/bot/logs'[source]#
bot.constants.URLs[source]#
class bot.constants._Tokens(_case_sensitive: bool | None = None, _env_prefix: str | None = None, _env_file: pydantic_settings.sources.DotenvType | None = ENV_FILE_SENTINEL, _env_file_encoding: str | None = None, _env_ignore_empty: bool | None = None, _env_nested_delimiter: str | None = None, _env_parse_none_str: str | None = None, _secrets_dir: str | pathlib.Path | None = None, **values: Any)[source]#

Bases: EnvConfig

Authentication tokens for external services.

github: str = ''[source]#
bot.constants.Tokens[source]#
class bot.constants._Emojis(_case_sensitive: bool | None = None, _env_prefix: str | None = None, _env_file: pydantic_settings.sources.DotenvType | None = ENV_FILE_SENTINEL, _env_file_encoding: str | None = None, _env_ignore_empty: bool | None = None, _env_nested_delimiter: str | None = None, _env_parse_none_str: str | None = None, _secrets_dir: str | pathlib.Path | None = None, **values: Any)[source]#

Bases: EnvConfig

Named emoji constants.

cross_mark: str = '❌'[source]#
star: str = '⭐'[source]#
christmas_tree: str = '🎄'[source]#
check: str = '☑'[source]#
envelope: str = '📨'[source]#
trashcan: str = '<:trashcan:637136429717389331>'[source]#
ok_hand: str = ':ok_hand:'[source]#
hand_raised: str = '🙋'[source]#
dice_1: str = '<:dice_1:755891608859443290>'[source]#
dice_2: str = '<:dice_2:755891608741740635>'[source]#
dice_3: str = '<:dice_3:755891608251138158>'[source]#
dice_4: str = '<:dice_4:755891607882039327>'[source]#
dice_5: str = '<:dice_5:755891608091885627>'[source]#
dice_6: str = '<:dice_6:755891607680843838>'[source]#
issue_open: str = '<:IssueOpen:852596024777506817>'[source]#
issue_closed: str = '<:IssueClosed:927326162861039626>'[source]#
issue_draft: str = '<:IssueDraft:852596025147523102>'[source]#
pull_request_open: str = '<:PROpen:852596471505223781>'[source]#
pull_request_closed: str = '<:PRClosed:852596024732286976>'[source]#
pull_request_draft: str = '<:PRDraft:852596025045680218>'[source]#
pull_request_merged: str = '<:PRMerged:852596100301193227>'[source]#
number_emojis: dict[int, str][source]#
confirmation: str = '✅'[source]#
decline: str = '❌'[source]#
incident_unactioned: str = '<:incident_unactioned:719645583245180960>'[source]#
x: str = '🇽'[source]#
o: str = '🇴'[source]#
x_square: str = '<:x_square:632278427260682281>'[source]#
o_square: str = '<:o_square:632278452413661214>'[source]#
status_online: str = '<:status_online:470326272351010816>'[source]#
status_idle: str = '<:status_idle:470326266625785866>'[source]#
status_dnd: str = '<:status_dnd:470326272082313216>'[source]#
status_offline: str = '<:status_offline:470326266537705472>'[source]#
stackoverflow_tag: str = '<:stack_tag:870926975307501570>'[source]#
stackoverflow_views: str = '<:stack_eye:870926992692879371>'[source]#
reddit: str = '<:reddit:676030265734332427>'[source]#
reddit_post_text: str = '<:reddit_post_text:676030265910493204>'[source]#
reddit_post_video: str = '<:reddit_post_video:676030265839190047>'[source]#
reddit_post_photo: str = '<:reddit_post_photo:676030265734201344>'[source]#
reddit_upvote: str = '<:reddit_upvote:755845219890757644>'[source]#
reddit_comments: str = '<:reddit_comments:755845255001014384>'[source]#
reddit_users: str = '<:reddit_users:755845303822974997>'[source]#
lemon_hyperpleased: str = '<:lemon_hyperpleased:754441879822663811>'[source]#
lemon_pensive: str = '<:lemon_pensive:754441880246419486>'[source]#
failed_file: str = '<:failed_file:1073298441968562226>'[source]#
bot.constants.Emojis[source]#
class bot.constants._Icons(_case_sensitive: bool | None = None, _env_prefix: str | None = None, _env_file: pydantic_settings.sources.DotenvType | None = ENV_FILE_SENTINEL, _env_file_encoding: str | None = None, _env_ignore_empty: bool | None = None, _env_nested_delimiter: str | None = None, _env_parse_none_str: str | None = None, _secrets_dir: str | pathlib.Path | None = None, **values: Any)[source]#

Bases: EnvConfig

Our default configuration for models that should load from .env files.

crown_blurple: str = 'https://cdn.discordapp.com/emojis/469964153289965568.png'[source]#
crown_green: str = 'https://cdn.discordapp.com/emojis/469964154719961088.png'[source]#
crown_red: str = 'https://cdn.discordapp.com/emojis/469964154879344640.png'[source]#
defcon_denied: str = 'https://cdn.discordapp.com/emojis/472475292078964738.png'[source]#
defcon_shutdown: str = 'https://cdn.discordapp.com/emojis/470326273952972810.png'[source]#
defcon_unshutdown: str = 'https://cdn.discordapp.com/emojis/470326274213150730.png'[source]#
defcon_update: str = 'https://cdn.discordapp.com/emojis/472472638342561793.png'[source]#
filtering: str = 'https://cdn.discordapp.com/emojis/472472638594482195.png'[source]#
green_checkmark: str = 'https://raw.githubusercontent.com/python-discord/branding/main/icons/checkmark/green-checkmark-dist.png'[source]#
green_questionmark: str = 'https://raw.githubusercontent.com/python-discord/branding/main/icons/checkmark/green-question-mar...'[source]#
guild_update: str = 'https://cdn.discordapp.com/emojis/469954765141442561.png'[source]#
hash_blurple: str = 'https://cdn.discordapp.com/emojis/469950142942806017.png'[source]#
hash_green: str = 'https://cdn.discordapp.com/emojis/469950144918585344.png'[source]#
hash_red: str = 'https://cdn.discordapp.com/emojis/469950145413251072.png'[source]#
message_bulk_delete: str = 'https://cdn.discordapp.com/emojis/469952898994929668.png'[source]#
message_delete: str = 'https://cdn.discordapp.com/emojis/472472641320648704.png'[source]#
message_edit: str = 'https://cdn.discordapp.com/emojis/472472638976163870.png'[source]#
pencil: str = 'https://cdn.discordapp.com/emojis/470326272401211415.png'[source]#
questionmark: str = 'https://cdn.discordapp.com/emojis/512367613339369475.png'[source]#
remind_blurple: str = 'https://cdn.discordapp.com/emojis/477907609215827968.png'[source]#
remind_green: str = 'https://cdn.discordapp.com/emojis/477907607785570310.png'[source]#
remind_red: str = 'https://cdn.discordapp.com/emojis/477907608057937930.png'[source]#
sign_in: str = 'https://cdn.discordapp.com/emojis/469952898181234698.png'[source]#
sign_out: str = 'https://cdn.discordapp.com/emojis/469952898089091082.png'[source]#
superstarify: str = 'https://cdn.discordapp.com/emojis/636288153044516874.png'[source]#
unsuperstarify: str = 'https://cdn.discordapp.com/emojis/636288201258172446.png'[source]#
token_removed: str = 'https://cdn.discordapp.com/emojis/470326273298792469.png'[source]#
user_ban: str = 'https://cdn.discordapp.com/emojis/469952898026045441.png'[source]#
user_timeout: str = 'https://cdn.discordapp.com/emojis/472472640100106250.png'[source]#
user_unban: str = 'https://cdn.discordapp.com/emojis/469952898692808704.png'[source]#
user_untimeout: str = 'https://cdn.discordapp.com/emojis/472472639206719508.png'[source]#
user_update: str = 'https://cdn.discordapp.com/emojis/469952898684551168.png'[source]#
user_verified: str = 'https://cdn.discordapp.com/emojis/470326274519334936.png'[source]#
user_warn: str = 'https://cdn.discordapp.com/emojis/470326274238447633.png'[source]#
voice_state_blue: str = 'https://cdn.discordapp.com/emojis/656899769662439456.png'[source]#
voice_state_green: str = 'https://cdn.discordapp.com/emojis/656899770094452754.png'[source]#
voice_state_red: str = 'https://cdn.discordapp.com/emojis/656899769905709076.png'[source]#
bot.constants.Icons[source]#
class bot.constants._Colours(_case_sensitive: bool | None = None, _env_prefix: str | None = None, _env_file: pydantic_settings.sources.DotenvType | None = ENV_FILE_SENTINEL, _env_file_encoding: str | None = None, _env_ignore_empty: bool | None = None, _env_nested_delimiter: str | None = None, _env_parse_none_str: str | None = None, _secrets_dir: str | pathlib.Path | None = None, **values: Any)[source]#

Bases: EnvConfig

Named color constants.

blue: int = 162301[source]#
twitter_blue: int = 1942002[source]#
bright_green: int = 119415[source]#
dark_green: int = 2067276[source]#
orange: int = 15105570[source]#
pink: int = 13599968[source]#
purple: int = 12006635[source]#
soft_green: int = 6865552[source]#
soft_orange: int = 16370516[source]#
soft_red: int = 13462893[source]#
yellow: int = 16381318[source]#
python_blue: int = 4950974[source]#
python_yellow: int = 16766011[source]#
grass_green: int = 6749952[source]#
gold: int = 15122944[source]#
parse_hex_values(values: dict[str, int]) dict[str, int][source]#

Verify that colors are valid hex.

bot.constants.Colours[source]#
bot.constants.GIT_SHA[source]#
bot.constants.MODERATION_ROLES[source]#
bot.constants.STAFF_ROLES[source]#
bot.constants.TXT_LIKE_FILES[source]#
bot.constants.NEGATIVE_REPLIES = ['Noooooo!!', 'Nope.', "I'm sorry Dave, I'm afraid I can't do that.", "I don't think so.", 'Not...[source]#
bot.constants.POSITIVE_REPLIES = ['Yep.', 'Absolutely!', 'Can do!', 'Affirmative!', 'Yeah okay.', 'Sure.', 'Sure thing!', "You're...[source]#
bot.constants.ERROR_REPLIES = ["Please don't do that.", 'You have to stop.', 'Do you mind?', "In the future, don't do that.",...[source]#