Skip to content

Commit

Permalink
feat: add echo example (#1530)
Browse files Browse the repository at this point in the history
  • Loading branch information
FedorLap2006 committed May 10, 2024
1 parent da9e191 commit fd0af76
Show file tree
Hide file tree
Showing 2 changed files with 159 additions and 0 deletions.
40 changes: 40 additions & 0 deletions examples/echo/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<img align="right" alt="DiscordGo logo" src="/docs/img/discordgo.svg" width="200">

## DiscordGo Echo Example

This example demonstrates how to utilize DiscordGo to create a simple,
slash commands based bot, that will echo your messages.

**Join [Discord Gophers](https://discord.gg/0f1SbxBZjYoCtNPP)
Discord chat channel for support.**

### Build

This assumes you already have a working Go environment setup and that
DiscordGo is correctly installed on your system.

From within the example folder, run the below command to compile the
example.

```sh
go build
```

### Usage

```
Usage of echo:
-app string
Application ID
-guild string
Guild ID
-token string
Bot authentication token
```

Run the command below to start the bot.

```sh
./echo -guild YOUR_TESTING_GUILD -app YOUR_TESTING_APP -token YOUR_BOT_TOKEN
```
119 changes: 119 additions & 0 deletions examples/echo/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
package main

import (
"flag"
"log"
"os"
"os/signal"
"strings"

"github.com/bwmarrin/discordgo"
)

type optionMap = map[string]*discordgo.ApplicationCommandInteractionDataOption

func parseOptions(options []*discordgo.ApplicationCommandInteractionDataOption) (om optionMap) {
om = make(optionMap)
for _, opt := range options {
om[opt.Name] = opt
}
return
}

func interactionAuthor(i *discordgo.Interaction) *discordgo.User {
if i.Member != nil {
return i.Member.User
}
return i.User
}

func handleEcho(s *discordgo.Session, i *discordgo.InteractionCreate, opts optionMap) {
builder := new(strings.Builder)
if v, ok := opts["author"]; ok && v.BoolValue() {
author := interactionAuthor(i.Interaction)
builder.WriteString("**" + author.String() + "** says: ")
}
builder.WriteString(opts["message"].StringValue())

err := s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
Type: discordgo.InteractionResponseChannelMessageWithSource,
Data: &discordgo.InteractionResponseData{
Content: builder.String(),
},
})

if err != nil {
log.Panicf("could not respond to interaction: %s", err)
}
}

var commands = []*discordgo.ApplicationCommand{
{
Name: "echo",
Description: "Say something through a bot",
Options: []*discordgo.ApplicationCommandOption{
{
Name: "message",
Description: "Contents of the message",
Type: discordgo.ApplicationCommandOptionString,
Required: true,
},
{
Name: "author",
Description: "Whether to prepend message's author",
Type: discordgo.ApplicationCommandOptionBoolean,
},
},
},
}

var (
Token = flag.String("token", "", "Bot authentication token")
App = flag.String("app", "", "Application ID")
Guild = flag.String("guild", "", "Guild ID")
)

func main() {
flag.Parse()
if *App == "" {
log.Fatal("application id is not set")
}

session, _ := discordgo.New("Bot " + *Token)

session.AddHandler(func(s *discordgo.Session, i *discordgo.InteractionCreate) {
if i.Type != discordgo.InteractionApplicationCommand {
return
}

data := i.ApplicationCommandData()
if data.Name != "echo" {
return
}

handleEcho(s, i, parseOptions(data.Options))
})

session.AddHandler(func(s *discordgo.Session, r *discordgo.Ready) {
log.Printf("Logged in as %s", r.User.String())
})

_, err := session.ApplicationCommandBulkOverwrite(*App, *Guild, commands)
if err != nil {
log.Fatalf("could not register commands: %s", err)
}

err = session.Open()
if err != nil {
log.Fatalf("could not open session: %s", err)
}

sigch := make(chan os.Signal, 1)
signal.Notify(sigch, os.Interrupt)
<-sigch

err = session.Close()
if err != nil {
log.Printf("could not close session gracefully: %s", err)
}
}

0 comments on commit fd0af76

Please sign in to comment.