Repository navigation
Expand file tree
/
Copy pathbot.py
More file actions
90 lines (76 loc) · 3.4 KB
/
Copy pathbot.py
File metadata and controls
90 lines (76 loc) · 3.4 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
84
85
86
87
88
89
90
"""bot.py"""
import logging
import discord
from discord.ext import commands
from config import Config
from db.database import Database
from db.repositories import SQLiteGuildConfigRepository, SQLiteMemeConfigRepository
from db.countdown_repository import SQLiteCountdownConfigRepository
from db.meme_history_repository import SQLiteMemeHistoryRepository
from services.disboard_classifier import DisboardMessageClassifier
from services.scheduler import TimerScheduler
from services.countdown_calculator import CountdownCalculator
from services.lemmy_video_fetcher import LemmyVideoFetcher
from services.meme_fetcher import MemeFetcher
from services.meme_service import MemeService
from services.meme_source import TIPO_IMAGEN, TIPO_VIDEO
from cogs.bump import BumpCog
from cogs.bump_config_commands import BumpConfigCog
from cogs.alarm import AlarmCog
from cogs.countdown import CountdownCog, CountdownConfigCog
from cogs.meme import MemeCog
from cogs.settings import SettingsCog
logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s")
logger = logging.getLogger("bump-bot")
class BumpBot(commands.Bot):
"""Composition root: arma las implementaciones concretas y las inyecta
en los cogs a través de sus constructores. Si mañana cambias SQLite por
otra base de datos, solo tocas esta clase."""
def __init__(self, config: Config):
intents = discord.Intents.default()
intents.message_content = True
intents.guilds = True
super().__init__(command_prefix="!", intents=intents)
self.config = config
self.database = Database(config.db_path)
self.repo = SQLiteGuildConfigRepository(self.database)
self.countdown_repo = SQLiteCountdownConfigRepository(self.database)
self.meme_repo = SQLiteMemeConfigRepository(self.database)
self.meme_history_repo = SQLiteMemeHistoryRepository(self.database)
self.scheduler = TimerScheduler()
self.classifier = DisboardMessageClassifier()
self.countdown_calculator = CountdownCalculator(config.countdown_start, config.countdown_end)
self.meme_service = MemeService(
sources={
TIPO_IMAGEN: MemeFetcher(),
TIPO_VIDEO: LemmyVideoFetcher(config.lemmy_communities),
},
history=self.meme_history_repo,
)
async def setup_hook(self):
await self.add_cog(BumpCog(self, self.config, self.repo, self.scheduler, self.classifier))
await self.add_cog(BumpConfigCog(self, self.repo))
await self.add_cog(AlarmCog(self, self.scheduler))
await self.add_cog(CountdownConfigCog(self, self.countdown_repo))
await self.add_cog(CountdownCog(self, self.countdown_repo, self.countdown_calculator))
await self.add_cog(MemeCog(self, self.meme_repo, self.meme_service))
await self.add_cog(
SettingsCog(
self,
self.config,
self.repo,
self.countdown_repo,
self.meme_repo,
self.countdown_calculator,
)
)
synced = await self.tree.sync()
logger.info(f"Comandos sincronizados: {[c.name for c in synced]}")
async def on_ready(self):
logger.info(f"Bot encendido y conectado como {self.user}")
def main():
config = Config.from_env()
bot = BumpBot(config)
bot.run(config.token)
if __name__ == "__main__":
main()