Coverage for polar/integrations/discord/webhook.py: 100%
15 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 12:42 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 12:42 +0000
1from typing import NotRequired, TypedDict
3from polar.config import settings
6class DiscordEmbedFooter(TypedDict):
7 text: str
8 icon_url: NotRequired[str]
9 proxy_icon_url: NotRequired[str]
12class DiscordEmbedImage(TypedDict):
13 url: str
14 proxy_url: NotRequired[str]
15 height: NotRequired[int]
16 width: NotRequired[int]
19class DiscordEmbedThumbnail(DiscordEmbedImage):
20 pass
23class DiscordEmbedVideo(DiscordEmbedImage):
24 pass
27class DiscordEmbedProvider(TypedDict):
28 name: NotRequired[str]
29 url: NotRequired[str]
32class DiscordEmbedAuthor(TypedDict):
33 name: str
34 url: NotRequired[str]
35 icon_url: NotRequired[str]
36 proxy_icon_url: NotRequired[str]
39class DiscordEmbedField(TypedDict):
40 name: str
41 value: str
42 inline: NotRequired[bool]
45class DiscordEmbed(TypedDict):
46 title: NotRequired[str]
47 type: NotRequired[str]
48 description: NotRequired[str]
49 url: NotRequired[str]
50 timestamp: NotRequired[str]
51 color: NotRequired[int]
52 footer: NotRequired[DiscordEmbedFooter]
53 image: NotRequired[DiscordEmbedImage]
54 thumbnail: NotRequired[DiscordEmbedThumbnail]
55 video: NotRequired[DiscordEmbedVideo]
56 provider: NotRequired[DiscordEmbedProvider]
57 author: NotRequired[DiscordEmbedAuthor]
58 fields: NotRequired[list[DiscordEmbedField]]
61class DiscordPayload(TypedDict):
62 content: NotRequired[str]
63 embeds: NotRequired[list[DiscordEmbed]]
66def get_branded_discord_embed(embed: DiscordEmbed) -> DiscordEmbed:
67 return {
68 "color": 25343,
69 "author": {
70 "name": "Polar.sh",
71 "icon_url": settings.FAVICON_URL,
72 },
73 "thumbnail": {
74 "url": settings.THUMBNAIL_URL,
75 },
76 "footer": {
77 "text": "Powered by Polar.sh",
78 },
79 **embed,
80 }