mirror of
https://github.com/brandons209/Red-bot-Cogs.git
synced 2024-09-30 17:17:35 +13:00
75 lines
1.9 KiB
Python
75 lines
1.9 KiB
Python
|
import asyncio
|
||
|
|
||
|
import discord
|
||
|
from redbot.core import commands
|
||
|
from redbot.core.i18n import Translator
|
||
|
|
||
|
_ = Translator("Announcer", __file__)
|
||
|
|
||
|
|
||
|
class Announcer:
|
||
|
def __init__(self, ctx: commands.Context, message: str, config=None):
|
||
|
"""
|
||
|
:param ctx:
|
||
|
:param message:
|
||
|
:param config: Used to determine channel overrides
|
||
|
"""
|
||
|
self.ctx = ctx
|
||
|
self.message = message
|
||
|
self.config = config
|
||
|
|
||
|
self.active = None
|
||
|
|
||
|
def start(self):
|
||
|
"""
|
||
|
Starts an announcement.
|
||
|
:return:
|
||
|
"""
|
||
|
if self.active is None:
|
||
|
self.active = True
|
||
|
self.ctx.bot.loop.create_task(self.announcer())
|
||
|
|
||
|
def cancel(self):
|
||
|
"""
|
||
|
Cancels a running announcement.
|
||
|
:return:
|
||
|
"""
|
||
|
self.active = False
|
||
|
|
||
|
async def _get_announce_channel(self, guild: discord.Guild) -> discord.TextChannel:
|
||
|
channel_id = await self.config.guild(guild).announce_channel()
|
||
|
channel = None
|
||
|
|
||
|
if channel_id is not None:
|
||
|
channel = guild.get_channel(channel_id)
|
||
|
|
||
|
if channel is None:
|
||
|
channel = guild.system_channel
|
||
|
|
||
|
if channel is None:
|
||
|
channel = guild.text_channels[0]
|
||
|
|
||
|
return channel
|
||
|
|
||
|
async def announcer(self):
|
||
|
guild_list = self.ctx.bot.guilds
|
||
|
bot_owner = (await self.ctx.bot.application_info()).owner
|
||
|
for g in guild_list:
|
||
|
if not self.active:
|
||
|
return
|
||
|
|
||
|
if await self.config.guild(g).announce_ignore():
|
||
|
continue
|
||
|
|
||
|
channel = await self._get_announce_channel(g)
|
||
|
|
||
|
try:
|
||
|
await channel.send(self.message)
|
||
|
except discord.Forbidden:
|
||
|
await bot_owner.send(
|
||
|
_("I could not announce to server: {server.id}").format(server=g)
|
||
|
)
|
||
|
await asyncio.sleep(0.5)
|
||
|
|
||
|
self.active = False
|