Templates
Templates are used to customize the messages that appear in raids and announcements. In this way, you can add some data that is not shown by default, such as the maximum CP or the types of the Pokémon, or you can also change the arrangement of the existing elements.
There are two completely independent templates: the raid template, which is changed with /raidtemplate
, and the announcement template, which is changed with /announcetemplate
. Also, raids can have content after the target list, which can be set with /raidfootertemplate
.
By putting those commands without arguments, the current template code is displayed. To change a template, you can copy and paste that code with the desired modifications. For example:
/raidtemplate <b>{Pokemon}</b> Raid {{on <b>{weekday_day_month}</b> }}at {timewarn_icon_}<b>{raidtime}</b> in {gym_icon}{gym}<br>{{<em>Available from {opentime} to {endtime}</em><br>}}<em>Organized by </em>{organizer}{_edited_icon}{_refloated_icon}
To return to the default template, you must put a dash -
, as follows:
/raidtemplate -
⚠️ Is everything very confusing? Start by putting the command
/raidtemplate
and look at the current raid template. Copy, paste it and make a little modification. Little by little, try new stuff.
Predefined templates
In addition to the default template, there are some additional predefined templates. To use them, you must specify their name instead of putting the complete template. For example:
/raidtemplate maxcp
/announcetemplate maxcp
The available predefined templates are:
Name | Description |
---|---|
maxcp | Like the default template, but also shows the Pokémon’s maximum CP. |
pokebattler | Like the default template, but with a link to Pokébattler in the Pokémon’s name. |
pokebattler_maxcp | The combination of the two previous templates: shows the maximum CP and a link to Pokébattler in the name of the Pokémon. |
Variables
In any template you will find text between brackets {}
that are variables that will later be replaced by the data of the raids and announcements. For example, {gym}
is replaced by the name of the gym, with a link if the location is known.
This list indicates all the available variables. Some are already used in the default template or in one of the predefined templates, but others are not. For clarity, the brackets {}
do not appear in the list.
Variable | Description | HTML |
---|---|---|
pokemon | The Pokémon or the egg. | - |
pokemon_gameinfo | The Pokémon (with a link to its guide on Gameinfo) or the egg. | Link |
pokemon_pokebattler | The Pokémon (with a link to its guide in Pokebattler) or the egg. | Link |
pokemon_kingcasualbot | The Pokémon (with a link to its guide in KingCasualBot) or the egg. | Link |
pokedexno | The number in Pokédex, available only if the boss were selected. | - |
tier | The level of the raid, numerically: 1 , 3 , 5 ; or mega or ex . | - |
expokemon_icon | The EX icon only if it is an EX Raid Boss. | - |
shinypokemon_icon | The shiny icon only if it is a raid boss that can appear shiny. | - |
maxcp | The maximum CP at level 20. | - |
maxcp_boosted | The maximum CP at level 25. | - |
types | The types of the Pokémon (in icons). | - |
types_text | The types of the Pokémon (in text). | - |
type1 | The first type of the Pokémon | - |
type2 | The second type of the Pokémon (if there is) | - |
numtypes | The number of Pokémon types (1 or 2) | - |
weatherboosts | The climates that empower the Pokémon (in icons). | - |
weatherboosts_text | The climates that empower the Pokémon (in text). | - |
numweatherboosts | The number of boosted climates the Pokémon has (1 or 2) | - |
x1weaknesses | The types the Pokémon is weak to (in icons) | - |
x2weaknesses | The types the Pokémon is doubly weak to (in icons) | - |
x1weaknesses_text | The types the Pokémon is weak to (in text, separated by commas) | - |
x2weaknesses_text | The types to which the Pokémon is doubly weak (in text, separated by commas) | - |
numx1weaknesses | The number of types the Pokémon is weak to | - |
numx2weaknesses | The number of types the Pokémon is doubly weak to | - |
gym | The gym, with a link to the location if recognized. | Link |
gym_icon | The location icon. | - |
exgym_icon | The EX icon only if it is an EX gym. | - |
zone | The area or areas of the gym. | - |
country | The country of the trainer who created the raid. This is used to locate the raids in remote groups that allow you to create raids from all over the world and do them using invitations. | - |
country_flag | The emoji with the flag of the country of the trainer who created the raid. | - |
countryregion | The region of the trainer’s country that created the raid. This serves to locate raids in remote groups with a little more precision that allows you to create raids over large areas, such as an entire country or several countries. | - |
announcer | Trainer who created the ad. | Link |
organizer | Trainer who has organized the raid. | Link |
weekday_day_month | Day of the week, day and month if the raid is not today. | - |
weekday_day | Day of the week and day if the raid is not today. | - |
day_month | Day and month if the raid is not today. | - |
opentime | Time of the egg’s hatch. You can force a 0 in the first position if the time is a single digit by adding 0 to the beginning of the variable: 0opentime . | - |
lopentime | Time of the egg’s hatch with a link to a local time converter. You can force a 0 in the first position if the time is a single digit by adding 0 after the leading l : l0opentime . | Link |
endtime | Time of the raid’s boss despawns. You can force a 0 in the first position if the time is a single digit by adding 0 to the beginning of the variable: 0endtime . | - |
lendtime | Time of the raid’s boss despawns with a link to a local time converter. You can force a 0 in the first position if the time is a single digit by adding 0 after the leading l : l0endtime . | Link |
raidtime | Time of the raid. You can force a 0 in the first position if the time is a single digit by adding 0 to the beginning of the variable: 0raidtime . | - |
lraidtime | Time of the raid with a link to a local time converter. You can force a 0 in the first position if the time is a single digit by adding 0 after the leading l : l0raidtime . | Link |
raidtime_europe/london | Time of the raid in a different time zone than the one configured in the group, in this example that of Europe/London . You can put any valid IANA time zone. The time zone of your group must be configured before. You can force a 0 in the first position if the time is a single digit by adding 0 to the beginning of the variable, for example, 0raidtime_europe/london . | - |
lraidtime_europe/london | Time of the raid in a different time zone than the one configured in the group, in this example that of Europe/London , with a link to a time converter to local time. You can put any valid IANA time zone. The time zone of your group must be configured before. You can force a 0 in the first position if the time is a single digit by adding 0 after the leading l , for example, l0raidtime_europe/london . | - |
timewarn | Text close soon if the raid organization time is very close to closing time. | - |
timewarn_icon | ⚠️ icon if the raid organization time is very close to the closing time. | - |
edited_icon | 📝 icon if edited. | - |
edited | Text edited if it is edited. | - |
refloated_icon | Icon 🎈 if it is refloated. | - |
refloated | Text refloated if it is refloated. | - |
note | Text note usually added by an administrator or the raid organizer. If it is not specified in the template, it will be automatically added in the footer of the raid in case of adding a note. | - |
trainerscount | The text with the registered trainers count and the corresponding subtotals, according to the group’s configuration. If not specified in the template, it will be automatically added just above the list of targeted trainers. | - |
trainerscount_all | The number of total registrants (only the number). Also available are trainerscount_notremote for face-to-face trainers, trainerscount_remote for remotes (including invitees), trainerscount_invited for invited trainers; and also trainerscount_valor , trainerscount_mystic and trainerscount_instinct in case the +1 are activated by teams. | - |
trainerscount_pendinginvites | The number of trainers that are requesting an invite and waiting for another trainer to agree to invite them. | - |
Format with HTML
Templates can be formatted with plain HTML, with the usual Telegram restrictions:
- Valid tags are
<i></i>
(italics),<b></b>
(bold),<u></u>
(underlined),<s></s>
(crossed out),<code></code>
(fixed-width text) and<a href=""></a>
(link). - If you want the characters
<
,>
and&
to be seen, the entities<
,>
and&
must be used. - You can put, for example, bold and underlined text at the same time, nesting the labels correctly.
<u><b>Good</b></u>
is correct, but<u><b>Bad</u></b>
is wrong and will not work - Line breaks should be indicated with
<br>
. You can separate the elements by putting several in a row, for example<br><br>
.
Remember that you are specifying code for the template, and the format that you apply directly will be ignored. That is, if you want something to be shown in bold, you must put it <b>this way</b>
, but not use the bold option integrated in Telegram.
Variants of variables
To help build better messages there are versions of the variables with spaces at the beginning, with spaces at the end, in capital letters… These are the available variants:
{VARIABLE}
: contains{variable}
in uppercase.{Variable}
: contains{variable}
forcing the first capital letter.{_variable}
: Contains{variable}
with a leading space.{variable_}
: contains{variable}
with a space at the end.{_variable_}
: contains{variable}
with a space at the beginning and at the end.
Variants of variables with links
Variables that put Link in the HTML column contain links. That is, {pokemon_gameinfo}
will be displayed as the name of the Pokémon with a link to Gameinfo.
This type of variable can be decomposed to independently display only the text, adding _text
at the end, or just the URL, adding _link
at the end.
For example, the variable {pokemon_gameinfo_text}
will contain the text with the name of the Pokémon and {pokemon_gameinfo_link}
will contain the URL.
Conditional blocks
There are two types of conditional blocks, which allow you to show or hide parts of the models depending on the situation.
Simple Conditional Block
The simplest conditional block is written like this: ` {{text {variables} and more text}}`.
In this case, the contents enclosed in square brackets will only be shown if all variables used inside are set or true.
There are several examples of this type of block in the default template, where only a part of the text is displayed if the variable weekday_day_month
is set and another part if opentime
and endtime
are set.
Conditional block with conditions
The other type of conditional block allows you to use complex conditions and is written like this: [condiciones]{{text {variables} and more text}}
.
In this case, the content between the tabs will be displayed as soon as the conditions defined between []
are true. It doesn’t matter if the variables inside the double braces {{}}
are undefined or false, the content is still displayed.
Conditions can simply be variables like opentime
or isegg
. They can also refuse by putting one !
in front of. For example:
[opentime]{{<em>Open between {opentime} and {endtime}</em><br>}}
[!isegg]{{🐒 Raid of <b>{pokemon_kingcasualbot} ({maxcp}/{maxcp_boosted})}}
Within the conditions, common mathematical comparators can be used: less than <
, greater than >
, equal to ==
, different than !=
, Less than or equal to <=
and greater than or equal to >=
. They can be used to compare variable values against arbitrary values, for example:
[opentime>20:00]{{🌚 Watch out!, night raid!}}
[minutestoend<5]{{⛔️ There is very little time to make the raid, put it a little earlier!!}}
[tier==ex]{{🎟' Remember that you need a special pass to be able to do the raid, do not sign up if you do not have it!}}
The logical conjunctions can also be used: and &&
and or ||
. In this way, several conditions can be joined to make a more complex one, for example:
[isegg && minutesfromstart<10]{{<em>🥚🚫 Several Pokémon can come out and you have set the time very close to hatching time. If you can, change the time for a little later}}
[raidispending && trainerscount_remote > 5]{{⛔️💌 <u>It is forbidden to invite anyone who is not registered!</u> }}
In case of using more than two conditions and mixing &&
and ||
, keep in mind that they are always evaluated from left to right and this order of evaluation cannot be altered.
Variables to use in conditional blocks
All the variables described in the table above can be used as conditions. In case they have a defined value, the condition will be true. In case they do not have a defined value, the condition will be false.
In addition, there are some variables specially indicated to use as conditions, which do not print anything even if they are true:
Variable | Description |
---|---|
isegg | True if it is an egg. |
ispokemon | True if it is a raid boss. |
isannounce | True if it is an unorganized raid ad (for use with image templates). |
israid | True if it is an organized raid (for use with image templates). |
istier5 | True if it’s a level 5 boss or egg. Also available for all other levels. |
hasforms | True if the Pokémon has globally defined forms (one or more). |
has1type | True if the Pokémon has only 1 type. |
has2types | True if the Pokémon has 2 types. |
has1weatherboost | True if the Pokémon has only 1 weather boosted. |
has2weatherboosts | True if the Pokémon has 2 weather boosted. |
ismissingform | True if the Pokémon has globally defined forms (one or more) but was not chosen in the raid. |
timenearopen | True if the raid organization time is less than 12 minutes from the hatching time. Also available timenearend , timefaropen , timefarend and timeverynearend (like timenearend but less than 6 minutes). |
pendinginvites | True if there are requests for invitations pending acceptance. |
maxjoined | True if the maximum number of face-to-face trainers configured in the group has been reached. |
maxtotal | True if the maximum total number of trainers configured in the group has been reached. |
maxremote | True if the maximum number of remote trainers configured in the group has been reached. |
maxinvited | True if the maximum number of guest trainers configured in the group has been reached. |
maxgametotal | True if the maximum total number of trainers has been exceeded based on the limit in the game, regardless of the group configuration. |
maxgameremote | True if the maximum number of remote trainers has been exceeded based on the limit in the game, regardless of the group setting. |
raidpending | True if the raid has not yet taken place, or if it is taking place but has not been manually closed, the egg has not despawned, or a reasonable amount of time has passed since the scheduled time. |
raidended | True if the raid has been closed manually, or the egg has despawned, or a reasonable amount of time has passed since the scheduled time. |
raidcancelled | True if the raid has been canceled. |
pokemon_hatchable_canbeshiny1 | If the Pokémon that can hatch from the egg in position 1 can be caught shiny (they can be used from 1 to 10, to be used with the image templates). |
Images Templates
Image templates allow you to add images to raids, which can be customized with information from each raid. They are disabled by default. To activate them or change them to others, use the /imagetemplate
command. For example, to use the default
template:
/imagetemplate default
To see the available templates or download the current template, use /imagetemplate
without parameters. To stop using image templates, use the -
parameter, that is:
/imagetemplate -
Image templates can also be customized. They are SVG files with a size between 600x300 pixels and 600x400 pixels. Inside, they contain text and image elements that are interpreted and replaced by the bot with the actual data from the raid or announce. Inkscape is recommended for editing (requires a Linux, Windows, or Mac computer).
To start using a custom template, send the SVG file of the template to the group, putting /imagetemplate
in the description.
You can start a template from scratch, but the easiest thing is to start by taking an existing template and modifying it. With the command /imagetemplate
you can download the current image template and make modifications and then use it as a custom template.
If you open a template, the linked images will show an error as the referenced file does not exist (see the section on images below). To avoid this, you can download this image pack and unzip it in the same directory where you have the template, which will facilitate editing by getting a better idea of how the images look while editing.
To interpret the elements of the template, the properties id
, class
and some properties that start with data-
, specific for each case, are used. In order to view and edit these properties you need to activate the Inkscape XML editor. Enable it in the Edit »XML Viewer… menu.
Replacements in text elements
Text elements can be interpreted, as if they were normal text templates. You cannot use conditionals of any kind. For a text element to be interpreted, it must have a class
called parsetext
.
Note that HTML cannot be used in images, so variables that contain links will display the HTML code. For example, the variable {gym}
. To prevent the HTML from being displayed, you can use the text-only variant, ie {gym_text}
.
Conditionals
Entire elements can be shown and hidden using conditionals. For an element’s conditionals to be interpreted, it must have a class
called parseconditions
.
Conditions must be set as the value of an attribute called data-conditions
. All the conditions described in the text templates section can be used, such as isegg && minutestoend <10
.
Images
In an SVG file you can embed images or link external images. If you drag an image file into Inkscape, you must tell it which of the two you want to do. If you want to include your own image (for example, a background image, or the group logo), you will want to embed it. On the contrary, if you want the image to be replaced by one of those available in the bot, you must link it.
The bot can substitute linked images to show Pokémon, Pokémon types, and more. To specify which image you want to replace, you must specify the correct identifier in the id attribute, according to the following table:
Id | Descripción | Relación |
---|---|---|
pokemon_img | Image of the Pokémon or the egg with a more realistic scaling (according to the sprites of the game) | 1:1 |
spokemon_img | Image of the Pokémon or egg with a less realistic but more balanced alternate scaling, fully centered | 1:1 |
dspokemon_img | Image of the Pokémon or egg with a less realistic but more balanced alternate scaling, centered vertically below | 1:1 |
pokemon_img_shiny | Image of the Pokémon or the egg with a more realistic scaling (according to the sprites of the game) in its shiny variant | 1:1 |
spokemon_img_shiny | Image of the Pokémon or the egg with a less realistic but more balanced alternative scaling, fully focused, in its shiny variant | 1:1 |
dspokemon_img_shiny | Image of the Pokémon or the egg with a less realistic but more balanced alternative scaling, centered vertically below, in its shiny variant | 1:1 |
pokemon_type1 | Icon of the first type of the Pokémon | 1:1 |
pokemon_type2 | Icon of the second type of the Pokémon (if there is) | 1:1 |
pokemon_weatherboost1 | Boosted weather icon for the first type of Pokémon | 1:1 |
pokemon_weatherboost2 | Boosted weather icon for the second type of Pokémon (if there is) | 1:1 |
pokemon_weatherboostw1 | Boosted weather icon for the first type of Pokémon (in white) | 1:1 |
pokemon_weatherboostw2 | Boosted weather icon for the second type of Pokémon (if there is, in white) | 1:1 |
pokemon_x1weakness1 | Icon of the type to which the Pokémon is weak at position 1 (can be used from 1 onwards, up to 7) | 1:1 |
pokemon_x2weakness1 | Icon of the type to which the Pokémon is doubly weak at position 1 (a 1 or a 2 can be used) | 1:1 |
pokemon_hatchable1 | Image of the Pokémon that can hatch from the egg in position 1 (they can be used from 1 to 10) | 1:1 |
spokemon_hatchable1 | Image of the Pokémon that can hatch from the egg in position 1 (they can be used from 1 to 10) with a less realistic but more balanced alternative scaling, fully centered | 1:1 |
dspokemon_hatchable1 | Image of the Pokémon that can hatch from the egg in position 1 (they can be used from 1 to 10) with a less realistic but more balanced alternative scaling, centered vertically below | 1:1 |
country_img | Country flag of the raid location, similar to the country_flag in text templates. | 4:3 |
gym_img | Image of the gym (it is necessary to upload them, read the section of gym images) | 1:1 |
If a linked image is defined with one of these id
and the image does not exist, it is automatically hidden. For example, if the Pokémon only has one type but images that refer to the second type are used. Linked images that do not have any of these ids will be ignored and will show errors in the template.
Text position and size
Text elements can be repositioned vertically or resized based on the length of your text, to help accommodate text in templates. Accommodating variable-length text is tricky, and using these techniques it is difficult to achieve perfect results when using variable-width fonts, but with a little trial and error you can get good results.
To change the font size based on the length of the text, the element must have a class
called resizetext
. You can specify the length from which to resize by putting the length as the value of an attribute called data-resizetext-length
and the desired size in data-resizetext-size
. The size must be specified in units and will be applied in the CSS font-size
property. For exemple:
class: resizetext
data-resizetext-length: 30
data-resizetext-size: 8px
To change the vertical position of the text based on its length, the element must have a class
called movetext
. You can specify the length from which the text is to be repositioned by putting the length as the value of an attribute called data-movetext-length
and the desired size in data-movetext-distance
. The distance must be specified without units and will be applied as the y
attribute of the element. For exemple:
class: movetext
data-movetext-length: 25
data-movetext-distance: -5
Gym images
For the gym images to work, the group needs to have a spreadsheet defined and the gyms are loaded. Once that is done, you have to get the images and send them through the group within a ZIP file by putting the /gymimages
command in the comment.
The images must be in JPEG format and be named as the name of the gym (first column) in the spreadsheet is set, with the extension .jpg
or .jpeg
at the end. Also, each image cannot exceed 300kB in size and the ZIP file cannot exceed 5MB. The ZIP file must not contain subdirectories: the images must all be in the main directory. A maximum of 300 files are processed, so if you have more gyms in your group, you will have to limit yourself to 300 of them.
Images received are only accepted if there is a gym pre-loaded with that name. Once accepted, they are resized and cut to a centered 250x250 pixel square, regardless of the original image format.
If you want to upload more images later, you have to resend them all since, each time a new ZIP file is received, all the previous ones are deleted first.
Limitations
Unlike text templates, image templates are not refreshed every time the message is updated, they are only updated when basic data of the raid changes, such as: the Pokémon, time, gym, etc. That is why variables and conditionals that refer to the number of registered trainers should not be used in the image template, since the image will not be updated properly.
The fonts that can be used are all included in this collection of Google Fonts. If you use unsupported fonts, they will look incorrect. To fix this, you can convert those texts to paths. This cannot be done if you want variables to be interpreted within the text, since when converting them to paths they stop behaving like texts.
Element ids cannot be repeated, so when using the id
attribute to specify the image type, you cannot put the same linked image twice in the same template. To fix this, you can add underline _
at the end and the bot will understand it the same. That is, pokemon_img_
and pokemon_img__
work the same as pokemon_img
.
Images messages take longer to generate, and depending on the server load this can spell trouble. You should try to use templates as simple as possible and, if you embed images, compress them to a suitable size first. Templates larger than 400 items or 2MB in size are automatically rejected.
Images messages on Telegram have a maximum of 1024 characters, while normal messages have a maximum of 4096 characters. With not very excessive text templates and a maximum of 20 points per raid there should be no problem, but if you don’t limit the targets in your group or put large texts in the templates, you could reach that limit and the raid would stop working. You can copy and paste the text of a raid with many points in a tool like charactercountonline.com to see the number of characters that you usually use. Keep in mind that if you put information in the image, you usually don’t want to have it duplicated in text as well, so you can remove duplicate information from text templates to save characters.
Test the templates
To facilitate template development, the SVG files of the templates can be submitted along with the description /testimagetemplate
for private testing (not in a group). The bot will render the template in several different situations so you can check how it looks and correct errors.