Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 2 additions & 5 deletions renovate.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,12 @@
"dependencies"
],
"prHourlyLimit": 0,
"prConcurrentLimit": 10,
"prConcurrentLimit": 15,
"dependencyDashboard": true,
"dependencyDashboardTitle": "ManagerX – Dependency Updates",
"automerge": false,
"rangeStrategy": "pin",
"timezone": "Europe/Berlin",
"schedule": [
"at any time on the weekend"
],
"npm": {
"npmrc": "legacy-peer-deps=true"
},
Expand Down Expand Up @@ -58,7 +55,7 @@
"patch"
],
"groupName": "All Non-Major Updates",
"description": "Fasst alles außer große Versionssprünge zusammen"
"description": "Fasst alle kleinen Updates zusammen, um PR-Spam zu vermeiden"
}
]
}
67 changes: 45 additions & 22 deletions src/bot/cogs/guild/globalchat.py
Original file line number Diff line number Diff line change
Expand Up @@ -640,16 +640,15 @@ def _build_author_info(self, author: discord.Member) -> Tuple[str, List[str]]:

class GlobalChatSender:
"""Verantwortlich für das Senden der Nachricht an alle verbundenen Kanäle"""
def __init__(self, bot, config: GlobalChatConfig, embed_builder: EmbedBuilder, cache_ref: List[int]):
def __init__(self, bot, config: GlobalChatConfig, embed_builder: EmbedBuilder):
self.bot = bot
self.config = config
self.embed_builder = embed_builder
self._cached_channels = cache_ref # Referenz zum Cache in der Cog
self._cached_channels: Optional[List[int]] = None

async def _get_all_active_channels(self) -> List[int]:
"""Ruft alle aktiven Channel-IDs ab, nutzt den Cache"""
if self._cached_channels is None:
# Cache initial füllen
self._cached_channels = await self._fetch_all_channels()
return self._cached_channels

