11import html
22
3+ from pytz import timezone
4+
35from chat_exporter .ext .discord_import import discord
46
57from chat_exporter .ext .html_generator import (
@@ -44,9 +46,11 @@ class Embed:
4446
4547 check_against = None
4648
47- def __init__ (self , embed , guild ):
49+ def __init__ (self , embed , guild , pytz_timezone = None , military_time = True ):
4850 self .embed : discord .Embed = embed
4951 self .guild : discord .Guild = guild
52+ self .pytz_timezone = pytz_timezone
53+ self .military_time = military_time
5054
5155 async def flow (self ):
5256 self .check_against = _gather_checker ()
@@ -68,13 +72,45 @@ def build_colour(self):
6872 if self .embed .colour != self .check_against else (0x4A , 0x4A , 0x50 )
6973 )
7074
75+ def _format_embed_timestamp (self ) -> str :
76+ timestamp = getattr (self .embed , "timestamp" , None )
77+ if not timestamp or timestamp == self .check_against :
78+ return ""
79+
80+ time_value = timestamp
81+ if not getattr (time_value , "tzinfo" , None ):
82+ time_value = timezone ("UTC" ).localize (time_value )
83+
84+ tz_name = self .pytz_timezone or getattr (self .guild , "timezone" , "UTC" ) or "UTC"
85+ try :
86+ tz = timezone (tz_name )
87+ except Exception :
88+ tz = timezone ("UTC" )
89+
90+ local_time = time_value .astimezone (tz )
91+ if self .military_time :
92+ return local_time .strftime ("%d-%m-%Y %H:%M" )
93+ return local_time .strftime ("%d-%m-%Y %I:%M %p" )
94+
7195 async def build_title (self ):
72- self . title = html .escape (self .embed .title ) if self .embed .title != self .check_against else ""
96+ raw_title = html .escape (self .embed .title ) if self .embed .title != self .check_against else ""
7397
74- if self .title :
75- self .title = await fill_out (self .guild , embed_title , [
76- ("EMBED_TITLE" , self .title , PARSE_MODE_MARKDOWN )
77- ])
98+ if not raw_title :
99+ self .title = ""
100+ return
101+
102+ title_html = await fill_out (self .guild , "{{EMBED_TITLE}}" , [
103+ ("EMBED_TITLE" , raw_title , PARSE_MODE_MARKDOWN )
104+ ])
105+
106+ url_value = getattr (self .embed , "url" , self .check_against )
107+ if url_value and url_value != self .check_against :
108+ safe_url = html .escape (str (url_value ), quote = True )
109+ title_html = f'<a href="{ safe_url } ">{ title_html } </a>'
110+
111+ self .title = await fill_out (self .guild , embed_title , [
112+ ("EMBED_TITLE" , title_html , PARSE_MODE_NONE )
113+ ])
78114
79115 async def build_description (self ):
80116 self .description = html .escape (self .embed .description ) if self .embed .description != self .check_against else ""
@@ -136,25 +172,32 @@ async def build_thumbnail(self):
136172 if self .embed .thumbnail and self .embed .thumbnail .url != self .check_against else ""
137173
138174 async def build_footer (self ):
139- self . footer = html .escape (self .embed .footer .text ) if (
175+ footer_text = html .escape (self .embed .footer .text ) if (
140176 self .embed .footer and self .embed .footer .text != self .check_against
141177 ) else ""
142178
143179 footer_icon = self .embed .footer .icon_url if (
144180 self .embed .footer and self .embed .footer .icon_url != self .check_against
145181 ) else None
146182
147- if not self .footer :
183+ timestamp_text = self ._format_embed_timestamp ()
184+ if footer_text and timestamp_text :
185+ footer_text = f"{ footer_text } | { timestamp_text } "
186+ elif not footer_text and timestamp_text :
187+ footer_text = timestamp_text
188+
189+ if not footer_text :
190+ self .footer = ""
148191 return
149192
150193 if footer_icon is not None :
151194 self .footer = await fill_out (self .guild , embed_footer_icon , [
152- ("EMBED_FOOTER" , self . footer , PARSE_MODE_NONE ),
195+ ("EMBED_FOOTER" , footer_text , PARSE_MODE_NONE ),
153196 ("EMBED_FOOTER_ICON" , footer_icon , PARSE_MODE_NONE )
154197 ])
155198 else :
156199 self .footer = await fill_out (self .guild , embed_footer , [
157- ("EMBED_FOOTER" , self . footer , PARSE_MODE_NONE )])
200+ ("EMBED_FOOTER" , footer_text , PARSE_MODE_NONE )])
158201
159202 async def build_embed (self ):
160203 self .embed = await fill_out (self .guild , embed_body , [
@@ -168,4 +211,4 @@ async def build_embed(self):
168211 ("EMBED_DESC" , self .description , PARSE_MODE_NONE ),
169212 ("EMBED_FIELDS" , self .fields , PARSE_MODE_NONE ),
170213 ("EMBED_FOOTER" , self .footer , PARSE_MODE_NONE ),
171- ])
214+ ])
0 commit comments