-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathbot.py
More file actions
79 lines (60 loc) · 2.59 KB
/
bot.py
File metadata and controls
79 lines (60 loc) · 2.59 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
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.cogs.guild_statistics import GuildStatisticsCog, GuildStatisticsConfig
from europython_discord.cogs.ping import PingCog
from europython_discord.program_notifications.cog import ProgramNotificationsCog
from europython_discord.program_notifications.config import ProgramNotificationsConfig
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
program_notifications: ProgramNotificationsConfig
guild_statistics: GuildStatisticsConfig
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(RegistrationCog(bot, config.registration))
await bot.add_cog(ProgramNotificationsCog(bot, config.program_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()