diff --git a/homeassistant/components/discord/notify.py b/homeassistant/components/discord/notify.py index 6d3dc704d83..10ad1e8e018 100644 --- a/homeassistant/components/discord/notify.py +++ b/homeassistant/components/discord/notify.py @@ -59,10 +59,22 @@ class DiscordNotificationService(BaseNotificationService): data = kwargs.get(ATTR_DATA) or {} + embed = None if ATTR_EMBED in data: embedding = data[ATTR_EMBED] fields = embedding.get(ATTR_EMBED_FIELDS) + if embedding: + embed = discord.Embed(**embedding) + for field in fields: + embed.add_field(**field) + if ATTR_EMBED_FOOTER in embedding: + embed.set_footer(**embedding[ATTR_EMBED_FOOTER]) + if ATTR_EMBED_AUTHOR in embedding: + embed.set_author(**embedding[ATTR_EMBED_AUTHOR]) + if ATTR_EMBED_THUMBNAIL in embedding: + embed.set_thumbnail(**embedding[ATTR_EMBED_THUMBNAIL]) + if ATTR_IMAGES in data: images = [] @@ -76,43 +88,21 @@ class DiscordNotificationService(BaseNotificationService): else: _LOGGER.warning("Image not found: %s", image) - # pylint: disable=unused-variable - @discord_bot.event - async def on_ready(): - """Send the messages when the bot is ready.""" - try: - for channelid in kwargs[ATTR_TARGET]: - channelid = int(channelid) - channel = discord_bot.get_channel( + await discord_bot.login(self.token) + + try: + for channelid in kwargs[ATTR_TARGET]: + channelid = int(channelid) + try: + channel = discord_bot.fetch_channel( channelid - ) or discord_bot.get_user(channelid) - - if channel is None: - _LOGGER.warning("Channel not found for ID: %s", channelid) - continue - # Must create new instances of File for each channel. - files = None - if images: - files = [] - for image in images: - files.append(discord.File(image)) - if embedding: - embed = discord.Embed(**embedding) - if fields: - for field_num, field_name in enumerate(fields): - embed.add_field(**fields[field_num]) - if ATTR_EMBED_FOOTER in embedding: - embed.set_footer(**embedding[ATTR_EMBED_FOOTER]) - if ATTR_EMBED_AUTHOR in embedding: - embed.set_author(**embedding[ATTR_EMBED_AUTHOR]) - if ATTR_EMBED_THUMBNAIL in embedding: - embed.set_thumbnail(**embedding[ATTR_EMBED_THUMBNAIL]) - await channel.send(message, files=files, embed=embed) - else: - await channel.send(message, files=files) - except (discord.errors.HTTPException, discord.errors.NotFound) as error: - _LOGGER.warning("Communication error: %s", error) - await discord_bot.close() - - # Using reconnect=False prevents multiple ready events to be fired. - await discord_bot.start(self.token, reconnect=False) + ) or discord_bot.fetch_user(channelid) + except discord.NotFound: + _LOGGER.warning("Channel not found for ID: %s", channelid) + continue + # Must create new instances of File for each channel. + files = [discord.File(image) for image in images] if images else None + await channel.send(message, files=files, embed=embed) + except (discord.HTTPException, discord.NotFound) as error: + _LOGGER.warning("Communication error: %s", error) + await discord_bot.close()