forked from lug/matterbridge
		
	Switch to discordgo upstream again (#1759)
* Switch to upstream discordgo again * Fix discord api changes
This commit is contained in:
		| @@ -10,8 +10,8 @@ import ( | |||||||
| 	"github.com/42wim/matterbridge/bridge/config" | 	"github.com/42wim/matterbridge/bridge/config" | ||||||
| 	"github.com/42wim/matterbridge/bridge/discord/transmitter" | 	"github.com/42wim/matterbridge/bridge/discord/transmitter" | ||||||
| 	"github.com/42wim/matterbridge/bridge/helper" | 	"github.com/42wim/matterbridge/bridge/helper" | ||||||
|  | 	"github.com/bwmarrin/discordgo" | ||||||
| 	lru "github.com/hashicorp/golang-lru" | 	lru "github.com/hashicorp/golang-lru" | ||||||
| 	"github.com/matterbridge/discordgo" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| const ( | const ( | ||||||
|   | |||||||
| @@ -2,8 +2,8 @@ package bdiscord | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"github.com/42wim/matterbridge/bridge/config" | 	"github.com/42wim/matterbridge/bridge/config" | ||||||
|  | 	"github.com/bwmarrin/discordgo" | ||||||
| 	"github.com/davecgh/go-spew/spew" | 	"github.com/davecgh/go-spew/spew" | ||||||
| 	"github.com/matterbridge/discordgo" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func (b *Bdiscord) messageDelete(s *discordgo.Session, m *discordgo.MessageDelete) { //nolint:unparam | func (b *Bdiscord) messageDelete(s *discordgo.Session, m *discordgo.MessageDelete) { //nolint:unparam | ||||||
| @@ -56,7 +56,7 @@ func (b *Bdiscord) messageUpdate(s *discordgo.Session, m *discordgo.MessageUpdat | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	// only when message is actually edited | 	// only when message is actually edited | ||||||
| 	if m.Message.EditedTimestamp != "" { | 	if m.Message.EditedTimestamp != nil { | ||||||
| 		b.Log.Debugf("Sending edit message") | 		b.Log.Debugf("Sending edit message") | ||||||
| 		m.Content += b.GetString("EditSuffix") | 		m.Content += b.GetString("EditSuffix") | ||||||
| 		msg := &discordgo.MessageCreate{ | 		msg := &discordgo.MessageCreate{ | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ package bdiscord | |||||||
| import ( | import ( | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| 	"github.com/matterbridge/discordgo" | 	"github.com/bwmarrin/discordgo" | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
| ) | ) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ import ( | |||||||
| 	"strings" | 	"strings" | ||||||
| 	"unicode" | 	"unicode" | ||||||
|  |  | ||||||
| 	"github.com/matterbridge/discordgo" | 	"github.com/bwmarrin/discordgo" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func (b *Bdiscord) getAllowedMentions() *discordgo.MessageAllowedMentions { | func (b *Bdiscord) getAllowedMentions() *discordgo.MessageAllowedMentions { | ||||||
|   | |||||||
| @@ -20,7 +20,7 @@ import ( | |||||||
| 	"sync" | 	"sync" | ||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
| 	"github.com/matterbridge/discordgo" | 	"github.com/bwmarrin/discordgo" | ||||||
| 	log "github.com/sirupsen/logrus" | 	log "github.com/sirupsen/logrus" | ||||||
| ) | ) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| package transmitter | package transmitter | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"github.com/matterbridge/discordgo" | 	"github.com/bwmarrin/discordgo" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // isDiscordPermissionError returns false for nil, and true if a Discord RESTError with code discordgo.ErrorCodeMissionPermissions | // isDiscordPermissionError returns false for nil, and true if a Discord RESTError with code discordgo.ErrorCodeMissionPermissions | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ import ( | |||||||
|  |  | ||||||
| 	"github.com/42wim/matterbridge/bridge/config" | 	"github.com/42wim/matterbridge/bridge/config" | ||||||
| 	"github.com/42wim/matterbridge/bridge/helper" | 	"github.com/42wim/matterbridge/bridge/helper" | ||||||
| 	"github.com/matterbridge/discordgo" | 	"github.com/bwmarrin/discordgo" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // shouldMessageUseWebhooks checks if have a channel specific webhook, if we're not using auto webhooks | // shouldMessageUseWebhooks checks if have a channel specific webhook, if we're not using auto webhooks | ||||||
| @@ -89,7 +89,7 @@ func (b *Bdiscord) webhookSend(msg *config.Message, channelID string) (*discordg | |||||||
| 				&discordgo.WebhookParams{ | 				&discordgo.WebhookParams{ | ||||||
| 					Username:        msg.Username, | 					Username:        msg.Username, | ||||||
| 					AvatarURL:       msg.Avatar, | 					AvatarURL:       msg.Avatar, | ||||||
| 					File:            &file, | 					Files:           []*discordgo.File{&file}, | ||||||
| 					Content:         content, | 					Content:         content, | ||||||
| 					AllowedMentions: b.getAllowedMentions(), | 					AllowedMentions: b.getAllowedMentions(), | ||||||
| 				}, | 				}, | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
									
									
									
									
								
							| @@ -7,6 +7,7 @@ require ( | |||||||
| 	github.com/Philipp15b/go-steam v1.0.1-0.20200727090957-6ae9b3c0a560 | 	github.com/Philipp15b/go-steam v1.0.1-0.20200727090957-6ae9b3c0a560 | ||||||
| 	github.com/Rhymen/go-whatsapp v0.1.2-0.20211102134409-31a2e740845c | 	github.com/Rhymen/go-whatsapp v0.1.2-0.20211102134409-31a2e740845c | ||||||
| 	github.com/SevereCloud/vksdk/v2 v2.13.1 | 	github.com/SevereCloud/vksdk/v2 v2.13.1 | ||||||
|  | 	github.com/bwmarrin/discordgo v0.24.0 | ||||||
| 	github.com/d5/tengo/v2 v2.10.0 | 	github.com/d5/tengo/v2 v2.10.0 | ||||||
| 	github.com/davecgh/go-spew v1.1.1 | 	github.com/davecgh/go-spew v1.1.1 | ||||||
| 	github.com/fsnotify/fsnotify v1.5.1 | 	github.com/fsnotify/fsnotify v1.5.1 | ||||||
| @@ -24,7 +25,6 @@ require ( | |||||||
| 	github.com/lrstanley/girc v0.0.0-20211023233735-147f0ff77566 | 	github.com/lrstanley/girc v0.0.0-20211023233735-147f0ff77566 | ||||||
| 	github.com/matrix-org/gomatrix v0.0.0-20210324163249-be2af5ef2e16 | 	github.com/matrix-org/gomatrix v0.0.0-20210324163249-be2af5ef2e16 | ||||||
| 	github.com/matterbridge/Rocket.Chat.Go.SDK v0.0.0-20211016222428-79310a412696 | 	github.com/matterbridge/Rocket.Chat.Go.SDK v0.0.0-20211016222428-79310a412696 | ||||||
| 	github.com/matterbridge/discordgo v0.21.2-0.20210201201054-fb39a175b4f7 |  | ||||||
| 	github.com/matterbridge/go-xmpp v0.0.0-20211030125215-791a06c5f1be | 	github.com/matterbridge/go-xmpp v0.0.0-20211030125215-791a06c5f1be | ||||||
| 	github.com/matterbridge/gozulipbot v0.0.0-20211023205727-a19d6c1f3b75 | 	github.com/matterbridge/gozulipbot v0.0.0-20211023205727-a19d6c1f3b75 | ||||||
| 	github.com/matterbridge/logrus-prefixed-formatter v0.5.3-0.20200523233437-d971309a77ba | 	github.com/matterbridge/logrus-prefixed-formatter v0.5.3-0.20200523233437-d971309a77ba | ||||||
|   | |||||||
							
								
								
									
										5
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								go.sum
									
									
									
									
									
								
							| @@ -290,6 +290,8 @@ github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7 | |||||||
| github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= | github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= | ||||||
| github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= | github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= | ||||||
| github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= | github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= | ||||||
|  | github.com/bwmarrin/discordgo v0.24.0 h1:Gw4MYxqHdvhO99A3nXnSLy97z5pmIKHZVJ1JY5ZDPqY= | ||||||
|  | github.com/bwmarrin/discordgo v0.24.0/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY= | ||||||
| github.com/cenkalti/backoff/v4 v4.0.2/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg= | github.com/cenkalti/backoff/v4 v4.0.2/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg= | ||||||
| github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= | github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= | ||||||
| github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= | github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= | ||||||
| @@ -1079,8 +1081,6 @@ github.com/marstr/guid v0.0.0-20170427235115-8bdf7d1a087c/go.mod h1:74gB1z2wpxxI | |||||||
| github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= | github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= | ||||||
| github.com/matterbridge/Rocket.Chat.Go.SDK v0.0.0-20211016222428-79310a412696 h1:pmPKkN3RJM9wVMZidR99epzK0+gatQiqVtvP1FacZcQ= | github.com/matterbridge/Rocket.Chat.Go.SDK v0.0.0-20211016222428-79310a412696 h1:pmPKkN3RJM9wVMZidR99epzK0+gatQiqVtvP1FacZcQ= | ||||||
| github.com/matterbridge/Rocket.Chat.Go.SDK v0.0.0-20211016222428-79310a412696/go.mod h1:c6MxwqHD+0HvtAJjsHMIdPCiAwGiQwPRPTp69ACMg8A= | github.com/matterbridge/Rocket.Chat.Go.SDK v0.0.0-20211016222428-79310a412696/go.mod h1:c6MxwqHD+0HvtAJjsHMIdPCiAwGiQwPRPTp69ACMg8A= | ||||||
| github.com/matterbridge/discordgo v0.21.2-0.20210201201054-fb39a175b4f7 h1:4J2YZuY8dIYrxbLMsWGqPZb/B59ygCwSBkyZHez5PSY= |  | ||||||
| github.com/matterbridge/discordgo v0.21.2-0.20210201201054-fb39a175b4f7/go.mod h1:411nZYv0UMMrtppR5glXop1foboJiFAowy+42U+Ahvw= |  | ||||||
| github.com/matterbridge/go-xmpp v0.0.0-20211030125215-791a06c5f1be h1:zlirT+LngOJ60G6FVzI87DljGZLUnfNzmXja61EjtYM= | github.com/matterbridge/go-xmpp v0.0.0-20211030125215-791a06c5f1be h1:zlirT+LngOJ60G6FVzI87DljGZLUnfNzmXja61EjtYM= | ||||||
| github.com/matterbridge/go-xmpp v0.0.0-20211030125215-791a06c5f1be/go.mod h1:ECDRehsR9TYTKCAsRS8/wLeOk6UUqDydw47ln7wG41Q= | github.com/matterbridge/go-xmpp v0.0.0-20211030125215-791a06c5f1be/go.mod h1:ECDRehsR9TYTKCAsRS8/wLeOk6UUqDydw47ln7wG41Q= | ||||||
| github.com/matterbridge/gomatrix v0.0.0-20220205235239-607eb9ee6419 h1:dx8x2J3EsVwP3hBGNmVT/otz4b42p7TRQ6Cu4BK2910= | github.com/matterbridge/gomatrix v0.0.0-20220205235239-607eb9ee6419 h1:dx8x2J3EsVwP3hBGNmVT/otz4b42p7TRQ6Cu4BK2910= | ||||||
| @@ -1791,6 +1791,7 @@ golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPh | |||||||
| golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||||
| golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= | golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= | ||||||
| golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= | golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= | ||||||
|  | golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= | ||||||
| golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= | golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= | ||||||
| golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | ||||||
| golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | ||||||
|   | |||||||
							
								
								
									
										5
									
								
								vendor/github.com/bwmarrin/discordgo/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/bwmarrin/discordgo/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | |||||||
|  | # IDE-specific metadata | ||||||
|  | .idea/ | ||||||
|  |  | ||||||
|  | # Environment variables. Useful for examples. | ||||||
|  | .env | ||||||
							
								
								
									
										19
									
								
								vendor/github.com/bwmarrin/discordgo/.golangci.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								vendor/github.com/bwmarrin/discordgo/.golangci.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | |||||||
|  | linters: | ||||||
|  |   disable-all: true | ||||||
|  |   enable: | ||||||
|  |     # - staticcheck | ||||||
|  |     # - unused | ||||||
|  |     - golint | ||||||
|  |  | ||||||
|  | linters-settings: | ||||||
|  |   staticcheck: | ||||||
|  |     go: "1.13" | ||||||
|  |  | ||||||
|  |     checks: ["all"] | ||||||
|  |  | ||||||
|  |   unused: | ||||||
|  |     go: "1.13" | ||||||
|  |  | ||||||
|  | issues: | ||||||
|  |   include: | ||||||
|  |     - EXC0002 | ||||||
| @@ -3,6 +3,7 @@ go: | |||||||
|     - 1.13.x |     - 1.13.x | ||||||
|     - 1.14.x |     - 1.14.x | ||||||
|     - 1.15.x |     - 1.15.x | ||||||
|  |     - 1.16.x | ||||||
| env: | env: | ||||||
|     - GO111MODULE=on |     - GO111MODULE=on | ||||||
| install: | install: | ||||||
| @@ -1,8 +1,8 @@ | |||||||
| # DiscordGo | # DiscordGo | ||||||
| 
 | 
 | ||||||
| [](https://godoc.org/github.com/bwmarrin/discordgo) [](http://goreportcard.com/report/bwmarrin/discordgo) [](https://travis-ci.org/bwmarrin/discordgo) [](https://discord.gg/0f1SbxBZjYoCtNPP) [](https://discord.com/invite/discord-api) | [](https://pkg.go.dev/github.com/bwmarrin/discordgo) [](https://goreportcard.com/report/github.com/bwmarrin/discordgo) [](https://travis-ci.com/bwmarrin/discordgo) [](https://discord.gg/golang) [](https://discord.com/invite/discord-api) | ||||||
| 
 | 
 | ||||||
| <img align="right" src="http://bwmarrin.github.io/discordgo/img/discordgo.png"> | <img align="right" alt="DiscordGo logo" src="docs/img/discordgo.svg" width="400"> | ||||||
| 
 | 
 | ||||||
| DiscordGo is a [Go](https://golang.org/) package that provides low level  | DiscordGo is a [Go](https://golang.org/) package that provides low level  | ||||||
| bindings to the [Discord](https://discord.com/) chat client API. DiscordGo  | bindings to the [Discord](https://discord.com/) chat client API. DiscordGo  | ||||||
| @@ -22,7 +22,7 @@ tool that wraps `ffmpeg` to create opus encoded audio appropriate for use with | |||||||
| Discord (and DiscordGo). | Discord (and DiscordGo). | ||||||
| 
 | 
 | ||||||
| **For help with this package or general Go discussion, please join the [Discord  | **For help with this package or general Go discussion, please join the [Discord  | ||||||
| Gophers](https://discord.gg/0f1SbxBZjYq9jLBk) chat server.** | Gophers](https://discord.gg/golang) chat server.** | ||||||
| 
 | 
 | ||||||
| ## Getting Started | ## Getting Started | ||||||
| 
 | 
 | ||||||
| @@ -64,8 +64,8 @@ The DiscordGo code is fairly well documented at this point and is currently | |||||||
| the only documentation available.  Both GoDoc and GoWalker (below) present | the only documentation available.  Both GoDoc and GoWalker (below) present | ||||||
| that information in a nice format. | that information in a nice format. | ||||||
| 
 | 
 | ||||||
| - [](https://godoc.org/github.com/bwmarrin/discordgo)  | - [](https://pkg.go.dev/github.com/bwmarrin/discordgo) | ||||||
| - [](https://gowalker.org/github.com/bwmarrin/discordgo)  | - [](https://gowalker.org/github.com/bwmarrin/discordgo)  | ||||||
| - Hand crafted documentation coming eventually. | - Hand crafted documentation coming eventually. | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
							
								
								
									
										241
									
								
								vendor/github.com/bwmarrin/discordgo/components.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										241
									
								
								vendor/github.com/bwmarrin/discordgo/components.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,241 @@ | |||||||
|  | package discordgo | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"encoding/json" | ||||||
|  | 	"fmt" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // ComponentType is type of component. | ||||||
|  | type ComponentType uint | ||||||
|  |  | ||||||
|  | // MessageComponent types. | ||||||
|  | const ( | ||||||
|  | 	ActionsRowComponent ComponentType = 1 | ||||||
|  | 	ButtonComponent     ComponentType = 2 | ||||||
|  | 	SelectMenuComponent ComponentType = 3 | ||||||
|  | 	TextInputComponent  ComponentType = 4 | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // MessageComponent is a base interface for all message components. | ||||||
|  | type MessageComponent interface { | ||||||
|  | 	json.Marshaler | ||||||
|  | 	Type() ComponentType | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type unmarshalableMessageComponent struct { | ||||||
|  | 	MessageComponent | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // UnmarshalJSON is a helper function to unmarshal MessageComponent object. | ||||||
|  | func (umc *unmarshalableMessageComponent) UnmarshalJSON(src []byte) error { | ||||||
|  | 	var v struct { | ||||||
|  | 		Type ComponentType `json:"type"` | ||||||
|  | 	} | ||||||
|  | 	err := json.Unmarshal(src, &v) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	switch v.Type { | ||||||
|  | 	case ActionsRowComponent: | ||||||
|  | 		umc.MessageComponent = &ActionsRow{} | ||||||
|  | 	case ButtonComponent: | ||||||
|  | 		umc.MessageComponent = &Button{} | ||||||
|  | 	case SelectMenuComponent: | ||||||
|  | 		umc.MessageComponent = &SelectMenu{} | ||||||
|  | 	case TextInputComponent: | ||||||
|  | 		umc.MessageComponent = &TextInput{} | ||||||
|  | 	default: | ||||||
|  | 		return fmt.Errorf("unknown component type: %d", v.Type) | ||||||
|  | 	} | ||||||
|  | 	return json.Unmarshal(src, umc.MessageComponent) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // MessageComponentFromJSON is a helper function for unmarshaling message components | ||||||
|  | func MessageComponentFromJSON(b []byte) (MessageComponent, error) { | ||||||
|  | 	var u unmarshalableMessageComponent | ||||||
|  | 	err := u.UnmarshalJSON(b) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, fmt.Errorf("failed to unmarshal into MessageComponent: %w", err) | ||||||
|  | 	} | ||||||
|  | 	return u.MessageComponent, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ActionsRow is a container for components within one row. | ||||||
|  | type ActionsRow struct { | ||||||
|  | 	Components []MessageComponent `json:"components"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // MarshalJSON is a method for marshaling ActionsRow to a JSON object. | ||||||
|  | func (r ActionsRow) MarshalJSON() ([]byte, error) { | ||||||
|  | 	type actionsRow ActionsRow | ||||||
|  |  | ||||||
|  | 	return json.Marshal(struct { | ||||||
|  | 		actionsRow | ||||||
|  | 		Type ComponentType `json:"type"` | ||||||
|  | 	}{ | ||||||
|  | 		actionsRow: actionsRow(r), | ||||||
|  | 		Type:       r.Type(), | ||||||
|  | 	}) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // UnmarshalJSON is a helper function to unmarshal Actions Row. | ||||||
|  | func (r *ActionsRow) UnmarshalJSON(data []byte) error { | ||||||
|  | 	var v struct { | ||||||
|  | 		RawComponents []unmarshalableMessageComponent `json:"components"` | ||||||
|  | 	} | ||||||
|  | 	err := json.Unmarshal(data, &v) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	r.Components = make([]MessageComponent, len(v.RawComponents)) | ||||||
|  | 	for i, v := range v.RawComponents { | ||||||
|  | 		r.Components[i] = v.MessageComponent | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Type is a method to get the type of a component. | ||||||
|  | func (r ActionsRow) Type() ComponentType { | ||||||
|  | 	return ActionsRowComponent | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ButtonStyle is style of button. | ||||||
|  | type ButtonStyle uint | ||||||
|  |  | ||||||
|  | // Button styles. | ||||||
|  | const ( | ||||||
|  | 	// PrimaryButton is a button with blurple color. | ||||||
|  | 	PrimaryButton ButtonStyle = 1 | ||||||
|  | 	// SecondaryButton is a button with grey color. | ||||||
|  | 	SecondaryButton ButtonStyle = 2 | ||||||
|  | 	// SuccessButton is a button with green color. | ||||||
|  | 	SuccessButton ButtonStyle = 3 | ||||||
|  | 	// DangerButton is a button with red color. | ||||||
|  | 	DangerButton ButtonStyle = 4 | ||||||
|  | 	// LinkButton is a special type of button which navigates to a URL. Has grey color. | ||||||
|  | 	LinkButton ButtonStyle = 5 | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // ComponentEmoji represents button emoji, if it does have one. | ||||||
|  | type ComponentEmoji struct { | ||||||
|  | 	Name     string `json:"name,omitempty"` | ||||||
|  | 	ID       string `json:"id,omitempty"` | ||||||
|  | 	Animated bool   `json:"animated,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Button represents button component. | ||||||
|  | type Button struct { | ||||||
|  | 	Label    string         `json:"label"` | ||||||
|  | 	Style    ButtonStyle    `json:"style"` | ||||||
|  | 	Disabled bool           `json:"disabled"` | ||||||
|  | 	Emoji    ComponentEmoji `json:"emoji"` | ||||||
|  |  | ||||||
|  | 	// NOTE: Only button with LinkButton style can have link. Also, URL is mutually exclusive with CustomID. | ||||||
|  | 	URL      string `json:"url,omitempty"` | ||||||
|  | 	CustomID string `json:"custom_id,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // MarshalJSON is a method for marshaling Button to a JSON object. | ||||||
|  | func (b Button) MarshalJSON() ([]byte, error) { | ||||||
|  | 	type button Button | ||||||
|  |  | ||||||
|  | 	if b.Style == 0 { | ||||||
|  | 		b.Style = PrimaryButton | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return json.Marshal(struct { | ||||||
|  | 		button | ||||||
|  | 		Type ComponentType `json:"type"` | ||||||
|  | 	}{ | ||||||
|  | 		button: button(b), | ||||||
|  | 		Type:   b.Type(), | ||||||
|  | 	}) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Type is a method to get the type of a component. | ||||||
|  | func (Button) Type() ComponentType { | ||||||
|  | 	return ButtonComponent | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // SelectMenuOption represents an option for a select menu. | ||||||
|  | type SelectMenuOption struct { | ||||||
|  | 	Label       string         `json:"label,omitempty"` | ||||||
|  | 	Value       string         `json:"value"` | ||||||
|  | 	Description string         `json:"description"` | ||||||
|  | 	Emoji       ComponentEmoji `json:"emoji"` | ||||||
|  | 	// Determines whenever option is selected by default or not. | ||||||
|  | 	Default bool `json:"default"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // SelectMenu represents select menu component. | ||||||
|  | type SelectMenu struct { | ||||||
|  | 	CustomID string `json:"custom_id,omitempty"` | ||||||
|  | 	// The text which will be shown in the menu if there's no default options or all options was deselected and component was closed. | ||||||
|  | 	Placeholder string `json:"placeholder"` | ||||||
|  | 	// This value determines the minimal amount of selected items in the menu. | ||||||
|  | 	MinValues *int `json:"min_values,omitempty"` | ||||||
|  | 	// This value determines the maximal amount of selected items in the menu. | ||||||
|  | 	// If MaxValues or MinValues are greater than one then the user can select multiple items in the component. | ||||||
|  | 	MaxValues int                `json:"max_values,omitempty"` | ||||||
|  | 	Options   []SelectMenuOption `json:"options"` | ||||||
|  | 	Disabled  bool               `json:"disabled"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Type is a method to get the type of a component. | ||||||
|  | func (SelectMenu) Type() ComponentType { | ||||||
|  | 	return SelectMenuComponent | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // MarshalJSON is a method for marshaling SelectMenu to a JSON object. | ||||||
|  | func (m SelectMenu) MarshalJSON() ([]byte, error) { | ||||||
|  | 	type selectMenu SelectMenu | ||||||
|  |  | ||||||
|  | 	return json.Marshal(struct { | ||||||
|  | 		selectMenu | ||||||
|  | 		Type ComponentType `json:"type"` | ||||||
|  | 	}{ | ||||||
|  | 		selectMenu: selectMenu(m), | ||||||
|  | 		Type:       m.Type(), | ||||||
|  | 	}) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // TextInput represents text input component. | ||||||
|  | type TextInput struct { | ||||||
|  | 	CustomID    string         `json:"custom_id"` | ||||||
|  | 	Label       string         `json:"label"` | ||||||
|  | 	Style       TextInputStyle `json:"style"` | ||||||
|  | 	Placeholder string         `json:"placeholder,omitempty"` | ||||||
|  | 	Value       string         `json:"value,omitempty"` | ||||||
|  | 	Required    bool           `json:"required,omitempty"` | ||||||
|  | 	MinLength   int            `json:"min_length,omitempty"` | ||||||
|  | 	MaxLength   int            `json:"max_length,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Type is a method to get the type of a component. | ||||||
|  | func (TextInput) Type() ComponentType { | ||||||
|  | 	return TextInputComponent | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // MarshalJSON is a method for marshaling TextInput to a JSON object. | ||||||
|  | func (m TextInput) MarshalJSON() ([]byte, error) { | ||||||
|  | 	type inputText TextInput | ||||||
|  |  | ||||||
|  | 	return json.Marshal(struct { | ||||||
|  | 		inputText | ||||||
|  | 		Type ComponentType `json:"type"` | ||||||
|  | 	}{ | ||||||
|  | 		inputText: inputText(m), | ||||||
|  | 		Type:      m.Type(), | ||||||
|  | 	}) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // TextInputStyle is style of text in TextInput component. | ||||||
|  | type TextInputStyle uint | ||||||
|  |  | ||||||
|  | // Text styles | ||||||
|  | const ( | ||||||
|  | 	TextInputShort     TextInputStyle = 1 | ||||||
|  | 	TextInputParagraph TextInputStyle = 2 | ||||||
|  | ) | ||||||
							
								
								
									
										60
									
								
								vendor/github.com/bwmarrin/discordgo/discord.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								vendor/github.com/bwmarrin/discordgo/discord.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | |||||||
|  | // Discordgo - Discord bindings for Go | ||||||
|  | // Available at https://github.com/bwmarrin/discordgo | ||||||
|  |  | ||||||
|  | // Copyright 2015-2016 Bruce Marriner <bruce@sqls.net>.  All rights reserved. | ||||||
|  | // Use of this source code is governed by a BSD-style | ||||||
|  | // license that can be found in the LICENSE file. | ||||||
|  |  | ||||||
|  | // This file contains high level helper functions and easy entry points for the | ||||||
|  | // entire discordgo package.  These functions are being developed and are very | ||||||
|  | // experimental at this point.  They will most likely change so please use the | ||||||
|  | // low level functions if that's a problem. | ||||||
|  |  | ||||||
|  | // Package discordgo provides Discord binding for Go | ||||||
|  | package discordgo | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"net/http" | ||||||
|  | 	"runtime" | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // VERSION of DiscordGo, follows Semantic Versioning. (http://semver.org/) | ||||||
|  | const VERSION = "0.24.0" | ||||||
|  |  | ||||||
|  | // New creates a new Discord session with provided token. | ||||||
|  | // If the token is for a bot, it must be prefixed with "Bot " | ||||||
|  | // 		e.g. "Bot ..." | ||||||
|  | // Or if it is an OAuth2 token, it must be prefixed with "Bearer " | ||||||
|  | //		e.g. "Bearer ..." | ||||||
|  | func New(token string) (s *Session, err error) { | ||||||
|  |  | ||||||
|  | 	// Create an empty Session interface. | ||||||
|  | 	s = &Session{ | ||||||
|  | 		State:                  NewState(), | ||||||
|  | 		Ratelimiter:            NewRatelimiter(), | ||||||
|  | 		StateEnabled:           true, | ||||||
|  | 		Compress:               true, | ||||||
|  | 		ShouldReconnectOnError: true, | ||||||
|  | 		ShardID:                0, | ||||||
|  | 		ShardCount:             1, | ||||||
|  | 		MaxRestRetries:         3, | ||||||
|  | 		Client:                 &http.Client{Timeout: (20 * time.Second)}, | ||||||
|  | 		UserAgent:              "DiscordBot (https://github.com/bwmarrin/discordgo, v" + VERSION + ")", | ||||||
|  | 		sequence:               new(int64), | ||||||
|  | 		LastHeartbeatAck:       time.Now().UTC(), | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// Initilize the Identify Package with defaults | ||||||
|  | 	// These can be modified prior to calling Open() | ||||||
|  | 	s.Identify.Compress = true | ||||||
|  | 	s.Identify.LargeThreshold = 250 | ||||||
|  | 	s.Identify.GuildSubscriptions = true | ||||||
|  | 	s.Identify.Properties.OS = runtime.GOOS | ||||||
|  | 	s.Identify.Properties.Browser = "DiscordGo v" + VERSION | ||||||
|  | 	s.Identify.Intents = IntentsAllWithoutPrivileged | ||||||
|  | 	s.Identify.Token = token | ||||||
|  | 	s.Token = token | ||||||
|  |  | ||||||
|  | 	return | ||||||
|  | } | ||||||
							
								
								
									
										210
									
								
								vendor/github.com/bwmarrin/discordgo/endpoints.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										210
									
								
								vendor/github.com/bwmarrin/discordgo/endpoints.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,210 @@ | |||||||
|  | // Discordgo - Discord bindings for Go | ||||||
|  | // Available at https://github.com/bwmarrin/discordgo | ||||||
|  |  | ||||||
|  | // Copyright 2015-2016 Bruce Marriner <bruce@sqls.net>.  All rights reserved. | ||||||
|  | // Use of this source code is governed by a BSD-style | ||||||
|  | // license that can be found in the LICENSE file. | ||||||
|  |  | ||||||
|  | // This file contains variables for all known Discord end points.  All functions | ||||||
|  | // throughout the Discordgo package use these variables for all connections | ||||||
|  | // to Discord.  These are all exported and you may modify them if needed. | ||||||
|  |  | ||||||
|  | package discordgo | ||||||
|  |  | ||||||
|  | import "strconv" | ||||||
|  |  | ||||||
|  | // APIVersion is the Discord API version used for the REST and Websocket API. | ||||||
|  | var APIVersion = "9" | ||||||
|  |  | ||||||
|  | // Known Discord API Endpoints. | ||||||
|  | var ( | ||||||
|  | 	EndpointStatus     = "https://status.discord.com/api/v2/" | ||||||
|  | 	EndpointSm         = EndpointStatus + "scheduled-maintenances/" | ||||||
|  | 	EndpointSmActive   = EndpointSm + "active.json" | ||||||
|  | 	EndpointSmUpcoming = EndpointSm + "upcoming.json" | ||||||
|  |  | ||||||
|  | 	EndpointDiscord    = "https://discord.com/" | ||||||
|  | 	EndpointAPI        = EndpointDiscord + "api/v" + APIVersion + "/" | ||||||
|  | 	EndpointGuilds     = EndpointAPI + "guilds/" | ||||||
|  | 	EndpointChannels   = EndpointAPI + "channels/" | ||||||
|  | 	EndpointUsers      = EndpointAPI + "users/" | ||||||
|  | 	EndpointGateway    = EndpointAPI + "gateway" | ||||||
|  | 	EndpointGatewayBot = EndpointGateway + "/bot" | ||||||
|  | 	EndpointWebhooks   = EndpointAPI + "webhooks/" | ||||||
|  | 	EndpointStickers   = EndpointAPI + "stickers/" | ||||||
|  |  | ||||||
|  | 	EndpointCDN             = "https://cdn.discordapp.com/" | ||||||
|  | 	EndpointCDNAttachments  = EndpointCDN + "attachments/" | ||||||
|  | 	EndpointCDNAvatars      = EndpointCDN + "avatars/" | ||||||
|  | 	EndpointCDNIcons        = EndpointCDN + "icons/" | ||||||
|  | 	EndpointCDNSplashes     = EndpointCDN + "splashes/" | ||||||
|  | 	EndpointCDNChannelIcons = EndpointCDN + "channel-icons/" | ||||||
|  | 	EndpointCDNBanners      = EndpointCDN + "banners/" | ||||||
|  | 	EndpointCDNGuilds       = EndpointCDN + "guilds/" | ||||||
|  |  | ||||||
|  | 	EndpointVoice        = EndpointAPI + "/voice/" | ||||||
|  | 	EndpointVoiceRegions = EndpointVoice + "regions" | ||||||
|  |  | ||||||
|  | 	// TODO: EndpointUserGuildMember | ||||||
|  |  | ||||||
|  | 	EndpointUser               = func(uID string) string { return EndpointUsers + uID } | ||||||
|  | 	EndpointUserAvatar         = func(uID, aID string) string { return EndpointCDNAvatars + uID + "/" + aID + ".png" } | ||||||
|  | 	EndpointUserAvatarAnimated = func(uID, aID string) string { return EndpointCDNAvatars + uID + "/" + aID + ".gif" } | ||||||
|  | 	EndpointDefaultUserAvatar  = func(uDiscriminator string) string { | ||||||
|  | 		uDiscriminatorInt, _ := strconv.Atoi(uDiscriminator) | ||||||
|  | 		return EndpointCDN + "embed/avatars/" + strconv.Itoa(uDiscriminatorInt%5) + ".png" | ||||||
|  | 	} | ||||||
|  | 	EndpointUserBanner = func(uID, cID string) string { | ||||||
|  | 		return EndpointCDNBanners + uID + "/" + cID + ".png" | ||||||
|  | 	} | ||||||
|  | 	EndpointUserBannerAnimated = func(uID, cID string) string { | ||||||
|  | 		return EndpointCDNBanners + uID + "/" + cID + ".gif" | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	EndpointUserGuilds      = func(uID string) string { return EndpointUsers + uID + "/guilds" } | ||||||
|  | 	EndpointUserGuild       = func(uID, gID string) string { return EndpointUsers + uID + "/guilds/" + gID } | ||||||
|  | 	EndpointUserChannels    = func(uID string) string { return EndpointUsers + uID + "/channels" } | ||||||
|  | 	EndpointUserConnections = func(uID string) string { return EndpointUsers + uID + "/connections" } | ||||||
|  |  | ||||||
|  | 	EndpointGuild                    = func(gID string) string { return EndpointGuilds + gID } | ||||||
|  | 	EndpointGuildThreads             = func(gID string) string { return EndpointGuild(gID) + "/threads" } | ||||||
|  | 	EndpointGuildActiveThreads       = func(gID string) string { return EndpointGuildThreads(gID) + "/active" } | ||||||
|  | 	EndpointGuildPreview             = func(gID string) string { return EndpointGuilds + gID + "/preview" } | ||||||
|  | 	EndpointGuildChannels            = func(gID string) string { return EndpointGuilds + gID + "/channels" } | ||||||
|  | 	EndpointGuildMembers             = func(gID string) string { return EndpointGuilds + gID + "/members" } | ||||||
|  | 	EndpointGuildMember              = func(gID, uID string) string { return EndpointGuilds + gID + "/members/" + uID } | ||||||
|  | 	EndpointGuildMemberRole          = func(gID, uID, rID string) string { return EndpointGuilds + gID + "/members/" + uID + "/roles/" + rID } | ||||||
|  | 	EndpointGuildBans                = func(gID string) string { return EndpointGuilds + gID + "/bans" } | ||||||
|  | 	EndpointGuildBan                 = func(gID, uID string) string { return EndpointGuilds + gID + "/bans/" + uID } | ||||||
|  | 	EndpointGuildIntegrations        = func(gID string) string { return EndpointGuilds + gID + "/integrations" } | ||||||
|  | 	EndpointGuildIntegration         = func(gID, iID string) string { return EndpointGuilds + gID + "/integrations/" + iID } | ||||||
|  | 	EndpointGuildRoles               = func(gID string) string { return EndpointGuilds + gID + "/roles" } | ||||||
|  | 	EndpointGuildRole                = func(gID, rID string) string { return EndpointGuilds + gID + "/roles/" + rID } | ||||||
|  | 	EndpointGuildInvites             = func(gID string) string { return EndpointGuilds + gID + "/invites" } | ||||||
|  | 	EndpointGuildWidget              = func(gID string) string { return EndpointGuilds + gID + "/widget" } | ||||||
|  | 	EndpointGuildEmbed               = EndpointGuildWidget | ||||||
|  | 	EndpointGuildPrune               = func(gID string) string { return EndpointGuilds + gID + "/prune" } | ||||||
|  | 	EndpointGuildIcon                = func(gID, hash string) string { return EndpointCDNIcons + gID + "/" + hash + ".png" } | ||||||
|  | 	EndpointGuildIconAnimated        = func(gID, hash string) string { return EndpointCDNIcons + gID + "/" + hash + ".gif" } | ||||||
|  | 	EndpointGuildSplash              = func(gID, hash string) string { return EndpointCDNSplashes + gID + "/" + hash + ".png" } | ||||||
|  | 	EndpointGuildWebhooks            = func(gID string) string { return EndpointGuilds + gID + "/webhooks" } | ||||||
|  | 	EndpointGuildAuditLogs           = func(gID string) string { return EndpointGuilds + gID + "/audit-logs" } | ||||||
|  | 	EndpointGuildEmojis              = func(gID string) string { return EndpointGuilds + gID + "/emojis" } | ||||||
|  | 	EndpointGuildEmoji               = func(gID, eID string) string { return EndpointGuilds + gID + "/emojis/" + eID } | ||||||
|  | 	EndpointGuildBanner              = func(gID, hash string) string { return EndpointCDNBanners + gID + "/" + hash + ".png" } | ||||||
|  | 	EndpointGuildStickers            = func(gID string) string { return EndpointGuilds + gID + "/stickers" } | ||||||
|  | 	EndpointGuildSticker             = func(gID, sID string) string { return EndpointGuilds + gID + "/stickers/" + sID } | ||||||
|  | 	EndpointGuildScheduledEvents     = func(gID string) string { return EndpointGuilds + gID + "/scheduled-events" } | ||||||
|  | 	EndpointGuildScheduledEvent      = func(gID, eID string) string { return EndpointGuilds + gID + "/scheduled-events/" + eID } | ||||||
|  | 	EndpointGuildScheduledEventUsers = func(gID, eID string) string { return EndpointGuildScheduledEvent(gID, eID) + "/users" } | ||||||
|  | 	EndpointGuildTemplate            = func(tID string) string { return EndpointGuilds + "/templates/" + tID } | ||||||
|  | 	EndpointGuildTemplates           = func(gID string) string { return EndpointGuilds + gID + "/templates" } | ||||||
|  | 	EndpointGuildTemplateSync        = func(gID, tID string) string { return EndpointGuilds + gID + "/templates/" + tID } | ||||||
|  | 	EndpointGuildMemberAvatar        = func(gId, uID, aID string) string { | ||||||
|  | 		return EndpointCDNGuilds + gId + "/users/" + uID + "/avatars/" + aID + ".png" | ||||||
|  | 	} | ||||||
|  | 	EndpointGuildMemberAvatarAnimated = func(gId, uID, aID string) string { | ||||||
|  | 		return EndpointCDNGuilds + gId + "/users/" + uID + "/avatars/" + aID + ".gif" | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	EndpointChannel                             = func(cID string) string { return EndpointChannels + cID } | ||||||
|  | 	EndpointChannelThreads                      = func(cID string) string { return EndpointChannel(cID) + "/threads" } | ||||||
|  | 	EndpointChannelActiveThreads                = func(cID string) string { return EndpointChannelThreads(cID) + "/active" } | ||||||
|  | 	EndpointChannelPublicArchivedThreads        = func(cID string) string { return EndpointChannelThreads(cID) + "/archived/public" } | ||||||
|  | 	EndpointChannelPrivateArchivedThreads       = func(cID string) string { return EndpointChannelThreads(cID) + "/archived/private" } | ||||||
|  | 	EndpointChannelJoinedPrivateArchivedThreads = func(cID string) string { return EndpointChannel(cID) + "/users/@me/threads/archived/private" } | ||||||
|  | 	EndpointChannelPermissions                  = func(cID string) string { return EndpointChannels + cID + "/permissions" } | ||||||
|  | 	EndpointChannelPermission                   = func(cID, tID string) string { return EndpointChannels + cID + "/permissions/" + tID } | ||||||
|  | 	EndpointChannelInvites                      = func(cID string) string { return EndpointChannels + cID + "/invites" } | ||||||
|  | 	EndpointChannelTyping                       = func(cID string) string { return EndpointChannels + cID + "/typing" } | ||||||
|  | 	EndpointChannelMessages                     = func(cID string) string { return EndpointChannels + cID + "/messages" } | ||||||
|  | 	EndpointChannelMessage                      = func(cID, mID string) string { return EndpointChannels + cID + "/messages/" + mID } | ||||||
|  | 	EndpointChannelMessageThread                = func(cID, mID string) string { return EndpointChannelMessage(cID, mID) + "/threads" } | ||||||
|  | 	EndpointChannelMessagesBulkDelete           = func(cID string) string { return EndpointChannel(cID) + "/messages/bulk-delete" } | ||||||
|  | 	EndpointChannelMessagesPins                 = func(cID string) string { return EndpointChannel(cID) + "/pins" } | ||||||
|  | 	EndpointChannelMessagePin                   = func(cID, mID string) string { return EndpointChannel(cID) + "/pins/" + mID } | ||||||
|  | 	EndpointChannelMessageCrosspost             = func(cID, mID string) string { return EndpointChannel(cID) + "/messages/" + mID + "/crosspost" } | ||||||
|  | 	EndpointChannelFollow                       = func(cID string) string { return EndpointChannel(cID) + "/followers" } | ||||||
|  | 	EndpointThreadMembers                       = func(tID string) string { return EndpointChannel(tID) + "/thread-members" } | ||||||
|  | 	EndpointThreadMember                        = func(tID, mID string) string { return EndpointThreadMembers(tID) + "/" + mID } | ||||||
|  |  | ||||||
|  | 	EndpointGroupIcon = func(cID, hash string) string { return EndpointCDNChannelIcons + cID + "/" + hash + ".png" } | ||||||
|  |  | ||||||
|  | 	EndpointSticker            = func(sID string) string { return EndpointStickers + sID } | ||||||
|  | 	EndpointNitroStickersPacks = EndpointAPI + "/sticker-packs" | ||||||
|  |  | ||||||
|  | 	EndpointChannelWebhooks = func(cID string) string { return EndpointChannel(cID) + "/webhooks" } | ||||||
|  | 	EndpointWebhook         = func(wID string) string { return EndpointWebhooks + wID } | ||||||
|  | 	EndpointWebhookToken    = func(wID, token string) string { return EndpointWebhooks + wID + "/" + token } | ||||||
|  | 	EndpointWebhookMessage  = func(wID, token, messageID string) string { | ||||||
|  | 		return EndpointWebhookToken(wID, token) + "/messages/" + messageID | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	EndpointMessageReactionsAll = func(cID, mID string) string { | ||||||
|  | 		return EndpointChannelMessage(cID, mID) + "/reactions" | ||||||
|  | 	} | ||||||
|  | 	EndpointMessageReactions = func(cID, mID, eID string) string { | ||||||
|  | 		return EndpointChannelMessage(cID, mID) + "/reactions/" + eID | ||||||
|  | 	} | ||||||
|  | 	EndpointMessageReaction = func(cID, mID, eID, uID string) string { | ||||||
|  | 		return EndpointMessageReactions(cID, mID, eID) + "/" + uID | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	EndpointApplicationGlobalCommands = func(aID string) string { | ||||||
|  | 		return EndpointApplication(aID) + "/commands" | ||||||
|  | 	} | ||||||
|  | 	EndpointApplicationGlobalCommand = func(aID, cID string) string { | ||||||
|  | 		return EndpointApplicationGlobalCommands(aID) + "/" + cID | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	EndpointApplicationGuildCommands = func(aID, gID string) string { | ||||||
|  | 		return EndpointApplication(aID) + "/guilds/" + gID + "/commands" | ||||||
|  | 	} | ||||||
|  | 	EndpointApplicationGuildCommand = func(aID, gID, cID string) string { | ||||||
|  | 		return EndpointApplicationGuildCommands(aID, gID) + "/" + cID | ||||||
|  | 	} | ||||||
|  | 	EndpointApplicationCommandPermissions = func(aID, gID, cID string) string { | ||||||
|  | 		return EndpointApplicationGuildCommand(aID, gID, cID) + "/permissions" | ||||||
|  | 	} | ||||||
|  | 	EndpointApplicationCommandsGuildPermissions = func(aID, gID string) string { | ||||||
|  | 		return EndpointApplicationGuildCommands(aID, gID) + "/permissions" | ||||||
|  | 	} | ||||||
|  | 	EndpointInteraction = func(aID, iToken string) string { | ||||||
|  | 		return EndpointAPI + "interactions/" + aID + "/" + iToken | ||||||
|  | 	} | ||||||
|  | 	EndpointInteractionResponse = func(iID, iToken string) string { | ||||||
|  | 		return EndpointInteraction(iID, iToken) + "/callback" | ||||||
|  | 	} | ||||||
|  | 	EndpointInteractionResponseActions = func(aID, iToken string) string { | ||||||
|  | 		return EndpointWebhookMessage(aID, iToken, "@original") | ||||||
|  | 	} | ||||||
|  | 	EndpointFollowupMessage = func(aID, iToken string) string { | ||||||
|  | 		return EndpointWebhookToken(aID, iToken) | ||||||
|  | 	} | ||||||
|  | 	EndpointFollowupMessageActions = func(aID, iToken, mID string) string { | ||||||
|  | 		return EndpointWebhookMessage(aID, iToken, mID) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	EndpointGuildCreate = EndpointAPI + "guilds" | ||||||
|  |  | ||||||
|  | 	EndpointInvite = func(iID string) string { return EndpointAPI + "invites/" + iID } | ||||||
|  |  | ||||||
|  | 	EndpointEmoji         = func(eID string) string { return EndpointCDN + "emojis/" + eID + ".png" } | ||||||
|  | 	EndpointEmojiAnimated = func(eID string) string { return EndpointCDN + "emojis/" + eID + ".gif" } | ||||||
|  |  | ||||||
|  | 	EndpointApplications = EndpointAPI + "applications" | ||||||
|  | 	EndpointApplication  = func(aID string) string { return EndpointApplications + "/" + aID } | ||||||
|  |  | ||||||
|  | 	EndpointOAuth2                  = EndpointAPI + "oauth2/" | ||||||
|  | 	EndpointOAuth2Applications      = EndpointOAuth2 + "applications" | ||||||
|  | 	EndpointOAuth2Application       = func(aID string) string { return EndpointOAuth2Applications + "/" + aID } | ||||||
|  | 	EndpointOAuth2ApplicationsBot   = func(aID string) string { return EndpointOAuth2Applications + "/" + aID + "/bot" } | ||||||
|  | 	EndpointOAuth2ApplicationAssets = func(aID string) string { return EndpointOAuth2Applications + "/" + aID + "/assets" } | ||||||
|  |  | ||||||
|  | 	// TODO: Deprecated, remove in the next release | ||||||
|  | 	EndpointOauth2                  = EndpointOAuth2 | ||||||
|  | 	EndpointOauth2Applications      = EndpointOAuth2Applications | ||||||
|  | 	EndpointOauth2Application       = EndpointOAuth2Application | ||||||
|  | 	EndpointOauth2ApplicationsBot   = EndpointOAuth2ApplicationsBot | ||||||
|  | 	EndpointOauth2ApplicationAssets = EndpointOAuth2ApplicationAssets | ||||||
|  | ) | ||||||
| @@ -157,7 +157,7 @@ func (s *Session) removeEventHandlerInstance(t string, ehi *eventHandlerInstance | |||||||
| 	onceHandlers := s.onceHandlers[t] | 	onceHandlers := s.onceHandlers[t] | ||||||
| 	for i := range onceHandlers { | 	for i := range onceHandlers { | ||||||
| 		if onceHandlers[i] == ehi { | 		if onceHandlers[i] == ehi { | ||||||
| 			s.onceHandlers[t] = append(onceHandlers[:i], handlers[i+1:]...) | 			s.onceHandlers[t] = append(onceHandlers[:i], onceHandlers[i+1:]...) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| @@ -7,50 +7,62 @@ package discordgo | |||||||
| // Event type values are used to match the events returned by Discord. | // Event type values are used to match the events returned by Discord. | ||||||
| // EventTypes surrounded by __ are synthetic and are internal to DiscordGo. | // EventTypes surrounded by __ are synthetic and are internal to DiscordGo. | ||||||
| const ( | const ( | ||||||
| 	channelCreateEventType            = "CHANNEL_CREATE" | 	channelCreateEventType             = "CHANNEL_CREATE" | ||||||
| 	channelDeleteEventType            = "CHANNEL_DELETE" | 	channelDeleteEventType             = "CHANNEL_DELETE" | ||||||
| 	channelPinsUpdateEventType        = "CHANNEL_PINS_UPDATE" | 	channelPinsUpdateEventType         = "CHANNEL_PINS_UPDATE" | ||||||
| 	channelUpdateEventType            = "CHANNEL_UPDATE" | 	channelUpdateEventType             = "CHANNEL_UPDATE" | ||||||
| 	connectEventType                  = "__CONNECT__" | 	connectEventType                   = "__CONNECT__" | ||||||
| 	disconnectEventType               = "__DISCONNECT__" | 	disconnectEventType                = "__DISCONNECT__" | ||||||
| 	eventEventType                    = "__EVENT__" | 	eventEventType                     = "__EVENT__" | ||||||
| 	guildBanAddEventType              = "GUILD_BAN_ADD" | 	guildBanAddEventType               = "GUILD_BAN_ADD" | ||||||
| 	guildBanRemoveEventType           = "GUILD_BAN_REMOVE" | 	guildBanRemoveEventType            = "GUILD_BAN_REMOVE" | ||||||
| 	guildCreateEventType              = "GUILD_CREATE" | 	guildCreateEventType               = "GUILD_CREATE" | ||||||
| 	guildDeleteEventType              = "GUILD_DELETE" | 	guildDeleteEventType               = "GUILD_DELETE" | ||||||
| 	guildEmojisUpdateEventType        = "GUILD_EMOJIS_UPDATE" | 	guildEmojisUpdateEventType         = "GUILD_EMOJIS_UPDATE" | ||||||
| 	guildIntegrationsUpdateEventType  = "GUILD_INTEGRATIONS_UPDATE" | 	guildIntegrationsUpdateEventType   = "GUILD_INTEGRATIONS_UPDATE" | ||||||
| 	guildMemberAddEventType           = "GUILD_MEMBER_ADD" | 	guildMemberAddEventType            = "GUILD_MEMBER_ADD" | ||||||
| 	guildMemberRemoveEventType        = "GUILD_MEMBER_REMOVE" | 	guildMemberRemoveEventType         = "GUILD_MEMBER_REMOVE" | ||||||
| 	guildMemberUpdateEventType        = "GUILD_MEMBER_UPDATE" | 	guildMemberUpdateEventType         = "GUILD_MEMBER_UPDATE" | ||||||
| 	guildMembersChunkEventType        = "GUILD_MEMBERS_CHUNK" | 	guildMembersChunkEventType         = "GUILD_MEMBERS_CHUNK" | ||||||
| 	guildRoleCreateEventType          = "GUILD_ROLE_CREATE" | 	guildRoleCreateEventType           = "GUILD_ROLE_CREATE" | ||||||
| 	guildRoleDeleteEventType          = "GUILD_ROLE_DELETE" | 	guildRoleDeleteEventType           = "GUILD_ROLE_DELETE" | ||||||
| 	guildRoleUpdateEventType          = "GUILD_ROLE_UPDATE" | 	guildRoleUpdateEventType           = "GUILD_ROLE_UPDATE" | ||||||
| 	guildUpdateEventType              = "GUILD_UPDATE" | 	guildUpdateEventType               = "GUILD_UPDATE" | ||||||
| 	messageAckEventType               = "MESSAGE_ACK" | 	guildScheduledEventCreateEventType = "GUILD_SCHEDULED_EVENT_CREATE" | ||||||
| 	messageCreateEventType            = "MESSAGE_CREATE" | 	guildScheduledEventUpdateEventType = "GUILD_SCHEDULED_EVENT_UPDATE" | ||||||
| 	messageDeleteEventType            = "MESSAGE_DELETE" | 	guildScheduledEventDeleteEventType = "GUILD_SCHEDULED_EVENT_DELETE" | ||||||
| 	messageDeleteBulkEventType        = "MESSAGE_DELETE_BULK" | 	interactionCreateEventType         = "INTERACTION_CREATE" | ||||||
| 	messageReactionAddEventType       = "MESSAGE_REACTION_ADD" | 	inviteCreateEventType              = "INVITE_CREATE" | ||||||
| 	messageReactionRemoveEventType    = "MESSAGE_REACTION_REMOVE" | 	inviteDeleteEventType              = "INVITE_DELETE" | ||||||
| 	messageReactionRemoveAllEventType = "MESSAGE_REACTION_REMOVE_ALL" | 	messageAckEventType                = "MESSAGE_ACK" | ||||||
| 	messageUpdateEventType            = "MESSAGE_UPDATE" | 	messageCreateEventType             = "MESSAGE_CREATE" | ||||||
| 	presenceUpdateEventType           = "PRESENCE_UPDATE" | 	messageDeleteEventType             = "MESSAGE_DELETE" | ||||||
| 	presencesReplaceEventType         = "PRESENCES_REPLACE" | 	messageDeleteBulkEventType         = "MESSAGE_DELETE_BULK" | ||||||
| 	rateLimitEventType                = "__RATE_LIMIT__" | 	messageReactionAddEventType        = "MESSAGE_REACTION_ADD" | ||||||
| 	readyEventType                    = "READY" | 	messageReactionRemoveEventType     = "MESSAGE_REACTION_REMOVE" | ||||||
| 	relationshipAddEventType          = "RELATIONSHIP_ADD" | 	messageReactionRemoveAllEventType  = "MESSAGE_REACTION_REMOVE_ALL" | ||||||
| 	relationshipRemoveEventType       = "RELATIONSHIP_REMOVE" | 	messageUpdateEventType             = "MESSAGE_UPDATE" | ||||||
| 	resumedEventType                  = "RESUMED" | 	presenceUpdateEventType            = "PRESENCE_UPDATE" | ||||||
| 	typingStartEventType              = "TYPING_START" | 	presencesReplaceEventType          = "PRESENCES_REPLACE" | ||||||
| 	userGuildSettingsUpdateEventType  = "USER_GUILD_SETTINGS_UPDATE" | 	rateLimitEventType                 = "__RATE_LIMIT__" | ||||||
| 	userNoteUpdateEventType           = "USER_NOTE_UPDATE" | 	readyEventType                     = "READY" | ||||||
| 	userSettingsUpdateEventType       = "USER_SETTINGS_UPDATE" | 	relationshipAddEventType           = "RELATIONSHIP_ADD" | ||||||
| 	userUpdateEventType               = "USER_UPDATE" | 	relationshipRemoveEventType        = "RELATIONSHIP_REMOVE" | ||||||
| 	voiceServerUpdateEventType        = "VOICE_SERVER_UPDATE" | 	resumedEventType                   = "RESUMED" | ||||||
| 	voiceStateUpdateEventType         = "VOICE_STATE_UPDATE" | 	threadCreateEventType              = "THREAD_CREATE" | ||||||
| 	webhooksUpdateEventType           = "WEBHOOKS_UPDATE" | 	threadDeleteEventType              = "THREAD_DELETE" | ||||||
|  | 	threadListSyncEventType            = "THREAD_LIST_SYNC" | ||||||
|  | 	threadMemberUpdateEventType        = "THREAD_MEMBER_UPDATE" | ||||||
|  | 	threadMembersUpdateEventType       = "THREAD_MEMBERS_UPDATE" | ||||||
|  | 	threadUpdateEventType              = "THREAD_UPDATE" | ||||||
|  | 	typingStartEventType               = "TYPING_START" | ||||||
|  | 	userGuildSettingsUpdateEventType   = "USER_GUILD_SETTINGS_UPDATE" | ||||||
|  | 	userNoteUpdateEventType            = "USER_NOTE_UPDATE" | ||||||
|  | 	userSettingsUpdateEventType        = "USER_SETTINGS_UPDATE" | ||||||
|  | 	userUpdateEventType                = "USER_UPDATE" | ||||||
|  | 	voiceServerUpdateEventType         = "VOICE_SERVER_UPDATE" | ||||||
|  | 	voiceStateUpdateEventType          = "VOICE_STATE_UPDATE" | ||||||
|  | 	webhooksUpdateEventType            = "WEBHOOKS_UPDATE" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // channelCreateEventHandler is an event handler for ChannelCreate events. | // channelCreateEventHandler is an event handler for ChannelCreate events. | ||||||
| @@ -298,6 +310,66 @@ func (eh guildIntegrationsUpdateEventHandler) Handle(s *Session, i interface{}) | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // guildScheduledEventCreateEventHandler is an event handler for GuildScheduledEventCreate events. | ||||||
|  | type guildScheduledEventCreateEventHandler func(*Session, *GuildScheduledEventCreate) | ||||||
|  | 
 | ||||||
|  | // Type returns the event type for GuildScheduledEventCreate events. | ||||||
|  | func (eh guildScheduledEventCreateEventHandler) Type() string { | ||||||
|  | 	return guildScheduledEventCreateEventType | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // New returns a new instance of GuildScheduledEventCreate. | ||||||
|  | func (eh guildScheduledEventCreateEventHandler) New() interface{} { | ||||||
|  | 	return &GuildScheduledEventCreate{} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Handle is the handler for GuildScheduledEventCreate events. | ||||||
|  | func (eh guildScheduledEventCreateEventHandler) Handle(s *Session, i interface{}) { | ||||||
|  | 	if t, ok := i.(*GuildScheduledEventCreate); ok { | ||||||
|  | 		eh(s, t) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // guildScheduledEventUpdateEventHandler is an event handler for GuildScheduledEventUpdate events. | ||||||
|  | type guildScheduledEventUpdateEventHandler func(*Session, *GuildScheduledEventUpdate) | ||||||
|  | 
 | ||||||
|  | // Type returns the event type for GuildScheduledEventUpdate events. | ||||||
|  | func (eh guildScheduledEventUpdateEventHandler) Type() string { | ||||||
|  | 	return guildScheduledEventUpdateEventType | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // New returns a new instance of GuildScheduledEventUpdate. | ||||||
|  | func (eh guildScheduledEventUpdateEventHandler) New() interface{} { | ||||||
|  | 	return &GuildScheduledEventUpdate{} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Handle is the handler for GuildScheduledEventUpdate events. | ||||||
|  | func (eh guildScheduledEventUpdateEventHandler) Handle(s *Session, i interface{}) { | ||||||
|  | 	if t, ok := i.(*GuildScheduledEventUpdate); ok { | ||||||
|  | 		eh(s, t) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // guildScheduledEventDeleteEventHandler is an event handler for GuildScheduledEventDelete events. | ||||||
|  | type guildScheduledEventDeleteEventHandler func(*Session, *GuildScheduledEventDelete) | ||||||
|  | 
 | ||||||
|  | // Type returns the event type for GuildScheduledEventDelete events. | ||||||
|  | func (eh guildScheduledEventDeleteEventHandler) Type() string { | ||||||
|  | 	return guildScheduledEventDeleteEventType | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // New returns a new instance of GuildScheduledEventDelete. | ||||||
|  | func (eh guildScheduledEventDeleteEventHandler) New() interface{} { | ||||||
|  | 	return &GuildScheduledEventDelete{} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Handle is the handler for GuildScheduledEventDelete events. | ||||||
|  | func (eh guildScheduledEventDeleteEventHandler) Handle(s *Session, i interface{}) { | ||||||
|  | 	if t, ok := i.(*GuildScheduledEventDelete); ok { | ||||||
|  | 		eh(s, t) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // guildMemberAddEventHandler is an event handler for GuildMemberAdd events. | // guildMemberAddEventHandler is an event handler for GuildMemberAdd events. | ||||||
| type guildMemberAddEventHandler func(*Session, *GuildMemberAdd) | type guildMemberAddEventHandler func(*Session, *GuildMemberAdd) | ||||||
| 
 | 
 | ||||||
| @@ -458,6 +530,66 @@ func (eh guildUpdateEventHandler) Handle(s *Session, i interface{}) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // interactionCreateEventHandler is an event handler for InteractionCreate events. | ||||||
|  | type interactionCreateEventHandler func(*Session, *InteractionCreate) | ||||||
|  | 
 | ||||||
|  | // Type returns the event type for InteractionCreate events. | ||||||
|  | func (eh interactionCreateEventHandler) Type() string { | ||||||
|  | 	return interactionCreateEventType | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // New returns a new instance of InteractionCreate. | ||||||
|  | func (eh interactionCreateEventHandler) New() interface{} { | ||||||
|  | 	return &InteractionCreate{} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Handle is the handler for InteractionCreate events. | ||||||
|  | func (eh interactionCreateEventHandler) Handle(s *Session, i interface{}) { | ||||||
|  | 	if t, ok := i.(*InteractionCreate); ok { | ||||||
|  | 		eh(s, t) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // inviteCreateEventHandler is an event handler for InviteCreate events. | ||||||
|  | type inviteCreateEventHandler func(*Session, *InviteCreate) | ||||||
|  | 
 | ||||||
|  | // Type returns the event type for InviteCreate events. | ||||||
|  | func (eh inviteCreateEventHandler) Type() string { | ||||||
|  | 	return inviteCreateEventType | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // New returns a new instance of InviteCreate. | ||||||
|  | func (eh inviteCreateEventHandler) New() interface{} { | ||||||
|  | 	return &InviteCreate{} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Handle is the handler for InviteCreate events. | ||||||
|  | func (eh inviteCreateEventHandler) Handle(s *Session, i interface{}) { | ||||||
|  | 	if t, ok := i.(*InviteCreate); ok { | ||||||
|  | 		eh(s, t) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // inviteDeleteEventHandler is an event handler for InviteDelete events. | ||||||
|  | type inviteDeleteEventHandler func(*Session, *InviteDelete) | ||||||
|  | 
 | ||||||
|  | // Type returns the event type for InviteDelete events. | ||||||
|  | func (eh inviteDeleteEventHandler) Type() string { | ||||||
|  | 	return inviteDeleteEventType | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // New returns a new instance of InviteDelete. | ||||||
|  | func (eh inviteDeleteEventHandler) New() interface{} { | ||||||
|  | 	return &InviteDelete{} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Handle is the handler for InviteDelete events. | ||||||
|  | func (eh inviteDeleteEventHandler) Handle(s *Session, i interface{}) { | ||||||
|  | 	if t, ok := i.(*InviteDelete); ok { | ||||||
|  | 		eh(s, t) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // messageAckEventHandler is an event handler for MessageAck events. | // messageAckEventHandler is an event handler for MessageAck events. | ||||||
| type messageAckEventHandler func(*Session, *MessageAck) | type messageAckEventHandler func(*Session, *MessageAck) | ||||||
| 
 | 
 | ||||||
| @@ -753,6 +885,126 @@ func (eh resumedEventHandler) Handle(s *Session, i interface{}) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // threadCreateEventHandler is an event handler for ThreadCreate events. | ||||||
|  | type threadCreateEventHandler func(*Session, *ThreadCreate) | ||||||
|  | 
 | ||||||
|  | // Type returns the event type for ThreadCreate events. | ||||||
|  | func (eh threadCreateEventHandler) Type() string { | ||||||
|  | 	return threadCreateEventType | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // New returns a new instance of ThreadCreate. | ||||||
|  | func (eh threadCreateEventHandler) New() interface{} { | ||||||
|  | 	return &ThreadCreate{} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Handle is the handler for ThreadCreate events. | ||||||
|  | func (eh threadCreateEventHandler) Handle(s *Session, i interface{}) { | ||||||
|  | 	if t, ok := i.(*ThreadCreate); ok { | ||||||
|  | 		eh(s, t) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // threadDeleteEventHandler is an event handler for ThreadDelete events. | ||||||
|  | type threadDeleteEventHandler func(*Session, *ThreadDelete) | ||||||
|  | 
 | ||||||
|  | // Type returns the event type for ThreadDelete events. | ||||||
|  | func (eh threadDeleteEventHandler) Type() string { | ||||||
|  | 	return threadDeleteEventType | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // New returns a new instance of ThreadDelete. | ||||||
|  | func (eh threadDeleteEventHandler) New() interface{} { | ||||||
|  | 	return &ThreadDelete{} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Handle is the handler for ThreadDelete events. | ||||||
|  | func (eh threadDeleteEventHandler) Handle(s *Session, i interface{}) { | ||||||
|  | 	if t, ok := i.(*ThreadDelete); ok { | ||||||
|  | 		eh(s, t) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // threadListSyncEventHandler is an event handler for ThreadListSync events. | ||||||
|  | type threadListSyncEventHandler func(*Session, *ThreadListSync) | ||||||
|  | 
 | ||||||
|  | // Type returns the event type for ThreadListSync events. | ||||||
|  | func (eh threadListSyncEventHandler) Type() string { | ||||||
|  | 	return threadListSyncEventType | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // New returns a new instance of ThreadListSync. | ||||||
|  | func (eh threadListSyncEventHandler) New() interface{} { | ||||||
|  | 	return &ThreadListSync{} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Handle is the handler for ThreadListSync events. | ||||||
|  | func (eh threadListSyncEventHandler) Handle(s *Session, i interface{}) { | ||||||
|  | 	if t, ok := i.(*ThreadListSync); ok { | ||||||
|  | 		eh(s, t) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // threadMemberUpdateEventHandler is an event handler for ThreadMemberUpdate events. | ||||||
|  | type threadMemberUpdateEventHandler func(*Session, *ThreadMemberUpdate) | ||||||
|  | 
 | ||||||
|  | // Type returns the event type for ThreadMemberUpdate events. | ||||||
|  | func (eh threadMemberUpdateEventHandler) Type() string { | ||||||
|  | 	return threadMemberUpdateEventType | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // New returns a new instance of ThreadMemberUpdate. | ||||||
|  | func (eh threadMemberUpdateEventHandler) New() interface{} { | ||||||
|  | 	return &ThreadMemberUpdate{} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Handle is the handler for ThreadMemberUpdate events. | ||||||
|  | func (eh threadMemberUpdateEventHandler) Handle(s *Session, i interface{}) { | ||||||
|  | 	if t, ok := i.(*ThreadMemberUpdate); ok { | ||||||
|  | 		eh(s, t) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // threadMembersUpdateEventHandler is an event handler for ThreadMembersUpdate events. | ||||||
|  | type threadMembersUpdateEventHandler func(*Session, *ThreadMembersUpdate) | ||||||
|  | 
 | ||||||
|  | // Type returns the event type for ThreadMembersUpdate events. | ||||||
|  | func (eh threadMembersUpdateEventHandler) Type() string { | ||||||
|  | 	return threadMembersUpdateEventType | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // New returns a new instance of ThreadMembersUpdate. | ||||||
|  | func (eh threadMembersUpdateEventHandler) New() interface{} { | ||||||
|  | 	return &ThreadMembersUpdate{} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Handle is the handler for ThreadMembersUpdate events. | ||||||
|  | func (eh threadMembersUpdateEventHandler) Handle(s *Session, i interface{}) { | ||||||
|  | 	if t, ok := i.(*ThreadMembersUpdate); ok { | ||||||
|  | 		eh(s, t) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // threadUpdateEventHandler is an event handler for ThreadUpdate events. | ||||||
|  | type threadUpdateEventHandler func(*Session, *ThreadUpdate) | ||||||
|  | 
 | ||||||
|  | // Type returns the event type for ThreadUpdate events. | ||||||
|  | func (eh threadUpdateEventHandler) Type() string { | ||||||
|  | 	return threadUpdateEventType | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // New returns a new instance of ThreadUpdate. | ||||||
|  | func (eh threadUpdateEventHandler) New() interface{} { | ||||||
|  | 	return &ThreadUpdate{} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Handle is the handler for ThreadUpdate events. | ||||||
|  | func (eh threadUpdateEventHandler) Handle(s *Session, i interface{}) { | ||||||
|  | 	if t, ok := i.(*ThreadUpdate); ok { | ||||||
|  | 		eh(s, t) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // typingStartEventHandler is an event handler for TypingStart events. | // typingStartEventHandler is an event handler for TypingStart events. | ||||||
| type typingStartEventHandler func(*Session, *TypingStart) | type typingStartEventHandler func(*Session, *TypingStart) | ||||||
| 
 | 
 | ||||||
| @@ -943,6 +1195,12 @@ func handlerForInterface(handler interface{}) EventHandler { | |||||||
| 		return guildEmojisUpdateEventHandler(v) | 		return guildEmojisUpdateEventHandler(v) | ||||||
| 	case func(*Session, *GuildIntegrationsUpdate): | 	case func(*Session, *GuildIntegrationsUpdate): | ||||||
| 		return guildIntegrationsUpdateEventHandler(v) | 		return guildIntegrationsUpdateEventHandler(v) | ||||||
|  | 	case func(*Session, *GuildScheduledEventCreate): | ||||||
|  | 		return guildScheduledEventCreateEventHandler(v) | ||||||
|  | 	case func(*Session, *GuildScheduledEventUpdate): | ||||||
|  | 		return guildScheduledEventUpdateEventHandler(v) | ||||||
|  | 	case func(*Session, *GuildScheduledEventDelete): | ||||||
|  | 		return guildScheduledEventDeleteEventHandler(v) | ||||||
| 	case func(*Session, *GuildMemberAdd): | 	case func(*Session, *GuildMemberAdd): | ||||||
| 		return guildMemberAddEventHandler(v) | 		return guildMemberAddEventHandler(v) | ||||||
| 	case func(*Session, *GuildMemberRemove): | 	case func(*Session, *GuildMemberRemove): | ||||||
| @@ -959,6 +1217,12 @@ func handlerForInterface(handler interface{}) EventHandler { | |||||||
| 		return guildRoleUpdateEventHandler(v) | 		return guildRoleUpdateEventHandler(v) | ||||||
| 	case func(*Session, *GuildUpdate): | 	case func(*Session, *GuildUpdate): | ||||||
| 		return guildUpdateEventHandler(v) | 		return guildUpdateEventHandler(v) | ||||||
|  | 	case func(*Session, *InteractionCreate): | ||||||
|  | 		return interactionCreateEventHandler(v) | ||||||
|  | 	case func(*Session, *InviteCreate): | ||||||
|  | 		return inviteCreateEventHandler(v) | ||||||
|  | 	case func(*Session, *InviteDelete): | ||||||
|  | 		return inviteDeleteEventHandler(v) | ||||||
| 	case func(*Session, *MessageAck): | 	case func(*Session, *MessageAck): | ||||||
| 		return messageAckEventHandler(v) | 		return messageAckEventHandler(v) | ||||||
| 	case func(*Session, *MessageCreate): | 	case func(*Session, *MessageCreate): | ||||||
| @@ -989,6 +1253,18 @@ func handlerForInterface(handler interface{}) EventHandler { | |||||||
| 		return relationshipRemoveEventHandler(v) | 		return relationshipRemoveEventHandler(v) | ||||||
| 	case func(*Session, *Resumed): | 	case func(*Session, *Resumed): | ||||||
| 		return resumedEventHandler(v) | 		return resumedEventHandler(v) | ||||||
|  | 	case func(*Session, *ThreadCreate): | ||||||
|  | 		return threadCreateEventHandler(v) | ||||||
|  | 	case func(*Session, *ThreadDelete): | ||||||
|  | 		return threadDeleteEventHandler(v) | ||||||
|  | 	case func(*Session, *ThreadListSync): | ||||||
|  | 		return threadListSyncEventHandler(v) | ||||||
|  | 	case func(*Session, *ThreadMemberUpdate): | ||||||
|  | 		return threadMemberUpdateEventHandler(v) | ||||||
|  | 	case func(*Session, *ThreadMembersUpdate): | ||||||
|  | 		return threadMembersUpdateEventHandler(v) | ||||||
|  | 	case func(*Session, *ThreadUpdate): | ||||||
|  | 		return threadUpdateEventHandler(v) | ||||||
| 	case func(*Session, *TypingStart): | 	case func(*Session, *TypingStart): | ||||||
| 		return typingStartEventHandler(v) | 		return typingStartEventHandler(v) | ||||||
| 	case func(*Session, *UserGuildSettingsUpdate): | 	case func(*Session, *UserGuildSettingsUpdate): | ||||||
| @@ -1021,6 +1297,9 @@ func init() { | |||||||
| 	registerInterfaceProvider(guildDeleteEventHandler(nil)) | 	registerInterfaceProvider(guildDeleteEventHandler(nil)) | ||||||
| 	registerInterfaceProvider(guildEmojisUpdateEventHandler(nil)) | 	registerInterfaceProvider(guildEmojisUpdateEventHandler(nil)) | ||||||
| 	registerInterfaceProvider(guildIntegrationsUpdateEventHandler(nil)) | 	registerInterfaceProvider(guildIntegrationsUpdateEventHandler(nil)) | ||||||
|  | 	registerInterfaceProvider(guildScheduledEventCreateEventHandler(nil)) | ||||||
|  | 	registerInterfaceProvider(guildScheduledEventUpdateEventHandler(nil)) | ||||||
|  | 	registerInterfaceProvider(guildScheduledEventDeleteEventHandler(nil)) | ||||||
| 	registerInterfaceProvider(guildMemberAddEventHandler(nil)) | 	registerInterfaceProvider(guildMemberAddEventHandler(nil)) | ||||||
| 	registerInterfaceProvider(guildMemberRemoveEventHandler(nil)) | 	registerInterfaceProvider(guildMemberRemoveEventHandler(nil)) | ||||||
| 	registerInterfaceProvider(guildMemberUpdateEventHandler(nil)) | 	registerInterfaceProvider(guildMemberUpdateEventHandler(nil)) | ||||||
| @@ -1029,6 +1308,9 @@ func init() { | |||||||
| 	registerInterfaceProvider(guildRoleDeleteEventHandler(nil)) | 	registerInterfaceProvider(guildRoleDeleteEventHandler(nil)) | ||||||
| 	registerInterfaceProvider(guildRoleUpdateEventHandler(nil)) | 	registerInterfaceProvider(guildRoleUpdateEventHandler(nil)) | ||||||
| 	registerInterfaceProvider(guildUpdateEventHandler(nil)) | 	registerInterfaceProvider(guildUpdateEventHandler(nil)) | ||||||
|  | 	registerInterfaceProvider(interactionCreateEventHandler(nil)) | ||||||
|  | 	registerInterfaceProvider(inviteCreateEventHandler(nil)) | ||||||
|  | 	registerInterfaceProvider(inviteDeleteEventHandler(nil)) | ||||||
| 	registerInterfaceProvider(messageAckEventHandler(nil)) | 	registerInterfaceProvider(messageAckEventHandler(nil)) | ||||||
| 	registerInterfaceProvider(messageCreateEventHandler(nil)) | 	registerInterfaceProvider(messageCreateEventHandler(nil)) | ||||||
| 	registerInterfaceProvider(messageDeleteEventHandler(nil)) | 	registerInterfaceProvider(messageDeleteEventHandler(nil)) | ||||||
| @@ -1043,6 +1325,12 @@ func init() { | |||||||
| 	registerInterfaceProvider(relationshipAddEventHandler(nil)) | 	registerInterfaceProvider(relationshipAddEventHandler(nil)) | ||||||
| 	registerInterfaceProvider(relationshipRemoveEventHandler(nil)) | 	registerInterfaceProvider(relationshipRemoveEventHandler(nil)) | ||||||
| 	registerInterfaceProvider(resumedEventHandler(nil)) | 	registerInterfaceProvider(resumedEventHandler(nil)) | ||||||
|  | 	registerInterfaceProvider(threadCreateEventHandler(nil)) | ||||||
|  | 	registerInterfaceProvider(threadDeleteEventHandler(nil)) | ||||||
|  | 	registerInterfaceProvider(threadListSyncEventHandler(nil)) | ||||||
|  | 	registerInterfaceProvider(threadMemberUpdateEventHandler(nil)) | ||||||
|  | 	registerInterfaceProvider(threadMembersUpdateEventHandler(nil)) | ||||||
|  | 	registerInterfaceProvider(threadUpdateEventHandler(nil)) | ||||||
| 	registerInterfaceProvider(typingStartEventHandler(nil)) | 	registerInterfaceProvider(typingStartEventHandler(nil)) | ||||||
| 	registerInterfaceProvider(userGuildSettingsUpdateEventHandler(nil)) | 	registerInterfaceProvider(userGuildSettingsUpdateEventHandler(nil)) | ||||||
| 	registerInterfaceProvider(userNoteUpdateEventHandler(nil)) | 	registerInterfaceProvider(userNoteUpdateEventHandler(nil)) | ||||||
| @@ -73,6 +73,53 @@ type ChannelPinsUpdate struct { | |||||||
| 	GuildID          string `json:"guild_id,omitempty"` | 	GuildID          string `json:"guild_id,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // ThreadCreate is the data for a ThreadCreate event. | ||||||
|  | type ThreadCreate struct { | ||||||
|  | 	*Channel | ||||||
|  | 	NewlyCreated bool `json:"newly_created"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ThreadUpdate is the data for a ThreadUpdate event. | ||||||
|  | type ThreadUpdate struct { | ||||||
|  | 	*Channel | ||||||
|  | 	BeforeUpdate *Channel `json:"-"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ThreadDelete is the data for a ThreadDelete event. | ||||||
|  | type ThreadDelete struct { | ||||||
|  | 	*Channel | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ThreadListSync is the data for a ThreadListSync event. | ||||||
|  | type ThreadListSync struct { | ||||||
|  | 	// The id of the guild | ||||||
|  | 	GuildID string `json:"guild_id"` | ||||||
|  | 	// The parent channel ids whose threads are being synced. | ||||||
|  | 	// If omitted, then threads were synced for the entire guild. | ||||||
|  | 	// This array may contain channel_ids that have no active threads as well, so you know to clear that data. | ||||||
|  | 	ChannelIDs []string `json:"channel_ids"` | ||||||
|  | 	// All active threads in the given channels that the current user can access | ||||||
|  | 	Threads []*Channel `json:"threads"` | ||||||
|  | 	// All thread member objects from the synced threads for the current user, | ||||||
|  | 	// indicating which threads the current user has been added to | ||||||
|  | 	Members []*ThreadMember `json:"members"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ThreadMemberUpdate is the data for a ThreadMemberUpdate event. | ||||||
|  | type ThreadMemberUpdate struct { | ||||||
|  | 	*ThreadMember | ||||||
|  | 	GuildID string `json:"guild_id"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ThreadMembersUpdate is the data for a ThreadMembersUpdate event. | ||||||
|  | type ThreadMembersUpdate struct { | ||||||
|  | 	ID             string              `json:"id"` | ||||||
|  | 	GuildID        string              `json:"guild_id"` | ||||||
|  | 	MemberCount    int                 `json:"member_count"` | ||||||
|  | 	AddedMembers   []AddedThreadMember `json:"added_members"` | ||||||
|  | 	RemovedMembers []string            `json:"removed_member_ids"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // GuildCreate is the data for a GuildCreate event. | // GuildCreate is the data for a GuildCreate event. | ||||||
| type GuildCreate struct { | type GuildCreate struct { | ||||||
| 	*Guild | 	*Guild | ||||||
| @@ -86,6 +133,7 @@ type GuildUpdate struct { | |||||||
| // GuildDelete is the data for a GuildDelete event. | // GuildDelete is the data for a GuildDelete event. | ||||||
| type GuildDelete struct { | type GuildDelete struct { | ||||||
| 	*Guild | 	*Guild | ||||||
|  | 	BeforeDelete *Guild `json:"-"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // GuildBanAdd is the data for a GuildBanAdd event. | // GuildBanAdd is the data for a GuildBanAdd event. | ||||||
| @@ -151,6 +199,21 @@ type GuildIntegrationsUpdate struct { | |||||||
| 	GuildID string `json:"guild_id"` | 	GuildID string `json:"guild_id"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // GuildScheduledEventCreate is the data for a GuildScheduledEventCreate event. | ||||||
|  | type GuildScheduledEventCreate struct { | ||||||
|  | 	*GuildScheduledEvent | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GuildScheduledEventUpdate is the data for a GuildScheduledEventUpdate event. | ||||||
|  | type GuildScheduledEventUpdate struct { | ||||||
|  | 	*GuildScheduledEvent | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GuildScheduledEventDelete is the data for a GuildScheduledEventDelete event. | ||||||
|  | type GuildScheduledEventDelete struct { | ||||||
|  | 	*GuildScheduledEvent | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // MessageAck is the data for a MessageAck event. | // MessageAck is the data for a MessageAck event. | ||||||
| type MessageAck struct { | type MessageAck struct { | ||||||
| 	MessageID string `json:"message_id"` | 	MessageID string `json:"message_id"` | ||||||
| @@ -162,6 +225,11 @@ type MessageCreate struct { | |||||||
| 	*Message | 	*Message | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // UnmarshalJSON is a helper function to unmarshal MessageCreate object. | ||||||
|  | func (m *MessageCreate) UnmarshalJSON(b []byte) error { | ||||||
|  | 	return json.Unmarshal(b, &m.Message) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // MessageUpdate is the data for a MessageUpdate event. | // MessageUpdate is the data for a MessageUpdate event. | ||||||
| type MessageUpdate struct { | type MessageUpdate struct { | ||||||
| 	*Message | 	*Message | ||||||
| @@ -169,15 +237,26 @@ type MessageUpdate struct { | |||||||
| 	BeforeUpdate *Message `json:"-"` | 	BeforeUpdate *Message `json:"-"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // UnmarshalJSON is a helper function to unmarshal MessageUpdate object. | ||||||
|  | func (m *MessageUpdate) UnmarshalJSON(b []byte) error { | ||||||
|  | 	return json.Unmarshal(b, &m.Message) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // MessageDelete is the data for a MessageDelete event. | // MessageDelete is the data for a MessageDelete event. | ||||||
| type MessageDelete struct { | type MessageDelete struct { | ||||||
| 	*Message | 	*Message | ||||||
| 	BeforeDelete *Message `json:"-"` | 	BeforeDelete *Message `json:"-"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // UnmarshalJSON is a helper function to unmarshal MessageDelete object. | ||||||
|  | func (m *MessageDelete) UnmarshalJSON(b []byte) error { | ||||||
|  | 	return json.Unmarshal(b, &m.Message) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // MessageReactionAdd is the data for a MessageReactionAdd event. | // MessageReactionAdd is the data for a MessageReactionAdd event. | ||||||
| type MessageReactionAdd struct { | type MessageReactionAdd struct { | ||||||
| 	*MessageReaction | 	*MessageReaction | ||||||
|  | 	Member *Member `json:"member,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // MessageReactionRemove is the data for a MessageReactionRemove event. | // MessageReactionRemove is the data for a MessageReactionRemove event. | ||||||
| @@ -267,3 +346,27 @@ type WebhooksUpdate struct { | |||||||
| 	GuildID   string `json:"guild_id"` | 	GuildID   string `json:"guild_id"` | ||||||
| 	ChannelID string `json:"channel_id"` | 	ChannelID string `json:"channel_id"` | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | // InteractionCreate is the data for a InteractionCreate event | ||||||
|  | type InteractionCreate struct { | ||||||
|  | 	*Interaction | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // UnmarshalJSON is a helper function to unmarshal Interaction object. | ||||||
|  | func (i *InteractionCreate) UnmarshalJSON(b []byte) error { | ||||||
|  | 	return json.Unmarshal(b, &i.Interaction) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // InviteCreate is the data for a InviteCreate event | ||||||
|  | type InviteCreate struct { | ||||||
|  | 	*Invite | ||||||
|  | 	ChannelID string `json:"channel_id"` | ||||||
|  | 	GuildID   string `json:"guild_id"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // InviteDelete is the data for a InviteDelete event | ||||||
|  | type InviteDelete struct { | ||||||
|  | 	ChannelID string `json:"channel_id"` | ||||||
|  | 	GuildID   string `json:"guild_id"` | ||||||
|  | 	Code      string `json:"code"` | ||||||
|  | } | ||||||
							
								
								
									
										568
									
								
								vendor/github.com/bwmarrin/discordgo/interactions.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										568
									
								
								vendor/github.com/bwmarrin/discordgo/interactions.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,568 @@ | |||||||
|  | package discordgo | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"bytes" | ||||||
|  | 	"crypto/ed25519" | ||||||
|  | 	"encoding/hex" | ||||||
|  | 	"encoding/json" | ||||||
|  | 	"fmt" | ||||||
|  | 	"io" | ||||||
|  | 	"io/ioutil" | ||||||
|  | 	"net/http" | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // InteractionDeadline is the time allowed to respond to an interaction. | ||||||
|  | const InteractionDeadline = time.Second * 3 | ||||||
|  |  | ||||||
|  | // ApplicationCommandType represents the type of application command. | ||||||
|  | type ApplicationCommandType uint8 | ||||||
|  |  | ||||||
|  | // Application command types | ||||||
|  | const ( | ||||||
|  | 	// ChatApplicationCommand is default command type. They are slash commands (i.e. called directly from the chat). | ||||||
|  | 	ChatApplicationCommand ApplicationCommandType = 1 | ||||||
|  | 	// UserApplicationCommand adds command to user context menu. | ||||||
|  | 	UserApplicationCommand ApplicationCommandType = 2 | ||||||
|  | 	// MessageApplicationCommand adds command to message context menu. | ||||||
|  | 	MessageApplicationCommand ApplicationCommandType = 3 | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // ApplicationCommand represents an application's slash command. | ||||||
|  | type ApplicationCommand struct { | ||||||
|  | 	ID                string                 `json:"id,omitempty"` | ||||||
|  | 	ApplicationID     string                 `json:"application_id,omitempty"` | ||||||
|  | 	Version           string                 `json:"version,omitempty"` | ||||||
|  | 	Type              ApplicationCommandType `json:"type,omitempty"` | ||||||
|  | 	Name              string                 `json:"name"` | ||||||
|  | 	DefaultPermission *bool                  `json:"default_permission,omitempty"` | ||||||
|  |  | ||||||
|  | 	// NOTE: Chat commands only. Otherwise it mustn't be set. | ||||||
|  |  | ||||||
|  | 	Description string                      `json:"description,omitempty"` | ||||||
|  | 	Options     []*ApplicationCommandOption `json:"options"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ApplicationCommandOptionType indicates the type of a slash command's option. | ||||||
|  | type ApplicationCommandOptionType uint8 | ||||||
|  |  | ||||||
|  | // Application command option types. | ||||||
|  | const ( | ||||||
|  | 	ApplicationCommandOptionSubCommand      ApplicationCommandOptionType = 1 | ||||||
|  | 	ApplicationCommandOptionSubCommandGroup ApplicationCommandOptionType = 2 | ||||||
|  | 	ApplicationCommandOptionString          ApplicationCommandOptionType = 3 | ||||||
|  | 	ApplicationCommandOptionInteger         ApplicationCommandOptionType = 4 | ||||||
|  | 	ApplicationCommandOptionBoolean         ApplicationCommandOptionType = 5 | ||||||
|  | 	ApplicationCommandOptionUser            ApplicationCommandOptionType = 6 | ||||||
|  | 	ApplicationCommandOptionChannel         ApplicationCommandOptionType = 7 | ||||||
|  | 	ApplicationCommandOptionRole            ApplicationCommandOptionType = 8 | ||||||
|  | 	ApplicationCommandOptionMentionable     ApplicationCommandOptionType = 9 | ||||||
|  | 	ApplicationCommandOptionNumber          ApplicationCommandOptionType = 10 | ||||||
|  | 	ApplicationCommandOptionAttachment      ApplicationCommandOptionType = 11 | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func (t ApplicationCommandOptionType) String() string { | ||||||
|  | 	switch t { | ||||||
|  | 	case ApplicationCommandOptionSubCommand: | ||||||
|  | 		return "SubCommand" | ||||||
|  | 	case ApplicationCommandOptionSubCommandGroup: | ||||||
|  | 		return "SubCommandGroup" | ||||||
|  | 	case ApplicationCommandOptionString: | ||||||
|  | 		return "String" | ||||||
|  | 	case ApplicationCommandOptionInteger: | ||||||
|  | 		return "Integer" | ||||||
|  | 	case ApplicationCommandOptionBoolean: | ||||||
|  | 		return "Boolean" | ||||||
|  | 	case ApplicationCommandOptionUser: | ||||||
|  | 		return "User" | ||||||
|  | 	case ApplicationCommandOptionChannel: | ||||||
|  | 		return "Channel" | ||||||
|  | 	case ApplicationCommandOptionRole: | ||||||
|  | 		return "Role" | ||||||
|  | 	case ApplicationCommandOptionMentionable: | ||||||
|  | 		return "Mentionable" | ||||||
|  | 	case ApplicationCommandOptionNumber: | ||||||
|  | 		return "Number" | ||||||
|  | 	case ApplicationCommandOptionAttachment: | ||||||
|  | 		return "Attachment" | ||||||
|  | 	} | ||||||
|  | 	return fmt.Sprintf("ApplicationCommandOptionType(%d)", t) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ApplicationCommandOption represents an option/subcommand/subcommands group. | ||||||
|  | type ApplicationCommandOption struct { | ||||||
|  | 	Type        ApplicationCommandOptionType `json:"type"` | ||||||
|  | 	Name        string                       `json:"name"` | ||||||
|  | 	Description string                       `json:"description,omitempty"` | ||||||
|  | 	// NOTE: This feature was on the API, but at some point developers decided to remove it. | ||||||
|  | 	// So I commented it, until it will be officially on the docs. | ||||||
|  | 	// Default     bool                              `json:"default"` | ||||||
|  |  | ||||||
|  | 	ChannelTypes []ChannelType               `json:"channel_types"` | ||||||
|  | 	Required     bool                        `json:"required"` | ||||||
|  | 	Options      []*ApplicationCommandOption `json:"options"` | ||||||
|  |  | ||||||
|  | 	// NOTE: mutually exclusive with Choices. | ||||||
|  | 	Autocomplete bool                              `json:"autocomplete"` | ||||||
|  | 	Choices      []*ApplicationCommandOptionChoice `json:"choices"` | ||||||
|  | 	// Minimal value of number/integer option. | ||||||
|  | 	MinValue *float64 `json:"min_value,omitempty"` | ||||||
|  | 	// Maximum value of number/integer option. | ||||||
|  | 	MaxValue float64 `json:"max_value,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ApplicationCommandOptionChoice represents a slash command option choice. | ||||||
|  | type ApplicationCommandOptionChoice struct { | ||||||
|  | 	Name  string      `json:"name"` | ||||||
|  | 	Value interface{} `json:"value"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ApplicationCommandPermissions represents a single user or role permission for a command. | ||||||
|  | type ApplicationCommandPermissions struct { | ||||||
|  | 	ID         string                           `json:"id"` | ||||||
|  | 	Type       ApplicationCommandPermissionType `json:"type"` | ||||||
|  | 	Permission bool                             `json:"permission"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ApplicationCommandPermissionsList represents a list of ApplicationCommandPermissions, needed for serializing to JSON. | ||||||
|  | type ApplicationCommandPermissionsList struct { | ||||||
|  | 	Permissions []*ApplicationCommandPermissions `json:"permissions"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GuildApplicationCommandPermissions represents all permissions for a single guild command. | ||||||
|  | type GuildApplicationCommandPermissions struct { | ||||||
|  | 	ID            string                           `json:"id"` | ||||||
|  | 	ApplicationID string                           `json:"application_id"` | ||||||
|  | 	GuildID       string                           `json:"guild_id"` | ||||||
|  | 	Permissions   []*ApplicationCommandPermissions `json:"permissions"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ApplicationCommandPermissionType indicates whether a permission is user or role based. | ||||||
|  | type ApplicationCommandPermissionType uint8 | ||||||
|  |  | ||||||
|  | // Application command permission types. | ||||||
|  | const ( | ||||||
|  | 	ApplicationCommandPermissionTypeRole ApplicationCommandPermissionType = 1 | ||||||
|  | 	ApplicationCommandPermissionTypeUser ApplicationCommandPermissionType = 2 | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // InteractionType indicates the type of an interaction event. | ||||||
|  | type InteractionType uint8 | ||||||
|  |  | ||||||
|  | // Interaction types | ||||||
|  | const ( | ||||||
|  | 	InteractionPing                           InteractionType = 1 | ||||||
|  | 	InteractionApplicationCommand             InteractionType = 2 | ||||||
|  | 	InteractionMessageComponent               InteractionType = 3 | ||||||
|  | 	InteractionApplicationCommandAutocomplete InteractionType = 4 | ||||||
|  | 	InteractionModalSubmit                    InteractionType = 5 | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func (t InteractionType) String() string { | ||||||
|  | 	switch t { | ||||||
|  | 	case InteractionPing: | ||||||
|  | 		return "Ping" | ||||||
|  | 	case InteractionApplicationCommand: | ||||||
|  | 		return "ApplicationCommand" | ||||||
|  | 	case InteractionMessageComponent: | ||||||
|  | 		return "MessageComponent" | ||||||
|  | 	case InteractionModalSubmit: | ||||||
|  | 		return "ModalSubmit" | ||||||
|  | 	} | ||||||
|  | 	return fmt.Sprintf("InteractionType(%d)", t) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Interaction represents data of an interaction. | ||||||
|  | type Interaction struct { | ||||||
|  | 	ID        string          `json:"id"` | ||||||
|  | 	Type      InteractionType `json:"type"` | ||||||
|  | 	Data      InteractionData `json:"data"` | ||||||
|  | 	GuildID   string          `json:"guild_id"` | ||||||
|  | 	ChannelID string          `json:"channel_id"` | ||||||
|  |  | ||||||
|  | 	// The message on which interaction was used. | ||||||
|  | 	// NOTE: this field is only filled when a button click triggered the interaction. Otherwise it will be nil. | ||||||
|  | 	Message *Message `json:"message"` | ||||||
|  |  | ||||||
|  | 	// The member who invoked this interaction. | ||||||
|  | 	// NOTE: this field is only filled when the slash command was invoked in a guild; | ||||||
|  | 	// if it was invoked in a DM, the `User` field will be filled instead. | ||||||
|  | 	// Make sure to check for `nil` before using this field. | ||||||
|  | 	Member *Member `json:"member"` | ||||||
|  | 	// The user who invoked this interaction. | ||||||
|  | 	// NOTE: this field is only filled when the slash command was invoked in a DM; | ||||||
|  | 	// if it was invoked in a guild, the `Member` field will be filled instead. | ||||||
|  | 	// Make sure to check for `nil` before using this field. | ||||||
|  | 	User *User `json:"user"` | ||||||
|  |  | ||||||
|  | 	// The user's discord client locale. | ||||||
|  | 	Locale Locale `json:"locale"` | ||||||
|  | 	// The guild's locale. This defaults to EnglishUS | ||||||
|  | 	// NOTE: this field is only filled when the interaction was invoked in a guild. | ||||||
|  | 	GuildLocale *Locale `json:"guild_locale"` | ||||||
|  |  | ||||||
|  | 	Token   string `json:"token"` | ||||||
|  | 	Version int    `json:"version"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type interaction Interaction | ||||||
|  |  | ||||||
|  | type rawInteraction struct { | ||||||
|  | 	interaction | ||||||
|  | 	Data json.RawMessage `json:"data"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // UnmarshalJSON is a method for unmarshalling JSON object to Interaction. | ||||||
|  | func (i *Interaction) UnmarshalJSON(raw []byte) error { | ||||||
|  | 	var tmp rawInteraction | ||||||
|  | 	err := json.Unmarshal(raw, &tmp) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	*i = Interaction(tmp.interaction) | ||||||
|  |  | ||||||
|  | 	switch tmp.Type { | ||||||
|  | 	case InteractionApplicationCommand, InteractionApplicationCommandAutocomplete: | ||||||
|  | 		v := ApplicationCommandInteractionData{} | ||||||
|  | 		err = json.Unmarshal(tmp.Data, &v) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		i.Data = v | ||||||
|  | 	case InteractionMessageComponent: | ||||||
|  | 		v := MessageComponentInteractionData{} | ||||||
|  | 		err = json.Unmarshal(tmp.Data, &v) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		i.Data = v | ||||||
|  | 	case InteractionModalSubmit: | ||||||
|  | 		v := ModalSubmitInteractionData{} | ||||||
|  | 		err = json.Unmarshal(tmp.Data, &v) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		i.Data = v | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // MessageComponentData is helper function to assert the inner InteractionData to MessageComponentInteractionData. | ||||||
|  | // Make sure to check that the Type of the interaction is InteractionMessageComponent before calling. | ||||||
|  | func (i Interaction) MessageComponentData() (data MessageComponentInteractionData) { | ||||||
|  | 	if i.Type != InteractionMessageComponent { | ||||||
|  | 		panic("MessageComponentData called on interaction of type " + i.Type.String()) | ||||||
|  | 	} | ||||||
|  | 	return i.Data.(MessageComponentInteractionData) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ApplicationCommandData is helper function to assert the inner InteractionData to ApplicationCommandInteractionData. | ||||||
|  | // Make sure to check that the Type of the interaction is InteractionApplicationCommand before calling. | ||||||
|  | func (i Interaction) ApplicationCommandData() (data ApplicationCommandInteractionData) { | ||||||
|  | 	if i.Type != InteractionApplicationCommand && i.Type != InteractionApplicationCommandAutocomplete { | ||||||
|  | 		panic("ApplicationCommandData called on interaction of type " + i.Type.String()) | ||||||
|  | 	} | ||||||
|  | 	return i.Data.(ApplicationCommandInteractionData) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ModalSubmitData is helper function to assert the inner InteractionData to ModalSubmitInteractionData. | ||||||
|  | // Make sure to check that the Type of the interaction is InteractionModalSubmit before calling. | ||||||
|  | func (i Interaction) ModalSubmitData() (data ModalSubmitInteractionData) { | ||||||
|  | 	if i.Type != InteractionModalSubmit { | ||||||
|  | 		panic("ModalSubmitData called on interaction of type " + i.Type.String()) | ||||||
|  | 	} | ||||||
|  | 	return i.Data.(ModalSubmitInteractionData) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // InteractionData is a common interface for all types of interaction data. | ||||||
|  | type InteractionData interface { | ||||||
|  | 	Type() InteractionType | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ApplicationCommandInteractionData contains the data of application command interaction. | ||||||
|  | type ApplicationCommandInteractionData struct { | ||||||
|  | 	ID       string                                     `json:"id"` | ||||||
|  | 	Name     string                                     `json:"name"` | ||||||
|  | 	Resolved *ApplicationCommandInteractionDataResolved `json:"resolved"` | ||||||
|  |  | ||||||
|  | 	// Slash command options | ||||||
|  | 	Options []*ApplicationCommandInteractionDataOption `json:"options"` | ||||||
|  | 	// Target (user/message) id on which context menu command was called. | ||||||
|  | 	// The details are stored in Resolved according to command type. | ||||||
|  | 	TargetID string `json:"target_id"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ApplicationCommandInteractionDataResolved contains resolved data of command execution. | ||||||
|  | // Partial Member objects are missing user, deaf and mute fields. | ||||||
|  | // Partial Channel objects only have id, name, type and permissions fields. | ||||||
|  | type ApplicationCommandInteractionDataResolved struct { | ||||||
|  | 	Users       map[string]*User              `json:"users"` | ||||||
|  | 	Members     map[string]*Member            `json:"members"` | ||||||
|  | 	Roles       map[string]*Role              `json:"roles"` | ||||||
|  | 	Channels    map[string]*Channel           `json:"channels"` | ||||||
|  | 	Messages    map[string]*Message           `json:"messages"` | ||||||
|  | 	Attachments map[string]*MessageAttachment `json:"attachments"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Type returns the type of interaction data. | ||||||
|  | func (ApplicationCommandInteractionData) Type() InteractionType { | ||||||
|  | 	return InteractionApplicationCommand | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // MessageComponentInteractionData contains the data of message component interaction. | ||||||
|  | type MessageComponentInteractionData struct { | ||||||
|  | 	CustomID      string        `json:"custom_id"` | ||||||
|  | 	ComponentType ComponentType `json:"component_type"` | ||||||
|  |  | ||||||
|  | 	// NOTE: Only filled when ComponentType is SelectMenuComponent (3). Otherwise is nil. | ||||||
|  | 	Values []string `json:"values"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Type returns the type of interaction data. | ||||||
|  | func (MessageComponentInteractionData) Type() InteractionType { | ||||||
|  | 	return InteractionMessageComponent | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ModalSubmitInteractionData contains the data of modal submit interaction. | ||||||
|  | type ModalSubmitInteractionData struct { | ||||||
|  | 	CustomID   string             `json:"custom_id"` | ||||||
|  | 	Components []MessageComponent `json:"-"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Type returns the type of interaction data. | ||||||
|  | func (ModalSubmitInteractionData) Type() InteractionType { | ||||||
|  | 	return InteractionModalSubmit | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // UnmarshalJSON is a helper function to correctly unmarshal Components. | ||||||
|  | func (d *ModalSubmitInteractionData) UnmarshalJSON(data []byte) error { | ||||||
|  | 	type modalSubmitInteractionData ModalSubmitInteractionData | ||||||
|  | 	var v struct { | ||||||
|  | 		modalSubmitInteractionData | ||||||
|  | 		RawComponents []unmarshalableMessageComponent `json:"components"` | ||||||
|  | 	} | ||||||
|  | 	err := json.Unmarshal(data, &v) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	*d = ModalSubmitInteractionData(v.modalSubmitInteractionData) | ||||||
|  | 	d.Components = make([]MessageComponent, len(v.RawComponents)) | ||||||
|  | 	for i, v := range v.RawComponents { | ||||||
|  | 		d.Components[i] = v.MessageComponent | ||||||
|  | 	} | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ApplicationCommandInteractionDataOption represents an option of a slash command. | ||||||
|  | type ApplicationCommandInteractionDataOption struct { | ||||||
|  | 	Name string                       `json:"name"` | ||||||
|  | 	Type ApplicationCommandOptionType `json:"type"` | ||||||
|  | 	// NOTE: Contains the value specified by Type. | ||||||
|  | 	Value   interface{}                                `json:"value,omitempty"` | ||||||
|  | 	Options []*ApplicationCommandInteractionDataOption `json:"options,omitempty"` | ||||||
|  |  | ||||||
|  | 	// NOTE: autocomplete interaction only. | ||||||
|  | 	Focused bool `json:"focused,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // IntValue is a utility function for casting option value to integer | ||||||
|  | func (o ApplicationCommandInteractionDataOption) IntValue() int64 { | ||||||
|  | 	if o.Type != ApplicationCommandOptionInteger { | ||||||
|  | 		panic("IntValue called on data option of type " + o.Type.String()) | ||||||
|  | 	} | ||||||
|  | 	return int64(o.Value.(float64)) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // UintValue is a utility function for casting option value to unsigned integer | ||||||
|  | func (o ApplicationCommandInteractionDataOption) UintValue() uint64 { | ||||||
|  | 	if o.Type != ApplicationCommandOptionInteger { | ||||||
|  | 		panic("UintValue called on data option of type " + o.Type.String()) | ||||||
|  | 	} | ||||||
|  | 	return uint64(o.Value.(float64)) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // FloatValue is a utility function for casting option value to float | ||||||
|  | func (o ApplicationCommandInteractionDataOption) FloatValue() float64 { | ||||||
|  | 	if o.Type != ApplicationCommandOptionNumber { | ||||||
|  | 		panic("FloatValue called on data option of type " + o.Type.String()) | ||||||
|  | 	} | ||||||
|  | 	return o.Value.(float64) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // StringValue is a utility function for casting option value to string | ||||||
|  | func (o ApplicationCommandInteractionDataOption) StringValue() string { | ||||||
|  | 	if o.Type != ApplicationCommandOptionString { | ||||||
|  | 		panic("StringValue called on data option of type " + o.Type.String()) | ||||||
|  | 	} | ||||||
|  | 	return o.Value.(string) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // BoolValue is a utility function for casting option value to bool | ||||||
|  | func (o ApplicationCommandInteractionDataOption) BoolValue() bool { | ||||||
|  | 	if o.Type != ApplicationCommandOptionBoolean { | ||||||
|  | 		panic("BoolValue called on data option of type " + o.Type.String()) | ||||||
|  | 	} | ||||||
|  | 	return o.Value.(bool) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ChannelValue is a utility function for casting option value to channel object. | ||||||
|  | // s : Session object, if not nil, function additionally fetches all channel's data | ||||||
|  | func (o ApplicationCommandInteractionDataOption) ChannelValue(s *Session) *Channel { | ||||||
|  | 	if o.Type != ApplicationCommandOptionChannel { | ||||||
|  | 		panic("ChannelValue called on data option of type " + o.Type.String()) | ||||||
|  | 	} | ||||||
|  | 	chanID := o.Value.(string) | ||||||
|  |  | ||||||
|  | 	if s == nil { | ||||||
|  | 		return &Channel{ID: chanID} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	ch, err := s.State.Channel(chanID) | ||||||
|  | 	if err != nil { | ||||||
|  | 		ch, err = s.Channel(chanID) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return &Channel{ID: chanID} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return ch | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // RoleValue is a utility function for casting option value to role object. | ||||||
|  | // s : Session object, if not nil, function additionally fetches all role's data | ||||||
|  | func (o ApplicationCommandInteractionDataOption) RoleValue(s *Session, gID string) *Role { | ||||||
|  | 	if o.Type != ApplicationCommandOptionRole && o.Type != ApplicationCommandOptionMentionable { | ||||||
|  | 		panic("RoleValue called on data option of type " + o.Type.String()) | ||||||
|  | 	} | ||||||
|  | 	roleID := o.Value.(string) | ||||||
|  |  | ||||||
|  | 	if s == nil || gID == "" { | ||||||
|  | 		return &Role{ID: roleID} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	r, err := s.State.Role(roleID, gID) | ||||||
|  | 	if err != nil { | ||||||
|  | 		roles, err := s.GuildRoles(gID) | ||||||
|  | 		if err == nil { | ||||||
|  | 			for _, r = range roles { | ||||||
|  | 				if r.ID == roleID { | ||||||
|  | 					return r | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return &Role{ID: roleID} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return r | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // UserValue is a utility function for casting option value to user object. | ||||||
|  | // s : Session object, if not nil, function additionally fetches all user's data | ||||||
|  | func (o ApplicationCommandInteractionDataOption) UserValue(s *Session) *User { | ||||||
|  | 	if o.Type != ApplicationCommandOptionUser && o.Type != ApplicationCommandOptionMentionable { | ||||||
|  | 		panic("UserValue called on data option of type " + o.Type.String()) | ||||||
|  | 	} | ||||||
|  | 	userID := o.Value.(string) | ||||||
|  |  | ||||||
|  | 	if s == nil { | ||||||
|  | 		return &User{ID: userID} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	u, err := s.User(userID) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return &User{ID: userID} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return u | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // InteractionResponseType is type of interaction response. | ||||||
|  | type InteractionResponseType uint8 | ||||||
|  |  | ||||||
|  | // Interaction response types. | ||||||
|  | const ( | ||||||
|  | 	// InteractionResponsePong is for ACK ping event. | ||||||
|  | 	InteractionResponsePong InteractionResponseType = 1 | ||||||
|  | 	// InteractionResponseChannelMessageWithSource is for responding with a message, showing the user's input. | ||||||
|  | 	InteractionResponseChannelMessageWithSource InteractionResponseType = 4 | ||||||
|  | 	// InteractionResponseDeferredChannelMessageWithSource acknowledges that the event was received, and that a follow-up will come later. | ||||||
|  | 	InteractionResponseDeferredChannelMessageWithSource InteractionResponseType = 5 | ||||||
|  | 	// InteractionResponseDeferredMessageUpdate acknowledges that the message component interaction event was received, and message will be updated later. | ||||||
|  | 	InteractionResponseDeferredMessageUpdate InteractionResponseType = 6 | ||||||
|  | 	// InteractionResponseUpdateMessage is for updating the message to which message component was attached. | ||||||
|  | 	InteractionResponseUpdateMessage InteractionResponseType = 7 | ||||||
|  | 	// InteractionApplicationCommandAutocompleteResult shows autocompletion results. Autocomplete interaction only. | ||||||
|  | 	InteractionApplicationCommandAutocompleteResult InteractionResponseType = 8 | ||||||
|  | 	// InteractionResponseModal is for responding to an interaction with a modal window. | ||||||
|  | 	InteractionResponseModal InteractionResponseType = 9 | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // InteractionResponse represents a response for an interaction event. | ||||||
|  | type InteractionResponse struct { | ||||||
|  | 	Type InteractionResponseType  `json:"type,omitempty"` | ||||||
|  | 	Data *InteractionResponseData `json:"data,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // InteractionResponseData is response data for an interaction. | ||||||
|  | type InteractionResponseData struct { | ||||||
|  | 	TTS             bool                    `json:"tts"` | ||||||
|  | 	Content         string                  `json:"content"` | ||||||
|  | 	Components      []MessageComponent      `json:"components"` | ||||||
|  | 	Embeds          []*MessageEmbed         `json:"embeds,omitempty"` | ||||||
|  | 	AllowedMentions *MessageAllowedMentions `json:"allowed_mentions,omitempty"` | ||||||
|  | 	Flags           uint64                  `json:"flags,omitempty"` | ||||||
|  | 	Files           []*File                 `json:"-"` | ||||||
|  |  | ||||||
|  | 	// NOTE: autocomplete interaction only. | ||||||
|  | 	Choices []*ApplicationCommandOptionChoice `json:"choices,omitempty"` | ||||||
|  |  | ||||||
|  | 	// NOTE: modal interaction only. | ||||||
|  |  | ||||||
|  | 	CustomID string `json:"custom_id,omitempty"` | ||||||
|  | 	Title    string `json:"title,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // VerifyInteraction implements message verification of the discord interactions api | ||||||
|  | // signing algorithm, as documented here: | ||||||
|  | // https://discord.com/developers/docs/interactions/receiving-and-responding#security-and-authorization | ||||||
|  | func VerifyInteraction(r *http.Request, key ed25519.PublicKey) bool { | ||||||
|  | 	var msg bytes.Buffer | ||||||
|  |  | ||||||
|  | 	signature := r.Header.Get("X-Signature-Ed25519") | ||||||
|  | 	if signature == "" { | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	sig, err := hex.DecodeString(signature) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if len(sig) != ed25519.SignatureSize { | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	timestamp := r.Header.Get("X-Signature-Timestamp") | ||||||
|  | 	if timestamp == "" { | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	msg.WriteString(timestamp) | ||||||
|  |  | ||||||
|  | 	defer r.Body.Close() | ||||||
|  | 	var body bytes.Buffer | ||||||
|  |  | ||||||
|  | 	// at the end of the function, copy the original body back into the request | ||||||
|  | 	defer func() { | ||||||
|  | 		r.Body = ioutil.NopCloser(&body) | ||||||
|  | 	}() | ||||||
|  |  | ||||||
|  | 	// copy body into buffers | ||||||
|  | 	_, err = io.Copy(&msg, io.TeeReader(r.Body, &body)) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return ed25519.Verify(key, msg.Bytes(), sig) | ||||||
|  | } | ||||||
							
								
								
									
										83
									
								
								vendor/github.com/bwmarrin/discordgo/locales.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								vendor/github.com/bwmarrin/discordgo/locales.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,83 @@ | |||||||
|  | package discordgo | ||||||
|  |  | ||||||
|  | // Locale represents the accepted languages for Discord. | ||||||
|  | // https://discord.com/developers/docs/reference#locales | ||||||
|  | type Locale string | ||||||
|  |  | ||||||
|  | // String returns the human-readable string of the locale | ||||||
|  | func (l Locale) String() string { | ||||||
|  | 	if name, ok := Locales[l]; ok { | ||||||
|  | 		return name | ||||||
|  | 	} | ||||||
|  | 	return Unknown.String() | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // All defined locales in Discord | ||||||
|  | const ( | ||||||
|  | 	EnglishUS    Locale = "en-US" | ||||||
|  | 	EnglishGB    Locale = "en-GB" | ||||||
|  | 	Bulgarian    Locale = "bg" | ||||||
|  | 	ChineseCN    Locale = "zh-CN" | ||||||
|  | 	ChineseTW    Locale = "zh-TW" | ||||||
|  | 	Croatian     Locale = "hr" | ||||||
|  | 	Czech        Locale = "cs" | ||||||
|  | 	Danish       Locale = "da" | ||||||
|  | 	Dutch        Locale = "nl" | ||||||
|  | 	Finnish      Locale = "fi" | ||||||
|  | 	French       Locale = "fr" | ||||||
|  | 	German       Locale = "de" | ||||||
|  | 	Greek        Locale = "el" | ||||||
|  | 	Hindi        Locale = "hi" | ||||||
|  | 	Hungarian    Locale = "hu" | ||||||
|  | 	Italian      Locale = "it" | ||||||
|  | 	Japanese     Locale = "ja" | ||||||
|  | 	Korean       Locale = "ko" | ||||||
|  | 	Lithuanian   Locale = "lt" | ||||||
|  | 	Norwegian    Locale = "no" | ||||||
|  | 	Polish       Locale = "pl" | ||||||
|  | 	PortugueseBR Locale = "pt-BR" | ||||||
|  | 	Romanian     Locale = "ro" | ||||||
|  | 	Russian      Locale = "ru" | ||||||
|  | 	SpanishES    Locale = "es-ES" | ||||||
|  | 	Swedish      Locale = "sv-SE" | ||||||
|  | 	Thai         Locale = "th" | ||||||
|  | 	Turkish      Locale = "tr" | ||||||
|  | 	Ukrainian    Locale = "uk" | ||||||
|  | 	Vietnamese   Locale = "vi" | ||||||
|  | 	Unknown      Locale = "" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // Locales is a map of all the languages codes to their names. | ||||||
|  | var Locales = map[Locale]string{ | ||||||
|  | 	EnglishUS:    "English (United States)", | ||||||
|  | 	EnglishGB:    "English (Great Britain)", | ||||||
|  | 	Bulgarian:    "Bulgarian", | ||||||
|  | 	ChineseCN:    "Chinese (China)", | ||||||
|  | 	ChineseTW:    "Chinese (Taiwan)", | ||||||
|  | 	Croatian:     "Croatian", | ||||||
|  | 	Czech:        "Czech", | ||||||
|  | 	Danish:       "Danish", | ||||||
|  | 	Dutch:        "Dutch", | ||||||
|  | 	Finnish:      "Finnish", | ||||||
|  | 	French:       "French", | ||||||
|  | 	German:       "German", | ||||||
|  | 	Greek:        "Greek", | ||||||
|  | 	Hindi:        "Hindi", | ||||||
|  | 	Hungarian:    "Hungarian", | ||||||
|  | 	Italian:      "Italian", | ||||||
|  | 	Japanese:     "Japanese", | ||||||
|  | 	Korean:       "Korean", | ||||||
|  | 	Lithuanian:   "Lithuanian", | ||||||
|  | 	Norwegian:    "Norwegian", | ||||||
|  | 	Polish:       "Polish", | ||||||
|  | 	PortugueseBR: "Portuguese (Brazil)", | ||||||
|  | 	Romanian:     "Romanian", | ||||||
|  | 	Russian:      "Russian", | ||||||
|  | 	SpanishES:    "Spanish (Spain)", | ||||||
|  | 	Swedish:      "Swedish", | ||||||
|  | 	Thai:         "Thai", | ||||||
|  | 	Turkish:      "Turkish", | ||||||
|  | 	Ukrainian:    "Ukrainian", | ||||||
|  | 	Vietnamese:   "Vietnamese", | ||||||
|  | 	Unknown:      "unknown", | ||||||
|  | } | ||||||
| @@ -10,9 +10,11 @@ | |||||||
| package discordgo | package discordgo | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
|  | 	"encoding/json" | ||||||
| 	"io" | 	"io" | ||||||
| 	"regexp" | 	"regexp" | ||||||
| 	"strings" | 	"strings" | ||||||
|  | 	"time" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // MessageType is the type of Message | // MessageType is the type of Message | ||||||
| @@ -21,23 +23,26 @@ type MessageType int | |||||||
| 
 | 
 | ||||||
| // Block contains the valid known MessageType values | // Block contains the valid known MessageType values | ||||||
| const ( | const ( | ||||||
| 	MessageTypeDefault MessageType = iota | 	MessageTypeDefault                               MessageType = 0 | ||||||
| 	MessageTypeRecipientAdd | 	MessageTypeRecipientAdd                          MessageType = 1 | ||||||
| 	MessageTypeRecipientRemove | 	MessageTypeRecipientRemove                       MessageType = 2 | ||||||
| 	MessageTypeCall | 	MessageTypeCall                                  MessageType = 3 | ||||||
| 	MessageTypeChannelNameChange | 	MessageTypeChannelNameChange                     MessageType = 4 | ||||||
| 	MessageTypeChannelIconChange | 	MessageTypeChannelIconChange                     MessageType = 5 | ||||||
| 	MessageTypeChannelPinnedMessage | 	MessageTypeChannelPinnedMessage                  MessageType = 6 | ||||||
| 	MessageTypeGuildMemberJoin | 	MessageTypeGuildMemberJoin                       MessageType = 7 | ||||||
| 	MessageTypeUserPremiumGuildSubscription | 	MessageTypeUserPremiumGuildSubscription          MessageType = 8 | ||||||
| 	MessageTypeUserPremiumGuildSubscriptionTierOne | 	MessageTypeUserPremiumGuildSubscriptionTierOne   MessageType = 9 | ||||||
| 	MessageTypeUserPremiumGuildSubscriptionTierTwo | 	MessageTypeUserPremiumGuildSubscriptionTierTwo   MessageType = 10 | ||||||
| 	MessageTypeUserPremiumGuildSubscriptionTierThree | 	MessageTypeUserPremiumGuildSubscriptionTierThree MessageType = 11 | ||||||
| 	MessageTypeChannelFollowAdd | 	MessageTypeChannelFollowAdd                      MessageType = 12 | ||||||
| 	MessageTypeGuildDiscoveryDisqualified = iota + 1 | 	MessageTypeGuildDiscoveryDisqualified            MessageType = 14 | ||||||
| 	MessageTypeGuildDiscoveryRequalified | 	MessageTypeGuildDiscoveryRequalified             MessageType = 15 | ||||||
| 	MessageTypeReply = iota + 4 | 	MessageTypeThreadCreated                         MessageType = 18 | ||||||
| 	MessageTypeApplicationCommand | 	MessageTypeReply                                 MessageType = 19 | ||||||
|  | 	MessageTypeChatInputCommand                      MessageType = 20 | ||||||
|  | 	MessageTypeThreadStarterMessage                  MessageType = 21 | ||||||
|  | 	MessageTypeContextMenuCommand                    MessageType = 23 | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // A Message stores all data related to a specific Discord message. | // A Message stores all data related to a specific Discord message. | ||||||
| @@ -58,11 +63,11 @@ type Message struct { | |||||||
| 	// CAUTION: this field may be removed in a | 	// CAUTION: this field may be removed in a | ||||||
| 	// future API version; it is safer to calculate | 	// future API version; it is safer to calculate | ||||||
| 	// the creation time via the ID. | 	// the creation time via the ID. | ||||||
| 	Timestamp Timestamp `json:"timestamp"` | 	Timestamp time.Time `json:"timestamp"` | ||||||
| 
 | 
 | ||||||
| 	// The time at which the last edit of the message | 	// The time at which the last edit of the message | ||||||
| 	// occurred, if it has been edited. | 	// occurred, if it has been edited. | ||||||
| 	EditedTimestamp Timestamp `json:"edited_timestamp"` | 	EditedTimestamp *time.Time `json:"edited_timestamp"` | ||||||
| 
 | 
 | ||||||
| 	// The roles mentioned in the message. | 	// The roles mentioned in the message. | ||||||
| 	MentionRoles []string `json:"mention_roles"` | 	MentionRoles []string `json:"mention_roles"` | ||||||
| @@ -80,8 +85,10 @@ type Message struct { | |||||||
| 	// A list of attachments present in the message. | 	// A list of attachments present in the message. | ||||||
| 	Attachments []*MessageAttachment `json:"attachments"` | 	Attachments []*MessageAttachment `json:"attachments"` | ||||||
| 
 | 
 | ||||||
| 	// A list of embeds present in the message. Multiple | 	// A list of components attached to the message. | ||||||
| 	// embeds can currently only be sent by webhooks. | 	Components []MessageComponent `json:"-"` | ||||||
|  | 
 | ||||||
|  | 	// A list of embeds present in the message. | ||||||
| 	Embeds []*MessageEmbed `json:"embeds"` | 	Embeds []*MessageEmbed `json:"embeds"` | ||||||
| 
 | 
 | ||||||
| 	// A list of users mentioned in the message. | 	// A list of users mentioned in the message. | ||||||
| @@ -116,13 +123,70 @@ type Message struct { | |||||||
| 	// Is sent with Rich Presence-related chat embeds | 	// Is sent with Rich Presence-related chat embeds | ||||||
| 	Application *MessageApplication `json:"application"` | 	Application *MessageApplication `json:"application"` | ||||||
| 
 | 
 | ||||||
| 	// MessageReference contains reference data sent with crossposted messages | 	// MessageReference contains reference data sent with crossposted or reply messages. | ||||||
|  | 	// This does not contain the reference *to* this message; this is for when *this* message references another. | ||||||
|  | 	// To generate a reference to this message, use (*Message).Reference(). | ||||||
| 	MessageReference *MessageReference `json:"message_reference"` | 	MessageReference *MessageReference `json:"message_reference"` | ||||||
| 
 | 
 | ||||||
|  | 	// The message associated with the message_reference | ||||||
|  | 	// NOTE: This field is only returned for messages with a type of 19 (REPLY) or 21 (THREAD_STARTER_MESSAGE). | ||||||
|  | 	// If the message is a reply but the referenced_message field is not present, | ||||||
|  | 	// the backend did not attempt to fetch the message that was being replied to, so its state is unknown. | ||||||
|  | 	// If the field exists but is null, the referenced message was deleted. | ||||||
|  | 	ReferencedMessage *Message `json:"referenced_message"` | ||||||
|  | 
 | ||||||
|  | 	// Is sent when the message is a response to an Interaction, without an existing message. | ||||||
|  | 	// This means responses to message component interactions do not include this property, | ||||||
|  | 	// instead including a MessageReference, as components exist on preexisting messages. | ||||||
|  | 	Interaction *MessageInteraction `json:"interaction"` | ||||||
|  | 
 | ||||||
| 	// The flags of the message, which describe extra features of a message. | 	// The flags of the message, which describe extra features of a message. | ||||||
| 	// This is a combination of bit masks; the presence of a certain permission can | 	// This is a combination of bit masks; the presence of a certain permission can | ||||||
| 	// be checked by performing a bitwise AND between this int and the flag. | 	// be checked by performing a bitwise AND between this int and the flag. | ||||||
| 	Flags MessageFlags `json:"flags"` | 	Flags MessageFlags `json:"flags"` | ||||||
|  | 
 | ||||||
|  | 	// The thread that was started from this message, includes thread member object | ||||||
|  | 	Thread *Channel `json:"thread,omitempty"` | ||||||
|  | 
 | ||||||
|  | 	// An array of Sticker objects, if any were sent. | ||||||
|  | 	StickerItems []*Sticker `json:"sticker_items"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // UnmarshalJSON is a helper function to unmarshal the Message. | ||||||
|  | func (m *Message) UnmarshalJSON(data []byte) error { | ||||||
|  | 	type message Message | ||||||
|  | 	var v struct { | ||||||
|  | 		message | ||||||
|  | 		RawComponents []unmarshalableMessageComponent `json:"components"` | ||||||
|  | 	} | ||||||
|  | 	err := json.Unmarshal(data, &v) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	*m = Message(v.message) | ||||||
|  | 	m.Components = make([]MessageComponent, len(v.RawComponents)) | ||||||
|  | 	for i, v := range v.RawComponents { | ||||||
|  | 		m.Components[i] = v.MessageComponent | ||||||
|  | 	} | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GetCustomEmojis pulls out all the custom (Non-unicode) emojis from a message and returns a Slice of the Emoji struct. | ||||||
|  | func (m *Message) GetCustomEmojis() []*Emoji { | ||||||
|  | 	var toReturn []*Emoji | ||||||
|  | 	emojis := EmojiRegex.FindAllString(m.Content, -1) | ||||||
|  | 	if len(emojis) < 1 { | ||||||
|  | 		return toReturn | ||||||
|  | 	} | ||||||
|  | 	for _, em := range emojis { | ||||||
|  | 		parts := strings.Split(em, ":") | ||||||
|  | 		toReturn = append(toReturn, &Emoji{ | ||||||
|  | 			ID:       parts[2][:len(parts[2])-1], | ||||||
|  | 			Name:     parts[1], | ||||||
|  | 			Animated: strings.HasPrefix(em, "<a:"), | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | 	return toReturn | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // MessageFlags is the flags of "message" (see MessageFlags* consts) | // MessageFlags is the flags of "message" (see MessageFlags* consts) | ||||||
| @@ -131,11 +195,24 @@ type MessageFlags int | |||||||
| 
 | 
 | ||||||
| // Valid MessageFlags values | // Valid MessageFlags values | ||||||
| const ( | const ( | ||||||
| 	MessageFlagsCrossPosted MessageFlags = 1 << iota | 	// MessageFlagsCrossPosted This message has been published to subscribed channels (via Channel Following). | ||||||
| 	MessageFlagsIsCrossPosted | 	MessageFlagsCrossPosted MessageFlags = 1 << 0 | ||||||
| 	MessageFlagsSupressEmbeds | 	// MessageFlagsIsCrossPosted this message originated from a message in another channel (via Channel Following). | ||||||
| 	MessageFlagsSourceMessageDeleted | 	MessageFlagsIsCrossPosted MessageFlags = 1 << 1 | ||||||
| 	MessageFlagsUrgent | 	// MessageFlagsSupressEmbeds do not include any embeds when serializing this message. | ||||||
|  | 	MessageFlagsSupressEmbeds MessageFlags = 1 << 2 | ||||||
|  | 	// MessageFlagsSourceMessageDeleted the source message for this crosspost has been deleted (via Channel Following). | ||||||
|  | 	MessageFlagsSourceMessageDeleted MessageFlags = 1 << 3 | ||||||
|  | 	// MessageFlagsUrgent this message came from the urgent message system. | ||||||
|  | 	MessageFlagsUrgent MessageFlags = 1 << 4 | ||||||
|  | 	// MessageFlagsHasThread this message has an associated thread, with the same id as the message. | ||||||
|  | 	MessageFlagsHasThread MessageFlags = 1 << 5 | ||||||
|  | 	// MessageFlagsEphemeral this message is only visible to the user who invoked the Interaction. | ||||||
|  | 	MessageFlagsEphemeral MessageFlags = 1 << 6 | ||||||
|  | 	// MessageFlagsLoading this message is an Interaction Response and the bot is "thinking". | ||||||
|  | 	MessageFlagsLoading MessageFlags = 1 << 7 | ||||||
|  | 	// MessageFlagsFailedToMentionSomeRolesInThread this message failed to mention some roles and add their members to the thread. | ||||||
|  | 	MessageFlagsFailedToMentionSomeRolesInThread MessageFlags = 1 << 8 | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // File stores info about files you e.g. send in messages. | // File stores info about files you e.g. send in messages. | ||||||
| @@ -148,25 +225,33 @@ type File struct { | |||||||
| // MessageSend stores all parameters you can send with ChannelMessageSendComplex. | // MessageSend stores all parameters you can send with ChannelMessageSendComplex. | ||||||
| type MessageSend struct { | type MessageSend struct { | ||||||
| 	Content         string                  `json:"content,omitempty"` | 	Content         string                  `json:"content,omitempty"` | ||||||
| 	Embed           *MessageEmbed           `json:"embed,omitempty"` | 	Embeds          []*MessageEmbed         `json:"embeds,omitempty"` | ||||||
| 	TTS             bool                    `json:"tts"` | 	TTS             bool                    `json:"tts"` | ||||||
|  | 	Components      []MessageComponent      `json:"components"` | ||||||
| 	Files           []*File                 `json:"-"` | 	Files           []*File                 `json:"-"` | ||||||
| 	AllowedMentions *MessageAllowedMentions `json:"allowed_mentions,omitempty"` | 	AllowedMentions *MessageAllowedMentions `json:"allowed_mentions,omitempty"` | ||||||
| 	Reference       *MessageReference       `json:"message_reference,omitempty"` | 	Reference       *MessageReference       `json:"message_reference,omitempty"` | ||||||
| 
 | 
 | ||||||
| 	// TODO: Remove this when compatibility is not required. | 	// TODO: Remove this when compatibility is not required. | ||||||
| 	File *File `json:"-"` | 	File *File `json:"-"` | ||||||
|  | 
 | ||||||
|  | 	// TODO: Remove this when compatibility is not required. | ||||||
|  | 	Embed *MessageEmbed `json:"-"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // MessageEdit is used to chain parameters via ChannelMessageEditComplex, which | // MessageEdit is used to chain parameters via ChannelMessageEditComplex, which | ||||||
| // is also where you should get the instance from. | // is also where you should get the instance from. | ||||||
| type MessageEdit struct { | type MessageEdit struct { | ||||||
| 	Content         *string                 `json:"content,omitempty"` | 	Content         *string                 `json:"content,omitempty"` | ||||||
| 	Embed           *MessageEmbed           `json:"embed,omitempty"` | 	Components      []MessageComponent      `json:"components"` | ||||||
|  | 	Embeds          []*MessageEmbed         `json:"embeds,omitempty"` | ||||||
| 	AllowedMentions *MessageAllowedMentions `json:"allowed_mentions,omitempty"` | 	AllowedMentions *MessageAllowedMentions `json:"allowed_mentions,omitempty"` | ||||||
| 
 | 
 | ||||||
| 	ID      string | 	ID      string | ||||||
| 	Channel string | 	Channel string | ||||||
|  | 
 | ||||||
|  | 	// TODO: Remove this when compatibility is not required. | ||||||
|  | 	Embed *MessageEmbed `json:"-"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // NewMessageEdit returns a MessageEdit struct, initialized | // NewMessageEdit returns a MessageEdit struct, initialized | ||||||
| @@ -188,7 +273,14 @@ func (m *MessageEdit) SetContent(str string) *MessageEdit { | |||||||
| // SetEmbed is a convenience function for setting the embed, | // SetEmbed is a convenience function for setting the embed, | ||||||
| // so you can chain commands. | // so you can chain commands. | ||||||
| func (m *MessageEdit) SetEmbed(embed *MessageEmbed) *MessageEdit { | func (m *MessageEdit) SetEmbed(embed *MessageEmbed) *MessageEdit { | ||||||
| 	m.Embed = embed | 	m.Embeds = []*MessageEmbed{embed} | ||||||
|  | 	return m | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // SetEmbeds is a convenience function for setting the embeds, | ||||||
|  | // so you can chain commands. | ||||||
|  | func (m *MessageEdit) SetEmbeds(embeds []*MessageEmbed) *MessageEdit { | ||||||
|  | 	m.Embeds = embeds | ||||||
| 	return m | 	return m | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @@ -230,13 +322,15 @@ type MessageAllowedMentions struct { | |||||||
| 
 | 
 | ||||||
| // A MessageAttachment stores data for message attachments. | // A MessageAttachment stores data for message attachments. | ||||||
| type MessageAttachment struct { | type MessageAttachment struct { | ||||||
| 	ID       string `json:"id"` | 	ID          string `json:"id"` | ||||||
| 	URL      string `json:"url"` | 	URL         string `json:"url"` | ||||||
| 	ProxyURL string `json:"proxy_url"` | 	ProxyURL    string `json:"proxy_url"` | ||||||
| 	Filename string `json:"filename"` | 	Filename    string `json:"filename"` | ||||||
| 	Width    int    `json:"width"` | 	ContentType string `json:"content_type"` | ||||||
| 	Height   int    `json:"height"` | 	Width       int    `json:"width"` | ||||||
| 	Size     int    `json:"size"` | 	Height      int    `json:"height"` | ||||||
|  | 	Size        int    `json:"size"` | ||||||
|  | 	Ephemeral   bool   `json:"ephemeral"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // MessageEmbedFooter is a part of a MessageEmbed struct. | // MessageEmbedFooter is a part of a MessageEmbed struct. | ||||||
| @@ -339,23 +433,10 @@ type MessageActivityType int | |||||||
| 
 | 
 | ||||||
| // Constants for the different types of Message Activity | // Constants for the different types of Message Activity | ||||||
| const ( | const ( | ||||||
| 	MessageActivityTypeJoin MessageActivityType = iota + 1 | 	MessageActivityTypeJoin        MessageActivityType = 1 | ||||||
| 	MessageActivityTypeSpectate | 	MessageActivityTypeSpectate    MessageActivityType = 2 | ||||||
| 	MessageActivityTypeListen | 	MessageActivityTypeListen      MessageActivityType = 3 | ||||||
| 	MessageActivityTypeJoinRequest | 	MessageActivityTypeJoinRequest MessageActivityType = 5 | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // MessageFlag describes an extra feature of the message |  | ||||||
| type MessageFlag int |  | ||||||
| 
 |  | ||||||
| // Constants for the different bit offsets of Message Flags |  | ||||||
| const ( |  | ||||||
| 	// This message has been published to subscribed channels (via Channel Following) |  | ||||||
| 	MessageFlagCrossposted MessageFlag = 1 << iota |  | ||||||
| 	// This message originated from a message in another channel (via Channel Following) |  | ||||||
| 	MessageFlagIsCrosspost |  | ||||||
| 	// Do not include any embeds when serializing this message |  | ||||||
| 	MessageFlagSuppressEmbeds |  | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // MessageApplication is sent with Rich Presence-related chat embeds | // MessageApplication is sent with Rich Presence-related chat embeds | ||||||
| @@ -447,3 +528,14 @@ func (m *Message) ContentWithMoreMentionsReplaced(s *Session) (content string, e | |||||||
| 	}) | 	}) | ||||||
| 	return | 	return | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | // MessageInteraction contains information about the application command interaction which generated the message. | ||||||
|  | type MessageInteraction struct { | ||||||
|  | 	ID   string          `json:"id"` | ||||||
|  | 	Type InteractionType `json:"type"` | ||||||
|  | 	Name string          `json:"name"` | ||||||
|  | 	User *User           `json:"user"` | ||||||
|  | 
 | ||||||
|  | 	// Member is only present when the interaction is from a guild. | ||||||
|  | 	Member *Member `json:"member"` | ||||||
|  | } | ||||||
| @@ -18,8 +18,8 @@ type MembershipState int | |||||||
| 
 | 
 | ||||||
| // Constants for the different stages of the MembershipState | // Constants for the different stages of the MembershipState | ||||||
| const ( | const ( | ||||||
| 	MembershipStateInvited MembershipState = iota + 1 | 	MembershipStateInvited  MembershipState = 1 | ||||||
| 	MembershipStateAccepted | 	MembershipStateAccepted MembershipState = 2 | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // A TeamMember struct stores values for a single Team Member, extending the normal User data - note that the user field is partial | // A TeamMember struct stores values for a single Team Member, extending the normal User data - note that the user field is partial | ||||||
| @@ -40,28 +40,11 @@ type Team struct { | |||||||
| 	Members     []*TeamMember `json:"members"` | 	Members     []*TeamMember `json:"members"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // An Application struct stores values for a Discord OAuth2 Application |  | ||||||
| type Application struct { |  | ||||||
| 	ID                  string    `json:"id,omitempty"` |  | ||||||
| 	Name                string    `json:"name"` |  | ||||||
| 	Description         string    `json:"description,omitempty"` |  | ||||||
| 	Icon                string    `json:"icon,omitempty"` |  | ||||||
| 	Secret              string    `json:"secret,omitempty"` |  | ||||||
| 	RedirectURIs        *[]string `json:"redirect_uris,omitempty"` |  | ||||||
| 	BotRequireCodeGrant bool      `json:"bot_require_code_grant,omitempty"` |  | ||||||
| 	BotPublic           bool      `json:"bot_public,omitempty"` |  | ||||||
| 	RPCApplicationState int       `json:"rpc_application_state,omitempty"` |  | ||||||
| 	Flags               int       `json:"flags,omitempty"` |  | ||||||
| 	Owner               *User     `json:"owner"` |  | ||||||
| 	Bot                 *User     `json:"bot"` |  | ||||||
| 	Team                *Team     `json:"team"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Application returns an Application structure of a specific Application | // Application returns an Application structure of a specific Application | ||||||
| //   appID : The ID of an Application | //   appID : The ID of an Application | ||||||
| func (s *Session) Application(appID string) (st *Application, err error) { | func (s *Session) Application(appID string) (st *Application, err error) { | ||||||
| 
 | 
 | ||||||
| 	body, err := s.RequestWithBucketID("GET", EndpointApplication(appID), nil, EndpointApplication("")) | 	body, err := s.RequestWithBucketID("GET", EndpointOAuth2Application(appID), nil, EndpointOAuth2Application("")) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| @@ -73,7 +56,7 @@ func (s *Session) Application(appID string) (st *Application, err error) { | |||||||
| // Applications returns all applications for the authenticated user | // Applications returns all applications for the authenticated user | ||||||
| func (s *Session) Applications() (st []*Application, err error) { | func (s *Session) Applications() (st []*Application, err error) { | ||||||
| 
 | 
 | ||||||
| 	body, err := s.RequestWithBucketID("GET", EndpointApplications, nil, EndpointApplications) | 	body, err := s.RequestWithBucketID("GET", EndpointOAuth2Applications, nil, EndpointOAuth2Applications) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| @@ -88,12 +71,11 @@ func (s *Session) Applications() (st []*Application, err error) { | |||||||
| func (s *Session) ApplicationCreate(ap *Application) (st *Application, err error) { | func (s *Session) ApplicationCreate(ap *Application) (st *Application, err error) { | ||||||
| 
 | 
 | ||||||
| 	data := struct { | 	data := struct { | ||||||
| 		Name         string    `json:"name"` | 		Name        string `json:"name"` | ||||||
| 		Description  string    `json:"description"` | 		Description string `json:"description"` | ||||||
| 		RedirectURIs *[]string `json:"redirect_uris,omitempty"` | 	}{ap.Name, ap.Description} | ||||||
| 	}{ap.Name, ap.Description, ap.RedirectURIs} |  | ||||||
| 
 | 
 | ||||||
| 	body, err := s.RequestWithBucketID("POST", EndpointApplications, data, EndpointApplications) | 	body, err := s.RequestWithBucketID("POST", EndpointOAuth2Applications, data, EndpointOAuth2Applications) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| @@ -107,12 +89,11 @@ func (s *Session) ApplicationCreate(ap *Application) (st *Application, err error | |||||||
| func (s *Session) ApplicationUpdate(appID string, ap *Application) (st *Application, err error) { | func (s *Session) ApplicationUpdate(appID string, ap *Application) (st *Application, err error) { | ||||||
| 
 | 
 | ||||||
| 	data := struct { | 	data := struct { | ||||||
| 		Name         string    `json:"name"` | 		Name        string `json:"name"` | ||||||
| 		Description  string    `json:"description"` | 		Description string `json:"description"` | ||||||
| 		RedirectURIs *[]string `json:"redirect_uris,omitempty"` | 	}{ap.Name, ap.Description} | ||||||
| 	}{ap.Name, ap.Description, ap.RedirectURIs} |  | ||||||
| 
 | 
 | ||||||
| 	body, err := s.RequestWithBucketID("PUT", EndpointApplication(appID), data, EndpointApplication("")) | 	body, err := s.RequestWithBucketID("PUT", EndpointOAuth2Application(appID), data, EndpointOAuth2Application("")) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| @@ -125,7 +106,7 @@ func (s *Session) ApplicationUpdate(appID string, ap *Application) (st *Applicat | |||||||
| //   appID : The ID of an Application | //   appID : The ID of an Application | ||||||
| func (s *Session) ApplicationDelete(appID string) (err error) { | func (s *Session) ApplicationDelete(appID string) (err error) { | ||||||
| 
 | 
 | ||||||
| 	_, err = s.RequestWithBucketID("DELETE", EndpointApplication(appID), nil, EndpointApplication("")) | 	_, err = s.RequestWithBucketID("DELETE", EndpointOAuth2Application(appID), nil, EndpointOAuth2Application("")) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| @@ -143,7 +124,7 @@ type Asset struct { | |||||||
| // ApplicationAssets returns an application's assets | // ApplicationAssets returns an application's assets | ||||||
| func (s *Session) ApplicationAssets(appID string) (ass []*Asset, err error) { | func (s *Session) ApplicationAssets(appID string) (ass []*Asset, err error) { | ||||||
| 
 | 
 | ||||||
| 	body, err := s.RequestWithBucketID("GET", EndpointApplicationAssets(appID), nil, EndpointApplicationAssets("")) | 	body, err := s.RequestWithBucketID("GET", EndpointOAuth2ApplicationAssets(appID), nil, EndpointOAuth2ApplicationAssets("")) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| @@ -163,7 +144,7 @@ func (s *Session) ApplicationAssets(appID string) (ass []*Asset, err error) { | |||||||
| // NOTE: func name may change, if I can think up something better. | // NOTE: func name may change, if I can think up something better. | ||||||
| func (s *Session) ApplicationBotCreate(appID string) (st *User, err error) { | func (s *Session) ApplicationBotCreate(appID string) (st *User, err error) { | ||||||
| 
 | 
 | ||||||
| 	body, err := s.RequestWithBucketID("POST", EndpointApplicationsBot(appID), nil, EndpointApplicationsBot("")) | 	body, err := s.RequestWithBucketID("POST", EndpointOAuth2ApplicationsBot(appID), nil, EndpointOAuth2ApplicationsBot("")) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| @@ -33,7 +33,7 @@ func NewRatelimiter() *RateLimiter { | |||||||
| 		buckets: make(map[string]*Bucket), | 		buckets: make(map[string]*Bucket), | ||||||
| 		global:  new(int64), | 		global:  new(int64), | ||||||
| 		customRateLimits: []*customRateLimit{ | 		customRateLimits: []*customRateLimit{ | ||||||
| 			&customRateLimit{ | 			{ | ||||||
| 				suffix:   "//reactions//", | 				suffix:   "//reactions//", | ||||||
| 				requests: 1, | 				requests: 1, | ||||||
| 				reset:    200 * time.Millisecond, | 				reset:    200 * time.Millisecond, | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -38,13 +38,15 @@ type State struct { | |||||||
| 	Ready | 	Ready | ||||||
| 
 | 
 | ||||||
| 	// MaxMessageCount represents how many messages per channel the state will store. | 	// MaxMessageCount represents how many messages per channel the state will store. | ||||||
| 	MaxMessageCount int | 	MaxMessageCount    int | ||||||
| 	TrackChannels   bool | 	TrackChannels      bool | ||||||
| 	TrackEmojis     bool | 	TrackThreads       bool | ||||||
| 	TrackMembers    bool | 	TrackEmojis        bool | ||||||
| 	TrackRoles      bool | 	TrackMembers       bool | ||||||
| 	TrackVoice      bool | 	TrackThreadMembers bool | ||||||
| 	TrackPresences  bool | 	TrackRoles         bool | ||||||
|  | 	TrackVoice         bool | ||||||
|  | 	TrackPresences     bool | ||||||
| 
 | 
 | ||||||
| 	guildMap   map[string]*Guild | 	guildMap   map[string]*Guild | ||||||
| 	channelMap map[string]*Channel | 	channelMap map[string]*Channel | ||||||
| @@ -58,15 +60,17 @@ func NewState() *State { | |||||||
| 			PrivateChannels: []*Channel{}, | 			PrivateChannels: []*Channel{}, | ||||||
| 			Guilds:          []*Guild{}, | 			Guilds:          []*Guild{}, | ||||||
| 		}, | 		}, | ||||||
| 		TrackChannels:  true, | 		TrackChannels:      true, | ||||||
| 		TrackEmojis:    true, | 		TrackThreads:       true, | ||||||
| 		TrackMembers:   true, | 		TrackEmojis:        true, | ||||||
| 		TrackRoles:     true, | 		TrackMembers:       true, | ||||||
| 		TrackVoice:     true, | 		TrackThreadMembers: true, | ||||||
| 		TrackPresences: true, | 		TrackRoles:         true, | ||||||
| 		guildMap:       make(map[string]*Guild), | 		TrackVoice:         true, | ||||||
| 		channelMap:     make(map[string]*Channel), | 		TrackPresences:     true, | ||||||
| 		memberMap:      make(map[string]map[string]*Member), | 		guildMap:           make(map[string]*Guild), | ||||||
|  | 		channelMap:         make(map[string]*Channel), | ||||||
|  | 		memberMap:          make(map[string]map[string]*Member), | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @@ -93,6 +97,11 @@ func (s *State) GuildAdd(guild *Guild) error { | |||||||
| 		s.channelMap[c.ID] = c | 		s.channelMap[c.ID] = c | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// Add all the threads to the state in case of thread sync list. | ||||||
|  | 	for _, t := range guild.Threads { | ||||||
|  | 		s.channelMap[t.ID] = t | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	// If this guild contains a new member slice, we must regenerate the member map so the pointers stay valid | 	// If this guild contains a new member slice, we must regenerate the member map so the pointers stay valid | ||||||
| 	if guild.Members != nil { | 	if guild.Members != nil { | ||||||
| 		s.createMemberMap(guild) | 		s.createMemberMap(guild) | ||||||
| @@ -122,6 +131,9 @@ func (s *State) GuildAdd(guild *Guild) error { | |||||||
| 		if guild.Channels == nil { | 		if guild.Channels == nil { | ||||||
| 			guild.Channels = g.Channels | 			guild.Channels = g.Channels | ||||||
| 		} | 		} | ||||||
|  | 		if guild.Threads == nil { | ||||||
|  | 			guild.Threads = g.Threads | ||||||
|  | 		} | ||||||
| 		if guild.VoiceStates == nil { | 		if guild.VoiceStates == nil { | ||||||
| 			guild.VoiceStates = g.VoiceStates | 			guild.VoiceStates = g.VoiceStates | ||||||
| 		} | 		} | ||||||
| @@ -180,21 +192,12 @@ func (s *State) Guild(guildID string) (*Guild, error) { | |||||||
| 	return nil, ErrStateNotFound | 	return nil, ErrStateNotFound | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // PresenceAdd adds a presence to the current world state, or | func (s *State) presenceAdd(guildID string, presence *Presence) error { | ||||||
| // updates it if it already exists. | 	guild, ok := s.guildMap[guildID] | ||||||
| func (s *State) PresenceAdd(guildID string, presence *Presence) error { | 	if !ok { | ||||||
| 	if s == nil { | 		return ErrStateNotFound | ||||||
| 		return ErrNilState |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	guild, err := s.Guild(guildID) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	s.Lock() |  | ||||||
| 	defer s.Unlock() |  | ||||||
| 
 |  | ||||||
| 	for i, p := range guild.Presences { | 	for i, p := range guild.Presences { | ||||||
| 		if p.User.ID == presence.User.ID { | 		if p.User.ID == presence.User.ID { | ||||||
| 			//guild.Presences[i] = presence | 			//guild.Presences[i] = presence | ||||||
| @@ -233,6 +236,19 @@ func (s *State) PresenceAdd(guildID string, presence *Presence) error { | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // PresenceAdd adds a presence to the current world state, or | ||||||
|  | // updates it if it already exists. | ||||||
|  | func (s *State) PresenceAdd(guildID string, presence *Presence) error { | ||||||
|  | 	if s == nil { | ||||||
|  | 		return ErrNilState | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	s.Lock() | ||||||
|  | 	defer s.Unlock() | ||||||
|  | 
 | ||||||
|  | 	return s.presenceAdd(guildID, presence) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // PresenceRemove removes a presence from the current world state. | // PresenceRemove removes a presence from the current world state. | ||||||
| func (s *State) PresenceRemove(guildID string, presence *Presence) error { | func (s *State) PresenceRemove(guildID string, presence *Presence) error { | ||||||
| 	if s == nil { | 	if s == nil { | ||||||
| @@ -279,21 +295,12 @@ func (s *State) Presence(guildID, userID string) (*Presence, error) { | |||||||
| 
 | 
 | ||||||
| // TODO: Consider moving Guild state update methods onto *Guild. | // TODO: Consider moving Guild state update methods onto *Guild. | ||||||
| 
 | 
 | ||||||
| // MemberAdd adds a member to the current world state, or | func (s *State) memberAdd(member *Member) error { | ||||||
| // updates it if it already exists. | 	guild, ok := s.guildMap[member.GuildID] | ||||||
| func (s *State) MemberAdd(member *Member) error { | 	if !ok { | ||||||
| 	if s == nil { | 		return ErrStateNotFound | ||||||
| 		return ErrNilState |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	guild, err := s.Guild(member.GuildID) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	s.Lock() |  | ||||||
| 	defer s.Unlock() |  | ||||||
| 
 |  | ||||||
| 	members, ok := s.memberMap[member.GuildID] | 	members, ok := s.memberMap[member.GuildID] | ||||||
| 	if !ok { | 	if !ok { | ||||||
| 		return ErrStateNotFound | 		return ErrStateNotFound | ||||||
| @@ -306,15 +313,27 @@ func (s *State) MemberAdd(member *Member) error { | |||||||
| 	} else { | 	} else { | ||||||
| 		// We are about to replace `m` in the state with `member`, but first we need to | 		// We are about to replace `m` in the state with `member`, but first we need to | ||||||
| 		// make sure we preserve any fields that the `member` doesn't contain from `m`. | 		// make sure we preserve any fields that the `member` doesn't contain from `m`. | ||||||
| 		if member.JoinedAt == "" { | 		if member.JoinedAt.IsZero() { | ||||||
| 			member.JoinedAt = m.JoinedAt | 			member.JoinedAt = m.JoinedAt | ||||||
| 		} | 		} | ||||||
| 		*m = *member | 		*m = *member | ||||||
| 	} | 	} | ||||||
| 
 |  | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // MemberAdd adds a member to the current world state, or | ||||||
|  | // updates it if it already exists. | ||||||
|  | func (s *State) MemberAdd(member *Member) error { | ||||||
|  | 	if s == nil { | ||||||
|  | 		return ErrNilState | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	s.Lock() | ||||||
|  | 	defer s.Unlock() | ||||||
|  | 
 | ||||||
|  | 	return s.memberAdd(member) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // MemberRemove removes a member from current world state. | // MemberRemove removes a member from current world state. | ||||||
| func (s *State) MemberRemove(member *Member) error { | func (s *State) MemberRemove(member *Member) error { | ||||||
| 	if s == nil { | 	if s == nil { | ||||||
| @@ -465,6 +484,9 @@ func (s *State) ChannelAdd(channel *Channel) error { | |||||||
| 		if channel.PermissionOverwrites == nil { | 		if channel.PermissionOverwrites == nil { | ||||||
| 			channel.PermissionOverwrites = c.PermissionOverwrites | 			channel.PermissionOverwrites = c.PermissionOverwrites | ||||||
| 		} | 		} | ||||||
|  | 		if channel.ThreadMetadata == nil { | ||||||
|  | 			channel.ThreadMetadata = c.ThreadMetadata | ||||||
|  | 		} | ||||||
| 
 | 
 | ||||||
| 		*c = *channel | 		*c = *channel | ||||||
| 		return nil | 		return nil | ||||||
| @@ -472,12 +494,18 @@ func (s *State) ChannelAdd(channel *Channel) error { | |||||||
| 
 | 
 | ||||||
| 	if channel.Type == ChannelTypeDM || channel.Type == ChannelTypeGroupDM { | 	if channel.Type == ChannelTypeDM || channel.Type == ChannelTypeGroupDM { | ||||||
| 		s.PrivateChannels = append(s.PrivateChannels, channel) | 		s.PrivateChannels = append(s.PrivateChannels, channel) | ||||||
| 	} else { | 		s.channelMap[channel.ID] = channel | ||||||
| 		guild, ok := s.guildMap[channel.GuildID] | 		return nil | ||||||
| 		if !ok { | 	} | ||||||
| 			return ErrStateNotFound |  | ||||||
| 		} |  | ||||||
| 
 | 
 | ||||||
|  | 	guild, ok := s.guildMap[channel.GuildID] | ||||||
|  | 	if !ok { | ||||||
|  | 		return ErrStateNotFound | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if channel.IsThread() { | ||||||
|  | 		guild.Threads = append(guild.Threads, channel) | ||||||
|  | 	} else { | ||||||
| 		guild.Channels = append(guild.Channels, channel) | 		guild.Channels = append(guild.Channels, channel) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| @@ -507,15 +535,26 @@ func (s *State) ChannelRemove(channel *Channel) error { | |||||||
| 				break | 				break | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} else { | 		delete(s.channelMap, channel.ID) | ||||||
| 		guild, err := s.Guild(channel.GuildID) | 		return nil | ||||||
| 		if err != nil { | 	} | ||||||
| 			return err | 
 | ||||||
|  | 	guild, err := s.Guild(channel.GuildID) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	s.Lock() | ||||||
|  | 	defer s.Unlock() | ||||||
|  | 
 | ||||||
|  | 	if channel.IsThread() { | ||||||
|  | 		for i, t := range guild.Threads { | ||||||
|  | 			if t.ID == channel.ID { | ||||||
|  | 				guild.Threads = append(guild.Threads[:i], guild.Threads[i+1:]...) | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
| 		} | 		} | ||||||
| 
 | 	} else { | ||||||
| 		s.Lock() |  | ||||||
| 		defer s.Unlock() |  | ||||||
| 
 |  | ||||||
| 		for i, c := range guild.Channels { | 		for i, c := range guild.Channels { | ||||||
| 			if c.ID == channel.ID { | 			if c.ID == channel.ID { | ||||||
| 				guild.Channels = append(guild.Channels[:i], guild.Channels[i+1:]...) | 				guild.Channels = append(guild.Channels[:i], guild.Channels[i+1:]...) | ||||||
| @@ -529,6 +568,99 @@ func (s *State) ChannelRemove(channel *Channel) error { | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // ThreadListSync syncs guild threads with provided ones. | ||||||
|  | func (s *State) ThreadListSync(tls *ThreadListSync) error { | ||||||
|  | 	guild, err := s.Guild(tls.GuildID) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	s.Lock() | ||||||
|  | 	defer s.Unlock() | ||||||
|  | 
 | ||||||
|  | 	// This algorithm filters out archived or | ||||||
|  | 	// threads which are children of channels in channelIDs | ||||||
|  | 	// and then it adds all synced threads to guild threads and cache | ||||||
|  | 	index := 0 | ||||||
|  | outer: | ||||||
|  | 	for _, t := range guild.Threads { | ||||||
|  | 		if !t.ThreadMetadata.Archived && tls.ChannelIDs != nil { | ||||||
|  | 			for _, v := range tls.ChannelIDs { | ||||||
|  | 				if t.ParentID == v { | ||||||
|  | 					delete(s.channelMap, t.ID) | ||||||
|  | 					continue outer | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			guild.Threads[index] = t | ||||||
|  | 			index++ | ||||||
|  | 		} else { | ||||||
|  | 			delete(s.channelMap, t.ID) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	guild.Threads = guild.Threads[:index] | ||||||
|  | 	for _, t := range tls.Threads { | ||||||
|  | 		s.channelMap[t.ID] = t | ||||||
|  | 		guild.Threads = append(guild.Threads, t) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for _, m := range tls.Members { | ||||||
|  | 		if c, ok := s.channelMap[m.ID]; ok { | ||||||
|  | 			c.Member = m | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ThreadMembersUpdate updates thread members list | ||||||
|  | func (s *State) ThreadMembersUpdate(tmu *ThreadMembersUpdate) error { | ||||||
|  | 	thread, err := s.Channel(tmu.ID) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	s.Lock() | ||||||
|  | 	defer s.Unlock() | ||||||
|  | 
 | ||||||
|  | 	for idx, member := range thread.Members { | ||||||
|  | 		for _, removedMember := range tmu.RemovedMembers { | ||||||
|  | 			if member.ID == removedMember { | ||||||
|  | 				thread.Members = append(thread.Members[:idx], thread.Members[idx+1:]...) | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for _, addedMember := range tmu.AddedMembers { | ||||||
|  | 		thread.Members = append(thread.Members, addedMember.ThreadMember) | ||||||
|  | 		if addedMember.Member != nil { | ||||||
|  | 			err = s.memberAdd(addedMember.Member) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		if addedMember.Presence != nil { | ||||||
|  | 			err = s.presenceAdd(tmu.GuildID, addedMember.Presence) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	thread.MemberCount = tmu.MemberCount | ||||||
|  | 
 | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ThreadMemberUpdate sets or updates member data for the current user. | ||||||
|  | func (s *State) ThreadMemberUpdate(mu *ThreadMemberUpdate) error { | ||||||
|  | 	thread, err := s.Channel(mu.ID) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	thread.Member = mu.ThreadMember | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // GuildChannel gets a channel by ID from a guild. | // GuildChannel gets a channel by ID from a guild. | ||||||
| // This method is Deprecated, use Channel(channelID) | // This method is Deprecated, use Channel(channelID) | ||||||
| func (s *State) GuildChannel(guildID, channelID string) (*Channel, error) { | func (s *State) GuildChannel(guildID, channelID string) (*Channel, error) { | ||||||
| @@ -637,7 +769,7 @@ func (s *State) MessageAdd(message *Message) error { | |||||||
| 			if message.Content != "" { | 			if message.Content != "" { | ||||||
| 				m.Content = message.Content | 				m.Content = message.Content | ||||||
| 			} | 			} | ||||||
| 			if message.EditedTimestamp != "" { | 			if message.EditedTimestamp != nil { | ||||||
| 				m.EditedTimestamp = message.EditedTimestamp | 				m.EditedTimestamp = message.EditedTimestamp | ||||||
| 			} | 			} | ||||||
| 			if message.Mentions != nil { | 			if message.Mentions != nil { | ||||||
| @@ -649,12 +781,15 @@ func (s *State) MessageAdd(message *Message) error { | |||||||
| 			if message.Attachments != nil { | 			if message.Attachments != nil { | ||||||
| 				m.Attachments = message.Attachments | 				m.Attachments = message.Attachments | ||||||
| 			} | 			} | ||||||
| 			if message.Timestamp != "" { | 			if !message.Timestamp.IsZero() { | ||||||
| 				m.Timestamp = message.Timestamp | 				m.Timestamp = message.Timestamp | ||||||
| 			} | 			} | ||||||
| 			if message.Author != nil { | 			if message.Author != nil { | ||||||
| 				m.Author = message.Author | 				m.Author = message.Author | ||||||
| 			} | 			} | ||||||
|  | 			if message.Components != nil { | ||||||
|  | 				m.Components = message.Components | ||||||
|  | 			} | ||||||
| 
 | 
 | ||||||
| 			return nil | 			return nil | ||||||
| 		} | 		} | ||||||
| @@ -665,6 +800,7 @@ func (s *State) MessageAdd(message *Message) error { | |||||||
| 	if len(c.Messages) > s.MaxMessageCount { | 	if len(c.Messages) > s.MaxMessageCount { | ||||||
| 		c.Messages = c.Messages[len(c.Messages)-s.MaxMessageCount:] | 		c.Messages = c.Messages[len(c.Messages)-s.MaxMessageCount:] | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @@ -690,6 +826,7 @@ func (s *State) messageRemoveByID(channelID, messageID string) error { | |||||||
| 	for i, m := range c.Messages { | 	for i, m := range c.Messages { | ||||||
| 		if m.ID == messageID { | 		if m.ID == messageID { | ||||||
| 			c.Messages = append(c.Messages[:i], c.Messages[i+1:]...) | 			c.Messages = append(c.Messages[:i], c.Messages[i+1:]...) | ||||||
|  | 
 | ||||||
| 			return nil | 			return nil | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| @@ -833,6 +970,13 @@ func (s *State) OnInterface(se *Session, i interface{}) (err error) { | |||||||
| 	case *GuildUpdate: | 	case *GuildUpdate: | ||||||
| 		err = s.GuildAdd(t.Guild) | 		err = s.GuildAdd(t.Guild) | ||||||
| 	case *GuildDelete: | 	case *GuildDelete: | ||||||
|  | 		var old *Guild | ||||||
|  | 		old, err = s.Guild(t.ID) | ||||||
|  | 		if err == nil { | ||||||
|  | 			oldCopy := *old | ||||||
|  | 			t.BeforeDelete = &oldCopy | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		err = s.GuildRemove(t.Guild) | 		err = s.GuildRemove(t.Guild) | ||||||
| 	case *GuildMemberAdd: | 	case *GuildMemberAdd: | ||||||
| 		// Updates the MemberCount of the guild. | 		// Updates the MemberCount of the guild. | ||||||
| @@ -903,6 +1047,35 @@ func (s *State) OnInterface(se *Session, i interface{}) (err error) { | |||||||
| 		if s.TrackChannels { | 		if s.TrackChannels { | ||||||
| 			err = s.ChannelRemove(t.Channel) | 			err = s.ChannelRemove(t.Channel) | ||||||
| 		} | 		} | ||||||
|  | 	case *ThreadCreate: | ||||||
|  | 		if s.TrackThreads { | ||||||
|  | 			err = s.ChannelAdd(t.Channel) | ||||||
|  | 		} | ||||||
|  | 	case *ThreadUpdate: | ||||||
|  | 		if s.TrackThreads { | ||||||
|  | 			old, err := s.Channel(t.ID) | ||||||
|  | 			if err == nil { | ||||||
|  | 				oldCopy := *old | ||||||
|  | 				t.BeforeUpdate = &oldCopy | ||||||
|  | 			} | ||||||
|  | 			err = s.ChannelAdd(t.Channel) | ||||||
|  | 		} | ||||||
|  | 	case *ThreadDelete: | ||||||
|  | 		if s.TrackThreads { | ||||||
|  | 			err = s.ChannelRemove(t.Channel) | ||||||
|  | 		} | ||||||
|  | 	case *ThreadMemberUpdate: | ||||||
|  | 		if s.TrackThreads { | ||||||
|  | 			err = s.ThreadMemberUpdate(t) | ||||||
|  | 		} | ||||||
|  | 	case *ThreadMembersUpdate: | ||||||
|  | 		if s.TrackThreadMembers { | ||||||
|  | 			err = s.ThreadMembersUpdate(t) | ||||||
|  | 		} | ||||||
|  | 	case *ThreadListSync: | ||||||
|  | 		if s.TrackThreads { | ||||||
|  | 			err = s.ThreadListSync(t) | ||||||
|  | 		} | ||||||
| 	case *MessageCreate: | 	case *MessageCreate: | ||||||
| 		if s.MaxMessageCount != 0 { | 		if s.MaxMessageCount != 0 { | ||||||
| 			err = s.MessageAdd(t.Message) | 			err = s.MessageAdd(t.Message) | ||||||
							
								
								
									
										2038
									
								
								vendor/github.com/bwmarrin/discordgo/structs.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2038
									
								
								vendor/github.com/bwmarrin/discordgo/structs.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -12,18 +12,8 @@ package discordgo | |||||||
| import ( | import ( | ||||||
| 	"encoding/json" | 	"encoding/json" | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"time" |  | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // Timestamp stores a timestamp, as sent by the Discord API. |  | ||||||
| type Timestamp string |  | ||||||
| 
 |  | ||||||
| // Parse parses a timestamp string into a time.Time object. |  | ||||||
| // The only time this can fail is if Discord changes their timestamp format. |  | ||||||
| func (t Timestamp) Parse() (time.Time, error) { |  | ||||||
| 	return time.Parse(time.RFC3339, string(t)) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // RESTError stores error information about a request with a bad response code. | // RESTError stores error information about a request with a bad response code. | ||||||
| // Message is not always present, there are cases where api calls can fail | // Message is not always present, there are cases where api calls can fail | ||||||
| // without returning a json message. | // without returning a json message. | ||||||
| @@ -1,26 +1,25 @@ | |||||||
| package discordgo | package discordgo | ||||||
| 
 | 
 | ||||||
| import "strings" |  | ||||||
| 
 |  | ||||||
| // UserFlags is the flags of "user" (see UserFlags* consts) | // UserFlags is the flags of "user" (see UserFlags* consts) | ||||||
| // https://discord.com/developers/docs/resources/user#user-object-user-flags | // https://discord.com/developers/docs/resources/user#user-object-user-flags | ||||||
| type UserFlags int | type UserFlags int | ||||||
| 
 | 
 | ||||||
| // Valid UserFlags values | // Valid UserFlags values | ||||||
| const ( | const ( | ||||||
| 	UserFlagDiscordEmployee      UserFlags = 1 << 0 | 	UserFlagDiscordEmployee           UserFlags = 1 << 0 | ||||||
| 	UserFlagDiscordPartner                 = 1 << 1 | 	UserFlagDiscordPartner            UserFlags = 1 << 1 | ||||||
| 	UserFlagHypeSquadEvents                = 1 << 2 | 	UserFlagHypeSquadEvents           UserFlags = 1 << 2 | ||||||
| 	UserFlagBugHunterLevel1                = 1 << 3 | 	UserFlagBugHunterLevel1           UserFlags = 1 << 3 | ||||||
| 	UserFlagHouseBravery                   = 1 << 6 | 	UserFlagHouseBravery              UserFlags = 1 << 6 | ||||||
| 	UserFlagHouseBrilliance                = 1 << 7 | 	UserFlagHouseBrilliance           UserFlags = 1 << 7 | ||||||
| 	UserFlagHouseBalance                   = 1 << 8 | 	UserFlagHouseBalance              UserFlags = 1 << 8 | ||||||
| 	UserFlagEarlySupporter                 = 1 << 9 | 	UserFlagEarlySupporter            UserFlags = 1 << 9 | ||||||
| 	UserFlagTeamUser                       = 1 << 10 | 	UserFlagTeamUser                  UserFlags = 1 << 10 | ||||||
| 	UserFlagSystem                         = 1 << 12 | 	UserFlagSystem                    UserFlags = 1 << 12 | ||||||
| 	UserFlagBugHunterLevel2                = 1 << 14 | 	UserFlagBugHunterLevel2           UserFlags = 1 << 14 | ||||||
| 	UserFlagVerifiedBot                    = 1 << 16 | 	UserFlagVerifiedBot               UserFlags = 1 << 16 | ||||||
| 	UserFlagVerifiedBotDeveloper           = 1 << 17 | 	UserFlagVerifiedBotDeveloper      UserFlags = 1 << 17 | ||||||
|  | 	UserFlagDiscordCertifiedModerator UserFlags = 1 << 18 | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // A User stores all data for an individual Discord user. | // A User stores all data for an individual Discord user. | ||||||
| @@ -55,6 +54,12 @@ type User struct { | |||||||
| 	// Whether the user has multi-factor authentication enabled. | 	// Whether the user has multi-factor authentication enabled. | ||||||
| 	MFAEnabled bool `json:"mfa_enabled"` | 	MFAEnabled bool `json:"mfa_enabled"` | ||||||
| 
 | 
 | ||||||
|  | 	// The hash of the user's banner image. | ||||||
|  | 	Banner string `json:"banner"` | ||||||
|  | 
 | ||||||
|  | 	// User's banner color, encoded as an integer representation of hexadecimal color code | ||||||
|  | 	AccentColor int `json:"accent_color"` | ||||||
|  | 
 | ||||||
| 	// Whether the user is a bot. | 	// Whether the user is a bot. | ||||||
| 	Bot bool `json:"bot"` | 	Bot bool `json:"bot"` | ||||||
| 
 | 
 | ||||||
| @@ -90,17 +95,13 @@ func (u *User) Mention() string { | |||||||
| //             if size is an empty string, no size parameter will | //             if size is an empty string, no size parameter will | ||||||
| //             be added to the URL. | //             be added to the URL. | ||||||
| func (u *User) AvatarURL(size string) string { | func (u *User) AvatarURL(size string) string { | ||||||
| 	var URL string | 	return avatarURL(u.Avatar, EndpointDefaultUserAvatar(u.Discriminator), | ||||||
| 	if u.Avatar == "" { | 		EndpointUserAvatar(u.ID, u.Avatar), EndpointUserAvatarAnimated(u.ID, u.Avatar), size) | ||||||
| 		URL = EndpointDefaultUserAvatar(u.Discriminator) | } | ||||||
| 	} else if strings.HasPrefix(u.Avatar, "a_") { | 
 | ||||||
| 		URL = EndpointUserAvatarAnimated(u.ID, u.Avatar) | // BannerURL returns the URL of the users's banner image. | ||||||
| 	} else { | //    size:    The size of the desired banner image as a power of two | ||||||
| 		URL = EndpointUserAvatar(u.ID, u.Avatar) | //             Image size can be any power of two between 16 and 4096. | ||||||
| 	} | func (u *User) BannerURL(size string) string { | ||||||
| 
 | 	return bannerURL(u.Banner, EndpointUserBanner(u.ID, u.Banner), EndpointUserBannerAnimated(u.ID, u.Banner), size) | ||||||
| 	if size != "" { |  | ||||||
| 		return URL + "?size=" + size |  | ||||||
| 	} |  | ||||||
| 	return URL |  | ||||||
| } | } | ||||||
							
								
								
									
										110
									
								
								vendor/github.com/bwmarrin/discordgo/util.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								vendor/github.com/bwmarrin/discordgo/util.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,110 @@ | |||||||
|  | package discordgo | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"bytes" | ||||||
|  | 	"encoding/json" | ||||||
|  | 	"fmt" | ||||||
|  | 	"io" | ||||||
|  | 	"mime/multipart" | ||||||
|  | 	"net/textproto" | ||||||
|  | 	"strconv" | ||||||
|  | 	"strings" | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // SnowflakeTimestamp returns the creation time of a Snowflake ID relative to the creation of Discord. | ||||||
|  | func SnowflakeTimestamp(ID string) (t time.Time, err error) { | ||||||
|  | 	i, err := strconv.ParseInt(ID, 10, 64) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	timestamp := (i >> 22) + 1420070400000 | ||||||
|  | 	t = time.Unix(0, timestamp*1000000) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // MultipartBodyWithJSON returns the contentType and body for a discord request | ||||||
|  | // data  : The object to encode for payload_json in the multipart request | ||||||
|  | // files : Files to include in the request | ||||||
|  | func MultipartBodyWithJSON(data interface{}, files []*File) (requestContentType string, requestBody []byte, err error) { | ||||||
|  | 	body := &bytes.Buffer{} | ||||||
|  | 	bodywriter := multipart.NewWriter(body) | ||||||
|  |  | ||||||
|  | 	payload, err := json.Marshal(data) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	var p io.Writer | ||||||
|  |  | ||||||
|  | 	h := make(textproto.MIMEHeader) | ||||||
|  | 	h.Set("Content-Disposition", `form-data; name="payload_json"`) | ||||||
|  | 	h.Set("Content-Type", "application/json") | ||||||
|  |  | ||||||
|  | 	p, err = bodywriter.CreatePart(h) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if _, err = p.Write(payload); err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	for i, file := range files { | ||||||
|  | 		h := make(textproto.MIMEHeader) | ||||||
|  | 		h.Set("Content-Disposition", fmt.Sprintf(`form-data; name="file%d"; filename="%s"`, i, quoteEscaper.Replace(file.Name))) | ||||||
|  | 		contentType := file.ContentType | ||||||
|  | 		if contentType == "" { | ||||||
|  | 			contentType = "application/octet-stream" | ||||||
|  | 		} | ||||||
|  | 		h.Set("Content-Type", contentType) | ||||||
|  |  | ||||||
|  | 		p, err = bodywriter.CreatePart(h) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if _, err = io.Copy(p, file.Reader); err != nil { | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	err = bodywriter.Close() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return bodywriter.FormDataContentType(), body.Bytes(), nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func avatarURL(avatarHash, defaultAvatarURL, staticAvatarURL, animatedAvatarURL, size string) string { | ||||||
|  | 	var URL string | ||||||
|  | 	if avatarHash == "" { | ||||||
|  | 		URL = defaultAvatarURL | ||||||
|  | 	} else if strings.HasPrefix(avatarHash, "a_") { | ||||||
|  | 		URL = animatedAvatarURL | ||||||
|  | 	} else { | ||||||
|  | 		URL = staticAvatarURL | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if size != "" { | ||||||
|  | 		return URL + "?size=" + size | ||||||
|  | 	} | ||||||
|  | 	return URL | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func bannerURL(bannerHash, staticBannerURL, animatedBannerURL, size string) string { | ||||||
|  | 	var URL string | ||||||
|  | 	if bannerHash == "" { | ||||||
|  | 		return "" | ||||||
|  | 	} else if strings.HasPrefix(bannerHash, "a_") { | ||||||
|  | 		URL = animatedBannerURL | ||||||
|  | 	} else { | ||||||
|  | 		URL = staticBannerURL | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if size != "" { | ||||||
|  | 		return URL + "?size=" + size | ||||||
|  | 	} | ||||||
|  | 	return URL | ||||||
|  | } | ||||||
| @@ -831,9 +831,15 @@ func (v *VoiceConnection) opusReceiver(udpConn *net.UDPConn, close <-chan struct | |||||||
| 		copy(nonce[:], recvbuf[0:12]) | 		copy(nonce[:], recvbuf[0:12]) | ||||||
| 		p.Opus, _ = secretbox.Open(nil, recvbuf[12:rlen], &nonce, &v.op4.SecretKey) | 		p.Opus, _ = secretbox.Open(nil, recvbuf[12:rlen], &nonce, &v.op4.SecretKey) | ||||||
| 
 | 
 | ||||||
| 		if len(p.Opus) > 8 && recvbuf[0] == 0x90 { | 		// extension bit set, and not a RTCP packet | ||||||
| 			// Extension bit is set, first 8 bytes is the extended header | 		if ((recvbuf[0] & 0x10) == 0x10) && ((recvbuf[1] & 0x80) == 0) { | ||||||
| 			p.Opus = p.Opus[8:] | 			// get extended header length | ||||||
|  | 			extlen := binary.BigEndian.Uint16(p.Opus[2:4]) | ||||||
|  | 			// 4 bytes (ext header header) + 4*extlen (ext header data) | ||||||
|  | 			shift := int(4 + 4*extlen) | ||||||
|  | 			if len(p.Opus) > shift { | ||||||
|  | 				p.Opus = p.Opus[shift:] | ||||||
|  | 			} | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if c != nil { | 		if c != nil { | ||||||
							
								
								
									
										49
									
								
								vendor/github.com/bwmarrin/discordgo/webhook.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								vendor/github.com/bwmarrin/discordgo/webhook.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,49 @@ | |||||||
|  | package discordgo | ||||||
|  |  | ||||||
|  | // Webhook stores the data for a webhook. | ||||||
|  | type Webhook struct { | ||||||
|  | 	ID        string      `json:"id"` | ||||||
|  | 	Type      WebhookType `json:"type"` | ||||||
|  | 	GuildID   string      `json:"guild_id"` | ||||||
|  | 	ChannelID string      `json:"channel_id"` | ||||||
|  | 	User      *User       `json:"user"` | ||||||
|  | 	Name      string      `json:"name"` | ||||||
|  | 	Avatar    string      `json:"avatar"` | ||||||
|  | 	Token     string      `json:"token"` | ||||||
|  |  | ||||||
|  | 	// ApplicationID is the bot/OAuth2 application that created this webhook | ||||||
|  | 	ApplicationID string `json:"application_id,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // WebhookType is the type of Webhook (see WebhookType* consts) in the Webhook struct | ||||||
|  | // https://discord.com/developers/docs/resources/webhook#webhook-object-webhook-types | ||||||
|  | type WebhookType int | ||||||
|  |  | ||||||
|  | // Valid WebhookType values | ||||||
|  | const ( | ||||||
|  | 	WebhookTypeIncoming        WebhookType = 1 | ||||||
|  | 	WebhookTypeChannelFollower WebhookType = 2 | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // WebhookParams is a struct for webhook params, used in the WebhookExecute command. | ||||||
|  | type WebhookParams struct { | ||||||
|  | 	Content         string                  `json:"content,omitempty"` | ||||||
|  | 	Username        string                  `json:"username,omitempty"` | ||||||
|  | 	AvatarURL       string                  `json:"avatar_url,omitempty"` | ||||||
|  | 	TTS             bool                    `json:"tts,omitempty"` | ||||||
|  | 	Files           []*File                 `json:"-"` | ||||||
|  | 	Components      []MessageComponent      `json:"components"` | ||||||
|  | 	Embeds          []*MessageEmbed         `json:"embeds,omitempty"` | ||||||
|  | 	AllowedMentions *MessageAllowedMentions `json:"allowed_mentions,omitempty"` | ||||||
|  | 	// NOTE: Works only for followup messages. | ||||||
|  | 	Flags uint64 `json:"flags,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // WebhookEdit stores data for editing of a webhook message. | ||||||
|  | type WebhookEdit struct { | ||||||
|  | 	Content         string                  `json:"content,omitempty"` | ||||||
|  | 	Components      []MessageComponent      `json:"components"` | ||||||
|  | 	Embeds          []*MessageEmbed         `json:"embeds,omitempty"` | ||||||
|  | 	Files           []*File                 `json:"-"` | ||||||
|  | 	AllowedMentions *MessageAllowedMentions `json:"allowed_mentions,omitempty"` | ||||||
|  | } | ||||||
| @@ -33,7 +33,7 @@ var ErrWSAlreadyOpen = errors.New("web socket already opened") | |||||||
| var ErrWSNotFound = errors.New("no websocket connection exists") | var ErrWSNotFound = errors.New("no websocket connection exists") | ||||||
| 
 | 
 | ||||||
| // ErrWSShardBounds is thrown when you try to use a shard ID that is | // ErrWSShardBounds is thrown when you try to use a shard ID that is | ||||||
| // less than the total shard count | // more than the total shard count | ||||||
| var ErrWSShardBounds = errors.New("ShardID must be less than ShardCount") | var ErrWSShardBounds = errors.New("ShardID must be less than ShardCount") | ||||||
| 
 | 
 | ||||||
| type resumePacket struct { | type resumePacket struct { | ||||||
| @@ -383,6 +383,17 @@ func (s *Session) UpdateListeningStatus(name string) (err error) { | |||||||
| 
 | 
 | ||||||
| // UpdateStatusComplex allows for sending the raw status update data untouched by discordgo. | // UpdateStatusComplex allows for sending the raw status update data untouched by discordgo. | ||||||
| func (s *Session) UpdateStatusComplex(usd UpdateStatusData) (err error) { | func (s *Session) UpdateStatusComplex(usd UpdateStatusData) (err error) { | ||||||
|  | 	// The comment does say "untouched by discordgo", but we might need to lie a bit here. | ||||||
|  | 	// The Discord documentation lists `activities` as being nullable, but in practice this | ||||||
|  | 	// doesn't seem to be the case. I had filed an issue about this at | ||||||
|  | 	// https://github.com/discord/discord-api-docs/issues/2559, but as of writing this | ||||||
|  | 	// haven't had any movement on it, so at this point I'm assuming this is an error, | ||||||
|  | 	// and am fixing this bug accordingly. Because sending `null` for `activities` instantly | ||||||
|  | 	// disconnects us, I think that disallowing it from being sent in `UpdateStatusComplex` | ||||||
|  | 	// isn't that big of an issue. | ||||||
|  | 	if usd.Activities == nil { | ||||||
|  | 		usd.Activities = make([]*Activity, 0) | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	s.RLock() | 	s.RLock() | ||||||
| 	defer s.RUnlock() | 	defer s.RUnlock() | ||||||
| @@ -755,13 +766,13 @@ func (s *Session) identify() error { | |||||||
| 	s.log(LogDebug, "called") | 	s.log(LogDebug, "called") | ||||||
| 
 | 
 | ||||||
| 	// TODO: This is a temporary block of code to help | 	// TODO: This is a temporary block of code to help | ||||||
| 	// maintain backwards compatability | 	// maintain backwards compatibility | ||||||
| 	if s.Compress == false { | 	if s.Compress == false { | ||||||
| 		s.Identify.Compress = false | 		s.Identify.Compress = false | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: This is a temporary block of code to help | 	// TODO: This is a temporary block of code to help | ||||||
| 	// maintain backwards compatability | 	// maintain backwards compatibility | ||||||
| 	if s.Token != "" && s.Identify.Token == "" { | 	if s.Token != "" && s.Identify.Token == "" { | ||||||
| 		s.Identify.Token = s.Token | 		s.Identify.Token = s.Token | ||||||
| 	} | 	} | ||||||
							
								
								
									
										2
									
								
								vendor/github.com/matterbridge/discordgo/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/matterbridge/discordgo/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,2 +0,0 @@ | |||||||
| # IDE-specific metadata |  | ||||||
| .idea/ |  | ||||||
							
								
								
									
										161
									
								
								vendor/github.com/matterbridge/discordgo/discord.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										161
									
								
								vendor/github.com/matterbridge/discordgo/discord.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,161 +0,0 @@ | |||||||
| // Discordgo - Discord bindings for Go |  | ||||||
| // Available at https://github.com/matterbridge/discordgo |  | ||||||
|  |  | ||||||
| // Copyright 2015-2016 Bruce Marriner <bruce@sqls.net>.  All rights reserved. |  | ||||||
| // Use of this source code is governed by a BSD-style |  | ||||||
| // license that can be found in the LICENSE file. |  | ||||||
|  |  | ||||||
| // This file contains high level helper functions and easy entry points for the |  | ||||||
| // entire discordgo package.  These functions are being developed and are very |  | ||||||
| // experimental at this point.  They will most likely change so please use the |  | ||||||
| // low level functions if that's a problem. |  | ||||||
|  |  | ||||||
| // Package discordgo provides Discord binding for Go |  | ||||||
| package discordgo |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"errors" |  | ||||||
| 	"fmt" |  | ||||||
| 	"net/http" |  | ||||||
| 	"runtime" |  | ||||||
| 	"time" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| // VERSION of DiscordGo, follows Semantic Versioning. (http://semver.org/) |  | ||||||
| const VERSION = "0.23.0" |  | ||||||
|  |  | ||||||
| // ErrMFA will be risen by New when the user has 2FA. |  | ||||||
| var ErrMFA = errors.New("account has 2FA enabled") |  | ||||||
|  |  | ||||||
| // New creates a new Discord session and will automate some startup |  | ||||||
| // tasks if given enough information to do so.  Currently you can pass zero |  | ||||||
| // arguments and it will return an empty Discord session. |  | ||||||
| // There are 3 ways to call New: |  | ||||||
| //     With a single auth token - All requests will use the token blindly |  | ||||||
| //         (just tossing it into the HTTP Authorization header); |  | ||||||
| //         no verification of the token will be done and requests may fail. |  | ||||||
| //         IF THE TOKEN IS FOR A BOT, IT MUST BE PREFIXED WITH `BOT ` |  | ||||||
| //         eg: `"Bot <token>"` |  | ||||||
| //         IF IT IS AN OAUTH2 ACCESS TOKEN, IT MUST BE PREFIXED WITH `Bearer ` |  | ||||||
| //         eg: `"Bearer <token>"` |  | ||||||
| //     With an email and password - Discord will sign in with the provided |  | ||||||
| //         credentials. |  | ||||||
| //     With an email, password and auth token - Discord will verify the auth |  | ||||||
| //         token, if it is invalid it will sign in with the provided |  | ||||||
| //         credentials. This is the Discord recommended way to sign in. |  | ||||||
| // |  | ||||||
| // NOTE: While email/pass authentication is supported by DiscordGo it is |  | ||||||
| // HIGHLY DISCOURAGED by Discord. Please only use email/pass to obtain a token |  | ||||||
| // and then use that authentication token for all future connections. |  | ||||||
| // Also, doing any form of automation with a user (non Bot) account may result |  | ||||||
| // in that account being permanently banned from Discord. |  | ||||||
| func New(args ...interface{}) (s *Session, err error) { |  | ||||||
|  |  | ||||||
| 	// Create an empty Session interface. |  | ||||||
| 	s = &Session{ |  | ||||||
| 		State:                  NewState(), |  | ||||||
| 		Ratelimiter:            NewRatelimiter(), |  | ||||||
| 		StateEnabled:           true, |  | ||||||
| 		Compress:               true, |  | ||||||
| 		ShouldReconnectOnError: true, |  | ||||||
| 		ShardID:                0, |  | ||||||
| 		ShardCount:             1, |  | ||||||
| 		MaxRestRetries:         3, |  | ||||||
| 		Client:                 &http.Client{Timeout: (20 * time.Second)}, |  | ||||||
| 		UserAgent:              "DiscordBot (https://github.com/matterbridge/discordgo, v" + VERSION + ")", |  | ||||||
| 		sequence:               new(int64), |  | ||||||
| 		LastHeartbeatAck:       time.Now().UTC(), |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// Initilize the Identify Package with defaults |  | ||||||
| 	// These can be modified prior to calling Open() |  | ||||||
| 	s.Identify.Compress = true |  | ||||||
| 	s.Identify.LargeThreshold = 250 |  | ||||||
| 	s.Identify.GuildSubscriptions = true |  | ||||||
| 	s.Identify.Properties.OS = runtime.GOOS |  | ||||||
| 	s.Identify.Properties.Browser = "DiscordGo v" + VERSION |  | ||||||
| 	s.Identify.Intents = MakeIntent(IntentsAllWithoutPrivileged) |  | ||||||
|  |  | ||||||
| 	// If no arguments are passed return the empty Session interface. |  | ||||||
| 	if args == nil { |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// Variables used below when parsing func arguments |  | ||||||
| 	var auth, pass string |  | ||||||
|  |  | ||||||
| 	// Parse passed arguments |  | ||||||
| 	for _, arg := range args { |  | ||||||
|  |  | ||||||
| 		switch v := arg.(type) { |  | ||||||
|  |  | ||||||
| 		case []string: |  | ||||||
| 			if len(v) > 3 { |  | ||||||
| 				err = fmt.Errorf("too many string parameters provided") |  | ||||||
| 				return |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			// First string is either token or username |  | ||||||
| 			if len(v) > 0 { |  | ||||||
| 				auth = v[0] |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			// If second string exists, it must be a password. |  | ||||||
| 			if len(v) > 1 { |  | ||||||
| 				pass = v[1] |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			// If third string exists, it must be an auth token. |  | ||||||
| 			if len(v) > 2 { |  | ||||||
| 				s.Identify.Token = v[2] |  | ||||||
| 				s.Token = v[2] // TODO: Remove, Deprecated - Kept for backwards compatibility. |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 		case string: |  | ||||||
| 			// First string must be either auth token or username. |  | ||||||
| 			// Second string must be a password. |  | ||||||
| 			// Only 2 input strings are supported. |  | ||||||
|  |  | ||||||
| 			if auth == "" { |  | ||||||
| 				auth = v |  | ||||||
| 			} else if pass == "" { |  | ||||||
| 				pass = v |  | ||||||
| 			} else if s.Token == "" { |  | ||||||
| 				s.Identify.Token = v |  | ||||||
| 				s.Token = v // TODO: Remove, Deprecated - Kept for backwards compatibility. |  | ||||||
| 			} else { |  | ||||||
| 				err = fmt.Errorf("too many string parameters provided") |  | ||||||
| 				return |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			//		case Config: |  | ||||||
| 			// TODO: Parse configuration struct |  | ||||||
|  |  | ||||||
| 		default: |  | ||||||
| 			err = fmt.Errorf("unsupported parameter type provided") |  | ||||||
| 			return |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// If only one string was provided, assume it is an auth token. |  | ||||||
| 	// Otherwise get auth token from Discord, if a token was specified |  | ||||||
| 	// Discord will verify it for free, or log the user in if it is |  | ||||||
| 	// invalid. |  | ||||||
| 	if pass == "" { |  | ||||||
| 		s.Identify.Token = auth |  | ||||||
| 		s.Token = auth // TODO: Remove, Deprecated - Kept for backwards compatibility. |  | ||||||
| 	} else { |  | ||||||
| 		err = s.Login(auth, pass) |  | ||||||
| 		// TODO: Remove last s.Token part, Deprecated - Kept for backwards compatibility. |  | ||||||
| 		if err != nil || s.Identify.Token == "" || s.Token == "" { |  | ||||||
| 			if s.MFA { |  | ||||||
| 				err = ErrMFA |  | ||||||
| 			} else { |  | ||||||
| 				err = fmt.Errorf("Unable to fetch discord authentication token. %v", err) |  | ||||||
| 			} |  | ||||||
| 			return |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return |  | ||||||
| } |  | ||||||
							
								
								
									
										153
									
								
								vendor/github.com/matterbridge/discordgo/endpoints.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										153
									
								
								vendor/github.com/matterbridge/discordgo/endpoints.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,153 +0,0 @@ | |||||||
| // Discordgo - Discord bindings for Go |  | ||||||
| // Available at https://github.com/bwmarrin/discordgo |  | ||||||
|  |  | ||||||
| // Copyright 2015-2016 Bruce Marriner <bruce@sqls.net>.  All rights reserved. |  | ||||||
| // Use of this source code is governed by a BSD-style |  | ||||||
| // license that can be found in the LICENSE file. |  | ||||||
|  |  | ||||||
| // This file contains variables for all known Discord end points.  All functions |  | ||||||
| // throughout the Discordgo package use these variables for all connections |  | ||||||
| // to Discord.  These are all exported and you may modify them if needed. |  | ||||||
|  |  | ||||||
| package discordgo |  | ||||||
|  |  | ||||||
| import "strconv" |  | ||||||
|  |  | ||||||
| // APIVersion is the Discord API version used for the REST and Websocket API. |  | ||||||
| var APIVersion = "8" |  | ||||||
|  |  | ||||||
| // Known Discord API Endpoints. |  | ||||||
| var ( |  | ||||||
| 	EndpointStatus     = "https://status.discord.com/api/v2/" |  | ||||||
| 	EndpointSm         = EndpointStatus + "scheduled-maintenances/" |  | ||||||
| 	EndpointSmActive   = EndpointSm + "active.json" |  | ||||||
| 	EndpointSmUpcoming = EndpointSm + "upcoming.json" |  | ||||||
|  |  | ||||||
| 	EndpointDiscord    = "https://discord.com/" |  | ||||||
| 	EndpointAPI        = EndpointDiscord + "api/v" + APIVersion + "/" |  | ||||||
| 	EndpointGuilds     = EndpointAPI + "guilds/" |  | ||||||
| 	EndpointChannels   = EndpointAPI + "channels/" |  | ||||||
| 	EndpointUsers      = EndpointAPI + "users/" |  | ||||||
| 	EndpointGateway    = EndpointAPI + "gateway" |  | ||||||
| 	EndpointGatewayBot = EndpointGateway + "/bot" |  | ||||||
| 	EndpointWebhooks   = EndpointAPI + "webhooks/" |  | ||||||
|  |  | ||||||
| 	EndpointCDN             = "https://cdn.discordapp.com/" |  | ||||||
| 	EndpointCDNAttachments  = EndpointCDN + "attachments/" |  | ||||||
| 	EndpointCDNAvatars      = EndpointCDN + "avatars/" |  | ||||||
| 	EndpointCDNIcons        = EndpointCDN + "icons/" |  | ||||||
| 	EndpointCDNSplashes     = EndpointCDN + "splashes/" |  | ||||||
| 	EndpointCDNChannelIcons = EndpointCDN + "channel-icons/" |  | ||||||
| 	EndpointCDNBanners      = EndpointCDN + "banners/" |  | ||||||
|  |  | ||||||
| 	EndpointAuth           = EndpointAPI + "auth/" |  | ||||||
| 	EndpointLogin          = EndpointAuth + "login" |  | ||||||
| 	EndpointLogout         = EndpointAuth + "logout" |  | ||||||
| 	EndpointVerify         = EndpointAuth + "verify" |  | ||||||
| 	EndpointVerifyResend   = EndpointAuth + "verify/resend" |  | ||||||
| 	EndpointForgotPassword = EndpointAuth + "forgot" |  | ||||||
| 	EndpointResetPassword  = EndpointAuth + "reset" |  | ||||||
| 	EndpointRegister       = EndpointAuth + "register" |  | ||||||
|  |  | ||||||
| 	EndpointVoice        = EndpointAPI + "/voice/" |  | ||||||
| 	EndpointVoiceRegions = EndpointVoice + "regions" |  | ||||||
| 	EndpointVoiceIce     = EndpointVoice + "ice" |  | ||||||
|  |  | ||||||
| 	EndpointTutorial           = EndpointAPI + "tutorial/" |  | ||||||
| 	EndpointTutorialIndicators = EndpointTutorial + "indicators" |  | ||||||
|  |  | ||||||
| 	EndpointTrack        = EndpointAPI + "track" |  | ||||||
| 	EndpointSso          = EndpointAPI + "sso" |  | ||||||
| 	EndpointReport       = EndpointAPI + "report" |  | ||||||
| 	EndpointIntegrations = EndpointAPI + "integrations" |  | ||||||
|  |  | ||||||
| 	EndpointUser               = func(uID string) string { return EndpointUsers + uID } |  | ||||||
| 	EndpointUserAvatar         = func(uID, aID string) string { return EndpointCDNAvatars + uID + "/" + aID + ".png" } |  | ||||||
| 	EndpointUserAvatarAnimated = func(uID, aID string) string { return EndpointCDNAvatars + uID + "/" + aID + ".gif" } |  | ||||||
| 	EndpointDefaultUserAvatar  = func(uDiscriminator string) string { |  | ||||||
| 		uDiscriminatorInt, _ := strconv.Atoi(uDiscriminator) |  | ||||||
| 		return EndpointCDN + "embed/avatars/" + strconv.Itoa(uDiscriminatorInt%5) + ".png" |  | ||||||
| 	} |  | ||||||
| 	EndpointUserSettings      = func(uID string) string { return EndpointUsers + uID + "/settings" } |  | ||||||
| 	EndpointUserGuilds        = func(uID string) string { return EndpointUsers + uID + "/guilds" } |  | ||||||
| 	EndpointUserGuild         = func(uID, gID string) string { return EndpointUsers + uID + "/guilds/" + gID } |  | ||||||
| 	EndpointUserGuildSettings = func(uID, gID string) string { return EndpointUsers + uID + "/guilds/" + gID + "/settings" } |  | ||||||
| 	EndpointUserChannels      = func(uID string) string { return EndpointUsers + uID + "/channels" } |  | ||||||
| 	EndpointUserDevices       = func(uID string) string { return EndpointUsers + uID + "/devices" } |  | ||||||
| 	EndpointUserConnections   = func(uID string) string { return EndpointUsers + uID + "/connections" } |  | ||||||
| 	EndpointUserNotes         = func(uID string) string { return EndpointUsers + "@me/notes/" + uID } |  | ||||||
|  |  | ||||||
| 	EndpointGuild                = func(gID string) string { return EndpointGuilds + gID } |  | ||||||
| 	EndpointGuildChannels        = func(gID string) string { return EndpointGuilds + gID + "/channels" } |  | ||||||
| 	EndpointGuildMembers         = func(gID string) string { return EndpointGuilds + gID + "/members" } |  | ||||||
| 	EndpointGuildMember          = func(gID, uID string) string { return EndpointGuilds + gID + "/members/" + uID } |  | ||||||
| 	EndpointGuildMemberRole      = func(gID, uID, rID string) string { return EndpointGuilds + gID + "/members/" + uID + "/roles/" + rID } |  | ||||||
| 	EndpointGuildBans            = func(gID string) string { return EndpointGuilds + gID + "/bans" } |  | ||||||
| 	EndpointGuildBan             = func(gID, uID string) string { return EndpointGuilds + gID + "/bans/" + uID } |  | ||||||
| 	EndpointGuildIntegrations    = func(gID string) string { return EndpointGuilds + gID + "/integrations" } |  | ||||||
| 	EndpointGuildIntegration     = func(gID, iID string) string { return EndpointGuilds + gID + "/integrations/" + iID } |  | ||||||
| 	EndpointGuildIntegrationSync = func(gID, iID string) string { return EndpointGuilds + gID + "/integrations/" + iID + "/sync" } |  | ||||||
| 	EndpointGuildRoles           = func(gID string) string { return EndpointGuilds + gID + "/roles" } |  | ||||||
| 	EndpointGuildRole            = func(gID, rID string) string { return EndpointGuilds + gID + "/roles/" + rID } |  | ||||||
| 	EndpointGuildInvites         = func(gID string) string { return EndpointGuilds + gID + "/invites" } |  | ||||||
| 	EndpointGuildWidget          = func(gID string) string { return EndpointGuilds + gID + "/widget" } |  | ||||||
| 	EndpointGuildEmbed           = EndpointGuildWidget |  | ||||||
| 	EndpointGuildPrune           = func(gID string) string { return EndpointGuilds + gID + "/prune" } |  | ||||||
| 	EndpointGuildIcon            = func(gID, hash string) string { return EndpointCDNIcons + gID + "/" + hash + ".png" } |  | ||||||
| 	EndpointGuildIconAnimated    = func(gID, hash string) string { return EndpointCDNIcons + gID + "/" + hash + ".gif" } |  | ||||||
| 	EndpointGuildSplash          = func(gID, hash string) string { return EndpointCDNSplashes + gID + "/" + hash + ".png" } |  | ||||||
| 	EndpointGuildWebhooks        = func(gID string) string { return EndpointGuilds + gID + "/webhooks" } |  | ||||||
| 	EndpointGuildAuditLogs       = func(gID string) string { return EndpointGuilds + gID + "/audit-logs" } |  | ||||||
| 	EndpointGuildEmojis          = func(gID string) string { return EndpointGuilds + gID + "/emojis" } |  | ||||||
| 	EndpointGuildEmoji           = func(gID, eID string) string { return EndpointGuilds + gID + "/emojis/" + eID } |  | ||||||
| 	EndpointGuildBanner          = func(gID, hash string) string { return EndpointCDNBanners + gID + "/" + hash + ".png" } |  | ||||||
|  |  | ||||||
| 	EndpointChannel                   = func(cID string) string { return EndpointChannels + cID } |  | ||||||
| 	EndpointChannelPermissions        = func(cID string) string { return EndpointChannels + cID + "/permissions" } |  | ||||||
| 	EndpointChannelPermission         = func(cID, tID string) string { return EndpointChannels + cID + "/permissions/" + tID } |  | ||||||
| 	EndpointChannelInvites            = func(cID string) string { return EndpointChannels + cID + "/invites" } |  | ||||||
| 	EndpointChannelTyping             = func(cID string) string { return EndpointChannels + cID + "/typing" } |  | ||||||
| 	EndpointChannelMessages           = func(cID string) string { return EndpointChannels + cID + "/messages" } |  | ||||||
| 	EndpointChannelMessage            = func(cID, mID string) string { return EndpointChannels + cID + "/messages/" + mID } |  | ||||||
| 	EndpointChannelMessageAck         = func(cID, mID string) string { return EndpointChannels + cID + "/messages/" + mID + "/ack" } |  | ||||||
| 	EndpointChannelMessagesBulkDelete = func(cID string) string { return EndpointChannel(cID) + "/messages/bulk-delete" } |  | ||||||
| 	EndpointChannelMessagesPins       = func(cID string) string { return EndpointChannel(cID) + "/pins" } |  | ||||||
| 	EndpointChannelMessagePin         = func(cID, mID string) string { return EndpointChannel(cID) + "/pins/" + mID } |  | ||||||
| 	EndpointChannelMessageCrosspost   = func(cID, mID string) string { return EndpointChannel(cID) + "/messages/" + mID + "/crosspost" } |  | ||||||
| 	EndpointChannelFollow             = func(cID string) string { return EndpointChannel(cID) + "/followers" } |  | ||||||
|  |  | ||||||
| 	EndpointGroupIcon = func(cID, hash string) string { return EndpointCDNChannelIcons + cID + "/" + hash + ".png" } |  | ||||||
|  |  | ||||||
| 	EndpointChannelWebhooks = func(cID string) string { return EndpointChannel(cID) + "/webhooks" } |  | ||||||
| 	EndpointWebhook         = func(wID string) string { return EndpointWebhooks + wID } |  | ||||||
| 	EndpointWebhookToken    = func(wID, token string) string { return EndpointWebhooks + wID + "/" + token } |  | ||||||
|  |  | ||||||
| 	EndpointMessageReactionsAll = func(cID, mID string) string { |  | ||||||
| 		return EndpointChannelMessage(cID, mID) + "/reactions" |  | ||||||
| 	} |  | ||||||
| 	EndpointMessageReactions = func(cID, mID, eID string) string { |  | ||||||
| 		return EndpointChannelMessage(cID, mID) + "/reactions/" + eID |  | ||||||
| 	} |  | ||||||
| 	EndpointMessageReaction = func(cID, mID, eID, uID string) string { |  | ||||||
| 		return EndpointMessageReactions(cID, mID, eID) + "/" + uID |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	EndpointRelationships       = func() string { return EndpointUsers + "@me" + "/relationships" } |  | ||||||
| 	EndpointRelationship        = func(uID string) string { return EndpointRelationships() + "/" + uID } |  | ||||||
| 	EndpointRelationshipsMutual = func(uID string) string { return EndpointUsers + uID + "/relationships" } |  | ||||||
|  |  | ||||||
| 	EndpointGuildCreate = EndpointAPI + "guilds" |  | ||||||
|  |  | ||||||
| 	EndpointInvite = func(iID string) string { return EndpointAPI + "invite/" + iID } |  | ||||||
|  |  | ||||||
| 	EndpointIntegrationsJoin = func(iID string) string { return EndpointAPI + "integrations/" + iID + "/join" } |  | ||||||
|  |  | ||||||
| 	EndpointEmoji         = func(eID string) string { return EndpointCDN + "emojis/" + eID + ".png" } |  | ||||||
| 	EndpointEmojiAnimated = func(eID string) string { return EndpointCDN + "emojis/" + eID + ".gif" } |  | ||||||
|  |  | ||||||
| 	EndpointOauth2            = EndpointAPI + "oauth2/" |  | ||||||
| 	EndpointApplications      = EndpointOauth2 + "applications" |  | ||||||
| 	EndpointApplication       = func(aID string) string { return EndpointApplications + "/" + aID } |  | ||||||
| 	EndpointApplicationsBot   = func(aID string) string { return EndpointApplications + "/" + aID + "/bot" } |  | ||||||
| 	EndpointApplicationAssets = func(aID string) string { return EndpointApplications + "/" + aID + "/assets" } |  | ||||||
| ) |  | ||||||
							
								
								
									
										54
									
								
								vendor/github.com/matterbridge/discordgo/interactions.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										54
									
								
								vendor/github.com/matterbridge/discordgo/interactions.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,54 +0,0 @@ | |||||||
| package discordgo |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"bytes" |  | ||||||
| 	"crypto/ed25519" |  | ||||||
| 	"encoding/hex" |  | ||||||
| 	"io" |  | ||||||
| 	"io/ioutil" |  | ||||||
| 	"net/http" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| // VerifyInteraction implements message verification of the discord interactions api |  | ||||||
| // signing algorithm, as documented here: |  | ||||||
| // https://discord.com/developers/docs/interactions/slash-commands#security-and-authorization |  | ||||||
| func VerifyInteraction(r *http.Request, key ed25519.PublicKey) bool { |  | ||||||
| 	var msg bytes.Buffer |  | ||||||
|  |  | ||||||
| 	signature := r.Header.Get("X-Signature-Ed25519") |  | ||||||
| 	if signature == "" { |  | ||||||
| 		return false |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	sig, err := hex.DecodeString(signature) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return false |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if len(sig) != ed25519.SignatureSize { |  | ||||||
| 		return false |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	timestamp := r.Header.Get("X-Signature-Timestamp") |  | ||||||
| 	if timestamp == "" { |  | ||||||
| 		return false |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	msg.WriteString(timestamp) |  | ||||||
|  |  | ||||||
| 	defer r.Body.Close() |  | ||||||
| 	var body bytes.Buffer |  | ||||||
|  |  | ||||||
| 	// at the end of the function, copy the original body back into the request |  | ||||||
| 	defer func() { |  | ||||||
| 		r.Body = ioutil.NopCloser(&body) |  | ||||||
| 	}() |  | ||||||
|  |  | ||||||
| 	// copy body into buffers |  | ||||||
| 	_, err = io.Copy(&msg, io.TeeReader(r.Body, &body)) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return false |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return ed25519.Verify(key, msg.Bytes(), sig) |  | ||||||
| } |  | ||||||
							
								
								
									
										1339
									
								
								vendor/github.com/matterbridge/discordgo/structs.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1339
									
								
								vendor/github.com/matterbridge/discordgo/structs.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										17
									
								
								vendor/github.com/matterbridge/discordgo/util.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								vendor/github.com/matterbridge/discordgo/util.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,17 +0,0 @@ | |||||||
| package discordgo |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"strconv" |  | ||||||
| 	"time" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| // SnowflakeTimestamp returns the creation time of a Snowflake ID relative to the creation of Discord. |  | ||||||
| func SnowflakeTimestamp(ID string) (t time.Time, err error) { |  | ||||||
| 	i, err := strconv.ParseInt(ID, 10, 64) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 	timestamp := (i >> 22) + 1420070400000 |  | ||||||
| 	t = time.Unix(0, timestamp*1000000) |  | ||||||
| 	return |  | ||||||
| } |  | ||||||
							
								
								
									
										6
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							| @@ -51,6 +51,9 @@ github.com/av-elier/go-decimal-to-rational | |||||||
| # github.com/blang/semver v3.5.1+incompatible | # github.com/blang/semver v3.5.1+incompatible | ||||||
| ## explicit | ## explicit | ||||||
| github.com/blang/semver | github.com/blang/semver | ||||||
|  | # github.com/bwmarrin/discordgo v0.24.0 | ||||||
|  | ## explicit; go 1.13 | ||||||
|  | github.com/bwmarrin/discordgo | ||||||
| # github.com/d5/tengo/v2 v2.10.0 | # github.com/d5/tengo/v2 v2.10.0 | ||||||
| ## explicit; go 1.13 | ## explicit; go 1.13 | ||||||
| github.com/d5/tengo/v2 | github.com/d5/tengo/v2 | ||||||
| @@ -194,9 +197,6 @@ github.com/matrix-org/gomatrix | |||||||
| github.com/matterbridge/Rocket.Chat.Go.SDK/models | github.com/matterbridge/Rocket.Chat.Go.SDK/models | ||||||
| github.com/matterbridge/Rocket.Chat.Go.SDK/realtime | github.com/matterbridge/Rocket.Chat.Go.SDK/realtime | ||||||
| github.com/matterbridge/Rocket.Chat.Go.SDK/rest | github.com/matterbridge/Rocket.Chat.Go.SDK/rest | ||||||
| # github.com/matterbridge/discordgo v0.21.2-0.20210201201054-fb39a175b4f7 |  | ||||||
| ## explicit; go 1.10 |  | ||||||
| github.com/matterbridge/discordgo |  | ||||||
| # github.com/matterbridge/go-xmpp v0.0.0-20211030125215-791a06c5f1be | # github.com/matterbridge/go-xmpp v0.0.0-20211030125215-791a06c5f1be | ||||||
| ## explicit | ## explicit | ||||||
| github.com/matterbridge/go-xmpp | github.com/matterbridge/go-xmpp | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Wim
					Wim