arikawa/README.md

135 lines
5.0 KiB
Markdown
Raw Normal View History

2020-01-02 05:39:52 +00:00
# arikawa
2020-11-19 20:00:14 +00:00
[![ Pipeline Status ][pipeline_img ]][pipeline ]
[![ Report Card ][goreportcard_img]][goreportcard]
[![ Godoc Reference ][pkg.go.dev_img ]][pkg.go.dev ]
[![ Examples ][examples_img ]][examples ]
[![ Discord Gophers ][dgophers_img ]][dgophers ]
[![ Hime Arikawa ][himeArikawa_img ]][himeArikawa ]
2020-01-16 05:04:08 +00:00
2020-01-02 05:39:52 +00:00
A Golang library for the Discord API.
2020-01-16 03:28:21 +00:00
2020-11-19 20:00:14 +00:00
[dgophers]: https://discord.gg/7jSf85J
[dgophers_img]: https://img.shields.io/badge/Discord%20Gophers-%23arikawa-%237289da?style=flat-square
[examples]: https://github.com/diamondburned/arikawa/tree/v3/0-examples
2023-11-04 09:34:21 +00:00
[examples_img]: https://img.shields.io/badge/Example-.%2F0--examples%2F-blueviolet?style=flat-square
2020-11-19 20:00:14 +00:00
2023-11-04 09:34:21 +00:00
[pipeline]: https://github.com/diamondburned/arikawa/actions/workflows/test.yml
2023-11-04 09:39:09 +00:00
[pipeline_img]: https://img.shields.io/github/actions/workflow/status/diamondburned/arikawa/test.yml?style=flat-square&label=Tests
2020-11-19 20:00:14 +00:00
2021-06-02 02:53:19 +00:00
[pkg.go.dev]: https://pkg.go.dev/github.com/diamondburned/arikawa/v3
2023-11-04 09:34:21 +00:00
[pkg.go.dev_img]: https://img.shields.io/badge/%E2%80%8B-reference-007d9c?logo=go&logoColor=white&style=flat-square
2020-11-19 20:00:14 +00:00
[himeArikawa]: https://hime-goto.fandom.com/wiki/Hime_Arikawa
[himeArikawa_img]: https://img.shields.io/badge/Hime-Arikawa-ea75a2?style=flat-square
[goreportcard]: https://goreportcard.com/report/github.com/diamondburned/arikawa
2023-11-04 09:39:09 +00:00
[goreportcard_img]: https://goreportcard.com/badge/github.com/diamondburned/arikawa?style=flat-square&label=Go%20Report
2020-11-19 20:00:14 +00:00
## Library Highlights
- More modularity with components divided up into independent packages, such as
the API client and the Websocket Gateway being fully independent.
- Clear separation of models: API and Gateway models are never mixed together so
to not be confusing.
- Extend and intercept Gateway events, allowing for use cases such as reading
deleted messages.
- Pluggable Gateway cache allows for custom caching implementations such as
Redis, automatically falling back to the API if needed.
- Typed Snowflakes make it much harder to accidentally use the wrong ID (e.g.
it is impossible to use a channel ID as a message ID).
- Working user account support, with much of them in [ningen][ningen]. Please
do not use this for self-botting, as that is against Discord's ToS.
[ningen]: https://github.com/diamondburned/ningen
2020-01-18 21:51:57 +00:00
## Examples
### [Commands (Hybrid)](https://github.com/diamondburned/arikawa/tree/v3/0-examples/commands-hybrid)
commands-hybrid is an alternative variant of
[commands](https://github.com/diamondburned/arikawa/tree/v3/0-examples/commands),
where the program permits being hosted either as a Gateway-based daemon or as a
web server using the Interactions Webhook API.
Both examples demonstrate adding interaction commands into the bot as well as an
example of routing those commands to be executed.
2021-12-20 21:57:04 +00:00
### [Simple](https://github.com/diamondburned/arikawa/tree/v3/0-examples/simple)
2020-01-18 21:51:57 +00:00
Simple bot example without any state. All it does is logging messages sent into
2020-11-19 20:00:14 +00:00
the console. Run with `BOT_TOKEN="TOKEN" go run .`. This example only
demonstrates the most simple needs; in most cases, bots should use the state or
the bot router.
2020-01-18 21:51:57 +00:00
**Note** that Discord discourages use of bots that do not use the interactions
API, meaning that this example should not be used for bots.
2021-12-20 21:57:04 +00:00
### [Undeleter](https://github.com/diamondburned/arikawa/tree/v3/0-examples/undeleter)
2020-01-18 21:51:57 +00:00
A slightly more complicated example. This bot uses a local state to cache
everything, including messages. It detects when someone deletes a message,
logging the content into the console.
2020-11-19 20:00:14 +00:00
This example demonstrates the PreHandler feature of the state library.
PreHandler calls all handlers that are registered (separately from the session),
calling them before the state is updated.
2020-01-18 21:51:57 +00:00
**Note** that Discord discourages use of bots that do not use the interactions
API, meaning that this example should not be used for bots.
2022-12-10 14:03:57 +00:00
### Bare Minimum Bot Example
2022-12-10 14:03:57 +00:00
The least amount of code recommended to have a bot that responds to a /ping.
```go
package main
import (
"context"
"log"
"os"
"github.com/diamondburned/arikawa/v3/api"
"github.com/diamondburned/arikawa/v3/api/cmdroute"
"github.com/diamondburned/arikawa/v3/gateway"
"github.com/diamondburned/arikawa/v3/state"
"github.com/diamondburned/arikawa/v3/utils/json/option"
)
var commands = []api.CreateCommandData{{Name: "ping", Description: "Ping!"}}
func main() {
r := cmdroute.NewRouter()
r.AddFunc("ping", func(ctx context.Context, data cmdroute.CommandData) *api.InteractionResponseData {
return &api.InteractionResponseData{Content: option.NewNullableString("Pong!")}
})
s := state.New("Bot " + os.Getenv("BOT_TOKEN"))
s.AddInteractionHandler(r)
s.AddIntents(gateway.IntentGuilds)
if err := cmdroute.OverwriteCommands(s, commands); err != nil {
log.Fatalln("cannot update commands:", err)
}
if err := s.Connect(context.TODO()); err != nil {
log.Println("cannot connect:", err)
}
2021-02-24 05:40:44 +00:00
}
```
2020-01-20 03:45:11 +00:00
2020-01-16 03:28:21 +00:00
## Testing
The package includes integration tests that require `$BOT_TOKEN`. To run these
tests, do:
2020-01-16 03:28:21 +00:00
```sh
export BOT_TOKEN="<BOT_TOKEN>"
2020-11-19 20:00:14 +00:00
go test -tags integration -race ./...
2020-01-16 03:28:21 +00:00
```