Source code for curious.dataclasses.embed
# This file is part of curious.
#
# curious is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# curious is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with curious. If not, see <http://www.gnu.org/licenses/>.
"""
Wrappers for Embed objects.
.. currentmodule:: curious.dataclasses.embed
"""
import datetime
from curious.util import attrdict
[docs]class Embed(object): # not an IDObject! Embeds don't have IDs.
"""
Represents an Embed object on Discord.
"""
def __init__(self, *,
title: str = None,
description: str = None,
colour: int = None,
type_: str = None,
url: str = None,
timestamp: str = None,
**kwargs):
def make_attrdict(key: str) -> attrdict:
if key not in kwargs:
return attrdict()
return attrdict(**kwargs[key])
#: The title of this embed.
self.title = title
#: The description of this embed.
self.description = description
if colour is None:
# for passing in from discord
colour = kwargs.get("color")
#: The colour of this embed.
self.colour = colour
#: The type of this embed.
self.type_ = type_
#: The URL for this embed.
self.url = url
#: The timestamp for this embed.
self.timestamp = timestamp # type: datetime.datetime
#: The fields for this embed.
self.fields = []
#: The footer for this embed.
self.footer = make_attrdict("footer")
#: The author of this embed.
self.author = make_attrdict("author")
#: The image for this embed.
self.image = make_attrdict("image")
#: The video for this embed.
self.video = make_attrdict("video")
#: The thumbnail for this embed.
self.thumbnail = make_attrdict("thumbnail")
[docs] def add_field(self, *, name: str, value: str,
inline: bool = True) -> 'Embed':
"""
Adds a field to the embed.
:param name: The field name.
:param value: The field value.
:param inline: Is this field inline?
:return: The Embed object.
"""
if isinstance(name, str) and len(name) == 0:
raise ValueError("Name must not be empty")
if isinstance(value, str) and len(value) == 0:
raise ValueError("Value must not be empty")
self.fields.append(attrdict({"name": str(name), "value": str(value), "inline": inline}))
return self
[docs] def set_author(self, *, name: str, url: str = None, icon_url: str = None) -> 'Embed':
"""
Sets the author of this embed.
:param name: The name of the author.
:param url: The URL of the author.
:param icon_url: The URL of the author icon.
:return: The Embed object.
"""
self.author = attrdict(
name=name
)
if url:
self.author.url = url
if icon_url:
self.author.icon_url = icon_url
return self
[docs] def set_image(self, *, image_url: str) -> 'Embed':
"""
Sets the image of this embed.
:param image_url: The image URL of this embed.
:return: The Embed object.
"""
self.image = attrdict()
if not image_url.startswith("http") or image_url.startswith("attachment://"):
raise ValueError("Image URLs must start with http[s]")
if image_url:
self.image.url = image_url
return self
[docs] def set_thumbnail(self, *, url: str) -> 'Embed':
"""
Sets the thumbnail image of this embed.
:param url: The image URL of this thumbnail.
:return: The Embed object.
"""
self.thumbnail = attrdict()
self.thumbnail.url = url
return self
[docs] def to_dict(self) -> dict:
"""
Converts this embed into a flattened dict.
"""
payload = {
"type": self.type_ if self.type_ else "rich"
}
if self.title:
payload["title"] = self.title
if self.description:
payload["description"] = self.description
if self.url:
payload["url"] = self.url
if self.colour:
payload["color"] = self.colour # american spelling
if self.timestamp:
payload["timestamp"] = self.timestamp.strftime("%Y-%m-%dT%H:%M:%S.%f")
# attrdicts can be automatically json dumped easily
# so we just go and shove these right in there
if self.footer:
payload["footer"] = self.footer
if self.thumbnail:
payload["thumbnail"] = self.thumbnail
if self.image:
payload["image"] = self.image
if self.author:
payload["author"] = self.author
payload["fields"] = self.fields
return payload