-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathbot.py
More file actions
83 lines (64 loc) · 2.8 KB
/
Copy pathbot.py
File metadata and controls
83 lines (64 loc) · 2.8 KB
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
from __future__ import annotations
import argparse
import asyncio
import logging
import os
import sys
import tomllib
from pathlib import Path
from typing import Literal
import discord
from discord.ext import commands
from pydantic import BaseModel
from europython_discord.animals.cog import AnimalsCog
from europython_discord.animals.config import AnimalsConfig
from europython_discord.cogs.guild_statistics import GuildStatisticsCog, GuildStatisticsConfig
from europython_discord.cogs.ping import PingCog
from europython_discord.programme_notifications.cog import ProgrammeNotificationsCog
from europython_discord.programme_notifications.config import ProgrammeNotificationsConfig
from europython_discord.registration.cog import RegistrationCog
from europython_discord.registration.config import RegistrationConfig
# silence warning about missing discord voice support
# https://github.com/Rapptz/discord.py/issues/1719#issuecomment-437703581
discord.VoiceClient.warn_nacl = False
_logger = logging.getLogger(__name__)
class Config(BaseModel):
log_level: Literal["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]
registration: RegistrationConfig
programme_notifications: ProgrammeNotificationsConfig
guild_statistics: GuildStatisticsConfig
animals: AnimalsConfig
async def run_bot(config: Config, auth_token: str) -> None:
intents = discord.Intents.all()
intents.presences = False
intents.dm_typing = False
intents.dm_reactions = False
intents.invites = False
intents.integrations = False
async with commands.Bot(intents=intents, command_prefix="$") as bot:
await bot.add_cog(PingCog(bot))
await bot.add_cog(AnimalsCog(bot, config.animals))
await bot.add_cog(RegistrationCog(bot, config.registration))
await bot.add_cog(ProgrammeNotificationsCog(bot, config.programme_notifications))
await bot.add_cog(GuildStatisticsCog(bot, config.guild_statistics))
await bot.start(auth_token)
def main() -> None:
parser = argparse.ArgumentParser(description="EuroPython Discord Bot")
parser.add_argument("--config-file", type=Path, required=True, help="Configuration file")
args = parser.parse_args()
if "DISCORD_BOT_TOKEN" not in os.environ:
raise RuntimeError("Missing environment variable 'DISCORD_BOT_TOKEN'")
bot_auth_token = os.environ["DISCORD_BOT_TOKEN"]
config_file_content = args.config_file.read_text()
config = Config(**tomllib.loads(config_file_content))
logging.basicConfig(
level=config.log_level,
stream=sys.stdout,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
)
try:
asyncio.run(run_bot(config, auth_token=bot_auth_token))
except KeyboardInterrupt:
_logger.info("Received KeyboardInterrupt, exiting...")
if __name__ == "__main__":
main()