nyrascript
v0.2.1
Published
Nyra language CLI for building and running Discord bots
Maintainers
Readme
Nyra
Nyra ist eine eigene DSL fuer Discord-Bots. Die Sprache bleibt bewusst direkt und lesbar: import, slash, command, func, onButton, embed, button, reply, edit, if, elif, while, for in, return, wait, purge.
Installation als CLI
npm install -g nyrascript
nyra init my-bot
cd my-bot
copy .env.example .env
nyra build bot.ny
nyra run generated/bot.nybcFuer die lokale Entwicklung im Nyra-Repo geht auch:
npm install
npm run build
npm link
nyra build examples/pythonish.nyWas jetzt drin ist
- Prefix-Commands und Slash-Commands
- Button-Handler
- Lokale Variablen mit
let - Echte Zuweisungen fuer bestehende Variablen
- Persistenter User-State ueber
state.<name> - Booleans,
and/or,!=,<=,>=,%,! noneals leerer Wertwhile-Schleifen undelif- Eigene Funktionen mit
func ... {}undreturn - Arrays mit
[], Indexzugriff ueberitems[0]und Schleifen mitfor item in items - Objektliterale wie
{ title: "Hi", views: 3 }und Property-Zugriff ueberprofile.title - Imports und Exporte ueber
import "lib/common"undexport func ... - Slash-Parameter wie
slash profile(target: string = "", member: user optional, lucky: number = 7) - Funktionsaufrufe wie
random,lower,upper,length,number,string,floor,ceil,round,abs,contains,startsWith,endsWith,trim,replace,substring,min,max,clamp,push,pop,join,split,range - Mehr Collections und Objekt-Helfer wie
keys,values,has,first,last,find - Callback-Collections wie
map(values, "upper"),filter(values, "isLong"), dazusum,sort,reverse,unique - Noch mehr Python-nahe Helfer:
slice,append,remove,insert,all,any,count,get - Mehr Built-ins:
user.id,user.name,user.displayName,user.tag,channel.id,channel.name,guild.id,guild.name,command.name,interaction.customId,message.content,args,argsCount,now - Embeds mit
title,description,color,footer,thumbnail,image
Beispiel
bot {
prefix "!"
}
command greet(name) {
let cleanName = user.displayName
if contains(name, "@") {
cleanName = name
}
reply "Hey " + cleanName + ", willkommen auf " + guild.name + "!"
}
slash profile {
state.profileViews = state.profileViews + 1
embed {
title "Profil von " + upper(user.displayName)
description "Ansichten: **" + state.profileViews + "**"
color 5793266
footer "Kanal: " + channel.name
}
}Neue Kontrollelemente
let attempts = 0
while attempts < 3 {
attempts = attempts + 1
}
if attempts == 0 {
reply "Noch kein Versuch"
} elif attempts < 3 {
reply "Fast geschafft"
} else {
reply "Fertig"
}Funktionen und Arrays
func makeTags(name) {
let tags = []
push(tags, upper(name))
push(tags, lower(name))
return join(tags, " | ")
}
slash tags(target) {
let values = split(target, " ")
let result = []
for item in values {
push(result, makeTags(item))
}
reply join(result, "\n")
}Objekte und Imports
export func buildProfile(name, serverName) {
return {
title: "Profil " + upper(name),
footer: "Server: " + serverName
}
}import "lib/common"
slash profile(target: string = "", member: user optional) {
let profile = buildProfile(target, guild.name)
let stats = { views: state.profileViews, owner: user.displayName }
embed {
title profile.title
description "Views: **" + stats.views + "**"
footer profile.footer
}
}Nutzung
npm run build
npm run compile -- examples/showcase.ny
npm run run -- generated/showcase.nybcAls global installiertes CLI:
nyra init my-bot
nyra build bot.ny
nyra run generated/bot.nybc
nyra version
nyra helpPublish auf npm
npm login
npm publish --access publicDas npm-Paket heisst nyrascript, der CLI-Befehl bleibt aber weiter nyra.
Hinweise
- Lokale Variablen muessen zuerst mit
letangelegt werden. - Wenn ein Wert zwischen Events erhalten bleiben soll, nutze
state.<name>. - Importierte Dateien sind Bibliotheken und koennen
export func ...oderexport let ...enthalten, aber keine eigenenbot- oder Command-Bloecke. - Beispiele liegen in examples/showcase.ny, examples/advanced.ny, examples/modular.ny und examples/test.ny.
- Ein groesseres Beispiel mit verschachtelten Objekten und Collections liegt in examples/mega.ny.
- Ein reines Collections-Beispiel liegt in examples/collections.ny.
- Ein groesseres Python-artiges Beispiel liegt in examples/pythonish.ny.