Expand All @@ -670,14 +669,18 @@ async def _send_to_channel(self, channel_id: int, embed: discord.Embed, attachme
try:
channel = self.bot.get_channel(channel_id)
if not channel:
logger.warning(f"⚠️ Channel {channel_id} nicht gefunden")
return False
try:
channel = await self.bot.fetch_channel(channel_id)
except Exception:
logger.warning(f"⚠️ Channel {channel_id} konnte nicht abgerufen werden.")
return False

# Permissions prüfen
perms = channel.permissions_for(channel.guild.me)
if not perms.send_messages or not perms.embed_links:
logger.warning(f"⚠️ Keine Permissions in {channel_id}")
return False
if hasattr(channel, 'guild') and channel.guild:
perms = channel.permissions_for(channel.guild.me)
if not perms.send_messages or not perms.embed_links:
logger.warning(f"⚠️ Keine Permissions in {channel_id} ({channel.guild.name})")
return False

# Erstelle NEUE discord.File Objekte für diesen Channel (wichtig!)
# Jeder Channel bekommt seine eigenen frischen Files!
Expand Down Expand Up @@ -745,6 +748,26 @@ async def send_global_message(self, message: discord.Message, attachment_data: L

return successful_sends, failed_sends

async def send_global_broadcast_message(self, embed: discord.Embed) -> Tuple[int, int]:
"""Sendet einen Broadcast an alle Kanäle"""
active_channels = await self._get_all_active_channels()
successful_sends = 0
failed_sends = 0

tasks = []
for channel_id in active_channels:
tasks.append(self._send_to_channel(channel_id, embed, []))

results = await asyncio.gather(*tasks, return_exceptions=True)

for result in results:
if result is True:
successful_sends += 1
else:
failed_sends += 1

return successful_sends, failed_sends


class GlobalChat(ezcord.Cog):
"""Haupt-Cog für das GlobalChat-System"""
Expand All @@ -762,8 +785,8 @@ def __init__(self, bot):
self.config.RATE_LIMIT_SECONDS,
commands.BucketType.user
)
self._cached_channels: Optional[List[int]] = None
self.sender = GlobalChatSender(self.bot, self.config, self.embed_builder, self._cached_channels)
self._cached_channels = None # Wird bei der ersten Nachricht geladen
self.sender = GlobalChatSender(self.bot, self.config, self.embed_builder)
self.cleanup_task.start()

@tasks.loop(hours=12)
Expand All @@ -772,8 +795,8 @@ async def cleanup_task(self):
# db.delete_expired_blacklist_entries() <--- DIESE ZEILE AUSKOMMENTIEREN
# logger.info("🗑️ GlobalChat: Abgelaufene Blacklist-Einträge bereinigt.")

# Cache neu laden, um Änderungen in der DB zu sehen
self._cached_channels = await self.sender._fetch_all_channels()
# Cache neu laden
await self.sender._get_all_active_channels()
logger.info("🧠 GlobalChat: Channel-Cache neu geladen.")

@ezcord.Cog.listener()
Expand Down Expand Up @@ -892,14 +915,14 @@ async def setup_globalchat(
db.set_globalchat_channel(ctx.guild.id, channel.id)

# Cache aktualisieren
self._cached_channels = await self.sender._fetch_all_channels()
self.sender._cached_channels = await self.sender._fetch_all_channels()

# UI Container für eine schönere Antwort (falls vorhanden)
container = Container()

status_text = f"✅ **GlobalChat eingerichtet!**\n\n"
status_text += f"Der GlobalChat ist nun in {channel.mention} aktiv.\n"
status_text += f"Aktuell verbunden: **{len(self._cached_channels)}** Server."
status_text += f"Aktuell verbunden: **{len(self.sender._cached_channels)}** Server."

container.add_text(status_text)
container.add_separator()
Expand Down Expand Up @@ -946,12 +969,12 @@ async def remove_globalchat(self, ctx: discord.ApplicationContext):
db.set_globalchat_channel(ctx.guild.id, None)

# Cache aktualisieren
self._cached_channels = await self.sender._fetch_all_channels()
self.sender._cached_channels = await self.sender._fetch_all_channels()

await ctx.respond(
f"✅ **GlobalChat entfernt!**\n\n"
f"Der GlobalChat wurde von diesem Server entfernt.\n"
f"Es sind nun noch **{len(self._cached_channels)}** Server verbunden.",
f"Es sind nun noch **{len(self.sender._cached_channels)}** Server verbunden.",
ephemeral=True
)
except Exception as e:
Expand Down Expand Up @@ -1414,7 +1437,7 @@ async def globalchat_broadcast(
)

# An alle Channels senden
successful, failed = await self.sender.send_global_broadcast_message(embed) # Annahme: Eine separate Broadcast-Methode in Sender
successful, failed = await self.sender.send_global_broadcast_message(embed)

# Response
result_embed = discord.Embed(
Expand Down Expand Up @@ -1457,9 +1480,9 @@ async def globalchat_reload_cache(self, ctx: discord.ApplicationContext):

await ctx.defer(ephemeral=True)
try:
old_count = len(self._cached_channels or [])
self._cached_channels = await self.sender._fetch_all_channels()
new_count = len(self._cached_channels)
old_count = len(self.sender._cached_channels or [])
self.sender._cached_channels = await self.sender._fetch_all_channels()
new_count = len(self.sender._cached_channels)

await ctx.respond(
f"✅ **Cache neu geladen!**\n\n"
Expand All @@ -1486,7 +1509,7 @@ async def globalchat_debug(self, ctx: discord.ApplicationContext):

await ctx.defer(ephemeral=True)
try:
cached_channels = len(self._cached_channels or [])
cached_channels = len(self.sender._cached_channels or [])
all_settings = db.get_all_guild_settings()

debug_info = (
Expand Down
Loading