Discord templating engine built on discord.py, to help separate text of embeds from the source code. Inspired by Flask.
Key Features:
- use of xml files to hold the various template responses
- allows for pagination, in an abstract form simplifying the interface in the source code
:gear: Installing:
Python3.8 or higher is required
:test_tube: Tests
To run the tests, run the following command in the root directory:
Windows:
python -m unittest tests -v
Linux:
python3 -m unittest tests -v
:zap: Usage
This is explained in more detail in the wiki
Wrap expressions that need to evaluated with {}
, such as {player.name}
or {todays_date}
Sample XML file:
<discord>
<message key="test_key">
<embed>
<title>Test</title>
<description>Test Description</description>
<colour>magenta</colour>
<timestamp format="%Y-%m-%d %H:%M:%S.%f">{todays_date}</timestamp>
<url>https://www.discord.com</url>
<fields>
<field>
<name>Test Field</name>
<value>Test Text</value>
</field>
</fields>
<footer>
<text>Test Footer</text>
<icon>https://cdn.discordapp.com/embed/avatars/0.png</icon>
</footer>
<thumbnail>https://cdn.discordapp.com/embed/avatars/0.png</thumbnail>
<image>https://cdn.discordapp.com/embed/avatars/0.png</image>
<author>
<name>Test Author</name>
<icon>https://cdn.discordapp.com/embed/avatars/0.png</icon>
<url>https://discordapp.com</url>
</author>
</embed>
<view>
<components>
<button key="understood_button">
<label>Understood</label>
<style>success</style>
</button>
</components>
</view>
</message>
</discord>
using the above xml file, for example, you can create an embed with the following code:
import datetime
from typing import Literal
import discord
from discord.ext import commands
import embedbuilder
from embedbuilder.template_engines import formatter
bot = commands.AutoShardedBot(command_prefix="!", intents=discord.Intents.all())
Messages = Literal["test_key"]
async def acknowledged(interaction: discord.Interaction):
await interaction.response.send_message("Acknowledged", ephemeral=True)
@bot.command()
@embedbuilder.embedbuilder_context(formatter.Formatter(), "templates/test.xml")
async def test(ctx: embedbuilder.embedbuilderContext[Messages]):
callables = {"understood_button": acknowledged}
await ctx.rendered_send("test_key", callables, keywords={
"todays_date": datetime.datetime.now()
})