tsd1

Private

Content

426 lines
{=():}
{=( ):{ }}
{=(args1):{{if(21>{index(&£):{replace(, ):{args(1)}} &£}):args(1)}}}
{=(block):{urlencode:{lower:{args1}}}}
{=(block):{if(dm=={block}):redirect|{if(upper=={block}):lower|{block}}}}

{=(t.{block}):## {1} blocks}
{=(t.):## You need to enter a block name.}
{=(t.complete):## TagScript supported blocks}

{embed(color):#{#:e9e9e9~97e752}}

{=(is.{block}):**No help found for `{1}`.**
> `[p]tsd complete` to check the list of supported blocks.
_ _
**Friendly Reminder:**
Try out the examples for better understanding.}

{=(is.):> `[p]tsd complete` to check the list of supported blocks.
_ _
**Friendly Reminder:**
Try out the examples for better understanding.}

{=(is.complete):- default
- redirect
- dm
- require
- blacklist
- react
- command
- boolean
- if
- any
- all
- break
- variables
- parsing
- delimiters
- list
- cycle
- index
- in
- contains
- lower
- upper
- join
- replace
- urlencode
- math
- random
- range
- 5050
- strf
- timedelta
- cooldown
- stop
- embed
- delete
- override
- silent
_ _
**USAGE:**
```[p]tsd default```}

{=(is.default):**Default Variables:**
`TagScript` comes with a few default variables. They are:

- `{ (1)}unix{ (2)}`
Current Unix time, useful for math blocks. This only works in Tags.
- `{ (1)}uses{ (2)}`
The number of times the tag has been used. This only works in Tags.
- `{ (1)}mention{ (2)}`
Mentions the user of the tag
- `{ (1)}args{ (2)}`
- `{ (1)}message{ (2)}`
The arguments (words used) after the tag invocation.
`[p]foo bar baz` means `{ (1)}args{ (2)}`==bar baz
For triggers `{ (1)}args{ (2)}` contains the entire message.
_ _
**NOTE:**
- `{ (1)}args{ (2)}` vs `{ (1)}message{ (2)}`
Both `{ (1)}args{ (2)}` and `{ (1)}message{ (2)}` represent the same thing, but they act as separate variables. If args or message are accidentally used as a variable name, the other will continue to represent the arguments during the tag execution.

However, the digit shorthand variables `{ (1)}1{ (2)}`, `{ (1)}2{ (2)}`, `{ (1)}3{ (2)}`, etc, are based upon `{ (1)}message{ (2)}`, not `{ (1)}args{ (2)}`, meaning if message is used as a variable name those shorthand variables will represent the 1st, 2nd, 3rd, etc index values in the new `{ (1)}message{ (2)}` variable rather than the arguments they represented prior.}

{=(is.redirect):**CARL:**
`{ (1)}dm{ (2)}` / `{ (1)}redirect:channel{ (2)}`
> Redirects output to dm / a specified channel
_ _
- ```{ (1)}dm{ (2)} don't say that again```
- ```{ (1)}user{ (2)} says: { (1)}args{ (2)} { (1)}redirect:screaming-out-loud{ (2)}```
- ```{ (1)}redirect:186980582863929345{ (2)}```
_ _
**RED:**
- ```{ (1)}redirect(<"dm|reply|channel>){ (2)}```}

{=(is.require):**CARL:**
`{ (1)}require(message):channel,role{ (2)}`
> Limits the tag to executing ONLY when the user has a role listed or when used in a channel listed.
_ _
- ```{ (1)}require(you're not cool enough):Cool kids{ (2)} Word around the office is that { (1)}user{ (2)} is kind of a big deal```
- ```{ (1)}require(not allowed in this channel):1064873227619942302{ (2)}```
_ _
**RED:**
- ```{ (1)}require(role,channel):response{ (2)}```}

{=(is.blacklist):`{ (1)}blacklist(message):channel,role{ (2)}`
> Prevents the tag from executing when the user has a role listed or when used in a channel listed.
_ _
- ```{ (1)}blacklist:Staff{ (2)} You have no power here.```}

{=(is.react):`{ (1)}react: emoji{ (2)}` / `{ (1)}reactu: emoji{ (2)}`
> React Blocks instruct Carl-bot to react to either the invocation or the output.
_ _
- ```{ (1)}react: :haha: :skul:{ (2)}```
Reacts with the emoji(s) listed to the tag’s output message. Cannot react to command block output messages.
- ```{ (1)}reactu: :haha: :skul:{ (2)}```
Reacts (upwards) with the emoji(s) listed to the tag’s invocation or to the message containing the trigger word.
_ _
**SNIPPETS:**
Combine react with random for a cool autoreact!
- ```{ (1)}reactu: { (2)}rand: :haha:, :skul:, :carl_happy:{ (2)}{ (2)}```}

{=(is.command):`{ (1)}c: ...{ (2)}` / `{ (1)}cmd: ...{ (2)}` / `{ (1)}command: ...{ (2)}`
> Command blocks execute a Carl-bot command. The formatting and syntax do not change compared to how Carl-bot commands are normally used, except you do not include a prefix. These can only be used in tags.
_ _
- ```{ (1)}command: pick Pizza,Burgers,Takeout{ (2)}```
- ```{ (1)}c: role add {user(id)} Verified{ (2)}```
_ _
**Using Tags to Create Command Aliases:**
- ```!tag + whois { (1)}cmd: info { (1)}args{ (2)}{ (2)}```
- ```!tag + lb { (1)}c: leaderboard { (1)}args{ (2)}{ (2)}```}

{=(is.boolean):> Boolean is a variable having 2 possible values - `True` or `False`
> For tagscript,
> - Equal - `==` / NotEqual - `!=`
> - GreaterThan - `>` / GreaterThanOrEqual - `>=`
> - LessThan - `<` / LessThanOrEqual - `<=`
_ _
**Equal - `==` / NotEqual - `!=`**
- ```cat==dog```
Evaluates to true if the string on the left is identical to the string on the right. False in above case.
- ```tree!=car```
Evaluates to true if the string on the left is not identical to the string on the right. True in above case.
**GreaterThan - `>` / GreaterThanOrEqual - `>=`**
- ```15>20```
Evaluates to true if the number on the left side is greater than the number on the right. False in above case.
- ```17>=17```
Evaluates to true if the number on the left side is greater than or equal to the number on the right. True in above case.
**LessThan - `>` / LessThanOrEqual - `>=`**
- Same logic as that of GreaterThan / GreaterThanOrEqual}

{=(is.if):`{ (1)}if(booleanEQ):then|else{ (2)}`
> If the boolean equation evaluates to true, the block will result in the payload. If the boolean equation evaluates to false, the block will result in the second portion of the payload after the | if provided.
_ _
- ```{ (1)}if({ (1)}args{ (2)}==28):Your guess was correct.|Wrong guess.{ (2)}```
- ```{ (1)}if({ (1)}user(id){ (2)}=={ (1)}target(id){ (2)}):No target mentioned.|{ (1)}user{ (2)} says { (1)}target{ (2)} is a wuss!{ (2)}```}

{=(is.any):`{ (1)}any(booleanEQ1|booleanEQ2|etc):then|else{ (2)}` - `any` / `or`
> If any of the boolean equations provided evaluate to true, the block will result in the payload. If all of the boolean equations evaluate to false, the block will result in the second portion of the payload after the | if provided. Separate boolean equations inside the parameters with a pipe character |.
_ _
- ```{ (1)}any({ (1)}args{ (2)}==cat|{ (1)}arg{ (2)}==dog):Correct guess!{ (2)}```
- ```{ (1)}any({ (1)}user(color){ (2)}==#5989ab|{ (1)}user(color){ (2)}==#6296ff|{ (1)}user(color){ (2)}==#000001):Correct!{ (2)}```}

{=(is.all):`{ (1)}all(booleanEQ1|booleanEQ2|etc):then|else{ (2)}` - `all` / `and`
> If all of the boolean equations provided evaluate to true, the block will result in the payload. If any of the boolean equations evaluate to false, the block will result in the second portion of the payload after the | if provided. Separate boolean equations inside the parameters with a pipe character |.
_ _
- ```{ (1)}all({ (1)}args{ (2)}!=|{ (1)}args{ (2)}!=carl):Enter a word other than "carl"{ (2)}```
Argument cannot be empty, argument cannot be "carl"
- ```{ (1)}all({ (1)}1{ (2)}>0|{ (1)}1{ (2)}<=100):You ate { (1)}args{ (2)} tacos.|You must input a number between 1 and 100{ (2)}```
`{ (1)}1{ (2)}` is `{ (1)}args(1){ (2)}`}

{=(is.break):`{ (1)}break(booleanEQ):then{ (2)}` - `break` / `short` / `shortcircuit`
> If the boolean equation evaluates to true, the tag’s output will ONLY be the payload of this block. However, Carl-bot commands in command blocks will still execute, and if an embed is defined in the tag’s attached embed builder it will still send.
_ _
- ```{ (1)}break({ (1)}1{ (2)}==):You did not provide the proper input.{ (2)}```
Argument is empty}

{=(is.variables):
{ (1)}=(variablename):Content{ (2)} - `=` / `assign` / `let` / `var`
> Variables store data and values which can be referenced within the instance of the tag.
_ _
- ```{ (1)}=(user):{ (1)}target(mention){ (2)}{ (2)}
{ (1)}=(msg):How are you today?{ (2)}
Hello { (1)}user{ (2)}, { (1)}msg{ (2)}{ (2)}
```}

{=(is.parsing):Since space is the default delimiter, you can easily grab individual words
`{ (1)}args(1){ (2)}==Carl`, `{ (1)}args(2){ (2)}==likes`, and `{ (1)}args(3){ (2)}==Subway`.
You can also use `{ (1)}1{ (2)}` to mean `{ (1)}args(1){ (2)}`, `{ (1)}2{ (2)}` to mean `{ (1)}args(2){ (2)}` etc…

You can parse backwards by using index values below 1.
`{ (1)}args(0){ (2)}==tomatoes`, `{ (1)}args(-1){ (2)}==and`, `{ (1)}args(-2){ (2)}==provolone`,

Use a `+` before the index to reference every element up to and including the index value.
`{ (1)}args(+9){ (2)}==Carl likes Subway. Today he got a Spicy Italian`
Use a + after the index to reference the index value and every element after it.
`{ (1)}args(-11+){ (2)}==a Spicy Italian with - double pepperoni, double salami, provolone, and tomatoes.`}

{=(is.delimiters):You can grab the sentences separately by defining the delimiter as a `.`
`{ (1)}args(2):.{ (2)}==Today he got a Spicy Italian with - double pepperoni, double salami, provolone, and tomatoes`

What if you wanted to parse through just the toppings? Set the toppings to another variable then parse that.
`{ (1)}=(toppings):{ (1)}args(2):-{ (2)}{ (2)}`
`{ (1)}toppings(1):,{ (2)}== double pepperoni, { (1)}toppings(2):,{ (2)}== double salami, { (1)}toppings(0):,{ (2)}== and tomatoes.`

If you attempt to reference an element with an index that is out of bounds for the variable, Tagscript will return the whole variable.
`{ (1)}args(19){ (2)}==Carl likes Subway. Today he got a Spicy Italian with - double pepperoni, double salami, provolone, and tomatoes.`
If you attempt to reference a span of elements using + after an index that is out of bounds for the variable, Tagscript will return nothing.
`{ (1)}args(3+):.{ (2)}==`}

{=(is.list):`{ (1)}list(index):elem,elem2...{ (2)}`
> Returns the element in the payload the corresponds to the index value in the parameters. Block is null if the index is out of bounds.
_ _
- ```{ (1)}list(3):Apples~Bananas~Pears~Grapes~Oranges{ (2)}==Grapes```}

{=(is.cycle):`{ (1)}cycle(index):elem,elem2...{ (2)}`
> Returns the element in the payload the corresponds to the index value in the parameters. Loops around if the index is out of bounds.
_ _
- ```{ (1)}cycle(11):Apples,Bananas,Pears,Grapes,Oranges{ (2)}==Bananas```}

{=(is.index):`{ (1)}index(element):list of elements{ (2)}`
> The index block functions inversely compared to other data parsing blocks. Instead of using an index value to return an element from a list or string, it finds the specified element in the payload and returns that element’s index value. This block only functions in Tags.
_ _
- ```{ (1)}index(bread):Which do you like more, bread or chocolate? I like bread more{ (2)} == 5```}

{=(is.in):`{ (1)}in(string):string{ (2)}`
_ _
- ```{ (1)}in(spam):Most server rules prohibit spamming.{ (2)}```
would return true.
- ```{ (1)}in(spicy italian):Today Carl had a spicy italian sub.{ (2)}```
would return true.
- ```{ (1)}in(kable):Kable is awesome{ (2)}```
would return false because everything in tagscript is case-sensitive.
_ _
**Common Usage:**
To check if user has a specific role
`{ (1)}if({ (1)}in(514905279188434972):{ (1)}user(roleids){ (2)}{ (2)}==true):That's user has the Fake Canadian role!{ (2)}`}

{=(is.contains):`{ (1)}contains(element):list{ (2)}`
> Checks the payload for the presence of the parameter as an element of the payload delimited by spaces. Returns *true* if found or *false* if not.
_ _
- ```{ (1)}contains(violet):blue black green grey violet red yellow{ (2)}```
would return true
- ```{ (1)}contains(maple):pine fir aspen oak dogwood{ (2)}```
would return false
_ _
**Common Usage:**
To check if user has a specific role
`{ (1)}if({ (1)}contains(514905279188434972):{ (1)}user(roleids){ (2)}{ (2)}==true):That's user has the Fake Canadian role!{ (2)}`}

{=(is.lower):`{ (1)}lower:string{ (2)}` / `{ (1)}upper:string{ (2)}`
> `lower` returns the payload in all lowercase and `upper` returns the payload in all uppercase.
_ _
- ```{ (1)}lower:Whoozard is a Wizard{ (2)}```
would return `whoozard is a wizard`
- ```{ (1)}upper:carl-bot best bot{ (2)}```
would return `CARL-BOT BEST BOT`}

{=(is.join):`{ (1)}join(string):string{ (2)}`
> Replaces every space in the payload with the parameters.
_ _
- ```{ (1)}join(_):hello friends{ (2)}```
will result in `hello_friends`
- ```{ (1)}join():an example sentence{ (2)}```
will result in `anexamplesentence`}

{=(is.replace):`{ (1)}replace(1st string,2nd string):string{ (2)}`
Replaces every instance of the 1st string in the payload with 2nd string.
_ _
- ```{ (1)}replace(oo,ee):Goose Tooth Moose{ (2)}```
will result in `Geese Teeth Meese`
- ```/{ (1)}replace(, ):Carl-Bot{ (2)}/```
will result in `/ C a r l - B o t /`}

{=(is.urlencode):> The urlencode block encodes the payload into [Percent-encoding](https://en.wikipedia.org/wiki/Percent-encoding) so it can be included in a URL and understood by the browser of the user that clicked the link.
`{ (1)}urlencode:payload{ (2)}`
> Encodes the payload into percent-encoding.
`{ (1)}urlencode(+):payload{ (2)}`
> Encodes the payload into percent-encoding, but replaces spaces with + instead of %20.
_ _
- ```{ (1)}urlencode:Hey there, how are you?{ (2)}```
will return `Hey%20there%2C%20how%20are%20you%3F`
- ```{ (1)}urlencode(+):Hey there, how are you?{ (2)}```
will return `Hey+there%2C+how+are+you%3F`
- ```https://www.google.com/search?q={ (1)}urlencode(+):Carl-bot's dashboard{ (2)}```
will result in this link: [Google Search Results](https://www.google.com/search?q=Carl-bot%27s+dashboard) `(https://www.google.com/search?q=Carl-bot%27s+dashboard)`}

{=(is.math):`{ (1)}math:8+9{ (2)}` / `{ (1)}calc:7-4{ (2)}` / `{ (1)}+:8/2{ (2)}` / `{ (1)}m:5*6{ (2)}`
> Math blocks perform the mathematical operations in the payload and return the results.
- `a+b` Addition
- `a-b` Subtraction
- `a*b` Multiplication
- `a/b` Division
- `a%b` Modulo
- `a^b` Exponent
- `abs(x)` Absolute value of x
- `round(x)` Rounds x to the nearest whole number
- `trunc(x)` Truncates x to integer value (chops off decimals)
_ _
- ```{ (1)}m:round(7.8)+trunc(8.9){ (2)}```
would return `16`}

{=(is.random):`{ (1)}random(optional_seed):List,of,elements{ (2)}`
`{ (1)}rand(optional_seed):List~of~elements{ (2)}`
`{ (1)}#(optional_seed):4|Weighted,2|list,of,3|elements{ (2)}`
> Chooses a random value out of the list in the payload. Block names are synonymous.
You can use `,` to separate simple lists, but if you want to use commas as part of an element, you must instead use `~` to separate all the elements.
_ _
- ```{ (1)}rand:Hello, how are you?~Howdy{ (2)}```
will return either `Hello`, `how are you?` or `Howdy`
- ```{ (1)}#({ (1)}args{ (2)}):1,2,3{ (2)} { (1)}#({ (1)}args{ (2)}):one,two,three{ (2)}```
will always return elements with matching indices. `1 one`, `2 two`, or `3 three`
- ```{ (1)}random:99|You lost,You won!{ (2)}```
has a 1% chance of returning `You won!`
_ _
**NOTE:**
Elements in the payload can be weighted if that is desired. Weighting a value is the same as if that value was in the list of elements that many times.
- `{ (1)}random:4|a,2|b{ (2)} is the same as { (1)}random:a,a,a,a,b,b{ (2)}`}

{=(is.range):`{ (1)}range(optional_seed):Lower#-Higher#{ (2)}`
> Returns a random whole number in the specified range.
`{ (1)}rangef(optional_seed):Lower#-Higher#{ (2)}`
> Returns a random number in the specified range with tenths place decimal numbers.
_ _
- ```{ (1)}range:1-100{ (2)}```
would pick a number from `1` to `100`, like `19`
- ```{ (1)}rangef:8-9{ (2)}```
would pick a number from `8.0` to `9.0`, like `8.7`}

{=(is.5050):`{ (1)}5050:payload{ (2)}`
`{ (1)}50:payload{ (2)}`
`{ (1)}?:payload{ (2)}`
Has a 50% chance of returning the payload, and a 50% chance of being null. Block names are synonymous.}

{=(is.strf):`{ (1)}strf(optional DateTime or Unix time):strf formatting codes{ (2)}`
> Strf blocks return the time data formatted according to Python’s strftime, see [StrfTime](http://strftime.org/) or the [Linux Programmer’s Manual](http://man7.org/linux/man-pages/man3/strftime.3.html) for more information.
_ _
- ```December 31st 1999 was a { (1)}strf(1999-12-31 23.59.59):%A{ (2)}```
will output `December 31st 1999 was a Friday`
- ```The current time is { (1)}strf:%-I:%M %p{ (2)}```
will output `The current time is` followed by whatever the current 12h clock is for UTC, like `2:19 AM`
- ```Your account was created on { (1)}strf({ (1)}user(created_at){ (2)}): %x{ (2)}```
will output `Your account was created on 2015/12/24`}

{=(is.timedelta):`{ (1)}td(optional DateTime or Unix time):DateTime value{ (2)}`
_ _
- ```{ (1)}td:2020-01-01 00:00:00{ (2)}```
as of `2019-11-25` would output `1 month, 5 days and 21 hours`, or the time until Midnight New Years Day.
- ```{ (1)}td({ (1)}m:trunc({ (1)}unix{ (2)}-3600){ (2)}):{ (1)}strf:%Y-%m-%d %H:%M:%S{ (2)}{ (2)}```
will always output `1 hour` because `{unix}` is the current time and we subtracted 3600 seconds.```}

{=(is.cooldown):`{ (1)}cooldown(rate|per):key|message{ (2)}`
> This only works with phen's tagscript
_ _
> The cooldown block implements cooldowns when running a tag. The parameter requires 2 values to be passed: `rate` and `per` integers. The `rate` is the number of times the tag can be used every `per` seconds.
> The payload requires a `key` value, which is the key used to store the cooldown. A key should be any string that is unique. If a channel’s ID is passed as a key, the tag’s cooldown will be enforced on that channel. Running the tag in a separate channel would have a different cooldown with the same `rate` and `per` values.
_ _
- ```{ (1)}cooldown(1|10):{ (1)}author(id){ (2)}{ (2)}```
outputs `The bucket for 741074175875088424 has reached its cooldown. Retry in 3.25 seconds.`
- ```{ (1)}cooldown(3|3):{ (1)}channel(id){ (2)}|Slow down! This tag can only be used 3 times per 3 seconds per channel. Try again in **{ (1)}retry_after{ (2)}** seconds."{ (2)}```
outputs `Slow down! This tag can only be used 3 times per 3 seconds per channel. Try again in 0.74 seconds.`}

{=(is.stop):`{ (1)}stop(bool):string{ (2)}`
> This only works with phen's tagscript
_ _
> The stop block stops tag processing if the given parameter is true. If a message is passed to the payload it will return that message.
_ _
- ```{ (1)}stop({ (1)}args{ (2)}==):You must provide arguments for this tag.{ (2)}```}

{=(is.embed):**RED:**
> title, description, color, url, thumbnail, image, footer, field
- ```{ (1)}embed({ (1)}"title":"Hello!", "description":"This is a test embed."{ (2)}){ (2)}
{ (1)}embed({ (1)}
    "title":"Here's a random duck!",
    "image":{ (1)}"url":"https://random-d.uk/api/randomimg"{ (2)},
    "color":15194415
{ (2)}){ (2)}
```
- ```{ (1)}embed({ (1)}{ (1)}"fields":[{ (1)}"name":"Field 1","value":"field description","inline":false{ (2)}]{ (2)}){ (2)}
{ (1)}embed(title):my embed title{ (2)}
```
_ _
**CARL:**
for carl's tagscript embeds just use the [dashboard](https://carl.gg/).}

{=(is.delete):**CARL:**
`{ (1)}delete{ (2)}` / `{ (1)}del{ (2)}`
Deletes the message or invocation that triggered the tag.
_ _
**RED:**
`{ (1)}delete{ (2)}` / `{ (1)}delete(bool){ (2)}`
- `{ (1)}delete({ (1)}args(1){ (2)}==delete){ (2)}`}

{=(is.override):
**CARL:**
`{ (1)}override{ (2)}
> This instructs the tag to act as if the tag user has the modrole. Carl-bot still respects role hierarchy though.
_ _
**RED:**
> override commands that require a specific permission
- `{ (1)}override(admin){ (2)}` / `{ (1)}override(permissions){ (2)}` / `{ (1)}override(mod){ (2)}`
}

{=(is.silent):`{ (1)}silence{ (2)}` / `{ (1)}silent{ (2)}`
Silences the usual output of any command being used in a command block.}

{=(is.difference):> **CHANGES IN PHEN'S TAGSCRIPT FOR REDBOT"
- **require, blacklist, redirect**
`{ (1)}require(response):role,channel{ (2)}` becomes `{ (1)}require(role,channel):response{ (2)}`
`{ (1)}redirect(<"dm|reply|channel>){ (2)}`
- **embeds**
embeds don't require dashboard to be used. example embed:
`{ (1)}embed({ (1)}"title":"Hello!", "description":"This is a test embed."{ (2)}){ (2)}`
embeds support fields with `|`:
`{ (1)}embed(field):Rule 1|Respect everyone you speak to.|false{ (2)}`
- **delete**
delete gets a parameter
`{ (1)}delete{ (2)}` / `{ (1)}delete({ (1)}args(1){ (2)}==delete){ (2)}`
- **override**
override commands that require a specific permission
`{ (1)}override(admin){ (2)}` / `{ (1)}override(permissions){ (2)}` / `{ (1)}override(mod){ (2)}`
_ _
> **STUFF CARL LACKS**
- `cooldown`, `stop`
- multi command usage in one tag}

Embed

1 line
{"url": "https://docs.carl.gg/#/tagstriggers?id=advanced-usage", "color": 5198940, "title": "Tagscript Documentation", "description": "{t.{block}}\n{is.{block}}"}
Raw JSON
{
  "id": 2071232,
  "created_at": "2024-07-27T00:30:34.000Z",
  "tag_name": "tsd1",
  "nsfw": false,
  "owner_id": "602615705015156736",
  "uses": 53,
  "description": null,
  "restricted": false,
  "shared": false,
  "deleted": false,
  "safe": "",
  "hidden": false,
  "guild_id": "1039570200544170025",
  "sharer": "602615705015156736",
  "content": "{=():}\n{=( ):{ }}\n{=(args1):{{if(21>{index(&£):{replace(, ):{args(1)}} &£}):args(1)}}}\n{=(block):{urlencode:{lower:{args1}}}}\n{=(block):{if(dm=={block}):redirect|{if(upper=={block}):lower|{block}}}}\n\n{=(t.{block}):## {1} blocks}\n{=(t.):## You need to enter a block name.}\n{=(t.complete):## TagScript supported blocks}\n\n{embed(color):#{#:e9e9e9~97e752}}\n\n{=(is.{block}):**No help found for `{1}`.**\n> `[p]tsd complete` to check the list of supported blocks.\n_ _\n**Friendly Reminder:**\nTry out the examples for better understanding.}\n\n{=(is.):> `[p]tsd complete` to check the list of supported blocks.\n_ _\n**Friendly Reminder:**\nTry out the examples for better understanding.}\n\n{=(is.complete):- default\n- redirect\n- dm\n- require\n- blacklist\n- react\n- command\n- boolean\n- if\n- any\n- all\n- break\n- variables\n- parsing\n- delimiters\n- list\n- cycle\n- index\n- in\n- contains\n- lower\n- upper\n- join\n- replace\n- urlencode\n- math\n- random\n- range\n- 5050\n- strf\n- timedelta\n- cooldown\n- stop\n- embed\n- delete\n- override\n- silent\n_ _\n**USAGE:**\n```[p]tsd default```}\n\n{=(is.default):**Default Variables:**\n`TagScript` comes with a few default variables. They are:\n\n- `{ (1)}unix{ (2)}`\nCurrent Unix time, useful for math blocks. This only works in Tags.\n- `{ (1)}uses{ (2)}`\nThe number of times the tag has been used. This only works in Tags.\n- `{ (1)}mention{ (2)}`\nMentions the user of the tag\n- `{ (1)}args{ (2)}`\n- `{ (1)}message{ (2)}`\nThe arguments (words used) after the tag invocation.\n`[p]foo bar baz` means `{ (1)}args{ (2)}`==bar baz\nFor triggers `{ (1)}args{ (2)}` contains the entire message.\n_ _\n**NOTE:**\n- `{ (1)}args{ (2)}` vs `{ (1)}message{ (2)}`\nBoth `{ (1)}args{ (2)}` and `{ (1)}message{ (2)}` represent the same thing, but they act as separate variables. If args or message are accidentally used as a variable name, the other will continue to represent the arguments during the tag execution.\n\nHowever, the digit shorthand variables `{ (1)}1{ (2)}`, `{ (1)}2{ (2)}`, `{ (1)}3{ (2)}`, etc, are based upon `{ (1)}message{ (2)}`, not `{ (1)}args{ (2)}`, meaning if message is used as a variable name those shorthand variables will represent the 1st, 2nd, 3rd, etc index values in the new `{ (1)}message{ (2)}` variable rather than the arguments they represented prior.}\n\n{=(is.redirect):**CARL:**\n`{ (1)}dm{ (2)}` / `{ (1)}redirect:channel{ (2)}`\n> Redirects output to dm / a specified channel\n_ _\n- ```{ (1)}dm{ (2)} don't say that again```\n- ```{ (1)}user{ (2)} says: { (1)}args{ (2)} { (1)}redirect:screaming-out-loud{ (2)}```\n- ```{ (1)}redirect:186980582863929345{ (2)}```\n_ _\n**RED:**\n- ```{ (1)}redirect(<\"dm|reply|channel>){ (2)}```}\n\n{=(is.require):**CARL:**\n`{ (1)}require(message):channel,role{ (2)}`\n> Limits the tag to executing ONLY when the user has a role listed or when used in a channel listed.\n_ _\n- ```{ (1)}require(you're not cool enough):Cool kids{ (2)} Word around the office is that { (1)}user{ (2)} is kind of a big deal```\n- ```{ (1)}require(not allowed in this channel):1064873227619942302{ (2)}```\n_ _\n**RED:**\n- ```{ (1)}require(role,channel):response{ (2)}```}\n\n{=(is.blacklist):`{ (1)}blacklist(message):channel,role{ (2)}`\n> Prevents the tag from executing when the user has a role listed or when used in a channel listed.\n_ _\n- ```{ (1)}blacklist:Staff{ (2)} You have no power here.```}\n\n{=(is.react):`{ (1)}react: emoji{ (2)}` / `{ (1)}reactu: emoji{ (2)}`\n> React Blocks instruct Carl-bot to react to either the invocation or the output.\n_ _\n- ```{ (1)}react: :haha: :skul:{ (2)}```\nReacts with the emoji(s) listed to the tag’s output message. Cannot react to command block output messages.\n- ```{ (1)}reactu: :haha: :skul:{ (2)}```\nReacts (upwards) with the emoji(s) listed to the tag’s invocation or to the message containing the trigger word.\n_ _\n**SNIPPETS:**\nCombine react with random for a cool autoreact!\n- ```{ (1)}reactu: { (2)}rand: :haha:, :skul:, :carl_happy:{ (2)}{ (2)}```}\n\n{=(is.command):`{ (1)}c: ...{ (2)}` / `{ (1)}cmd: ...{ (2)}` / `{ (1)}command: ...{ (2)}`\n> Command blocks execute a Carl-bot command. The formatting and syntax do not change compared to how Carl-bot commands are normally used, except you do not include a prefix. These can only be used in tags.\n_ _\n- ```{ (1)}command: pick Pizza,Burgers,Takeout{ (2)}```\n- ```{ (1)}c: role add {user(id)} Verified{ (2)}```\n_ _\n**Using Tags to Create Command Aliases:**\n- ```!tag + whois { (1)}cmd: info { (1)}args{ (2)}{ (2)}```\n- ```!tag + lb { (1)}c: leaderboard { (1)}args{ (2)}{ (2)}```}\n\n{=(is.boolean):> Boolean is a variable having 2 possible values - `True` or `False`\n> For tagscript,\n> - Equal - `==` / NotEqual - `!=`\n> - GreaterThan - `>` / GreaterThanOrEqual - `>=`\n> - LessThan - `<` / LessThanOrEqual - `<=`\n_ _\n**Equal - `==` / NotEqual - `!=`**\n- ```cat==dog```\nEvaluates to true if the string on the left is identical to the string on the right. False in above case.\n- ```tree!=car```\nEvaluates to true if the string on the left is not identical to the string on the right. True in above case.\n**GreaterThan - `>` / GreaterThanOrEqual - `>=`**\n- ```15>20```\nEvaluates to true if the number on the left side is greater than the number on the right. False in above case.\n- ```17>=17```\nEvaluates to true if the number on the left side is greater than or equal to the number on the right. True in above case.\n**LessThan - `>` / LessThanOrEqual - `>=`**\n- Same logic as that of GreaterThan / GreaterThanOrEqual}\n\n{=(is.if):`{ (1)}if(booleanEQ):then|else{ (2)}`\n> If the boolean equation evaluates to true, the block will result in the payload. If the boolean equation evaluates to false, the block will result in the second portion of the payload after the | if provided.\n_ _\n- ```{ (1)}if({ (1)}args{ (2)}==28):Your guess was correct.|Wrong guess.{ (2)}```\n- ```{ (1)}if({ (1)}user(id){ (2)}=={ (1)}target(id){ (2)}):No target mentioned.|{ (1)}user{ (2)} says { (1)}target{ (2)} is a wuss!{ (2)}```}\n\n{=(is.any):`{ (1)}any(booleanEQ1|booleanEQ2|etc):then|else{ (2)}` - `any` / `or`\n> If any of the boolean equations provided evaluate to true, the block will result in the payload. If all of the boolean equations evaluate to false, the block will result in the second portion of the payload after the | if provided. Separate boolean equations inside the parameters with a pipe character |.\n_ _\n- ```{ (1)}any({ (1)}args{ (2)}==cat|{ (1)}arg{ (2)}==dog):Correct guess!{ (2)}```\n- ```{ (1)}any({ (1)}user(color){ (2)}==#5989ab|{ (1)}user(color){ (2)}==#6296ff|{ (1)}user(color){ (2)}==#000001):Correct!{ (2)}```}\n\n{=(is.all):`{ (1)}all(booleanEQ1|booleanEQ2|etc):then|else{ (2)}` - `all` / `and`\n> If all of the boolean equations provided evaluate to true, the block will result in the payload. If any of the boolean equations evaluate to false, the block will result in the second portion of the payload after the | if provided. Separate boolean equations inside the parameters with a pipe character |.\n_ _\n- ```{ (1)}all({ (1)}args{ (2)}!=|{ (1)}args{ (2)}!=carl):Enter a word other than \"carl\"{ (2)}```\nArgument cannot be empty, argument cannot be \"carl\"\n- ```{ (1)}all({ (1)}1{ (2)}>0|{ (1)}1{ (2)}<=100):You ate { (1)}args{ (2)} tacos.|You must input a number between 1 and 100{ (2)}```\n`{ (1)}1{ (2)}` is `{ (1)}args(1){ (2)}`}\n\n{=(is.break):`{ (1)}break(booleanEQ):then{ (2)}` - `break` / `short` / `shortcircuit`\n> If the boolean equation evaluates to true, the tag’s output will ONLY be the payload of this block. However, Carl-bot commands in command blocks will still execute, and if an embed is defined in the tag’s attached embed builder it will still send.\n_ _\n- ```{ (1)}break({ (1)}1{ (2)}==):You did not provide the proper input.{ (2)}```\nArgument is empty}\n\n{=(is.variables):\n{ (1)}=(variablename):Content{ (2)} - `=` / `assign` / `let` / `var`\n> Variables store data and values which can be referenced within the instance of the tag.\n_ _\n- ```{ (1)}=(user):{ (1)}target(mention){ (2)}{ (2)}\n{ (1)}=(msg):How are you today?{ (2)}\nHello { (1)}user{ (2)}, { (1)}msg{ (2)}{ (2)}\n```}\n\n{=(is.parsing):Since space is the default delimiter, you can easily grab individual words\n`{ (1)}args(1){ (2)}==Carl`, `{ (1)}args(2){ (2)}==likes`, and `{ (1)}args(3){ (2)}==Subway`.\nYou can also use `{ (1)}1{ (2)}` to mean `{ (1)}args(1){ (2)}`, `{ (1)}2{ (2)}` to mean `{ (1)}args(2){ (2)}` etc…\n\nYou can parse backwards by using index values below 1.\n`{ (1)}args(0){ (2)}==tomatoes`, `{ (1)}args(-1){ (2)}==and`, `{ (1)}args(-2){ (2)}==provolone`,\n\nUse a `+` before the index to reference every element up to and including the index value.\n`{ (1)}args(+9){ (2)}==Carl likes Subway. Today he got a Spicy Italian`\nUse a + after the index to reference the index value and every element after it.\n`{ (1)}args(-11+){ (2)}==a Spicy Italian with - double pepperoni, double salami, provolone, and tomatoes.`}\n\n{=(is.delimiters):You can grab the sentences separately by defining the delimiter as a `.`\n`{ (1)}args(2):.{ (2)}==Today he got a Spicy Italian with - double pepperoni, double salami, provolone, and tomatoes`\n\nWhat if you wanted to parse through just the toppings? Set the toppings to another variable then parse that.\n`{ (1)}=(toppings):{ (1)}args(2):-{ (2)}{ (2)}`\n`{ (1)}toppings(1):,{ (2)}== double pepperoni, { (1)}toppings(2):,{ (2)}== double salami, { (1)}toppings(0):,{ (2)}== and tomatoes.`\n\nIf you attempt to reference an element with an index that is out of bounds for the variable, Tagscript will return the whole variable.\n`{ (1)}args(19){ (2)}==Carl likes Subway. Today he got a Spicy Italian with - double pepperoni, double salami, provolone, and tomatoes.`\nIf you attempt to reference a span of elements using + after an index that is out of bounds for the variable, Tagscript will return nothing.\n`{ (1)}args(3+):.{ (2)}==`}\n\n{=(is.list):`{ (1)}list(index):elem,elem2...{ (2)}`\n> Returns the element in the payload the corresponds to the index value in the parameters. Block is null if the index is out of bounds.\n_ _\n- ```{ (1)}list(3):Apples~Bananas~Pears~Grapes~Oranges{ (2)}==Grapes```}\n\n{=(is.cycle):`{ (1)}cycle(index):elem,elem2...{ (2)}`\n> Returns the element in the payload the corresponds to the index value in the parameters. Loops around if the index is out of bounds.\n_ _\n- ```{ (1)}cycle(11):Apples,Bananas,Pears,Grapes,Oranges{ (2)}==Bananas```}\n\n{=(is.index):`{ (1)}index(element):list of elements{ (2)}`\n> The index block functions inversely compared to other data parsing blocks. Instead of using an index value to return an element from a list or string, it finds the specified element in the payload and returns that element’s index value. This block only functions in Tags.\n_ _\n- ```{ (1)}index(bread):Which do you like more, bread or chocolate? I like bread more{ (2)} == 5```}\n\n{=(is.in):`{ (1)}in(string):string{ (2)}`\n_ _\n- ```{ (1)}in(spam):Most server rules prohibit spamming.{ (2)}```\nwould return true.\n- ```{ (1)}in(spicy italian):Today Carl had a spicy italian sub.{ (2)}```\nwould return true.\n- ```{ (1)}in(kable):Kable is awesome{ (2)}```\nwould return false because everything in tagscript is case-sensitive.\n_ _\n**Common Usage:**\nTo check if user has a specific role\n`{ (1)}if({ (1)}in(514905279188434972):{ (1)}user(roleids){ (2)}{ (2)}==true):That's user has the Fake Canadian role!{ (2)}`}\n\n{=(is.contains):`{ (1)}contains(element):list{ (2)}`\n> Checks the payload for the presence of the parameter as an element of the payload delimited by spaces. Returns *true* if found or *false* if not.\n_ _\n- ```{ (1)}contains(violet):blue black green grey violet red yellow{ (2)}```\nwould return true\n- ```{ (1)}contains(maple):pine fir aspen oak dogwood{ (2)}```\nwould return false\n_ _\n**Common Usage:**\nTo check if user has a specific role\n`{ (1)}if({ (1)}contains(514905279188434972):{ (1)}user(roleids){ (2)}{ (2)}==true):That's user has the Fake Canadian role!{ (2)}`}\n\n{=(is.lower):`{ (1)}lower:string{ (2)}` / `{ (1)}upper:string{ (2)}`\n> `lower` returns the payload in all lowercase and `upper` returns the payload in all uppercase.\n_ _\n- ```{ (1)}lower:Whoozard is a Wizard{ (2)}```\nwould return `whoozard is a wizard`\n- ```{ (1)}upper:carl-bot best bot{ (2)}```\nwould return `CARL-BOT BEST BOT`}\n\n{=(is.join):`{ (1)}join(string):string{ (2)}`\n> Replaces every space in the payload with the parameters.\n_ _\n- ```{ (1)}join(_):hello friends{ (2)}```\nwill result in `hello_friends`\n- ```{ (1)}join():an example sentence{ (2)}```\nwill result in `anexamplesentence`}\n\n{=(is.replace):`{ (1)}replace(1st string,2nd string):string{ (2)}`\nReplaces every instance of the 1st string in the payload with 2nd string.\n_ _\n- ```{ (1)}replace(oo,ee):Goose Tooth Moose{ (2)}```\nwill result in `Geese Teeth Meese`\n- ```/{ (1)}replace(, ):Carl-Bot{ (2)}/```\nwill result in `/ C a r l - B o t /`}\n\n{=(is.urlencode):> The urlencode block encodes the payload into [Percent-encoding](https://en.wikipedia.org/wiki/Percent-encoding) so it can be included in a URL and understood by the browser of the user that clicked the link.\n`{ (1)}urlencode:payload{ (2)}`\n> Encodes the payload into percent-encoding.\n`{ (1)}urlencode(+):payload{ (2)}`\n> Encodes the payload into percent-encoding, but replaces spaces with + instead of %20.\n_ _\n- ```{ (1)}urlencode:Hey there, how are you?{ (2)}```\nwill return `Hey%20there%2C%20how%20are%20you%3F`\n- ```{ (1)}urlencode(+):Hey there, how are you?{ (2)}```\nwill return `Hey+there%2C+how+are+you%3F`\n- ```https://www.google.com/search?q={ (1)}urlencode(+):Carl-bot's dashboard{ (2)}```\nwill result in this link: [Google Search Results](https://www.google.com/search?q=Carl-bot%27s+dashboard) `(https://www.google.com/search?q=Carl-bot%27s+dashboard)`}\n\n{=(is.math):`{ (1)}math:8+9{ (2)}` / `{ (1)}calc:7-4{ (2)}` / `{ (1)}+:8/2{ (2)}` / `{ (1)}m:5*6{ (2)}`\n> Math blocks perform the mathematical operations in the payload and return the results.\n- `a+b` Addition\n- `a-b` Subtraction\n- `a*b` Multiplication\n- `a/b` Division\n- `a%b` Modulo\n- `a^b` Exponent\n- `abs(x)` Absolute value of x\n- `round(x)` Rounds x to the nearest whole number\n- `trunc(x)` Truncates x to integer value (chops off decimals)\n_ _\n- ```{ (1)}m:round(7.8)+trunc(8.9){ (2)}```\nwould return `16`}\n\n{=(is.random):`{ (1)}random(optional_seed):List,of,elements{ (2)}`\n`{ (1)}rand(optional_seed):List~of~elements{ (2)}`\n`{ (1)}#(optional_seed):4|Weighted,2|list,of,3|elements{ (2)}`\n> Chooses a random value out of the list in the payload. Block names are synonymous.\nYou can use `,` to separate simple lists, but if you want to use commas as part of an element, you must instead use `~` to separate all the elements.\n_ _\n- ```{ (1)}rand:Hello, how are you?~Howdy{ (2)}```\nwill return either `Hello`, `how are you?` or `Howdy`\n- ```{ (1)}#({ (1)}args{ (2)}):1,2,3{ (2)} { (1)}#({ (1)}args{ (2)}):one,two,three{ (2)}```\nwill always return elements with matching indices. `1 one`, `2 two`, or `3 three`\n- ```{ (1)}random:99|You lost,You won!{ (2)}```\nhas a 1% chance of returning `You won!`\n_ _\n**NOTE:**\nElements in the payload can be weighted if that is desired. Weighting a value is the same as if that value was in the list of elements that many times.\n- `{ (1)}random:4|a,2|b{ (2)} is the same as { (1)}random:a,a,a,a,b,b{ (2)}`}\n\n{=(is.range):`{ (1)}range(optional_seed):Lower#-Higher#{ (2)}`\n> Returns a random whole number in the specified range.\n`{ (1)}rangef(optional_seed):Lower#-Higher#{ (2)}`\n> Returns a random number in the specified range with tenths place decimal numbers.\n_ _\n- ```{ (1)}range:1-100{ (2)}```\nwould pick a number from `1` to `100`, like `19`\n- ```{ (1)}rangef:8-9{ (2)}```\nwould pick a number from `8.0` to `9.0`, like `8.7`}\n\n{=(is.5050):`{ (1)}5050:payload{ (2)}`\n`{ (1)}50:payload{ (2)}`\n`{ (1)}?:payload{ (2)}`\nHas a 50% chance of returning the payload, and a 50% chance of being null. Block names are synonymous.}\n\n{=(is.strf):`{ (1)}strf(optional DateTime or Unix time):strf formatting codes{ (2)}`\n> Strf blocks return the time data formatted according to Python’s strftime, see [StrfTime](http://strftime.org/) or the [Linux Programmer’s Manual](http://man7.org/linux/man-pages/man3/strftime.3.html) for more information.\n_ _\n- ```December 31st 1999 was a { (1)}strf(1999-12-31 23.59.59):%A{ (2)}```\nwill output `December 31st 1999 was a Friday`\n- ```The current time is { (1)}strf:%-I:%M %p{ (2)}```\nwill output `The current time is` followed by whatever the current 12h clock is for UTC, like `2:19 AM`\n- ```Your account was created on { (1)}strf({ (1)}user(created_at){ (2)}): %x{ (2)}```\nwill output `Your account was created on 2015/12/24`}\n\n{=(is.timedelta):`{ (1)}td(optional DateTime or Unix time):DateTime value{ (2)}`\n_ _\n- ```{ (1)}td:2020-01-01 00:00:00{ (2)}```\nas of `2019-11-25` would output `1 month, 5 days and 21 hours`, or the time until Midnight New Years Day.\n- ```{ (1)}td({ (1)}m:trunc({ (1)}unix{ (2)}-3600){ (2)}):{ (1)}strf:%Y-%m-%d %H:%M:%S{ (2)}{ (2)}```\nwill always output `1 hour` because `{unix}` is the current time and we subtracted 3600 seconds.```}\n\n{=(is.cooldown):`{ (1)}cooldown(rate|per):key|message{ (2)}`\n> This only works with phen's tagscript\n_ _\n> The cooldown block implements cooldowns when running a tag. The parameter requires 2 values to be passed: `rate` and `per` integers. The `rate` is the number of times the tag can be used every `per` seconds.\n> The payload requires a `key` value, which is the key used to store the cooldown. A key should be any string that is unique. If a channel’s ID is passed as a key, the tag’s cooldown will be enforced on that channel. Running the tag in a separate channel would have a different cooldown with the same `rate` and `per` values.\n_ _\n- ```{ (1)}cooldown(1|10):{ (1)}author(id){ (2)}{ (2)}```\noutputs `The bucket for 741074175875088424 has reached its cooldown. Retry in 3.25 seconds.`\n- ```{ (1)}cooldown(3|3):{ (1)}channel(id){ (2)}|Slow down! This tag can only be used 3 times per 3 seconds per channel. Try again in **{ (1)}retry_after{ (2)}** seconds.\"{ (2)}```\noutputs `Slow down! This tag can only be used 3 times per 3 seconds per channel. Try again in 0.74 seconds.`}\n\n{=(is.stop):`{ (1)}stop(bool):string{ (2)}`\n> This only works with phen's tagscript\n_ _\n> The stop block stops tag processing if the given parameter is true. If a message is passed to the payload it will return that message.\n_ _\n- ```{ (1)}stop({ (1)}args{ (2)}==):You must provide arguments for this tag.{ (2)}```}\n\n{=(is.embed):**RED:**\n> title, description, color, url, thumbnail, image, footer, field\n- ```{ (1)}embed({ (1)}\"title\":\"Hello!\", \"description\":\"This is a test embed.\"{ (2)}){ (2)}\n{ (1)}embed({ (1)}\n    \"title\":\"Here's a random duck!\",\n    \"image\":{ (1)}\"url\":\"https://random-d.uk/api/randomimg\"{ (2)},\n    \"color\":15194415\n{ (2)}){ (2)}\n```\n- ```{ (1)}embed({ (1)}{ (1)}\"fields\":[{ (1)}\"name\":\"Field 1\",\"value\":\"field description\",\"inline\":false{ (2)}]{ (2)}){ (2)}\n{ (1)}embed(title):my embed title{ (2)}\n```\n_ _\n**CARL:**\nfor carl's tagscript embeds just use the [dashboard](https://carl.gg/).}\n\n{=(is.delete):**CARL:**\n`{ (1)}delete{ (2)}` / `{ (1)}del{ (2)}`\nDeletes the message or invocation that triggered the tag.\n_ _\n**RED:**\n`{ (1)}delete{ (2)}` / `{ (1)}delete(bool){ (2)}`\n- `{ (1)}delete({ (1)}args(1){ (2)}==delete){ (2)}`}\n\n{=(is.override):\n**CARL:**\n`{ (1)}override{ (2)}\n> This instructs the tag to act as if the tag user has the modrole. Carl-bot still respects role hierarchy though.\n_ _\n**RED:**\n> override commands that require a specific permission\n- `{ (1)}override(admin){ (2)}` / `{ (1)}override(permissions){ (2)}` / `{ (1)}override(mod){ (2)}`\n}\n\n{=(is.silent):`{ (1)}silence{ (2)}` / `{ (1)}silent{ (2)}`\nSilences the usual output of any command being used in a command block.}\n\n{=(is.difference):> **CHANGES IN PHEN'S TAGSCRIPT FOR REDBOT\"\n- **require, blacklist, redirect**\n`{ (1)}require(response):role,channel{ (2)}` becomes `{ (1)}require(role,channel):response{ (2)}`\n`{ (1)}redirect(<\"dm|reply|channel>){ (2)}`\n- **embeds**\nembeds don't require dashboard to be used. example embed:\n`{ (1)}embed({ (1)}\"title\":\"Hello!\", \"description\":\"This is a test embed.\"{ (2)}){ (2)}`\nembeds support fields with `|`:\n`{ (1)}embed(field):Rule 1|Respect everyone you speak to.|false{ (2)}`\n- **delete**\ndelete gets a parameter\n`{ (1)}delete{ (2)}` / `{ (1)}delete({ (1)}args(1){ (2)}==delete){ (2)}`\n- **override**\noverride commands that require a specific permission\n`{ (1)}override(admin){ (2)}` / `{ (1)}override(permissions){ (2)}` / `{ (1)}override(mod){ (2)}`\n_ _\n> **STUFF CARL LACKS**\n- `cooldown`, `stop`\n- multi command usage in one tag}",
  "embed": "{\"url\": \"https://docs.carl.gg/#/tagstriggers?id=advanced-usage\", \"color\": 5198940, \"title\": \"Tagscript Documentation\", \"description\": \"{t.{block}}\\n{is.{block}}\"}",
  "last_fetched": "2026-10-20T19:41:38.405Z"
}