From ba9e5e0ace9be65c419e694487c7876bb5f88556 Mon Sep 17 00:00:00 2001 From: MatthieuCoder Date: Tue, 3 Jan 2023 14:46:43 +0400 Subject: [PATCH] add readme and example files --- .gitignore | 6 ++- README.md | 75 +++++++++++++++++++++++++++++++++++++ bin/.gitkeep | 0 config/default.example.yml | 53 ++++++++++++++++++++++++++ imgs/nova1.png | Bin 0 -> 20407 bytes 5 files changed, 132 insertions(+), 2 deletions(-) create mode 100644 README.md create mode 100644 bin/.gitkeep create mode 100644 config/default.example.yml create mode 100644 imgs/nova1.png diff --git a/.gitignore b/.gitignore index b2de364..67a6e37 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ -config/ +config/* +!config/default.example.yml dist/ -bin/ +bin/* +!bin/.gitkeep node_modules/ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..de6888e --- /dev/null +++ b/README.md @@ -0,0 +1,75 @@ +# Nova quickstart + +This is a simple example of a nov base Discord bot inspired by the discord.js structure. + +## What you'll be doing + +This repo is a simple example of a bot developped using Nova. It's a simple bot that executes `ping` (ICMP Echo) requests using slash-commands. + +> Issuing arbitrary pings is not viable for a real discord bot, this is an example. Acces to your developement bot should be kept private to avoid abuse. + + + +## Running + +### Configuring your instance + +> The nova-all-in-one we are going to use is going to search this directory for a `default.{toml,json,json5,yml,yaml}`, feel free to use the configuration language you feel confortable with. + +You need to fill the configuration file and rename it to `default.yml` in the `config/` folder. + +### Getting nova running + +Download the nova-all-in-one server and put it in `bin/nova`. +You can find the binary in the nova project releases page. + +> You can also use a full Nova instance running in `docker-compose` or an orchestrator such as [Kubernetes](https://kubernetes.io). Using a real nova instance, you'll need to store the configuration file safely depending on your orchestrator. + +The next step is starting nova: + +```bash +RUST_LOG=info ./bin/nova +``` + +### Installing npm dependencies + +Since this example use node, you need node.js installed and a package manager, we recommend *yarn* or *pnpm*. + +```bash +# Using yarn +yarn +# Using pnpm +pnpm install +# Using npm +npm install +``` + +### Registering commands + +Before starting your bot, you need to run the `register.ts` utility to register the commands wihin discord. + +> Registering commands is a one-time operation to tell discord which commands are available, you can read more about it [here](https://discord.com/developers/docs/interactions/application-commands#registering-a-command) + +```bash +# Using yarn +yarn register +# Using pnpm +pnpm run register +# Using npm +npm run register +``` + +### Starting the bot + +Finally, you can start the bot instance. + +```bash +# Using yarn +yarn start +# Using pnpm +pnpm run start +# Using npm +npm run start +``` + +**Everything should be running now!** \ No newline at end of file diff --git a/bin/.gitkeep b/bin/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/config/default.example.yml b/config/default.example.yml new file mode 100644 index 0000000..d4978c2 --- /dev/null +++ b/config/default.example.yml @@ -0,0 +1,53 @@ +gateway: + token: + intents: 3276799 + shard: 0 + shard_total: 1 + +rest: + discord: + token: + server: + port: 8090 + address: 0.0.0.0 + +webhook: + discord: + public_key: + client_id: + server: + port: 8091 + address: 0.0.0.0 + +cache: + toggles: + - channels_cache + - guilds_cache + - guild_schedules_cache + - stage_instances_cache + - integrations_cache + - members_cache + - bans_cache + - reactions_cache + - messages_cache + - threads_cache + - invites_cache + - roles_cache + - automoderation_cache + - voice_states_cache + +ratelimiter: + + +# Prometheus monitoring configuration +monitoring: + enabled: false + address: 0.0.0.0 + port: 9000 + +# Nats broker configuration +nats: + host: nats + +redis: + url: redis://redis diff --git a/imgs/nova1.png b/imgs/nova1.png new file mode 100644 index 0000000000000000000000000000000000000000..85361d76f21b4e41fee44f42ba881aa9c3a602b8 GIT binary patch literal 20407 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