forked from EuroPython/discord
-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbot.py
More file actions
83 lines (63 loc) · 2.66 KB
/
bot.py
File metadata and controls
83 lines (63 loc) · 2.66 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
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
if sys.version_info >= (3, 11):
import tomllib
else:
import tomli as tomllib
# 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="PyLadiesCon 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()