Basico
Redeye Script é uma linguagem simples para criar comandos personalizados no Discord.
Variáveis
var nome = "Redeye" // mutável, pode mudar
const pi = 3.14 // constante, não pode mudar
nome = "Outro" // ok
pi = 3 // erro!
Condicionais
if user.name == "Victor" {
reply "Olá, criador!"
} else if user.isBot {
reply "Você é um bot."
} else {
reply "Olá, {user.name}!"
}
Funções
fun dobro(n) {
return n * 2
}
reply "O dobro de 5 é {dobro(5)}"
Null coalescing
val target = args[0] ?? user
reply "Alvo: {target.name}"
O operador ?? retorna o lado direito se o esquerdo for null.
Tipos
| Tipo |
Exemplo |
Descrição |
number |
42, 3.14 |
Numero inteiro ou decimal |
string |
"texto" |
Texto entre aspas |
boolean |
true, false |
Verdadeiro ou falso |
null |
null |
Ausencia de valor |
list |
list(1, 2, 3) |
Lista ordenada |
object |
{ nome: "x", idade: 20 } |
Objeto com chaves e valores |
String interpolation
val nome = "Victor"
reply "Olá, {nome}!" // Olá, Victor!
Use {expressao} dentro de strings para interpolar valores.
Objetos
val perfil = {
nome: "Victor",
nivel: 10,
vip: true
}
reply "{perfil.nome} é nivel {perfil.nivel}"
Operadores
| Operador |
Descrição |
Exemplo |
+ |
Soma / concatenar |
1 + 2, "a" + "b" |
- |
Subtração |
10 - 3 |
* |
Multiplicação |
4 * 5 |
/ |
Divisão |
10 / 3 |
% |
Resto |
10 % 3 |
== |
Igual |
x == 5 |
!= |
Diferente |
x != 5 |
< > <= >= |
Comparação |
x > 10 |
&& |
E lógico |
x > 0 && x < 10 |
|| |
Ou lógico |
x == 0 || x == 1 |
! |
Negação |
!flag |
?? |
Null coalescing |
valor ?? "padrão" |
Funções
Saida
| Função |
Descrição |
reply(msg) |
Envia uma mensagem (max 5 por execução) |
Matemática
| Função |
Descrição |
random() |
Numero aleatorio entre 0.0 e 1.0 |
random(max) |
Inteiro aleatorio de 0 a max-1 |
random(min, max) |
Inteiro aleatorio de min a max |
floor(n) |
Arredonda pra baixo |
ceil(n) |
Arredonda pra cima |
round(n) |
Arredonda pro mais proximo |
abs(n) |
Valor absoluto |
min(a, b, ...) |
Menor valor |
max(a, b, ...) |
Maior valor |
Conversão e Utilidades
| Função |
Descrição |
number(val) |
Converte para numero |
string(val) |
Converte para string |
typeof(val) |
Retorna o tipo como string |
len(val) |
Tamanho de string, lista ou objeto |
list(a, b, ...) |
Cria uma lista |
now() |
Timestamp atual em milissegundos (epoch) |
Objetos de contexto
Esses objetos estão disponíveis em todo script automaticamente.
user - Quem executou o comando
| Propriedade |
Tipo |
Descrição |
user.name |
string |
Nome de exibição |
user.id |
string |
ID do usuario |
user.asMention |
string |
Menção (@user) |
user.avatar |
string |
URL do avatar |
user.isBot |
boolean |
Se é um bot |
user.balance |
number |
Saldo de iris |
user.aboutMe |
string |
Texto do about me |
user.hasRole(nome) |
boolean |
Se tem o cargo |
guild - O servidor atual
| Propriedade |
Tipo |
Descrição |
guild.name |
string |
Nome do servidor |
guild.id |
string |
ID do servidor |
guild.memberCount |
number |
Quantidade de membros |
guild.getMemberById(id) |
user/null |
Busca um membro pelo ID |
channel - O canal atual
| Propriedade |
Tipo |
Descrição |
channel.name |
string |
Nome do canal |
channel.id |
string |
ID do canal |
channel.asMention |
string |
Menção (#canal) |
args - Argumentos do comando
// Se o comando tem opção "user" e "amount":
val alvo = args[0] // primeiro argumento
val qtd = args[1] // segundo argumento
// Verificar se foi passado:
val target = args[0] ?? user
Storage
Armazena dados persistentes compartilhados entre todos os scripts do servidor.
| Método |
Descrição |
storage.get(key) |
Lê um valor (retorna null se não existir) |
storage.set(key, value) |
Salva um valor (string, numero, objeto, lista) |
storage.delete(key) |
Remove um valor |
Exemplo com objetos
val dados = storage.get(user.id)
if dados == null {
storage.set(user.id, { pontos: 0, nivel: 1 })
reply "Conta criada!"
} else {
dados.pontos = dados.pontos + 1
storage.set(user.id, dados)
reply "Você tem {dados.pontos} pontos!"
}
Secrets
Chaves de API armazenadas com segurança. Configuráveis no painel.
val apiKey = secrets.get("MINHA_API_KEY")
val res = fetch("https://api.exemplo.com?key={apiKey}")
Embeds
Crie mensagens ricas com embeds do Discord.
reply embed {
title "Titulo do embed"
description "Uma descricao legal"
color "#dc2626"
thumbnail user.avatar
field("Campo 1", "Valor 1", true)
field("Campo 2", "Valor 2", true)
footer "Redeye Bot"
footerIcon user.avatar
}
| Propriedade |
Descrição |
title |
Titulo do embed |
description |
Descricao |
color |
Cor em hex (#RRGGBB) |
thumbnail |
URL de imagem pequena |
image |
URL de imagem grande |
url |
Link no titulo |
footer |
Texto do rodapé |
footerIcon |
Icone do rodapé |
author |
Nome do autor |
authorIcon |
Icone do autor |
authorUrl |
Link do autor |
field(nome, valor, inline?) |
Adiciona um campo |
HTTP (fetch)
Faz requisições GET para APIs externas. Apenas HTTPS.
val res = fetch("https://api.exemplo.com/dados")
// res é o JSON parseado automaticamente
reply "Resultado: {res.campo}"
Restrições: apenas HTTPS, max 3 requests por execução, bloqueado para IPs privados/localhost, max 256 KB de resposta, timeout de 5 segundos.
Limites
| Recurso |
Limite |
Replies por execução |
5 |
Fetch requests por execução |
3 |
getMemberById por execução |
3 |
Passos de execução |
50.000 |
Tamanho da resposta HTTP |
256 KB |
Timeout de conexão |
3 segundos |
Timeout de request |
5 segundos |
Storage: chaves (free) |
500 |
Storage: tamanho por valor |
4 KB |
Exemplos
Jogar moeda
val resultado = random(1, 2)
if resultado == 1 {
reply "Cara!"
} else {
reply "Coroa!"
}
Contador de peidos
val target = args[0] ?? user
val dados = storage.get(target.id)
if dados == null {
storage.set(target.id, { peidos: 0 })
reply "{target.name} tem 0 peidos."
} else {
reply "{target.name} tem {dados.peidos} peidos."
}
API externa
val piada = fetch("https://v2.jokeapi.dev/joke/Any?type=single&lang=pt")
reply piada.joke
Embed com dados do usuario
val target = args[0] ?? user
reply embed {
title target.name
description target.aboutMe ?? "Sem about me"
color "#dc2626"
thumbnail target.avatar
field("Saldo", "{target.balance} iris", true)
field("Bot?", "{target.isBot}", true)
}
Sistema de nivel simples
var perfil = storage.get("nivel_{user.id}")
if perfil == null {
perfil = { xp: 0, nivel: 1 }
}
perfil.xp = perfil.xp + random(5, 15)
if perfil.xp >= perfil.nivel * 100 {
perfil.nivel = perfil.nivel + 1
perfil.xp = 0
reply "Subiu para nivel {perfil.nivel}!"
} else {
reply "XP: {perfil.xp}/{perfil.nivel * 100}"
}
storage.set("nivel_{user.id}", perfil)