forked from jshiffer/matterbridge
Update dependencies and fix whatsmeow API changes (#1887)
* Update dependencies * Fix whatsmau API changes
This commit is contained in:
parent
7abf1a5884
commit
fda05f2262
@ -1,3 +1,4 @@
|
||||
//go:build whatsappmulti
|
||||
// +build whatsappmulti
|
||||
|
||||
package bwhatsapp
|
||||
@ -77,7 +78,7 @@ func (b *Bwhatsapp) getSenderNotify(senderJid types.JID) string {
|
||||
|
||||
func (b *Bwhatsapp) GetProfilePicThumb(jid string) (*types.ProfilePictureInfo, error) {
|
||||
pjid, _ := types.ParseJID(jid)
|
||||
info, err := b.wc.GetProfilePictureInfo(pjid, true)
|
||||
info, err := b.wc.GetProfilePictureInfo(pjid, true, "")
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get avatar: %v", err)
|
||||
}
|
||||
|
@ -1,3 +1,4 @@
|
||||
//go:build whatsappmulti
|
||||
// +build whatsappmulti
|
||||
|
||||
package bwhatsapp
|
||||
@ -234,7 +235,7 @@ func (b *Bwhatsapp) PostDocumentMessage(msg config.Message, filetype string) (st
|
||||
b.Log.Debugf("=> Sending %#v", msg)
|
||||
|
||||
ID := whatsmeow.GenerateMessageID()
|
||||
_, err = b.wc.SendMessage(groupJID, ID, &message)
|
||||
_, err = b.wc.SendMessage(context.TODO(), groupJID, ID, &message)
|
||||
|
||||
return ID, err
|
||||
}
|
||||
@ -268,7 +269,7 @@ func (b *Bwhatsapp) PostImageMessage(msg config.Message, filetype string) (strin
|
||||
b.Log.Debugf("=> Sending %#v", msg)
|
||||
|
||||
ID := whatsmeow.GenerateMessageID()
|
||||
_, err = b.wc.SendMessage(groupJID, ID, &message)
|
||||
_, err = b.wc.SendMessage(context.TODO(), groupJID, ID, &message)
|
||||
|
||||
return ID, err
|
||||
}
|
||||
@ -327,7 +328,7 @@ func (b *Bwhatsapp) Send(msg config.Message) (string, error) {
|
||||
message.Conversation = &text
|
||||
|
||||
ID := whatsmeow.GenerateMessageID()
|
||||
_, err := b.wc.SendMessage(groupJID, ID, &message)
|
||||
_, err := b.wc.SendMessage(context.TODO(), groupJID, ID, &message)
|
||||
|
||||
return ID, err
|
||||
}
|
||||
|
16
go.mod
16
go.mod
@ -7,12 +7,12 @@ require (
|
||||
github.com/Philipp15b/go-steam v1.0.1-0.20200727090957-6ae9b3c0a560
|
||||
github.com/Rhymen/go-whatsapp v0.1.2-0.20211102134409-31a2e740845c
|
||||
github.com/SevereCloud/vksdk/v2 v2.15.0
|
||||
github.com/bwmarrin/discordgo v0.25.0
|
||||
github.com/d5/tengo/v2 v2.12.1
|
||||
github.com/bwmarrin/discordgo v0.26.1
|
||||
github.com/d5/tengo/v2 v2.12.2
|
||||
github.com/davecgh/go-spew v1.1.1
|
||||
github.com/fsnotify/fsnotify v1.5.4
|
||||
github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1
|
||||
github.com/gomarkdown/markdown v0.0.0-20220731190611-dcdaee8e7a53
|
||||
github.com/gomarkdown/markdown v0.0.0-20220830015526-01a3c37d6f50
|
||||
github.com/google/gops v0.3.25
|
||||
github.com/gorilla/schema v1.2.0
|
||||
github.com/gorilla/websocket v1.5.0
|
||||
@ -21,8 +21,8 @@ require (
|
||||
github.com/jpillora/backoff v1.0.0
|
||||
github.com/keybase/go-keybase-chat-bot v0.0.0-20220322223021-75d497527469
|
||||
github.com/kyokomi/emoji/v2 v2.2.10
|
||||
github.com/labstack/echo/v4 v4.8.0
|
||||
github.com/lrstanley/girc v0.0.0-20220812131643-56459d73b75a
|
||||
github.com/labstack/echo/v4 v4.9.0
|
||||
github.com/lrstanley/girc v0.0.0-20220821023908-8e7df6d970f8
|
||||
github.com/matterbridge/Rocket.Chat.Go.SDK v0.0.0-20211016222428-79310a412696
|
||||
github.com/matterbridge/go-xmpp v0.0.0-20211030125215-791a06c5f1be
|
||||
github.com/matterbridge/gomatrix v0.0.0-20220411225302-271e5088ea27
|
||||
@ -47,9 +47,9 @@ require (
|
||||
github.com/writeas/go-strip-markdown v2.0.1+incompatible
|
||||
github.com/yaegashi/msgraph.go v0.1.4
|
||||
github.com/zfjagann/golang-ring v0.0.0-20220330170733-19bcea1b6289
|
||||
go.mau.fi/whatsmeow v0.0.0-20220804175245-31c5af44cb82
|
||||
golang.org/x/image v0.0.0-20220722155232-062f8c9fd539
|
||||
golang.org/x/oauth2 v0.0.0-20220808172628-8227340efae7
|
||||
go.mau.fi/whatsmeow v0.0.0-20220811191500-f650c10b0068
|
||||
golang.org/x/image v0.0.0-20220902085622-e7cb96979f69
|
||||
golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094
|
||||
golang.org/x/text v0.3.7
|
||||
gomod.garykim.dev/nc-talk v0.3.0
|
||||
google.golang.org/protobuf v1.28.1
|
||||
|
32
go.sum
32
go.sum
@ -285,8 +285,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/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/bwmarrin/discordgo v0.25.0 h1:NXhdfHRNxtwso6FPdzW2i3uBvvU7UIQTghmV2T4nqAs=
|
||||
github.com/bwmarrin/discordgo v0.25.0/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY=
|
||||
github.com/bwmarrin/discordgo v0.26.1 h1:AIrM+g3cl+iYBr4yBxCBp9tD9jR3K7upEjl0d89FRkE=
|
||||
github.com/bwmarrin/discordgo v0.26.1/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY=
|
||||
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.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||
@ -445,8 +445,8 @@ github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1S
|
||||
github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s=
|
||||
github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8=
|
||||
github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I=
|
||||
github.com/d5/tengo/v2 v2.12.1 h1:0dhup9b1wlEKe4bVyidZ+A5wccRFzYGG+ixTZkhS0mM=
|
||||
github.com/d5/tengo/v2 v2.12.1/go.mod h1:XRGjEs5I9jYIKTxly6HCF8oiiilk5E/RYXOZ5b0DZC8=
|
||||
github.com/d5/tengo/v2 v2.12.2 h1:79yyTgfWCABEJeuMuWy8R4xBnXA4Yp9i3EB0PCfoxLQ=
|
||||
github.com/d5/tengo/v2 v2.12.2/go.mod h1:XRGjEs5I9jYIKTxly6HCF8oiiilk5E/RYXOZ5b0DZC8=
|
||||
github.com/dave/jennifer v1.4.1/go.mod h1:7jEdnm+qBcxl8PC0zyp7vxcpSRnzXSt9r39tpTVGlwA=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
@ -703,8 +703,8 @@ github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW
|
||||
github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/gomarkdown/markdown v0.0.0-20220731190611-dcdaee8e7a53 h1:JguE3sS3yLzLiCTCnsmzVFuTvTMDJALbzCgurwY5G/0=
|
||||
github.com/gomarkdown/markdown v0.0.0-20220731190611-dcdaee8e7a53/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA=
|
||||
github.com/gomarkdown/markdown v0.0.0-20220830015526-01a3c37d6f50 h1:tSuUky4sFWjiIIEOefDDBjx5BUIT3kZwcXHM2CNDdTk=
|
||||
github.com/gomarkdown/markdown v0.0.0-20220830015526-01a3c37d6f50/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA=
|
||||
github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
|
||||
github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
|
||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
@ -1033,8 +1033,8 @@ github.com/kyokomi/emoji/v2 v2.2.10 h1:1z5eMVcxFifsmEoNpdeq4UahbcicgQ4FEHuzrCVwm
|
||||
github.com/kyokomi/emoji/v2 v2.2.10/go.mod h1:JUcn42DTdsXJo1SWanHh4HKDEyPaR5CqkmoirZZP9qE=
|
||||
github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g=
|
||||
github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y=
|
||||
github.com/labstack/echo/v4 v4.8.0 h1:wdc6yKVaHxkNOEdz4cRZs1pQkwSXPiRjq69yWP4QQS8=
|
||||
github.com/labstack/echo/v4 v4.8.0/go.mod h1:xkCDAdFCIf8jsFQ5NnbK7oqaF/yU1A1X20Ltm0OvSks=
|
||||
github.com/labstack/echo/v4 v4.9.0 h1:wPOF1CE6gvt/kmbMR4dGzWvHMPT+sAEUJOwOTtvITVY=
|
||||
github.com/labstack/echo/v4 v4.9.0/go.mod h1:xkCDAdFCIf8jsFQ5NnbK7oqaF/yU1A1X20Ltm0OvSks=
|
||||
github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k=
|
||||
github.com/labstack/gommon v0.3.1 h1:OomWaJXm7xR6L1HmEtGyQf26TEn7V6X88mktX9kee9o=
|
||||
github.com/labstack/gommon v0.3.1/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM=
|
||||
@ -1052,8 +1052,8 @@ github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||
github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||
github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||
github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||
github.com/lrstanley/girc v0.0.0-20220812131643-56459d73b75a h1:Ts1KhJMUe+9F0B1QyEKN8F8I748xdRXCbSeF8RAyYI4=
|
||||
github.com/lrstanley/girc v0.0.0-20220812131643-56459d73b75a/go.mod h1:lgrnhcF8bg/Bd5HA5DOb4Z+uGqUqGnp4skr+J2GwVgI=
|
||||
github.com/lrstanley/girc v0.0.0-20220821023908-8e7df6d970f8 h1:OeTVm9ph5q9eq9E+HDkUbiJtVvu+kNOhuLe5Qs83sEs=
|
||||
github.com/lrstanley/girc v0.0.0-20220821023908-8e7df6d970f8/go.mod h1:lgrnhcF8bg/Bd5HA5DOb4Z+uGqUqGnp4skr+J2GwVgI=
|
||||
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
|
||||
github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI=
|
||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||
@ -1725,8 +1725,8 @@ go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3
|
||||
go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=
|
||||
go.mau.fi/libsignal v0.0.0-20220628090436-4d18b66b087e h1:ByHDg+D+dMIGuBA2n+1xOUf4xr3FJFYg8yxl06s1YBE=
|
||||
go.mau.fi/libsignal v0.0.0-20220628090436-4d18b66b087e/go.mod h1:RCdzkTWSJv0AKGqurzPXJsEGIVMuQps3E/h7CMUPous=
|
||||
go.mau.fi/whatsmeow v0.0.0-20220804175245-31c5af44cb82 h1:puhLha4NZeIXdwujCBduTR5MxG4+R/Q0vrCx8bYhZn8=
|
||||
go.mau.fi/whatsmeow v0.0.0-20220804175245-31c5af44cb82/go.mod h1:hsjqq2xLuoFew8vbsDCJcGf5EbXCRcR/yoQ+87w6m3k=
|
||||
go.mau.fi/whatsmeow v0.0.0-20220811191500-f650c10b0068 h1:DgSTWZ1LHSBxJFa3dvTvtMJGzqfYjinUFGLR3DujEts=
|
||||
go.mau.fi/whatsmeow v0.0.0-20220811191500-f650c10b0068/go.mod h1:hsjqq2xLuoFew8vbsDCJcGf5EbXCRcR/yoQ+87w6m3k=
|
||||
go.mongodb.org/mongo-driver v1.1.0/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
|
||||
go.mongodb.org/mongo-driver v1.7.0/go.mod h1:Q4oFMbo1+MSNqICAdYMlC/zSTrwCogR4R8NzkI+yfU8=
|
||||
go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk=
|
||||
@ -1839,8 +1839,8 @@ golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+o
|
||||
golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/image v0.0.0-20210622092929-e6eecd499c2c/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
|
||||
golang.org/x/image v0.0.0-20220321031419-a8550c1d254a/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
|
||||
golang.org/x/image v0.0.0-20220722155232-062f8c9fd539 h1:/eM0PCrQI2xd471rI+snWuu251/+/jpBpZqir2mPdnU=
|
||||
golang.org/x/image v0.0.0-20220722155232-062f8c9fd539/go.mod h1:doUCurBvlfPMKfmIpRIywoHmhN3VyhnoFDbvIEWF4hY=
|
||||
golang.org/x/image v0.0.0-20220902085622-e7cb96979f69 h1:Lj6HJGCSn5AjxRAH2+r35Mir4icalbqku+CLUtjnvXY=
|
||||
golang.org/x/image v0.0.0-20220902085622-e7cb96979f69/go.mod h1:doUCurBvlfPMKfmIpRIywoHmhN3VyhnoFDbvIEWF4hY=
|
||||
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20181217174547-8f45f776aaf1/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
@ -1972,8 +1972,8 @@ golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ
|
||||
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||
golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||
golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
|
||||
golang.org/x/oauth2 v0.0.0-20220808172628-8227340efae7 h1:dtndE8FcEta75/4kHF3AbpuWzV6f1LjnLrM4pe2SZrw=
|
||||
golang.org/x/oauth2 v0.0.0-20220808172628-8227340efae7/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
|
||||
golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094 h1:2o1E+E8TpNLklK9nHiPiK1uzIYrIHt+cQx3ynCwq9V8=
|
||||
golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
|
||||
golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
|
87
vendor/github.com/bwmarrin/discordgo/CONTRIBUTING.md
generated
vendored
Normal file
87
vendor/github.com/bwmarrin/discordgo/CONTRIBUTING.md
generated
vendored
Normal file
@ -0,0 +1,87 @@
|
||||
# Getting started
|
||||
|
||||
To start off you can check out existing Pull Requests and Issues to get a gasp of what problems we’re currently solving and what features you can implement.
|
||||
|
||||
## Issues
|
||||
|
||||
Our issues are mostly used for bugs, however we welcome refactoring and conceptual issues.
|
||||
|
||||
Any other conversation would belong and would be moved into “Discussions”.
|
||||
|
||||
## Discussions
|
||||
|
||||
We use discussions for ideas, polls, announcements and help questions.
|
||||
|
||||
Don’t hesitate to ask, we always would try to help.
|
||||
|
||||
## Pull Requests
|
||||
|
||||
If you want to help us by improving existing or adding new features, you create what’s called a Pull Request (aka PR). It allows us to review your code, suggest changes and merge it.
|
||||
|
||||
Here are some tips on how to make a good first PR:
|
||||
|
||||
- When creating a PR, please consider a distinctive name and description for it, so the maintainers can understand what your PR changes / adds / removes.
|
||||
- It’s always a good idea to link documentation when implementing a new feature / endpoint
|
||||
- If you’re resolving an issue, don’t forget to [link it](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue) in the description.
|
||||
- Enable the checkbox to allow maintainers to edit your PR and make commits in the PR branch when necessary.
|
||||
- We may ask for changes, usually through suggestions or pull request comments. You can apply suggestions right in the UI. Any other change needs to be done manually.
|
||||
- Don’t forget to mark PR comments resolved when you’re done applying the changes.
|
||||
- Be patient and don’t close and reopen your PR when no one responds, sometimes it might be held for a while. There might be a lot of reasons: release preparation, the feature is not significant, maintainers are busy, etc.
|
||||
|
||||
|
||||
When your changes are still incomplete (i.e. in Work In Progress state), you can still create a PR, but consider making it a draft.
|
||||
To make a draft PR, you can change the type of PR by clicking to a triangle next to the “Create Pull Request” button.
|
||||
|
||||
Once you’re done, you can mark it as “Ready for review”, and we’ll get right on it.
|
||||
|
||||
|
||||
# Code style
|
||||
|
||||
To standardize and make things less messy we have a certain code style, that is persistent throughout the codebase.
|
||||
|
||||
## Naming
|
||||
|
||||
### REST methods
|
||||
|
||||
When naming a REST method, while it might seem counterintuitive, we specify the entity before the action verb (for GET endpoints we don’t specify one however). Here’s an example:
|
||||
|
||||
> Endpoint name: Get Channel Message
|
||||
>
|
||||
> Method name: `ChannelMessage`
|
||||
|
||||
> Endpoint name: Edit Channel Message
|
||||
>
|
||||
> Method name: `ChannelMessageEdit`
|
||||
|
||||
### Parameter structures
|
||||
|
||||
When making a complex REST endpoint, sometimes you might need to implement a `Param` structure. This structure contains parameters for certain endpoint/set of endpoints.
|
||||
|
||||
- If an endpoint/set of endpoints have mostly same parameters, it’s a good idea to use a single `Param` structure for them. Here’s an example:
|
||||
|
||||
> Endpoint: `GuildMemberEdit`
|
||||
>
|
||||
> `Param` structure: `GuildMemberParams`
|
||||
- If an endpoint/set of endpoints have differentiating parameters, `Param` structure can be named after the endpoint’s verb. Here’s an example:
|
||||
|
||||
> Endpoint: `ChannelMessageSendComplex`
|
||||
>
|
||||
> `Param` structure: `MessageSend`
|
||||
|
||||
> Endpoint: `ChannelMessageEditComplex`
|
||||
>
|
||||
> `Param` structure: `MessageEdit`
|
||||
|
||||
### Events
|
||||
|
||||
When naming an event, we follow gateway’s internal naming (which often matches with the official event name in the docs). Here’s an example:
|
||||
|
||||
> Event name: Interaction Create (`INTERACTION_CREATE`)
|
||||
>
|
||||
> Structure name: `InteractionCreate`
|
||||
|
||||
## Returns
|
||||
|
||||
In our REST functions we usually favor named returns instead of regular anonymous returns. This helps readability.
|
||||
|
||||
Additionally we try to avoid naked return statements for functions with a long body. Since it’s easier to loose track of the return result.
|
8
vendor/github.com/bwmarrin/discordgo/README.md
generated
vendored
8
vendor/github.com/bwmarrin/discordgo/README.md
generated
vendored
@ -1,6 +1,6 @@
|
||||
# DiscordGo
|
||||
|
||||
[![Go Reference](https://pkg.go.dev/badge/github.com/bwmarrin/discordgo.svg)](https://pkg.go.dev/github.com/bwmarrin/discordgo) [![Go Report Card](https://goreportcard.com/badge/github.com/bwmarrin/discordgo)](https://goreportcard.com/report/github.com/bwmarrin/discordgo) [![Build Status](https://travis-ci.com/bwmarrin/discordgo.svg?branch=master)](https://travis-ci.com/bwmarrin/discordgo) [![Discord Gophers](https://img.shields.io/badge/Discord%20Gophers-%23discordgo-blue.svg)](https://discord.gg/golang) [![Discord API](https://img.shields.io/badge/Discord%20API-%23go_discordgo-blue.svg)](https://discord.com/invite/discord-api)
|
||||
[![Go Reference](https://pkg.go.dev/badge/github.com/bwmarrin/discordgo.svg)](https://pkg.go.dev/github.com/bwmarrin/discordgo) [![Go Report Card](https://goreportcard.com/badge/github.com/bwmarrin/discordgo)](https://goreportcard.com/report/github.com/bwmarrin/discordgo) [![CI](https://github.com/bwmarrin/discordgo/actions/workflows/ci.yml/badge.svg)](https://github.com/bwmarrin/discordgo/actions/workflows/ci.yml) [![Discord Gophers](https://img.shields.io/badge/Discord%20Gophers-%23discordgo-blue.svg)](https://discord.gg/golang) [![Discord API](https://img.shields.io/badge/Discord%20API-%23go_discordgo-blue.svg)](https://discord.com/invite/discord-api)
|
||||
|
||||
<img align="right" alt="DiscordGo logo" src="docs/img/discordgo.svg" width="400">
|
||||
|
||||
@ -61,11 +61,9 @@ See Documentation and Examples below for more detailed information.
|
||||
Because of that there may be major changes to library in the future.
|
||||
|
||||
The DiscordGo code is fairly well documented at this point and is currently
|
||||
the only documentation available. Both GoDoc and GoWalker (below) present
|
||||
that information in a nice format.
|
||||
the only documentation available. Go reference (below) presents that information in a nice format.
|
||||
|
||||
- [![Go Reference](https://pkg.go.dev/badge/github.com/bwmarrin/discordgo.svg)](https://pkg.go.dev/github.com/bwmarrin/discordgo)
|
||||
- [![Go Walker](https://gowalker.org/api/v1/badge)](https://gowalker.org/github.com/bwmarrin/discordgo)
|
||||
- [![Go Reference](https://pkg.go.dev/badge/github.com/bwmarrin/discordgo.svg)](https://pkg.go.dev/github.com/bwmarrin/discordgo)
|
||||
- Hand crafted documentation coming eventually.
|
||||
|
||||
|
||||
|
7
vendor/github.com/bwmarrin/discordgo/discord.go
generated
vendored
7
vendor/github.com/bwmarrin/discordgo/discord.go
generated
vendored
@ -17,10 +17,12 @@ import (
|
||||
"net/http"
|
||||
"runtime"
|
||||
"time"
|
||||
|
||||
"github.com/gorilla/websocket"
|
||||
)
|
||||
|
||||
// VERSION of DiscordGo, follows Semantic Versioning. (http://semver.org/)
|
||||
const VERSION = "0.25.0"
|
||||
const VERSION = "0.26.1"
|
||||
|
||||
// New creates a new Discord session with provided token.
|
||||
// If the token is for a bot, it must be prefixed with "Bot "
|
||||
@ -41,12 +43,13 @@ func New(token string) (s *Session, err error) {
|
||||
ShardCount: 1,
|
||||
MaxRestRetries: 3,
|
||||
Client: &http.Client{Timeout: (20 * time.Second)},
|
||||
Dialer: websocket.DefaultDialer,
|
||||
UserAgent: "DiscordBot (https://github.com/bwmarrin/discordgo, v" + VERSION + ")",
|
||||
sequence: new(int64),
|
||||
LastHeartbeatAck: time.Now().UTC(),
|
||||
}
|
||||
|
||||
// Initilize the Identify Package with defaults
|
||||
// Initialize the Identify Package with defaults
|
||||
// These can be modified prior to calling Open()
|
||||
s.Identify.Compress = true
|
||||
s.Identify.LargeThreshold = 250
|
||||
|
6
vendor/github.com/bwmarrin/discordgo/endpoints.go
generated
vendored
6
vendor/github.com/bwmarrin/discordgo/endpoints.go
generated
vendored
@ -46,8 +46,6 @@ var (
|
||||
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" }
|
||||
@ -64,10 +62,14 @@ var (
|
||||
|
||||
EndpointUserGuilds = func(uID string) string { return EndpointUsers + uID + "/guilds" }
|
||||
EndpointUserGuild = func(uID, gID string) string { return EndpointUsers + uID + "/guilds/" + gID }
|
||||
EndpointUserGuildMember = func(uID, gID string) string { return EndpointUserGuild(uID, gID) + "/member" }
|
||||
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 }
|
||||
EndpointGuildAutoModeration = func(gID string) string { return EndpointGuild(gID) + "/auto-moderation" }
|
||||
EndpointGuildAutoModerationRules = func(gID string) string { return EndpointGuildAutoModeration(gID) + "/rules" }
|
||||
EndpointGuildAutoModerationRule = func(gID, rID string) string { return EndpointGuildAutoModerationRules(gID) + "/" + rID }
|
||||
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" }
|
||||
|
503
vendor/github.com/bwmarrin/discordgo/eventhandlers.go
generated
vendored
503
vendor/github.com/bwmarrin/discordgo/eventhandlers.go
generated
vendored
@ -7,69 +7,168 @@ package discordgo
|
||||
// Event type values are used to match the events returned by Discord.
|
||||
// EventTypes surrounded by __ are synthetic and are internal to DiscordGo.
|
||||
const (
|
||||
channelCreateEventType = "CHANNEL_CREATE"
|
||||
channelDeleteEventType = "CHANNEL_DELETE"
|
||||
channelPinsUpdateEventType = "CHANNEL_PINS_UPDATE"
|
||||
channelUpdateEventType = "CHANNEL_UPDATE"
|
||||
connectEventType = "__CONNECT__"
|
||||
disconnectEventType = "__DISCONNECT__"
|
||||
eventEventType = "__EVENT__"
|
||||
guildBanAddEventType = "GUILD_BAN_ADD"
|
||||
guildBanRemoveEventType = "GUILD_BAN_REMOVE"
|
||||
guildCreateEventType = "GUILD_CREATE"
|
||||
guildDeleteEventType = "GUILD_DELETE"
|
||||
guildEmojisUpdateEventType = "GUILD_EMOJIS_UPDATE"
|
||||
guildIntegrationsUpdateEventType = "GUILD_INTEGRATIONS_UPDATE"
|
||||
guildMemberAddEventType = "GUILD_MEMBER_ADD"
|
||||
guildMemberRemoveEventType = "GUILD_MEMBER_REMOVE"
|
||||
guildMemberUpdateEventType = "GUILD_MEMBER_UPDATE"
|
||||
guildMembersChunkEventType = "GUILD_MEMBERS_CHUNK"
|
||||
guildRoleCreateEventType = "GUILD_ROLE_CREATE"
|
||||
guildRoleDeleteEventType = "GUILD_ROLE_DELETE"
|
||||
guildRoleUpdateEventType = "GUILD_ROLE_UPDATE"
|
||||
guildStageInstanceCreateEventType = "STAGE_INSTANCE_CREATE"
|
||||
guildStageInstanceUpdateEventType = "STAGE_INSTANCE_UPDATE"
|
||||
guildStageInstanceDeleteEventType = "STAGE_INSTANCE_DELETE"
|
||||
guildScheduledEventCreateEventType = "GUILD_SCHEDULED_EVENT_CREATE"
|
||||
guildScheduledEventDeleteEventType = "GUILD_SCHEDULED_EVENT_DELETE"
|
||||
guildScheduledEventUpdateEventType = "GUILD_SCHEDULED_EVENT_UPDATE"
|
||||
guildScheduledEventUserAddEventType = "GUILD_SCHEDULED_EVENT_USER_ADD"
|
||||
guildScheduledEventUserRemoveEventType = "GUILD_SCHEDULED_EVENT_USER_REMOVE"
|
||||
guildUpdateEventType = "GUILD_UPDATE"
|
||||
interactionCreateEventType = "INTERACTION_CREATE"
|
||||
inviteCreateEventType = "INVITE_CREATE"
|
||||
inviteDeleteEventType = "INVITE_DELETE"
|
||||
messageAckEventType = "MESSAGE_ACK"
|
||||
messageCreateEventType = "MESSAGE_CREATE"
|
||||
messageDeleteEventType = "MESSAGE_DELETE"
|
||||
messageDeleteBulkEventType = "MESSAGE_DELETE_BULK"
|
||||
messageReactionAddEventType = "MESSAGE_REACTION_ADD"
|
||||
messageReactionRemoveEventType = "MESSAGE_REACTION_REMOVE"
|
||||
messageReactionRemoveAllEventType = "MESSAGE_REACTION_REMOVE_ALL"
|
||||
messageUpdateEventType = "MESSAGE_UPDATE"
|
||||
presenceUpdateEventType = "PRESENCE_UPDATE"
|
||||
presencesReplaceEventType = "PRESENCES_REPLACE"
|
||||
rateLimitEventType = "__RATE_LIMIT__"
|
||||
readyEventType = "READY"
|
||||
relationshipAddEventType = "RELATIONSHIP_ADD"
|
||||
relationshipRemoveEventType = "RELATIONSHIP_REMOVE"
|
||||
resumedEventType = "RESUMED"
|
||||
threadCreateEventType = "THREAD_CREATE"
|
||||
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"
|
||||
applicationCommandPermissionsUpdateEventType = "APPLICATION_COMMAND_PERMISSIONS_UPDATE"
|
||||
autoModerationActionExecutionEventType = "AUTO_MODERATION_ACTION_EXECUTION"
|
||||
autoModerationRuleCreateEventType = "AUTO_MODERATION_RULE_CREATE"
|
||||
autoModerationRuleDeleteEventType = "AUTO_MODERATION_RULE_DELETE"
|
||||
autoModerationRuleUpdateEventType = "AUTO_MODERATION_RULE_UPDATE"
|
||||
channelCreateEventType = "CHANNEL_CREATE"
|
||||
channelDeleteEventType = "CHANNEL_DELETE"
|
||||
channelPinsUpdateEventType = "CHANNEL_PINS_UPDATE"
|
||||
channelUpdateEventType = "CHANNEL_UPDATE"
|
||||
connectEventType = "__CONNECT__"
|
||||
disconnectEventType = "__DISCONNECT__"
|
||||
eventEventType = "__EVENT__"
|
||||
guildBanAddEventType = "GUILD_BAN_ADD"
|
||||
guildBanRemoveEventType = "GUILD_BAN_REMOVE"
|
||||
guildCreateEventType = "GUILD_CREATE"
|
||||
guildDeleteEventType = "GUILD_DELETE"
|
||||
guildEmojisUpdateEventType = "GUILD_EMOJIS_UPDATE"
|
||||
guildIntegrationsUpdateEventType = "GUILD_INTEGRATIONS_UPDATE"
|
||||
guildMemberAddEventType = "GUILD_MEMBER_ADD"
|
||||
guildMemberRemoveEventType = "GUILD_MEMBER_REMOVE"
|
||||
guildMemberUpdateEventType = "GUILD_MEMBER_UPDATE"
|
||||
guildMembersChunkEventType = "GUILD_MEMBERS_CHUNK"
|
||||
guildRoleCreateEventType = "GUILD_ROLE_CREATE"
|
||||
guildRoleDeleteEventType = "GUILD_ROLE_DELETE"
|
||||
guildRoleUpdateEventType = "GUILD_ROLE_UPDATE"
|
||||
guildScheduledEventCreateEventType = "GUILD_SCHEDULED_EVENT_CREATE"
|
||||
guildScheduledEventDeleteEventType = "GUILD_SCHEDULED_EVENT_DELETE"
|
||||
guildScheduledEventUpdateEventType = "GUILD_SCHEDULED_EVENT_UPDATE"
|
||||
guildScheduledEventUserAddEventType = "GUILD_SCHEDULED_EVENT_USER_ADD"
|
||||
guildScheduledEventUserRemoveEventType = "GUILD_SCHEDULED_EVENT_USER_REMOVE"
|
||||
guildUpdateEventType = "GUILD_UPDATE"
|
||||
interactionCreateEventType = "INTERACTION_CREATE"
|
||||
inviteCreateEventType = "INVITE_CREATE"
|
||||
inviteDeleteEventType = "INVITE_DELETE"
|
||||
messageCreateEventType = "MESSAGE_CREATE"
|
||||
messageDeleteEventType = "MESSAGE_DELETE"
|
||||
messageDeleteBulkEventType = "MESSAGE_DELETE_BULK"
|
||||
messageReactionAddEventType = "MESSAGE_REACTION_ADD"
|
||||
messageReactionRemoveEventType = "MESSAGE_REACTION_REMOVE"
|
||||
messageReactionRemoveAllEventType = "MESSAGE_REACTION_REMOVE_ALL"
|
||||
messageUpdateEventType = "MESSAGE_UPDATE"
|
||||
presenceUpdateEventType = "PRESENCE_UPDATE"
|
||||
presencesReplaceEventType = "PRESENCES_REPLACE"
|
||||
rateLimitEventType = "__RATE_LIMIT__"
|
||||
readyEventType = "READY"
|
||||
resumedEventType = "RESUMED"
|
||||
stageInstanceEventCreateEventType = "STAGE_INSTANCE_EVENT_CREATE"
|
||||
stageInstanceEventDeleteEventType = "STAGE_INSTANCE_EVENT_DELETE"
|
||||
stageInstanceEventUpdateEventType = "STAGE_INSTANCE_EVENT_UPDATE"
|
||||
threadCreateEventType = "THREAD_CREATE"
|
||||
threadDeleteEventType = "THREAD_DELETE"
|
||||
threadListSyncEventType = "THREAD_LIST_SYNC"
|
||||
threadMemberUpdateEventType = "THREAD_MEMBER_UPDATE"
|
||||
threadMembersUpdateEventType = "THREAD_MEMBERS_UPDATE"
|
||||
threadUpdateEventType = "THREAD_UPDATE"
|
||||
typingStartEventType = "TYPING_START"
|
||||
userUpdateEventType = "USER_UPDATE"
|
||||
voiceServerUpdateEventType = "VOICE_SERVER_UPDATE"
|
||||
voiceStateUpdateEventType = "VOICE_STATE_UPDATE"
|
||||
webhooksUpdateEventType = "WEBHOOKS_UPDATE"
|
||||
)
|
||||
|
||||
// applicationCommandPermissionsUpdateEventHandler is an event handler for ApplicationCommandPermissionsUpdate events.
|
||||
type applicationCommandPermissionsUpdateEventHandler func(*Session, *ApplicationCommandPermissionsUpdate)
|
||||
|
||||
// Type returns the event type for ApplicationCommandPermissionsUpdate events.
|
||||
func (eh applicationCommandPermissionsUpdateEventHandler) Type() string {
|
||||
return applicationCommandPermissionsUpdateEventType
|
||||
}
|
||||
|
||||
// New returns a new instance of ApplicationCommandPermissionsUpdate.
|
||||
func (eh applicationCommandPermissionsUpdateEventHandler) New() interface{} {
|
||||
return &ApplicationCommandPermissionsUpdate{}
|
||||
}
|
||||
|
||||
// Handle is the handler for ApplicationCommandPermissionsUpdate events.
|
||||
func (eh applicationCommandPermissionsUpdateEventHandler) Handle(s *Session, i interface{}) {
|
||||
if t, ok := i.(*ApplicationCommandPermissionsUpdate); ok {
|
||||
eh(s, t)
|
||||
}
|
||||
}
|
||||
|
||||
// autoModerationActionExecutionEventHandler is an event handler for AutoModerationActionExecution events.
|
||||
type autoModerationActionExecutionEventHandler func(*Session, *AutoModerationActionExecution)
|
||||
|
||||
// Type returns the event type for AutoModerationActionExecution events.
|
||||
func (eh autoModerationActionExecutionEventHandler) Type() string {
|
||||
return autoModerationActionExecutionEventType
|
||||
}
|
||||
|
||||
// New returns a new instance of AutoModerationActionExecution.
|
||||
func (eh autoModerationActionExecutionEventHandler) New() interface{} {
|
||||
return &AutoModerationActionExecution{}
|
||||
}
|
||||
|
||||
// Handle is the handler for AutoModerationActionExecution events.
|
||||
func (eh autoModerationActionExecutionEventHandler) Handle(s *Session, i interface{}) {
|
||||
if t, ok := i.(*AutoModerationActionExecution); ok {
|
||||
eh(s, t)
|
||||
}
|
||||
}
|
||||
|
||||
// autoModerationRuleCreateEventHandler is an event handler for AutoModerationRuleCreate events.
|
||||
type autoModerationRuleCreateEventHandler func(*Session, *AutoModerationRuleCreate)
|
||||
|
||||
// Type returns the event type for AutoModerationRuleCreate events.
|
||||
func (eh autoModerationRuleCreateEventHandler) Type() string {
|
||||
return autoModerationRuleCreateEventType
|
||||
}
|
||||
|
||||
// New returns a new instance of AutoModerationRuleCreate.
|
||||
func (eh autoModerationRuleCreateEventHandler) New() interface{} {
|
||||
return &AutoModerationRuleCreate{}
|
||||
}
|
||||
|
||||
// Handle is the handler for AutoModerationRuleCreate events.
|
||||
func (eh autoModerationRuleCreateEventHandler) Handle(s *Session, i interface{}) {
|
||||
if t, ok := i.(*AutoModerationRuleCreate); ok {
|
||||
eh(s, t)
|
||||
}
|
||||
}
|
||||
|
||||
// autoModerationRuleDeleteEventHandler is an event handler for AutoModerationRuleDelete events.
|
||||
type autoModerationRuleDeleteEventHandler func(*Session, *AutoModerationRuleDelete)
|
||||
|
||||
// Type returns the event type for AutoModerationRuleDelete events.
|
||||
func (eh autoModerationRuleDeleteEventHandler) Type() string {
|
||||
return autoModerationRuleDeleteEventType
|
||||
}
|
||||
|
||||
// New returns a new instance of AutoModerationRuleDelete.
|
||||
func (eh autoModerationRuleDeleteEventHandler) New() interface{} {
|
||||
return &AutoModerationRuleDelete{}
|
||||
}
|
||||
|
||||
// Handle is the handler for AutoModerationRuleDelete events.
|
||||
func (eh autoModerationRuleDeleteEventHandler) Handle(s *Session, i interface{}) {
|
||||
if t, ok := i.(*AutoModerationRuleDelete); ok {
|
||||
eh(s, t)
|
||||
}
|
||||
}
|
||||
|
||||
// autoModerationRuleUpdateEventHandler is an event handler for AutoModerationRuleUpdate events.
|
||||
type autoModerationRuleUpdateEventHandler func(*Session, *AutoModerationRuleUpdate)
|
||||
|
||||
// Type returns the event type for AutoModerationRuleUpdate events.
|
||||
func (eh autoModerationRuleUpdateEventHandler) Type() string {
|
||||
return autoModerationRuleUpdateEventType
|
||||
}
|
||||
|
||||
// New returns a new instance of AutoModerationRuleUpdate.
|
||||
func (eh autoModerationRuleUpdateEventHandler) New() interface{} {
|
||||
return &AutoModerationRuleUpdate{}
|
||||
}
|
||||
|
||||
// Handle is the handler for AutoModerationRuleUpdate events.
|
||||
func (eh autoModerationRuleUpdateEventHandler) Handle(s *Session, i interface{}) {
|
||||
if t, ok := i.(*AutoModerationRuleUpdate); ok {
|
||||
eh(s, t)
|
||||
}
|
||||
}
|
||||
|
||||
// channelCreateEventHandler is an event handler for ChannelCreate events.
|
||||
type channelCreateEventHandler func(*Session, *ChannelCreate)
|
||||
|
||||
@ -455,66 +554,6 @@ func (eh guildRoleUpdateEventHandler) Handle(s *Session, i interface{}) {
|
||||
}
|
||||
}
|
||||
|
||||
// guildStageInstanceEventCreateHandler is an event handler for StageInstanceEventCreate events.
|
||||
type guildStageInstanceEventCreateHandler func(*Session, *StageInstanceEventCreate)
|
||||
|
||||
// Type returns the event type for StageInstanceEventCreate events.
|
||||
func (eh guildStageInstanceEventCreateHandler) Type() string {
|
||||
return guildStageInstanceCreateEventType
|
||||
}
|
||||
|
||||
// New returns a new instance of StageInstanceEventCreate.
|
||||
func (eh guildStageInstanceEventCreateHandler) New() interface{} {
|
||||
return &StageInstanceEventCreate{}
|
||||
}
|
||||
|
||||
// Handle is the handler for StageInstanceEventCreate events.
|
||||
func (eh guildStageInstanceEventCreateHandler) Handle(s *Session, i interface{}) {
|
||||
if t, ok := i.(*StageInstanceEventCreate); ok {
|
||||
eh(s, t)
|
||||
}
|
||||
}
|
||||
|
||||
// guildStageInstanceEventUpdateHandler is an event handler for StageInstanceEventUpdate events.
|
||||
type guildStageInstanceEventUpdateHandler func(*Session, *StageInstanceEventUpdate)
|
||||
|
||||
// Type returns the event type for StageInstanceEventUpdate events.
|
||||
func (eh guildStageInstanceEventUpdateHandler) Type() string {
|
||||
return guildStageInstanceCreateEventType
|
||||
}
|
||||
|
||||
// New returns a new instance of StageInstanceEventUpdate.
|
||||
func (eh guildStageInstanceEventUpdateHandler) New() interface{} {
|
||||
return &StageInstanceEventUpdate{}
|
||||
}
|
||||
|
||||
// Handle is the handler for StageInstanceEventUpdate events.
|
||||
func (eh guildStageInstanceEventUpdateHandler) Handle(s *Session, i interface{}) {
|
||||
if t, ok := i.(*StageInstanceEventUpdate); ok {
|
||||
eh(s, t)
|
||||
}
|
||||
}
|
||||
|
||||
// guildStageInstanceEventDeleteHandler is an event handler for StageInstanceEventDelete events.
|
||||
type guildStageInstanceEventDeleteHandler func(*Session, *StageInstanceEventDelete)
|
||||
|
||||
// Type returns the event type for StageInstanceEventDelete events.
|
||||
func (eh guildStageInstanceEventDeleteHandler) Type() string {
|
||||
return guildStageInstanceCreateEventType
|
||||
}
|
||||
|
||||
// New returns a new instance of StageInstanceEventDelete.
|
||||
func (eh guildStageInstanceEventDeleteHandler) New() interface{} {
|
||||
return &StageInstanceEventDelete{}
|
||||
}
|
||||
|
||||
// Handle is the handler for StageInstanceEventDelete events.
|
||||
func (eh guildStageInstanceEventDeleteHandler) Handle(s *Session, i interface{}) {
|
||||
if t, ok := i.(*StageInstanceEventDelete); ok {
|
||||
eh(s, t)
|
||||
}
|
||||
}
|
||||
|
||||
// guildScheduledEventCreateEventHandler is an event handler for GuildScheduledEventCreate events.
|
||||
type guildScheduledEventCreateEventHandler func(*Session, *GuildScheduledEventCreate)
|
||||
|
||||
@ -695,26 +734,6 @@ func (eh inviteDeleteEventHandler) Handle(s *Session, i interface{}) {
|
||||
}
|
||||
}
|
||||
|
||||
// messageAckEventHandler is an event handler for MessageAck events.
|
||||
type messageAckEventHandler func(*Session, *MessageAck)
|
||||
|
||||
// Type returns the event type for MessageAck events.
|
||||
func (eh messageAckEventHandler) Type() string {
|
||||
return messageAckEventType
|
||||
}
|
||||
|
||||
// New returns a new instance of MessageAck.
|
||||
func (eh messageAckEventHandler) New() interface{} {
|
||||
return &MessageAck{}
|
||||
}
|
||||
|
||||
// Handle is the handler for MessageAck events.
|
||||
func (eh messageAckEventHandler) Handle(s *Session, i interface{}) {
|
||||
if t, ok := i.(*MessageAck); ok {
|
||||
eh(s, t)
|
||||
}
|
||||
}
|
||||
|
||||
// messageCreateEventHandler is an event handler for MessageCreate events.
|
||||
type messageCreateEventHandler func(*Session, *MessageCreate)
|
||||
|
||||
@ -930,46 +949,6 @@ func (eh readyEventHandler) Handle(s *Session, i interface{}) {
|
||||
}
|
||||
}
|
||||
|
||||
// relationshipAddEventHandler is an event handler for RelationshipAdd events.
|
||||
type relationshipAddEventHandler func(*Session, *RelationshipAdd)
|
||||
|
||||
// Type returns the event type for RelationshipAdd events.
|
||||
func (eh relationshipAddEventHandler) Type() string {
|
||||
return relationshipAddEventType
|
||||
}
|
||||
|
||||
// New returns a new instance of RelationshipAdd.
|
||||
func (eh relationshipAddEventHandler) New() interface{} {
|
||||
return &RelationshipAdd{}
|
||||
}
|
||||
|
||||
// Handle is the handler for RelationshipAdd events.
|
||||
func (eh relationshipAddEventHandler) Handle(s *Session, i interface{}) {
|
||||
if t, ok := i.(*RelationshipAdd); ok {
|
||||
eh(s, t)
|
||||
}
|
||||
}
|
||||
|
||||
// relationshipRemoveEventHandler is an event handler for RelationshipRemove events.
|
||||
type relationshipRemoveEventHandler func(*Session, *RelationshipRemove)
|
||||
|
||||
// Type returns the event type for RelationshipRemove events.
|
||||
func (eh relationshipRemoveEventHandler) Type() string {
|
||||
return relationshipRemoveEventType
|
||||
}
|
||||
|
||||
// New returns a new instance of RelationshipRemove.
|
||||
func (eh relationshipRemoveEventHandler) New() interface{} {
|
||||
return &RelationshipRemove{}
|
||||
}
|
||||
|
||||
// Handle is the handler for RelationshipRemove events.
|
||||
func (eh relationshipRemoveEventHandler) Handle(s *Session, i interface{}) {
|
||||
if t, ok := i.(*RelationshipRemove); ok {
|
||||
eh(s, t)
|
||||
}
|
||||
}
|
||||
|
||||
// resumedEventHandler is an event handler for Resumed events.
|
||||
type resumedEventHandler func(*Session, *Resumed)
|
||||
|
||||
@ -990,6 +969,66 @@ func (eh resumedEventHandler) Handle(s *Session, i interface{}) {
|
||||
}
|
||||
}
|
||||
|
||||
// stageInstanceEventCreateEventHandler is an event handler for StageInstanceEventCreate events.
|
||||
type stageInstanceEventCreateEventHandler func(*Session, *StageInstanceEventCreate)
|
||||
|
||||
// Type returns the event type for StageInstanceEventCreate events.
|
||||
func (eh stageInstanceEventCreateEventHandler) Type() string {
|
||||
return stageInstanceEventCreateEventType
|
||||
}
|
||||
|
||||
// New returns a new instance of StageInstanceEventCreate.
|
||||
func (eh stageInstanceEventCreateEventHandler) New() interface{} {
|
||||
return &StageInstanceEventCreate{}
|
||||
}
|
||||
|
||||
// Handle is the handler for StageInstanceEventCreate events.
|
||||
func (eh stageInstanceEventCreateEventHandler) Handle(s *Session, i interface{}) {
|
||||
if t, ok := i.(*StageInstanceEventCreate); ok {
|
||||
eh(s, t)
|
||||
}
|
||||
}
|
||||
|
||||
// stageInstanceEventDeleteEventHandler is an event handler for StageInstanceEventDelete events.
|
||||
type stageInstanceEventDeleteEventHandler func(*Session, *StageInstanceEventDelete)
|
||||
|
||||
// Type returns the event type for StageInstanceEventDelete events.
|
||||
func (eh stageInstanceEventDeleteEventHandler) Type() string {
|
||||
return stageInstanceEventDeleteEventType
|
||||
}
|
||||
|
||||
// New returns a new instance of StageInstanceEventDelete.
|
||||
func (eh stageInstanceEventDeleteEventHandler) New() interface{} {
|
||||
return &StageInstanceEventDelete{}
|
||||
}
|
||||
|
||||
// Handle is the handler for StageInstanceEventDelete events.
|
||||
func (eh stageInstanceEventDeleteEventHandler) Handle(s *Session, i interface{}) {
|
||||
if t, ok := i.(*StageInstanceEventDelete); ok {
|
||||
eh(s, t)
|
||||
}
|
||||
}
|
||||
|
||||
// stageInstanceEventUpdateEventHandler is an event handler for StageInstanceEventUpdate events.
|
||||
type stageInstanceEventUpdateEventHandler func(*Session, *StageInstanceEventUpdate)
|
||||
|
||||
// Type returns the event type for StageInstanceEventUpdate events.
|
||||
func (eh stageInstanceEventUpdateEventHandler) Type() string {
|
||||
return stageInstanceEventUpdateEventType
|
||||
}
|
||||
|
||||
// New returns a new instance of StageInstanceEventUpdate.
|
||||
func (eh stageInstanceEventUpdateEventHandler) New() interface{} {
|
||||
return &StageInstanceEventUpdate{}
|
||||
}
|
||||
|
||||
// Handle is the handler for StageInstanceEventUpdate events.
|
||||
func (eh stageInstanceEventUpdateEventHandler) Handle(s *Session, i interface{}) {
|
||||
if t, ok := i.(*StageInstanceEventUpdate); ok {
|
||||
eh(s, t)
|
||||
}
|
||||
}
|
||||
|
||||
// threadCreateEventHandler is an event handler for ThreadCreate events.
|
||||
type threadCreateEventHandler func(*Session, *ThreadCreate)
|
||||
|
||||
@ -1130,66 +1169,6 @@ func (eh typingStartEventHandler) Handle(s *Session, i interface{}) {
|
||||
}
|
||||
}
|
||||
|
||||
// userGuildSettingsUpdateEventHandler is an event handler for UserGuildSettingsUpdate events.
|
||||
type userGuildSettingsUpdateEventHandler func(*Session, *UserGuildSettingsUpdate)
|
||||
|
||||
// Type returns the event type for UserGuildSettingsUpdate events.
|
||||
func (eh userGuildSettingsUpdateEventHandler) Type() string {
|
||||
return userGuildSettingsUpdateEventType
|
||||
}
|
||||
|
||||
// New returns a new instance of UserGuildSettingsUpdate.
|
||||
func (eh userGuildSettingsUpdateEventHandler) New() interface{} {
|
||||
return &UserGuildSettingsUpdate{}
|
||||
}
|
||||
|
||||
// Handle is the handler for UserGuildSettingsUpdate events.
|
||||
func (eh userGuildSettingsUpdateEventHandler) Handle(s *Session, i interface{}) {
|
||||
if t, ok := i.(*UserGuildSettingsUpdate); ok {
|
||||
eh(s, t)
|
||||
}
|
||||
}
|
||||
|
||||
// userNoteUpdateEventHandler is an event handler for UserNoteUpdate events.
|
||||
type userNoteUpdateEventHandler func(*Session, *UserNoteUpdate)
|
||||
|
||||
// Type returns the event type for UserNoteUpdate events.
|
||||
func (eh userNoteUpdateEventHandler) Type() string {
|
||||
return userNoteUpdateEventType
|
||||
}
|
||||
|
||||
// New returns a new instance of UserNoteUpdate.
|
||||
func (eh userNoteUpdateEventHandler) New() interface{} {
|
||||
return &UserNoteUpdate{}
|
||||
}
|
||||
|
||||
// Handle is the handler for UserNoteUpdate events.
|
||||
func (eh userNoteUpdateEventHandler) Handle(s *Session, i interface{}) {
|
||||
if t, ok := i.(*UserNoteUpdate); ok {
|
||||
eh(s, t)
|
||||
}
|
||||
}
|
||||
|
||||
// userSettingsUpdateEventHandler is an event handler for UserSettingsUpdate events.
|
||||
type userSettingsUpdateEventHandler func(*Session, *UserSettingsUpdate)
|
||||
|
||||
// Type returns the event type for UserSettingsUpdate events.
|
||||
func (eh userSettingsUpdateEventHandler) Type() string {
|
||||
return userSettingsUpdateEventType
|
||||
}
|
||||
|
||||
// New returns a new instance of UserSettingsUpdate.
|
||||
func (eh userSettingsUpdateEventHandler) New() interface{} {
|
||||
return &UserSettingsUpdate{}
|
||||
}
|
||||
|
||||
// Handle is the handler for UserSettingsUpdate events.
|
||||
func (eh userSettingsUpdateEventHandler) Handle(s *Session, i interface{}) {
|
||||
if t, ok := i.(*UserSettingsUpdate); ok {
|
||||
eh(s, t)
|
||||
}
|
||||
}
|
||||
|
||||
// userUpdateEventHandler is an event handler for UserUpdate events.
|
||||
type userUpdateEventHandler func(*Session, *UserUpdate)
|
||||
|
||||
@ -1274,6 +1253,16 @@ func handlerForInterface(handler interface{}) EventHandler {
|
||||
switch v := handler.(type) {
|
||||
case func(*Session, interface{}):
|
||||
return interfaceEventHandler(v)
|
||||
case func(*Session, *ApplicationCommandPermissionsUpdate):
|
||||
return applicationCommandPermissionsUpdateEventHandler(v)
|
||||
case func(*Session, *AutoModerationActionExecution):
|
||||
return autoModerationActionExecutionEventHandler(v)
|
||||
case func(*Session, *AutoModerationRuleCreate):
|
||||
return autoModerationRuleCreateEventHandler(v)
|
||||
case func(*Session, *AutoModerationRuleDelete):
|
||||
return autoModerationRuleDeleteEventHandler(v)
|
||||
case func(*Session, *AutoModerationRuleUpdate):
|
||||
return autoModerationRuleUpdateEventHandler(v)
|
||||
case func(*Session, *ChannelCreate):
|
||||
return channelCreateEventHandler(v)
|
||||
case func(*Session, *ChannelDelete):
|
||||
@ -1332,8 +1321,6 @@ func handlerForInterface(handler interface{}) EventHandler {
|
||||
return inviteCreateEventHandler(v)
|
||||
case func(*Session, *InviteDelete):
|
||||
return inviteDeleteEventHandler(v)
|
||||
case func(*Session, *MessageAck):
|
||||
return messageAckEventHandler(v)
|
||||
case func(*Session, *MessageCreate):
|
||||
return messageCreateEventHandler(v)
|
||||
case func(*Session, *MessageDelete):
|
||||
@ -1356,12 +1343,14 @@ func handlerForInterface(handler interface{}) EventHandler {
|
||||
return rateLimitEventHandler(v)
|
||||
case func(*Session, *Ready):
|
||||
return readyEventHandler(v)
|
||||
case func(*Session, *RelationshipAdd):
|
||||
return relationshipAddEventHandler(v)
|
||||
case func(*Session, *RelationshipRemove):
|
||||
return relationshipRemoveEventHandler(v)
|
||||
case func(*Session, *Resumed):
|
||||
return resumedEventHandler(v)
|
||||
case func(*Session, *StageInstanceEventCreate):
|
||||
return stageInstanceEventCreateEventHandler(v)
|
||||
case func(*Session, *StageInstanceEventDelete):
|
||||
return stageInstanceEventDeleteEventHandler(v)
|
||||
case func(*Session, *StageInstanceEventUpdate):
|
||||
return stageInstanceEventUpdateEventHandler(v)
|
||||
case func(*Session, *ThreadCreate):
|
||||
return threadCreateEventHandler(v)
|
||||
case func(*Session, *ThreadDelete):
|
||||
@ -1376,12 +1365,6 @@ func handlerForInterface(handler interface{}) EventHandler {
|
||||
return threadUpdateEventHandler(v)
|
||||
case func(*Session, *TypingStart):
|
||||
return typingStartEventHandler(v)
|
||||
case func(*Session, *UserGuildSettingsUpdate):
|
||||
return userGuildSettingsUpdateEventHandler(v)
|
||||
case func(*Session, *UserNoteUpdate):
|
||||
return userNoteUpdateEventHandler(v)
|
||||
case func(*Session, *UserSettingsUpdate):
|
||||
return userSettingsUpdateEventHandler(v)
|
||||
case func(*Session, *UserUpdate):
|
||||
return userUpdateEventHandler(v)
|
||||
case func(*Session, *VoiceServerUpdate):
|
||||
@ -1396,6 +1379,11 @@ func handlerForInterface(handler interface{}) EventHandler {
|
||||
}
|
||||
|
||||
func init() {
|
||||
registerInterfaceProvider(applicationCommandPermissionsUpdateEventHandler(nil))
|
||||
registerInterfaceProvider(autoModerationActionExecutionEventHandler(nil))
|
||||
registerInterfaceProvider(autoModerationRuleCreateEventHandler(nil))
|
||||
registerInterfaceProvider(autoModerationRuleDeleteEventHandler(nil))
|
||||
registerInterfaceProvider(autoModerationRuleUpdateEventHandler(nil))
|
||||
registerInterfaceProvider(channelCreateEventHandler(nil))
|
||||
registerInterfaceProvider(channelDeleteEventHandler(nil))
|
||||
registerInterfaceProvider(channelPinsUpdateEventHandler(nil))
|
||||
@ -1422,7 +1410,6 @@ func init() {
|
||||
registerInterfaceProvider(interactionCreateEventHandler(nil))
|
||||
registerInterfaceProvider(inviteCreateEventHandler(nil))
|
||||
registerInterfaceProvider(inviteDeleteEventHandler(nil))
|
||||
registerInterfaceProvider(messageAckEventHandler(nil))
|
||||
registerInterfaceProvider(messageCreateEventHandler(nil))
|
||||
registerInterfaceProvider(messageDeleteEventHandler(nil))
|
||||
registerInterfaceProvider(messageDeleteBulkEventHandler(nil))
|
||||
@ -1433,9 +1420,10 @@ func init() {
|
||||
registerInterfaceProvider(presenceUpdateEventHandler(nil))
|
||||
registerInterfaceProvider(presencesReplaceEventHandler(nil))
|
||||
registerInterfaceProvider(readyEventHandler(nil))
|
||||
registerInterfaceProvider(relationshipAddEventHandler(nil))
|
||||
registerInterfaceProvider(relationshipRemoveEventHandler(nil))
|
||||
registerInterfaceProvider(resumedEventHandler(nil))
|
||||
registerInterfaceProvider(stageInstanceEventCreateEventHandler(nil))
|
||||
registerInterfaceProvider(stageInstanceEventDeleteEventHandler(nil))
|
||||
registerInterfaceProvider(stageInstanceEventUpdateEventHandler(nil))
|
||||
registerInterfaceProvider(threadCreateEventHandler(nil))
|
||||
registerInterfaceProvider(threadDeleteEventHandler(nil))
|
||||
registerInterfaceProvider(threadListSyncEventHandler(nil))
|
||||
@ -1443,9 +1431,6 @@ func init() {
|
||||
registerInterfaceProvider(threadMembersUpdateEventHandler(nil))
|
||||
registerInterfaceProvider(threadUpdateEventHandler(nil))
|
||||
registerInterfaceProvider(typingStartEventHandler(nil))
|
||||
registerInterfaceProvider(userGuildSettingsUpdateEventHandler(nil))
|
||||
registerInterfaceProvider(userNoteUpdateEventHandler(nil))
|
||||
registerInterfaceProvider(userSettingsUpdateEventHandler(nil))
|
||||
registerInterfaceProvider(userUpdateEventHandler(nil))
|
||||
registerInterfaceProvider(voiceServerUpdateEventHandler(nil))
|
||||
registerInterfaceProvider(voiceStateUpdateEventHandler(nil))
|
||||
|
83
vendor/github.com/bwmarrin/discordgo/events.go
generated
vendored
83
vendor/github.com/bwmarrin/discordgo/events.go
generated
vendored
@ -36,19 +36,13 @@ type Event struct {
|
||||
|
||||
// A Ready stores all data for the websocket READY event.
|
||||
type Ready struct {
|
||||
Version int `json:"v"`
|
||||
SessionID string `json:"session_id"`
|
||||
User *User `json:"user"`
|
||||
ReadState []*ReadState `json:"read_state"`
|
||||
PrivateChannels []*Channel `json:"private_channels"`
|
||||
Guilds []*Guild `json:"guilds"`
|
||||
Version int `json:"v"`
|
||||
SessionID string `json:"session_id"`
|
||||
User *User `json:"user"`
|
||||
Guilds []*Guild `json:"guilds"`
|
||||
PrivateChannels []*Channel `json:"private_channels"`
|
||||
|
||||
// Undocumented fields
|
||||
Settings *Settings `json:"user_settings"`
|
||||
UserGuildSettings []*UserGuildSettings `json:"user_guild_settings"`
|
||||
Relationships []*Relationship `json:"relationships"`
|
||||
Presences []*Presence `json:"presences"`
|
||||
Notes map[string]string `json:"notes"`
|
||||
// TODO: Application and Shard
|
||||
}
|
||||
|
||||
// ChannelCreate is the data for a ChannelCreate event.
|
||||
@ -245,12 +239,6 @@ type GuildScheduledEventUserRemove struct {
|
||||
GuildID string `json:"guild_id"`
|
||||
}
|
||||
|
||||
// MessageAck is the data for a MessageAck event.
|
||||
type MessageAck struct {
|
||||
MessageID string `json:"message_id"`
|
||||
ChannelID string `json:"channel_id"`
|
||||
}
|
||||
|
||||
// MessageCreate is the data for a MessageCreate event.
|
||||
type MessageCreate struct {
|
||||
*Message
|
||||
@ -314,16 +302,6 @@ type Resumed struct {
|
||||
Trace []string `json:"_trace"`
|
||||
}
|
||||
|
||||
// RelationshipAdd is the data for a RelationshipAdd event.
|
||||
type RelationshipAdd struct {
|
||||
*Relationship
|
||||
}
|
||||
|
||||
// RelationshipRemove is the data for a RelationshipRemove event.
|
||||
type RelationshipRemove struct {
|
||||
*Relationship
|
||||
}
|
||||
|
||||
// TypingStart is the data for a TypingStart event.
|
||||
type TypingStart struct {
|
||||
UserID string `json:"user_id"`
|
||||
@ -337,20 +315,6 @@ type UserUpdate struct {
|
||||
*User
|
||||
}
|
||||
|
||||
// UserSettingsUpdate is the data for a UserSettingsUpdate event.
|
||||
type UserSettingsUpdate map[string]interface{}
|
||||
|
||||
// UserGuildSettingsUpdate is the data for a UserGuildSettingsUpdate event.
|
||||
type UserGuildSettingsUpdate struct {
|
||||
*UserGuildSettings
|
||||
}
|
||||
|
||||
// UserNoteUpdate is the data for a UserNoteUpdate event.
|
||||
type UserNoteUpdate struct {
|
||||
ID string `json:"id"`
|
||||
Note string `json:"note"`
|
||||
}
|
||||
|
||||
// VoiceServerUpdate is the data for a VoiceServerUpdate event.
|
||||
type VoiceServerUpdate struct {
|
||||
Token string `json:"token"`
|
||||
@ -401,3 +365,38 @@ type InviteDelete struct {
|
||||
GuildID string `json:"guild_id"`
|
||||
Code string `json:"code"`
|
||||
}
|
||||
|
||||
// ApplicationCommandPermissionsUpdate is the data for an ApplicationCommandPermissionsUpdate event
|
||||
type ApplicationCommandPermissionsUpdate struct {
|
||||
*GuildApplicationCommandPermissions
|
||||
}
|
||||
|
||||
// AutoModerationRuleCreate is the data for an AutoModerationRuleCreate event.
|
||||
type AutoModerationRuleCreate struct {
|
||||
*AutoModerationRule
|
||||
}
|
||||
|
||||
// AutoModerationRuleUpdate is the data for an AutoModerationRuleUpdate event.
|
||||
type AutoModerationRuleUpdate struct {
|
||||
*AutoModerationRule
|
||||
}
|
||||
|
||||
// AutoModerationRuleDelete is the data for an AutoModerationRuleDelete event.
|
||||
type AutoModerationRuleDelete struct {
|
||||
*AutoModerationRule
|
||||
}
|
||||
|
||||
// AutoModerationActionExecution is the data for an AutoModerationActionExecution event.
|
||||
type AutoModerationActionExecution struct {
|
||||
GuildID string `json:"guild_id"`
|
||||
Action AutoModerationAction `json:"action"`
|
||||
RuleID string `json:"rule_id"`
|
||||
RuleTriggerType AutoModerationRuleTriggerType `json:"rule_trigger_type"`
|
||||
UserID string `json:"user_id"`
|
||||
ChannelID string `json:"channel_id"`
|
||||
MessageID string `json:"message_id"`
|
||||
AlertSystemMessageID string `json:"alert_system_message_id"`
|
||||
Content string `json:"content"`
|
||||
MatchedKeyword string `json:"matched_keyword"`
|
||||
MatchedContent string `json:"matched_content"`
|
||||
}
|
||||
|
35
vendor/github.com/bwmarrin/discordgo/interactions.go
generated
vendored
35
vendor/github.com/bwmarrin/discordgo/interactions.go
generated
vendored
@ -9,6 +9,7 @@ import (
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"time"
|
||||
)
|
||||
|
||||
@ -32,11 +33,15 @@ const (
|
||||
type ApplicationCommand struct {
|
||||
ID string `json:"id,omitempty"`
|
||||
ApplicationID string `json:"application_id,omitempty"`
|
||||
GuildID string `json:"guild_id,omitempty"`
|
||||
Version string `json:"version,omitempty"`
|
||||
Type ApplicationCommandType `json:"type,omitempty"`
|
||||
Name string `json:"name"`
|
||||
NameLocalizations *map[Locale]string `json:"name_localizations,omitempty"`
|
||||
DefaultPermission *bool `json:"default_permission,omitempty"`
|
||||
// NOTE: DefaultPermission will be soon deprecated. Use DefaultMemberPermissions and DMPermission instead.
|
||||
DefaultPermission *bool `json:"default_permission,omitempty"`
|
||||
DefaultMemberPermissions *int64 `json:"default_member_permissions,string,omitempty"`
|
||||
DMPermission *bool `json:"dm_permission,omitempty"`
|
||||
|
||||
// NOTE: Chat commands only. Otherwise it mustn't be set.
|
||||
|
||||
@ -113,6 +118,10 @@ type ApplicationCommandOption struct {
|
||||
MinValue *float64 `json:"min_value,omitempty"`
|
||||
// Maximum value of number/integer option.
|
||||
MaxValue float64 `json:"max_value,omitempty"`
|
||||
// Minimum length of string option.
|
||||
MinLength *int `json:"min_length,omitempty"`
|
||||
// Maximum length of string option.
|
||||
MaxLength int `json:"max_length,omitempty"`
|
||||
}
|
||||
|
||||
// ApplicationCommandOptionChoice represents a slash command option choice.
|
||||
@ -129,6 +138,18 @@ type ApplicationCommandPermissions struct {
|
||||
Permission bool `json:"permission"`
|
||||
}
|
||||
|
||||
// GuildAllChannelsID is a helper function which returns guild_id-1.
|
||||
// It is used in ApplicationCommandPermissions to target all the channels within a guild.
|
||||
func GuildAllChannelsID(guild string) (id string, err error) {
|
||||
var v uint64
|
||||
v, err = strconv.ParseUint(guild, 10, 64)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
return strconv.FormatUint(v-1, 10), nil
|
||||
}
|
||||
|
||||
// ApplicationCommandPermissionsList represents a list of ApplicationCommandPermissions, needed for serializing to JSON.
|
||||
type ApplicationCommandPermissionsList struct {
|
||||
Permissions []*ApplicationCommandPermissions `json:"permissions"`
|
||||
@ -147,8 +168,9 @@ type ApplicationCommandPermissionType uint8
|
||||
|
||||
// Application command permission types.
|
||||
const (
|
||||
ApplicationCommandPermissionTypeRole ApplicationCommandPermissionType = 1
|
||||
ApplicationCommandPermissionTypeUser ApplicationCommandPermissionType = 2
|
||||
ApplicationCommandPermissionTypeRole ApplicationCommandPermissionType = 1
|
||||
ApplicationCommandPermissionTypeUser ApplicationCommandPermissionType = 2
|
||||
ApplicationCommandPermissionTypeChannel ApplicationCommandPermissionType = 3
|
||||
)
|
||||
|
||||
// InteractionType indicates the type of an interaction event.
|
||||
@ -190,6 +212,9 @@ type Interaction struct {
|
||||
// NOTE: this field is only filled when a button click triggered the interaction. Otherwise it will be nil.
|
||||
Message *Message `json:"message"`
|
||||
|
||||
// Bitwise set of permissions the app or bot has within the channel the interaction was sent from
|
||||
AppPermissions int64 `json:"app_permissions,string"`
|
||||
|
||||
// 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.
|
||||
@ -517,9 +542,11 @@ type InteractionResponseData struct {
|
||||
Components []MessageComponent `json:"components"`
|
||||
Embeds []*MessageEmbed `json:"embeds"`
|
||||
AllowedMentions *MessageAllowedMentions `json:"allowed_mentions,omitempty"`
|
||||
Flags uint64 `json:"flags,omitempty"`
|
||||
Files []*File `json:"-"`
|
||||
|
||||
// NOTE: only MessageFlagsSuppressEmbeds and MessageFlagsEphemeral can be set.
|
||||
Flags MessageFlags `json:"flags,omitempty"`
|
||||
|
||||
// NOTE: autocomplete interaction only.
|
||||
Choices []*ApplicationCommandOptionChoice `json:"choices,omitempty"`
|
||||
|
||||
|
2
vendor/github.com/bwmarrin/discordgo/logging.go
generated
vendored
2
vendor/github.com/bwmarrin/discordgo/logging.go
generated
vendored
@ -90,7 +90,7 @@ func (v *VoiceConnection) log(msgL int, format string, a ...interface{}) {
|
||||
msglog(msgL, 2, format, a...)
|
||||
}
|
||||
|
||||
// printJSON is a helper function to display JSON data in a easy to read format.
|
||||
// printJSON is a helper function to display JSON data in an easy to read format.
|
||||
/* NOT USED ATM
|
||||
func printJSON(body []byte) {
|
||||
var prettyJSON bytes.Buffer
|
||||
|
5
vendor/github.com/bwmarrin/discordgo/message.go
generated
vendored
5
vendor/github.com/bwmarrin/discordgo/message.go
generated
vendored
@ -321,6 +321,9 @@ type MessageAllowedMentions struct {
|
||||
// A list of user IDs to allow. This cannot be used when specifying
|
||||
// AllowedMentionTypeUsers in the Parse slice.
|
||||
Users []string `json:"users,omitempty"`
|
||||
|
||||
// For replies, whether to mention the author of the message being replied to
|
||||
RepliedUser bool `json:"replied_user"`
|
||||
}
|
||||
|
||||
// A MessageAttachment stores data for message attachments.
|
||||
@ -454,7 +457,7 @@ type MessageApplication struct {
|
||||
// MessageReference contains reference data sent with crossposted messages
|
||||
type MessageReference struct {
|
||||
MessageID string `json:"message_id"`
|
||||
ChannelID string `json:"channel_id"`
|
||||
ChannelID string `json:"channel_id,omitempty"`
|
||||
GuildID string `json:"guild_id,omitempty"`
|
||||
}
|
||||
|
||||
|
286
vendor/github.com/bwmarrin/discordgo/restapi.go
generated
vendored
286
vendor/github.com/bwmarrin/discordgo/restapi.go
generated
vendored
@ -334,6 +334,18 @@ func (s *Session) UserChannelCreate(recipientID string) (st *Channel, err error)
|
||||
return
|
||||
}
|
||||
|
||||
// UserGuildMember returns a guild member object for the current user in the given Guild.
|
||||
// guildID : ID of the guild
|
||||
func (s *Session) UserGuildMember(guildID string) (st *Member, err error) {
|
||||
body, err := s.RequestWithBucketID("GET", EndpointUserGuildMember("@me", guildID), nil, EndpointUserGuildMember("@me", guildID))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
err = unmarshal(body, &st)
|
||||
return
|
||||
}
|
||||
|
||||
// UserGuilds returns an array of UserGuild structures for all guilds.
|
||||
// limit : The number guilds that can be returned. (max 100)
|
||||
// beforeID : If provided all guilds returned will be before given ID.
|
||||
@ -541,7 +553,7 @@ func (s *Session) GuildCreate(name string) (st *Guild, err error) {
|
||||
// GuildEdit edits a new Guild
|
||||
// guildID : The ID of a Guild
|
||||
// g : A GuildParams struct with the values Name, Region and VerificationLevel defined.
|
||||
func (s *Session) GuildEdit(guildID string, g GuildParams) (st *Guild, err error) {
|
||||
func (s *Session) GuildEdit(guildID string, g *GuildParams) (st *Guild, err error) {
|
||||
|
||||
// Bounds checking for VerificationLevel, interval: [0, 4]
|
||||
if g.VerificationLevel != nil {
|
||||
@ -760,22 +772,10 @@ func (s *Session) GuildMember(guildID, userID string) (st *Member, err error) {
|
||||
}
|
||||
|
||||
// GuildMemberAdd force joins a user to the guild.
|
||||
// accessToken : Valid access_token for the user.
|
||||
// guildID : The ID of a Guild.
|
||||
// userID : The ID of a User.
|
||||
// nick : Value to set users nickname to
|
||||
// roles : A list of role ID's to set on the member.
|
||||
// mute : If the user is muted.
|
||||
// deaf : If the user is deafened.
|
||||
func (s *Session) GuildMemberAdd(accessToken, guildID, userID, nick string, roles []string, mute, deaf bool) (err error) {
|
||||
|
||||
data := struct {
|
||||
AccessToken string `json:"access_token"`
|
||||
Nick string `json:"nick,omitempty"`
|
||||
Roles []string `json:"roles,omitempty"`
|
||||
Mute bool `json:"mute,omitempty"`
|
||||
Deaf bool `json:"deaf,omitempty"`
|
||||
}{accessToken, nick, roles, mute, deaf}
|
||||
// data : Parameters of the user to add.
|
||||
func (s *Session) GuildMemberAdd(guildID, userID string, data *GuildMemberAddParams) (err error) {
|
||||
|
||||
_, err = s.RequestWithBucketID("PUT", EndpointGuildMember(guildID, userID), data, EndpointGuildMember(guildID, ""))
|
||||
if err != nil {
|
||||
@ -808,25 +808,11 @@ func (s *Session) GuildMemberDeleteWithReason(guildID, userID, reason string) (e
|
||||
return
|
||||
}
|
||||
|
||||
// GuildMemberEdit edits the roles of a member.
|
||||
// GuildMemberEdit edits and returns updated member.
|
||||
// guildID : The ID of a Guild.
|
||||
// userID : The ID of a User.
|
||||
// roles : A list of role ID's to set on the member.
|
||||
func (s *Session) GuildMemberEdit(guildID, userID string, roles []string) (err error) {
|
||||
|
||||
data := struct {
|
||||
Roles []string `json:"roles"`
|
||||
}{roles}
|
||||
|
||||
_, err = s.RequestWithBucketID("PATCH", EndpointGuildMember(guildID, userID), data, EndpointGuildMember(guildID, ""))
|
||||
return
|
||||
}
|
||||
|
||||
// GuildMemberEditComplex edits the nickname and roles of a member.
|
||||
// guildID : The ID of a Guild.
|
||||
// userID : The ID of a User.
|
||||
// data : A GuildMemberEditData struct with the new nickname and roles
|
||||
func (s *Session) GuildMemberEditComplex(guildID, userID string, data GuildMemberParams) (st *Member, err error) {
|
||||
// data : Updated GuildMember data.
|
||||
func (s *Session) GuildMemberEdit(guildID, userID string, data *GuildMemberParams) (st *Member, err error) {
|
||||
var body []byte
|
||||
body, err = s.RequestWithBucketID("PATCH", EndpointGuildMember(guildID, userID), data, EndpointGuildMember(guildID, ""))
|
||||
if err != nil {
|
||||
@ -837,6 +823,15 @@ func (s *Session) GuildMemberEditComplex(guildID, userID string, data GuildMembe
|
||||
return
|
||||
}
|
||||
|
||||
// GuildMemberEditComplex edits the nickname and roles of a member.
|
||||
// NOTE: deprecated, use GuildMemberEdit instead.
|
||||
// guildID : The ID of a Guild.
|
||||
// userID : The ID of a User.
|
||||
// data : A GuildMemberEditData struct with the new nickname and roles
|
||||
func (s *Session) GuildMemberEditComplex(guildID, userID string, data *GuildMemberParams) (st *Member, err error) {
|
||||
return s.GuildMemberEdit(guildID, userID, data)
|
||||
}
|
||||
|
||||
// GuildMemberMove moves a guild member from one voice channel to another/none
|
||||
// guildID : The ID of a Guild.
|
||||
// userID : The ID of a User.
|
||||
@ -1031,11 +1026,11 @@ func (s *Session) GuildRoles(guildID string) (st []*Role, err error) {
|
||||
return // TODO return pointer
|
||||
}
|
||||
|
||||
// GuildRoleCreate returns a new Guild Role.
|
||||
// guildID: The ID of a Guild.
|
||||
func (s *Session) GuildRoleCreate(guildID string) (st *Role, err error) {
|
||||
|
||||
body, err := s.RequestWithBucketID("POST", EndpointGuildRoles(guildID), nil, EndpointGuildRoles(guildID))
|
||||
// GuildRoleCreate creates a new Guild Role and returns it.
|
||||
// guildID : The ID of a Guild.
|
||||
// data : New Role parameters.
|
||||
func (s *Session) GuildRoleCreate(guildID string, data *RoleParams) (st *Role, err error) {
|
||||
body, err := s.RequestWithBucketID("POST", EndpointGuildRoles(guildID), data, EndpointGuildRoles(guildID))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
@ -1045,30 +1040,17 @@ func (s *Session) GuildRoleCreate(guildID string) (st *Role, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
// GuildRoleEdit updates an existing Guild Role with new values
|
||||
// GuildRoleEdit updates an existing Guild Role and returns updated Role data.
|
||||
// guildID : The ID of a Guild.
|
||||
// roleID : The ID of a Role.
|
||||
// name : The name of the Role.
|
||||
// color : The color of the role (decimal, not hex).
|
||||
// hoist : Whether to display the role's users separately.
|
||||
// perm : The permissions for the role.
|
||||
// mention : Whether this role is mentionable
|
||||
func (s *Session) GuildRoleEdit(guildID, roleID, name string, color int, hoist bool, perm int64, mention bool) (st *Role, err error) {
|
||||
// data : Updated Role data.
|
||||
func (s *Session) GuildRoleEdit(guildID, roleID string, data *RoleParams) (st *Role, err error) {
|
||||
|
||||
// Prevent sending a color int that is too big.
|
||||
if color > 0xFFFFFF {
|
||||
err = fmt.Errorf("color value cannot be larger than 0xFFFFFF")
|
||||
return nil, err
|
||||
if data.Color != nil && *data.Color > 0xFFFFFF {
|
||||
return nil, fmt.Errorf("color value cannot be larger than 0xFFFFFF")
|
||||
}
|
||||
|
||||
data := struct {
|
||||
Name string `json:"name"` // The role's name (overwrites existing)
|
||||
Color int `json:"color"` // The color the role should have (as a decimal, not hex)
|
||||
Hoist bool `json:"hoist"` // Whether to display the role's users separately
|
||||
Permissions int64 `json:"permissions,string"` // The overall permissions number of the role (overwrites existing)
|
||||
Mentionable bool `json:"mentionable"` // Whether this role is mentionable
|
||||
}{name, color, hoist, perm, mention}
|
||||
|
||||
body, err := s.RequestWithBucketID("PATCH", EndpointGuildRole(guildID, roleID), data, EndpointGuildRole(guildID, ""))
|
||||
if err != nil {
|
||||
return
|
||||
@ -1286,12 +1268,10 @@ func (s *Session) GuildEmbed(guildID string) (st *GuildEmbed, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
// GuildEmbedEdit returns the embed for a Guild.
|
||||
// GuildEmbedEdit edits the embed of a Guild.
|
||||
// guildID : The ID of a Guild.
|
||||
func (s *Session) GuildEmbedEdit(guildID string, enabled bool, channelID string) (err error) {
|
||||
|
||||
data := GuildEmbed{enabled, channelID}
|
||||
|
||||
// data : New GuildEmbed data.
|
||||
func (s *Session) GuildEmbedEdit(guildID string, data *GuildEmbed) (err error) {
|
||||
_, err = s.RequestWithBucketID("PATCH", EndpointGuildEmbed(guildID), data, EndpointGuildEmbed(guildID))
|
||||
return
|
||||
}
|
||||
@ -1359,19 +1339,10 @@ func (s *Session) GuildEmoji(guildID, emojiID string) (emoji *Emoji, err error)
|
||||
return
|
||||
}
|
||||
|
||||
// GuildEmojiCreate creates a new emoji
|
||||
// GuildEmojiCreate creates a new Emoji.
|
||||
// guildID : The ID of a Guild.
|
||||
// name : The Name of the Emoji.
|
||||
// image : The base64 encoded emoji image, has to be smaller than 256KB.
|
||||
// roles : The roles for which this emoji will be whitelisted, can be nil.
|
||||
func (s *Session) GuildEmojiCreate(guildID, name, image string, roles []string) (emoji *Emoji, err error) {
|
||||
|
||||
data := struct {
|
||||
Name string `json:"name"`
|
||||
Image string `json:"image"`
|
||||
Roles []string `json:"roles,omitempty"`
|
||||
}{name, image, roles}
|
||||
|
||||
// data : New Emoji data.
|
||||
func (s *Session) GuildEmojiCreate(guildID string, data *EmojiParams) (emoji *Emoji, err error) {
|
||||
body, err := s.RequestWithBucketID("POST", EndpointGuildEmojis(guildID), data, EndpointGuildEmojis(guildID))
|
||||
if err != nil {
|
||||
return
|
||||
@ -1381,18 +1352,11 @@ func (s *Session) GuildEmojiCreate(guildID, name, image string, roles []string)
|
||||
return
|
||||
}
|
||||
|
||||
// GuildEmojiEdit modifies an emoji
|
||||
// GuildEmojiEdit modifies and returns updated Emoji.
|
||||
// guildID : The ID of a Guild.
|
||||
// emojiID : The ID of an Emoji.
|
||||
// name : The Name of the Emoji.
|
||||
// roles : The roles for which this emoji will be whitelisted, if nil or empty the roles will be reset.
|
||||
func (s *Session) GuildEmojiEdit(guildID, emojiID, name string, roles []string) (emoji *Emoji, err error) {
|
||||
|
||||
data := struct {
|
||||
Name string `json:"name"`
|
||||
Roles []string `json:"roles"`
|
||||
}{name, roles}
|
||||
|
||||
// data : Updated Emoji data.
|
||||
func (s *Session) GuildEmojiEdit(guildID, emojiID string, data *EmojiParams) (emoji *Emoji, err error) {
|
||||
body, err := s.RequestWithBucketID("PATCH", EndpointGuildEmoji(guildID, emojiID), data, EndpointGuildEmojis(guildID))
|
||||
if err != nil {
|
||||
return
|
||||
@ -1458,16 +1422,9 @@ func (s *Session) GuildTemplates(guildID string) (st []*GuildTemplate, err error
|
||||
}
|
||||
|
||||
// GuildTemplateCreate creates a template for the guild
|
||||
// guildID: The ID of the guild
|
||||
// name: The name of the template (1-100 characters)
|
||||
// description: The description for the template (0-120 characters)
|
||||
func (s *Session) GuildTemplateCreate(guildID, name, description string) (st *GuildTemplate) {
|
||||
|
||||
data := struct {
|
||||
Name string `json:"name"`
|
||||
Description string `json:"description"`
|
||||
}{name, description}
|
||||
|
||||
// guildID : The ID of the guild
|
||||
// data : Template metadata
|
||||
func (s *Session) GuildTemplateCreate(guildID string, data *GuildTemplateParams) (st *GuildTemplate) {
|
||||
body, err := s.RequestWithBucketID("POST", EndpointGuildTemplates(guildID), data, EndpointGuildTemplates(guildID))
|
||||
if err != nil {
|
||||
return
|
||||
@ -1487,16 +1444,10 @@ func (s *Session) GuildTemplateSync(guildID, templateCode string) (err error) {
|
||||
}
|
||||
|
||||
// GuildTemplateEdit modifies the template's metadata
|
||||
// guildID: The ID of the guild
|
||||
// templateCode: The code of the template
|
||||
// name: The name of the template (1-100 characters)
|
||||
// description: The description for the template (0-120 characters)
|
||||
func (s *Session) GuildTemplateEdit(guildID, templateCode, name, description string) (st *GuildTemplate, err error) {
|
||||
|
||||
data := struct {
|
||||
Name string `json:"name,omitempty"`
|
||||
Description string `json:"description,omitempty"`
|
||||
}{name, description}
|
||||
// guildID : The ID of the guild
|
||||
// templateCode : The code of the template
|
||||
// data : New template metadata
|
||||
func (s *Session) GuildTemplateEdit(guildID, templateCode string, data *GuildTemplateParams) (st *GuildTemplate, err error) {
|
||||
|
||||
body, err := s.RequestWithBucketID("PATCH", EndpointGuildTemplateSync(guildID, templateCode), data, EndpointGuildTemplateSync(guildID, ""))
|
||||
if err != nil {
|
||||
@ -1532,19 +1483,10 @@ func (s *Session) Channel(channelID string) (st *Channel, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
// ChannelEdit edits the given channel
|
||||
// channelID : The ID of a Channel
|
||||
// name : The new name to assign the channel.
|
||||
func (s *Session) ChannelEdit(channelID, name string) (*Channel, error) {
|
||||
return s.ChannelEditComplex(channelID, &ChannelEdit{
|
||||
Name: name,
|
||||
})
|
||||
}
|
||||
|
||||
// ChannelEditComplex edits an existing channel, replacing the parameters entirely with ChannelEdit struct
|
||||
// channelID : The ID of a Channel
|
||||
// data : The channel struct to send
|
||||
func (s *Session) ChannelEditComplex(channelID string, data *ChannelEdit) (st *Channel, err error) {
|
||||
// ChannelEdit edits the given channel and returns the updated Channel data.
|
||||
// channelID : The ID of a Channel.
|
||||
// data : New Channel data.
|
||||
func (s *Session) ChannelEdit(channelID string, data *ChannelEdit) (st *Channel, err error) {
|
||||
body, err := s.RequestWithBucketID("PATCH", EndpointChannel(channelID), data, EndpointChannel(channelID))
|
||||
if err != nil {
|
||||
return
|
||||
@ -1552,6 +1494,15 @@ func (s *Session) ChannelEditComplex(channelID string, data *ChannelEdit) (st *C
|
||||
|
||||
err = unmarshal(body, &st)
|
||||
return
|
||||
|
||||
}
|
||||
|
||||
// ChannelEditComplex edits an existing channel, replacing the parameters entirely with ChannelEdit struct
|
||||
// NOTE: deprecated, use ChannelEdit instead
|
||||
// channelID : The ID of a Channel
|
||||
// data : The channel struct to send
|
||||
func (s *Session) ChannelEditComplex(channelID string, data *ChannelEdit) (st *Channel, err error) {
|
||||
return s.ChannelEdit(channelID, data)
|
||||
}
|
||||
|
||||
// ChannelDelete deletes the given channel
|
||||
@ -1729,6 +1680,28 @@ func (s *Session) ChannelMessageSendReply(channelID string, content string, refe
|
||||
})
|
||||
}
|
||||
|
||||
// ChannelMessageSendEmbedReply sends a message to the given channel with reference data and embedded data.
|
||||
// channelID : The ID of a Channel.
|
||||
// embed : The embed data to send.
|
||||
// reference : The message reference to send.
|
||||
func (s *Session) ChannelMessageSendEmbedReply(channelID string, embed *MessageEmbed, reference *MessageReference) (*Message, error) {
|
||||
return s.ChannelMessageSendEmbedsReply(channelID, []*MessageEmbed{embed}, reference)
|
||||
}
|
||||
|
||||
// ChannelMessageSendEmbedsReply sends a message to the given channel with reference data and multiple embedded data.
|
||||
// channelID : The ID of a Channel.
|
||||
// embeds : The embeds data to send.
|
||||
// reference : The message reference to send.
|
||||
func (s *Session) ChannelMessageSendEmbedsReply(channelID string, embeds []*MessageEmbed, reference *MessageReference) (*Message, error) {
|
||||
if reference == nil {
|
||||
return nil, fmt.Errorf("reply attempted with nil message reference")
|
||||
}
|
||||
return s.ChannelMessageSendComplex(channelID, &MessageSend{
|
||||
Embeds: embeds,
|
||||
Reference: reference,
|
||||
})
|
||||
}
|
||||
|
||||
// ChannelMessageEdit edits an existing message, replacing it entirely with
|
||||
// the given content.
|
||||
// channelID : The ID of a Channel
|
||||
@ -2792,7 +2765,7 @@ func (s *Session) ApplicationCommands(appID, guildID string) (cmd []*Application
|
||||
endpoint = EndpointApplicationGuildCommands(appID, guildID)
|
||||
}
|
||||
|
||||
body, err := s.RequestWithBucketID("GET", endpoint, nil, endpoint)
|
||||
body, err := s.RequestWithBucketID("GET", endpoint+"?with_localizations=true", nil, "GET "+endpoint)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
@ -2840,6 +2813,8 @@ func (s *Session) ApplicationCommandPermissions(appID, guildID, cmdID string) (p
|
||||
// guildID : The guild ID containing the application command
|
||||
// cmdID : The command ID to edit the permissions of
|
||||
// permissions : An object containing a list of permissions for the application command
|
||||
//
|
||||
// NOTE: Requires OAuth2 token with applications.commands.permissions.update scope
|
||||
func (s *Session) ApplicationCommandPermissionsEdit(appID, guildID, cmdID string, permissions *ApplicationCommandPermissionsList) (err error) {
|
||||
endpoint := EndpointApplicationCommandPermissions(appID, guildID, cmdID)
|
||||
|
||||
@ -2851,6 +2826,8 @@ func (s *Session) ApplicationCommandPermissionsEdit(appID, guildID, cmdID string
|
||||
// appID : The Application ID
|
||||
// guildID : The guild ID to batch edit commands of
|
||||
// permissions : A list of permissions paired with a command ID, guild ID, and application ID per application command
|
||||
//
|
||||
// NOTE: This endpoint has been disabled with updates to command permissions (Permissions v2). Please use ApplicationCommandPermissionsEdit instead.
|
||||
func (s *Session) ApplicationCommandPermissionsBatchEdit(appID, guildID string, permissions []*GuildApplicationCommandPermissions) (err error) {
|
||||
endpoint := EndpointApplicationCommandsGuildPermissions(appID, guildID)
|
||||
|
||||
@ -3085,3 +3062,80 @@ func (s *Session) GuildScheduledEventUsers(guildID, eventID string, limit int, w
|
||||
err = unmarshal(body, &st)
|
||||
return
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
// Functions specific to auto moderation
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
// AutoModerationRules returns a list of auto moderation rules.
|
||||
// guildID : ID of the guild
|
||||
func (s *Session) AutoModerationRules(guildID string) (st []*AutoModerationRule, err error) {
|
||||
endpoint := EndpointGuildAutoModerationRules(guildID)
|
||||
|
||||
var body []byte
|
||||
body, err = s.RequestWithBucketID("GET", endpoint, nil, endpoint)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
err = unmarshal(body, &st)
|
||||
return
|
||||
}
|
||||
|
||||
// AutoModerationRule returns an auto moderation rule.
|
||||
// guildID : ID of the guild
|
||||
// ruleID : ID of the auto moderation rule
|
||||
func (s *Session) AutoModerationRule(guildID, ruleID string) (st *AutoModerationRule, err error) {
|
||||
endpoint := EndpointGuildAutoModerationRule(guildID, ruleID)
|
||||
|
||||
var body []byte
|
||||
body, err = s.RequestWithBucketID("GET", endpoint, nil, endpoint)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
err = unmarshal(body, &st)
|
||||
return
|
||||
}
|
||||
|
||||
// AutoModerationRuleCreate creates an auto moderation rule with the given data and returns it.
|
||||
// guildID : ID of the guild
|
||||
// rule : Rule data
|
||||
func (s *Session) AutoModerationRuleCreate(guildID string, rule *AutoModerationRule) (st *AutoModerationRule, err error) {
|
||||
endpoint := EndpointGuildAutoModerationRules(guildID)
|
||||
|
||||
var body []byte
|
||||
body, err = s.RequestWithBucketID("POST", endpoint, rule, endpoint)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
err = unmarshal(body, &st)
|
||||
return
|
||||
}
|
||||
|
||||
// AutoModerationRuleEdit edits and returns the updated auto moderation rule.
|
||||
// guildID : ID of the guild
|
||||
// ruleID : ID of the auto moderation rule
|
||||
// rule : New rule data
|
||||
func (s *Session) AutoModerationRuleEdit(guildID, ruleID string, rule *AutoModerationRule) (st *AutoModerationRule, err error) {
|
||||
endpoint := EndpointGuildAutoModerationRule(guildID, ruleID)
|
||||
|
||||
var body []byte
|
||||
body, err = s.RequestWithBucketID("PATCH", endpoint, rule, endpoint)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
err = unmarshal(body, &st)
|
||||
return
|
||||
}
|
||||
|
||||
// AutoModerationRuleDelete deletes an auto moderation rule.
|
||||
// guildID : ID of the guild
|
||||
// ruleID : ID of the auto moderation rule
|
||||
func (s *Session) AutoModerationRuleDelete(guildID, ruleID string) (err error) {
|
||||
endpoint := EndpointGuildAutoModerationRule(guildID, ruleID)
|
||||
_, err = s.RequestWithBucketID("DELETE", endpoint, nil, endpoint)
|
||||
return
|
||||
}
|
||||
|
14
vendor/github.com/bwmarrin/discordgo/state.go
generated
vendored
14
vendor/github.com/bwmarrin/discordgo/state.go
generated
vendored
@ -7,7 +7,7 @@
|
||||
|
||||
// This file contains code related to state tracking. If enabled, state
|
||||
// tracking will capture the initial READY packet and many other websocket
|
||||
// events and maintain an in-memory state of of guilds, channels, users, and
|
||||
// events and maintain an in-memory state of guilds, channels, users, and
|
||||
// so forth. This information can be accessed through the Session.State struct.
|
||||
|
||||
package discordgo
|
||||
@ -661,18 +661,6 @@ func (s *State) ThreadMemberUpdate(mu *ThreadMemberUpdate) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// GuildChannel gets a channel by ID from a guild.
|
||||
// This method is Deprecated, use Channel(channelID)
|
||||
func (s *State) GuildChannel(guildID, channelID string) (*Channel, error) {
|
||||
return s.Channel(channelID)
|
||||
}
|
||||
|
||||
// PrivateChannel gets a private channel by ID.
|
||||
// This method is Deprecated, use Channel(channelID)
|
||||
func (s *State) PrivateChannel(channelID string) (*Channel, error) {
|
||||
return s.Channel(channelID)
|
||||
}
|
||||
|
||||
// Channel gets a channel by ID, it will look in all guilds and private channels.
|
||||
func (s *State) Channel(channelID string) (*Channel, error) {
|
||||
if s == nil {
|
||||
|
406
vendor/github.com/bwmarrin/discordgo/structs.go
generated
vendored
406
vendor/github.com/bwmarrin/discordgo/structs.go
generated
vendored
@ -59,12 +59,12 @@ type Session struct {
|
||||
ShardCount int
|
||||
|
||||
// Should state tracking be enabled.
|
||||
// State tracking is the best way for getting the the users
|
||||
// State tracking is the best way for getting the users
|
||||
// active guilds and the members of the guilds.
|
||||
StateEnabled bool
|
||||
|
||||
// Whether or not to call event handlers synchronously.
|
||||
// e.g false = launch event handlers in their own goroutines.
|
||||
// e.g. false = launch event handlers in their own goroutines.
|
||||
SyncEvents bool
|
||||
|
||||
// Exposed but should not be modified by User.
|
||||
@ -75,7 +75,7 @@ type Session struct {
|
||||
// Max number of REST API retries
|
||||
MaxRestRetries int
|
||||
|
||||
// Status stores the currect status of the websocket connection
|
||||
// Status stores the current status of the websocket connection
|
||||
// this is being tested, may stay, may go away.
|
||||
status int32
|
||||
|
||||
@ -95,6 +95,9 @@ type Session struct {
|
||||
// The http client used for REST requests
|
||||
Client *http.Client
|
||||
|
||||
// The dialer used for WebSocket connection
|
||||
Dialer *websocket.Dialer
|
||||
|
||||
// The user agent used for REST APIs
|
||||
UserAgent string
|
||||
|
||||
@ -197,23 +200,8 @@ type IntegrationAccount struct {
|
||||
|
||||
// A VoiceRegion stores data for a specific voice region server.
|
||||
type VoiceRegion struct {
|
||||
ID string `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Hostname string `json:"sample_hostname"`
|
||||
Port int `json:"sample_port"`
|
||||
}
|
||||
|
||||
// A VoiceICE stores data for voice ICE servers.
|
||||
type VoiceICE struct {
|
||||
TTL string `json:"ttl"`
|
||||
Servers []*ICEServer `json:"servers"`
|
||||
}
|
||||
|
||||
// A ICEServer stores data for a specific voice ICE server.
|
||||
type ICEServer struct {
|
||||
URL string `json:"url"`
|
||||
Username string `json:"username"`
|
||||
Credential string `json:"credential"`
|
||||
ID string `json:"id"`
|
||||
Name string `json:"name"`
|
||||
}
|
||||
|
||||
// InviteTargetType indicates the type of target of an invite
|
||||
@ -222,8 +210,8 @@ type InviteTargetType uint8
|
||||
|
||||
// Invite target types
|
||||
const (
|
||||
InviteTargetStream InviteTargetType = 1
|
||||
InviteTargetEmbeddedAppliction InviteTargetType = 2
|
||||
InviteTargetStream InviteTargetType = 1
|
||||
InviteTargetEmbeddedApplication InviteTargetType = 2
|
||||
)
|
||||
|
||||
// A Invite stores all data related to a specific Discord Guild or Channel invite.
|
||||
@ -246,6 +234,8 @@ type Invite struct {
|
||||
// will only be filled when using InviteWithCounts
|
||||
ApproximatePresenceCount int `json:"approximate_presence_count"`
|
||||
ApproximateMemberCount int `json:"approximate_member_count"`
|
||||
|
||||
ExpiresAt *time.Time `json:"expires_at"`
|
||||
}
|
||||
|
||||
// ChannelType is the type of a Channel
|
||||
@ -358,7 +348,7 @@ func (c *Channel) IsThread() bool {
|
||||
type ChannelEdit struct {
|
||||
Name string `json:"name,omitempty"`
|
||||
Topic string `json:"topic,omitempty"`
|
||||
NSFW bool `json:"nsfw,omitempty"`
|
||||
NSFW *bool `json:"nsfw,omitempty"`
|
||||
Position int `json:"position"`
|
||||
Bitrate int `json:"bitrate,omitempty"`
|
||||
UserLimit int `json:"user_limit,omitempty"`
|
||||
@ -368,10 +358,10 @@ type ChannelEdit struct {
|
||||
|
||||
// NOTE: threads only
|
||||
|
||||
Archived bool `json:"archived,omitempty"`
|
||||
AutoArchiveDuration int `json:"auto_archive_duration,omitempty"`
|
||||
Locked bool `json:"locked,bool"`
|
||||
Invitable bool `json:"invitable,omitempty"`
|
||||
Archived *bool `json:"archived,omitempty"`
|
||||
AutoArchiveDuration int `json:"auto_archive_duration,omitempty"`
|
||||
Locked *bool `json:"locked,omitempty"`
|
||||
Invitable *bool `json:"invitable,omitempty"`
|
||||
}
|
||||
|
||||
// A ChannelFollow holds data returned after following a news channel
|
||||
@ -489,6 +479,17 @@ func (e *Emoji) APIName() string {
|
||||
return e.ID
|
||||
}
|
||||
|
||||
// EmojiParams represents parameters needed to create or update an Emoji.
|
||||
type EmojiParams struct {
|
||||
// Name of the emoji
|
||||
Name string `json:"name,omitempty"`
|
||||
// A base64 encoded emoji image, has to be smaller than 256KB.
|
||||
// NOTE: can be only set on creation.
|
||||
Image string `json:"image,omitempty"`
|
||||
// Roles for which this emoji will be available.
|
||||
Roles []string `json:"roles,omitempty"`
|
||||
}
|
||||
|
||||
// StickerFormat is the file format of the Sticker.
|
||||
type StickerFormat int
|
||||
|
||||
@ -694,7 +695,7 @@ type Guild struct {
|
||||
NSFWLevel GuildNSFWLevel `json:"nsfw_level"`
|
||||
|
||||
// The list of enabled guild features
|
||||
Features []string `json:"features"`
|
||||
Features []GuildFeature `json:"features"`
|
||||
|
||||
// Required MFA level for the guild
|
||||
MfaLevel MfaLevel `json:"mfa_level"`
|
||||
@ -946,19 +947,19 @@ type GuildScheduledEventUser struct {
|
||||
Member *Member `json:"member"`
|
||||
}
|
||||
|
||||
// A GuildTemplate represents
|
||||
// A GuildTemplate represents a replicable template for guild creation
|
||||
type GuildTemplate struct {
|
||||
// The unique code for the guild template
|
||||
Code string `json:"code"`
|
||||
|
||||
// The name of the template
|
||||
Name string `json:"name"`
|
||||
Name string `json:"name,omitempty"`
|
||||
|
||||
// The description for the template
|
||||
Description string `json:"description"`
|
||||
Description *string `json:"description,omitempty"`
|
||||
|
||||
// The number of times this template has been used
|
||||
UsageCount string `json:"usage_count"`
|
||||
UsageCount int `json:"usage_count"`
|
||||
|
||||
// The ID of the user who created the template
|
||||
CreatorID string `json:"creator_id"`
|
||||
@ -982,6 +983,14 @@ type GuildTemplate struct {
|
||||
IsDirty bool `json:"is_dirty"`
|
||||
}
|
||||
|
||||
// GuildTemplateParams stores the data needed to create or update a GuildTemplate.
|
||||
type GuildTemplateParams struct {
|
||||
// The name of the template (1-100 characters)
|
||||
Name string `json:"name,omitempty"`
|
||||
// The description of the template (0-120 characters)
|
||||
Description string `json:"description,omitempty"`
|
||||
}
|
||||
|
||||
// MessageNotifications is the notification level for a guild
|
||||
// https://discord.com/developers/docs/resources/guild#guild-object-default-message-notification-level
|
||||
type MessageNotifications int
|
||||
@ -1025,13 +1034,42 @@ func (g *Guild) BannerURL() string {
|
||||
|
||||
// A UserGuild holds a brief version of a Guild
|
||||
type UserGuild struct {
|
||||
ID string `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Icon string `json:"icon"`
|
||||
Owner bool `json:"owner"`
|
||||
Permissions int64 `json:"permissions,string"`
|
||||
ID string `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Icon string `json:"icon"`
|
||||
Owner bool `json:"owner"`
|
||||
Permissions int64 `json:"permissions,string"`
|
||||
Features []GuildFeature `json:"features"`
|
||||
}
|
||||
|
||||
// GuildFeature indicates the presence of a feature in a guild
|
||||
type GuildFeature string
|
||||
|
||||
// Constants for GuildFeature
|
||||
const (
|
||||
GuildFeatureAnimatedBanner GuildFeature = "ANIMATED_BANNER"
|
||||
GuildFeatureAnimatedIcon GuildFeature = "ANIMATED_ICON"
|
||||
GuildFeatureAutoModeration GuildFeature = "AUTO_MODERATION"
|
||||
GuildFeatureBanner GuildFeature = "BANNER"
|
||||
GuildFeatureCommunity GuildFeature = "COMMUNITY"
|
||||
GuildFeatureDiscoverable GuildFeature = "DISCOVERABLE"
|
||||
GuildFeatureFeaturable GuildFeature = "FEATURABLE"
|
||||
GuildFeatureInviteSplash GuildFeature = "INVITE_SPLASH"
|
||||
GuildFeatureMemberVerificationGateEnabled GuildFeature = "MEMBER_VERIFICATION_GATE_ENABLED"
|
||||
GuildFeatureMonetizationEnabled GuildFeature = "MONETIZATION_ENABLED"
|
||||
GuildFeatureMoreStickers GuildFeature = "MORE_STICKERS"
|
||||
GuildFeatureNews GuildFeature = "NEWS"
|
||||
GuildFeaturePartnered GuildFeature = "PARTNERED"
|
||||
GuildFeaturePreviewEnabled GuildFeature = "PREVIEW_ENABLED"
|
||||
GuildFeaturePrivateThreads GuildFeature = "PRIVATE_THREADS"
|
||||
GuildFeatureRoleIcons GuildFeature = "ROLE_ICONS"
|
||||
GuildFeatureTicketedEventsEnabled GuildFeature = "TICKETED_EVENTS_ENABLED"
|
||||
GuildFeatureVanityURL GuildFeature = "VANITY_URL"
|
||||
GuildFeatureVerified GuildFeature = "VERIFIED"
|
||||
GuildFeatureVipRegions GuildFeature = "VIP_REGIONS"
|
||||
GuildFeatureWelcomeScreenEnabled GuildFeature = "WELCOME_SCREEN_ENABLED"
|
||||
)
|
||||
|
||||
// A GuildParams stores all the data needed to update discord guild settings
|
||||
type GuildParams struct {
|
||||
Name string `json:"name,omitempty"`
|
||||
@ -1081,6 +1119,20 @@ func (r *Role) Mention() string {
|
||||
return fmt.Sprintf("<@&%s>", r.ID)
|
||||
}
|
||||
|
||||
// RoleParams represents the parameters needed to create or update a Role
|
||||
type RoleParams struct {
|
||||
// The role's name
|
||||
Name string `json:"name,omitempty"`
|
||||
// The color the role should have (as a decimal, not hex)
|
||||
Color *int `json:"color,omitempty"`
|
||||
// Whether to display the role's users separately
|
||||
Hoist *bool `json:"hoist,omitempty"`
|
||||
// The overall permissions number of the role
|
||||
Permissions *int64 `json:"permissions,omitempty,string"`
|
||||
// Whether this role is mentionable
|
||||
Mentionable *bool `json:"mentionable,omitempty"`
|
||||
}
|
||||
|
||||
// Roles are a collection of Role
|
||||
type Roles []*Role
|
||||
|
||||
@ -1098,15 +1150,19 @@ func (r Roles) Swap(i, j int) {
|
||||
|
||||
// A VoiceState stores the voice states of Guilds
|
||||
type VoiceState struct {
|
||||
UserID string `json:"user_id"`
|
||||
SessionID string `json:"session_id"`
|
||||
ChannelID string `json:"channel_id"`
|
||||
GuildID string `json:"guild_id"`
|
||||
Suppress bool `json:"suppress"`
|
||||
SelfMute bool `json:"self_mute"`
|
||||
SelfDeaf bool `json:"self_deaf"`
|
||||
Mute bool `json:"mute"`
|
||||
Deaf bool `json:"deaf"`
|
||||
GuildID string `json:"guild_id"`
|
||||
ChannelID string `json:"channel_id"`
|
||||
UserID string `json:"user_id"`
|
||||
Member *Member `json:"member"`
|
||||
SessionID string `json:"session_id"`
|
||||
Deaf bool `json:"deaf"`
|
||||
Mute bool `json:"mute"`
|
||||
SelfDeaf bool `json:"self_deaf"`
|
||||
SelfMute bool `json:"self_mute"`
|
||||
SelfStream bool `json:"self_stream"`
|
||||
SelfVideo bool `json:"self_video"`
|
||||
Suppress bool `json:"suppress"`
|
||||
RequestToSpeakTimestamp *time.Time `json:"request_to_speak_timestamp"`
|
||||
}
|
||||
|
||||
// A Presence stores the online, offline, or idle and game status of Guild members.
|
||||
@ -1206,25 +1262,6 @@ func (m *Member) AvatarURL(size string) string {
|
||||
|
||||
}
|
||||
|
||||
// A Settings stores data for a specific users Discord client settings.
|
||||
type Settings struct {
|
||||
RenderEmbeds bool `json:"render_embeds"`
|
||||
InlineEmbedMedia bool `json:"inline_embed_media"`
|
||||
InlineAttachmentMedia bool `json:"inline_attachment_media"`
|
||||
EnableTTSCommand bool `json:"enable_tts_command"`
|
||||
MessageDisplayCompact bool `json:"message_display_compact"`
|
||||
ShowCurrentGame bool `json:"show_current_game"`
|
||||
ConvertEmoticons bool `json:"convert_emoticons"`
|
||||
Locale string `json:"locale"`
|
||||
Theme string `json:"theme"`
|
||||
GuildPositions []string `json:"guild_positions"`
|
||||
RestrictedGuilds []string `json:"restricted_guilds"`
|
||||
FriendSourceFlags *FriendSourceFlags `json:"friend_source_flags"`
|
||||
Status Status `json:"status"`
|
||||
DetectPlatformAccounts bool `json:"detect_platform_accounts"`
|
||||
DeveloperMode bool `json:"developer_mode"`
|
||||
}
|
||||
|
||||
// Status type definition
|
||||
type Status string
|
||||
|
||||
@ -1237,20 +1274,6 @@ const (
|
||||
StatusOffline Status = "offline"
|
||||
)
|
||||
|
||||
// FriendSourceFlags stores ... TODO :)
|
||||
type FriendSourceFlags struct {
|
||||
All bool `json:"all"`
|
||||
MutualGuilds bool `json:"mutual_guilds"`
|
||||
MutualFriends bool `json:"mutual_friends"`
|
||||
}
|
||||
|
||||
// A Relationship between the logged in user and Relationship.User
|
||||
type Relationship struct {
|
||||
User *User `json:"user"`
|
||||
Type int `json:"type"` // 1 = friend, 2 = blocked, 3 = incoming friend req, 4 = sent friend req
|
||||
ID string `json:"id"`
|
||||
}
|
||||
|
||||
// A TooManyRequests struct holds information received from Discord
|
||||
// when receiving a HTTP 429 response.
|
||||
type TooManyRequests struct {
|
||||
@ -1286,11 +1309,6 @@ type ReadState struct {
|
||||
ID string `json:"id"`
|
||||
}
|
||||
|
||||
// An Ack is used to ack messages
|
||||
type Ack struct {
|
||||
Token string `json:"token"`
|
||||
}
|
||||
|
||||
// A GuildRole stores data for guild roles.
|
||||
type GuildRole struct {
|
||||
Role *Role `json:"role"`
|
||||
@ -1303,10 +1321,92 @@ type GuildBan struct {
|
||||
User *User `json:"user"`
|
||||
}
|
||||
|
||||
// AutoModerationRule stores data for an auto moderation rule.
|
||||
type AutoModerationRule struct {
|
||||
ID string `json:"id,omitempty"`
|
||||
GuildID string `json:"guild_id,omitempty"`
|
||||
Name string `json:"name,omitempty"`
|
||||
CreatorID string `json:"creator_id,omitempty"`
|
||||
EventType AutoModerationRuleEventType `json:"event_type,omitempty"`
|
||||
TriggerType AutoModerationRuleTriggerType `json:"trigger_type,omitempty"`
|
||||
TriggerMetadata *AutoModerationTriggerMetadata `json:"trigger_metadata,omitempty"`
|
||||
Actions []AutoModerationAction `json:"actions,omitempty"`
|
||||
Enabled *bool `json:"enabled,omitempty"`
|
||||
ExemptRoles *[]string `json:"exempt_roles,omitempty"`
|
||||
ExemptChannels *[]string `json:"exempt_channels,omitempty"`
|
||||
}
|
||||
|
||||
// AutoModerationRuleEventType indicates in what event context a rule should be checked.
|
||||
type AutoModerationRuleEventType int
|
||||
|
||||
// Auto moderation rule event types.
|
||||
const (
|
||||
// AutoModerationEventMessageSend is checked when a member sends or edits a message in the guild
|
||||
AutoModerationEventMessageSend AutoModerationRuleEventType = 1
|
||||
)
|
||||
|
||||
// AutoModerationRuleTriggerType represents the type of content which can trigger the rule.
|
||||
type AutoModerationRuleTriggerType int
|
||||
|
||||
// Auto moderation rule trigger types.
|
||||
const (
|
||||
AutoModerationEventTriggerKeyword AutoModerationRuleTriggerType = 1
|
||||
AutoModerationEventTriggerHarmfulLink AutoModerationRuleTriggerType = 2
|
||||
AutoModerationEventTriggerSpam AutoModerationRuleTriggerType = 3
|
||||
AutoModerationEventTriggerKeywordPreset AutoModerationRuleTriggerType = 4
|
||||
)
|
||||
|
||||
// AutoModerationKeywordPreset represents an internally pre-defined wordset.
|
||||
type AutoModerationKeywordPreset uint
|
||||
|
||||
// Auto moderation keyword presets.
|
||||
const (
|
||||
AutoModerationKeywordPresetProfanity AutoModerationKeywordPreset = 1
|
||||
AutoModerationKeywordPresetSexualContent AutoModerationKeywordPreset = 2
|
||||
AutoModerationKeywordPresetSlurs AutoModerationKeywordPreset = 3
|
||||
)
|
||||
|
||||
// AutoModerationTriggerMetadata represents additional metadata used to determine whether rule should be triggered.
|
||||
type AutoModerationTriggerMetadata struct {
|
||||
// Substrings which will be searched for in content.
|
||||
// NOTE: should be only used with keyword trigger type.
|
||||
KeywordFilter []string `json:"keyword_filter,omitempty"`
|
||||
// Internally pre-defined wordsets which will be searched for in content.
|
||||
// NOTE: should be only used with keyword preset trigger type.
|
||||
Presets []AutoModerationKeywordPreset `json:"presets,omitempty"`
|
||||
}
|
||||
|
||||
// AutoModerationActionType represents an action which will execute whenever a rule is triggered.
|
||||
type AutoModerationActionType int
|
||||
|
||||
// Auto moderation actions types.
|
||||
const (
|
||||
AutoModerationRuleActionBlockMessage AutoModerationActionType = 1
|
||||
AutoModerationRuleActionSendAlertMessage AutoModerationActionType = 2
|
||||
AutoModerationRuleActionTimeout AutoModerationActionType = 3
|
||||
)
|
||||
|
||||
// AutoModerationActionMetadata represents additional metadata needed during execution for a specific action type.
|
||||
type AutoModerationActionMetadata struct {
|
||||
// Channel to which user content should be logged.
|
||||
// NOTE: should be only used with send alert message action type.
|
||||
ChannelID string `json:"channel_id,omitempty"`
|
||||
|
||||
// Timeout duration in seconds (maximum of 2419200 - 4 weeks).
|
||||
// NOTE: should be only used with timeout action type.
|
||||
Duration int `json:"duration_seconds,omitempty"`
|
||||
}
|
||||
|
||||
// AutoModerationAction stores data for an auto moderation action.
|
||||
type AutoModerationAction struct {
|
||||
Type AutoModerationActionType `json:"type"`
|
||||
Metadata *AutoModerationActionMetadata `json:"metadata,omitempty"`
|
||||
}
|
||||
|
||||
// A GuildEmbed stores data for a guild embed.
|
||||
type GuildEmbed struct {
|
||||
Enabled bool `json:"enabled"`
|
||||
ChannelID string `json:"channel_id"`
|
||||
Enabled *bool `json:"enabled,omitempty"`
|
||||
ChannelID string `json:"channel_id,omitempty"`
|
||||
}
|
||||
|
||||
// A GuildAuditLog stores data for a guild audit log.
|
||||
@ -1574,41 +1674,79 @@ const (
|
||||
AuditLogActionThreadCreate AuditLogAction = 110
|
||||
AuditLogActionThreadUpdate AuditLogAction = 111
|
||||
AuditLogActionThreadDelete AuditLogAction = 112
|
||||
|
||||
AuditLogActionApplicationCommandPermissionUpdate AuditLogAction = 121
|
||||
)
|
||||
|
||||
// A UserGuildSettingsChannelOverride stores data for a channel override for a users guild settings.
|
||||
type UserGuildSettingsChannelOverride struct {
|
||||
Muted bool `json:"muted"`
|
||||
MessageNotifications int `json:"message_notifications"`
|
||||
ChannelID string `json:"channel_id"`
|
||||
}
|
||||
|
||||
// A UserGuildSettings stores data for a users guild settings.
|
||||
type UserGuildSettings struct {
|
||||
SupressEveryone bool `json:"suppress_everyone"`
|
||||
Muted bool `json:"muted"`
|
||||
MobilePush bool `json:"mobile_push"`
|
||||
MessageNotifications int `json:"message_notifications"`
|
||||
GuildID string `json:"guild_id"`
|
||||
ChannelOverrides []*UserGuildSettingsChannelOverride `json:"channel_overrides"`
|
||||
}
|
||||
|
||||
// A UserGuildSettingsEdit stores data for editing UserGuildSettings
|
||||
type UserGuildSettingsEdit struct {
|
||||
SupressEveryone bool `json:"suppress_everyone"`
|
||||
Muted bool `json:"muted"`
|
||||
MobilePush bool `json:"mobile_push"`
|
||||
MessageNotifications int `json:"message_notifications"`
|
||||
ChannelOverrides map[string]*UserGuildSettingsChannelOverride `json:"channel_overrides"`
|
||||
}
|
||||
|
||||
// GuildMemberParams stores data needed to update a member
|
||||
// https://discord.com/developers/docs/resources/guild#modify-guild-member
|
||||
type GuildMemberParams struct {
|
||||
// Value to set user's nickname to
|
||||
// Value to set user's nickname to.
|
||||
Nick string `json:"nick,omitempty"`
|
||||
// Array of role ids the member is assigned
|
||||
// Array of role ids the member is assigned.
|
||||
Roles *[]string `json:"roles,omitempty"`
|
||||
// ID of channel to move user to (if they are connected to voice).
|
||||
// Set to "" to remove user from a voice channel.
|
||||
ChannelID *string `json:"channel_id,omitempty"`
|
||||
// Whether the user is muted in voice channels.
|
||||
Mute *bool `json:"mute,omitempty"`
|
||||
// Whether the user is deafened in voice channels.
|
||||
Deaf *bool `json:"deaf,omitempty"`
|
||||
// When the user's timeout will expire and the user will be able
|
||||
// to communicate in the guild again (up to 28 days in the future).
|
||||
// Set to time.Time{} to remove timeout.
|
||||
CommunicationDisabledUntil *time.Time `json:"communication_disabled_until,omitempty"`
|
||||
}
|
||||
|
||||
// MarshalJSON is a helper function to marshal GuildMemberParams.
|
||||
func (p GuildMemberParams) MarshalJSON() (res []byte, err error) {
|
||||
type guildMemberParams GuildMemberParams
|
||||
v := struct {
|
||||
guildMemberParams
|
||||
ChannelID json.RawMessage `json:"channel_id,omitempty"`
|
||||
CommunicationDisabledUntil json.RawMessage `json:"communication_disabled_until,omitempty"`
|
||||
}{guildMemberParams: guildMemberParams(p)}
|
||||
|
||||
if p.ChannelID != nil {
|
||||
if *p.ChannelID == "" {
|
||||
v.ChannelID = json.RawMessage(`null`)
|
||||
} else {
|
||||
res, err = json.Marshal(p.ChannelID)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
v.ChannelID = res
|
||||
}
|
||||
}
|
||||
|
||||
if p.CommunicationDisabledUntil != nil {
|
||||
if p.CommunicationDisabledUntil.IsZero() {
|
||||
v.CommunicationDisabledUntil = json.RawMessage(`null`)
|
||||
} else {
|
||||
res, err = json.Marshal(p.CommunicationDisabledUntil)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
v.CommunicationDisabledUntil = res
|
||||
}
|
||||
}
|
||||
|
||||
return json.Marshal(v)
|
||||
}
|
||||
|
||||
// GuildMemberAddParams stores data needed to add a user to a guild.
|
||||
// NOTE: All fields are optional, except AccessToken.
|
||||
type GuildMemberAddParams struct {
|
||||
// Valid access_token for the user.
|
||||
AccessToken string `json:"access_token"`
|
||||
// Value to set users nickname to.
|
||||
Nick string `json:"nick,omitempty"`
|
||||
// A list of role ID's to set on the member.
|
||||
Roles []string `json:"roles,omitempty"`
|
||||
// Whether the user is muted.
|
||||
Mute bool `json:"mute,omitempty"`
|
||||
// Whether the user is deafened.
|
||||
Deaf bool `json:"deaf,omitempty"`
|
||||
}
|
||||
|
||||
// An APIErrorMessage is an api error message returned from discord
|
||||
@ -2059,23 +2197,25 @@ type Intent int
|
||||
|
||||
// Constants for the different bit offsets of intents
|
||||
const (
|
||||
IntentGuilds Intent = 1 << 0
|
||||
IntentGuildMembers Intent = 1 << 1
|
||||
IntentGuildBans Intent = 1 << 2
|
||||
IntentGuildEmojis Intent = 1 << 3
|
||||
IntentGuildIntegrations Intent = 1 << 4
|
||||
IntentGuildWebhooks Intent = 1 << 5
|
||||
IntentGuildInvites Intent = 1 << 6
|
||||
IntentGuildVoiceStates Intent = 1 << 7
|
||||
IntentGuildPresences Intent = 1 << 8
|
||||
IntentGuildMessages Intent = 1 << 9
|
||||
IntentGuildMessageReactions Intent = 1 << 10
|
||||
IntentGuildMessageTyping Intent = 1 << 11
|
||||
IntentDirectMessages Intent = 1 << 12
|
||||
IntentDirectMessageReactions Intent = 1 << 13
|
||||
IntentDirectMessageTyping Intent = 1 << 14
|
||||
IntentMessageContent Intent = 1 << 15
|
||||
IntentGuildScheduledEvents Intent = 1 << 16
|
||||
IntentGuilds Intent = 1 << 0
|
||||
IntentGuildMembers Intent = 1 << 1
|
||||
IntentGuildBans Intent = 1 << 2
|
||||
IntentGuildEmojis Intent = 1 << 3
|
||||
IntentGuildIntegrations Intent = 1 << 4
|
||||
IntentGuildWebhooks Intent = 1 << 5
|
||||
IntentGuildInvites Intent = 1 << 6
|
||||
IntentGuildVoiceStates Intent = 1 << 7
|
||||
IntentGuildPresences Intent = 1 << 8
|
||||
IntentGuildMessages Intent = 1 << 9
|
||||
IntentGuildMessageReactions Intent = 1 << 10
|
||||
IntentGuildMessageTyping Intent = 1 << 11
|
||||
IntentDirectMessages Intent = 1 << 12
|
||||
IntentDirectMessageReactions Intent = 1 << 13
|
||||
IntentDirectMessageTyping Intent = 1 << 14
|
||||
IntentMessageContent Intent = 1 << 15
|
||||
IntentGuildScheduledEvents Intent = 1 << 16
|
||||
IntentAutoModerationConfiguration Intent = 1 << 20
|
||||
IntentAutoModerationExecution Intent = 1 << 21
|
||||
|
||||
// TODO: remove when compatibility is not needed
|
||||
|
||||
@ -2110,7 +2250,9 @@ const (
|
||||
IntentDirectMessages |
|
||||
IntentDirectMessageReactions |
|
||||
IntentDirectMessageTyping |
|
||||
IntentGuildScheduledEvents
|
||||
IntentGuildScheduledEvents |
|
||||
IntentAutoModerationConfiguration |
|
||||
IntentAutoModerationExecution
|
||||
|
||||
IntentsAll = IntentsAllWithoutPrivileged |
|
||||
IntentGuildMembers |
|
||||
|
21
vendor/github.com/bwmarrin/discordgo/voice.go
generated
vendored
21
vendor/github.com/bwmarrin/discordgo/voice.go
generated
vendored
@ -120,9 +120,9 @@ func (v *VoiceConnection) ChangeChannel(channelID string, mute, deaf bool) (err
|
||||
v.log(LogInformational, "called")
|
||||
|
||||
data := voiceChannelJoinOp{4, voiceChannelJoinData{&v.GuildID, &channelID, mute, deaf}}
|
||||
v.wsMutex.Lock()
|
||||
v.session.wsMutex.Lock()
|
||||
err = v.session.wsConn.WriteJSON(data)
|
||||
v.wsMutex.Unlock()
|
||||
v.session.wsMutex.Unlock()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
@ -304,7 +304,7 @@ func (v *VoiceConnection) open() (err error) {
|
||||
// Connect to VoiceConnection Websocket
|
||||
vg := "wss://" + strings.TrimSuffix(v.endpoint, ":80")
|
||||
v.log(LogInformational, "connecting to voice endpoint %s", vg)
|
||||
v.wsConn, _, err = websocket.DefaultDialer.Dial(vg, nil)
|
||||
v.wsConn, _, err = v.session.Dialer.Dial(vg, nil)
|
||||
if err != nil {
|
||||
v.log(LogWarning, "error connecting to voice endpoint %s, %s", vg, err)
|
||||
v.log(LogDebug, "voice struct: %#v\n", v)
|
||||
@ -323,7 +323,9 @@ func (v *VoiceConnection) open() (err error) {
|
||||
}
|
||||
data := voiceHandshakeOp{0, voiceHandshakeData{v.GuildID, v.UserID, v.sessionID, v.token}}
|
||||
|
||||
v.wsMutex.Lock()
|
||||
err = v.wsConn.WriteJSON(data)
|
||||
v.wsMutex.Unlock()
|
||||
if err != nil {
|
||||
v.log(LogWarning, "error sending init packet, %s", err)
|
||||
return
|
||||
@ -829,7 +831,12 @@ func (v *VoiceConnection) opusReceiver(udpConn *net.UDPConn, close <-chan struct
|
||||
p.SSRC = binary.BigEndian.Uint32(recvbuf[8:12])
|
||||
// decrypt opus data
|
||||
copy(nonce[:], recvbuf[0:12])
|
||||
p.Opus, _ = secretbox.Open(nil, recvbuf[12:rlen], &nonce, &v.op4.SecretKey)
|
||||
|
||||
if opus, ok := secretbox.Open(nil, recvbuf[12:rlen], &nonce, &v.op4.SecretKey); ok {
|
||||
p.Opus = opus
|
||||
} else {
|
||||
return
|
||||
}
|
||||
|
||||
// extension bit set, and not a RTCP packet
|
||||
if ((recvbuf[0] & 0x10) == 0x10) && ((recvbuf[1] & 0x80) == 0) {
|
||||
@ -870,7 +877,11 @@ func (v *VoiceConnection) reconnect() {
|
||||
v.reconnecting = true
|
||||
v.Unlock()
|
||||
|
||||
defer func() { v.reconnecting = false }()
|
||||
defer func() {
|
||||
v.Lock()
|
||||
v.reconnecting = false
|
||||
v.Unlock()
|
||||
}()
|
||||
|
||||
// Close any currently open connections
|
||||
v.Close()
|
||||
|
11
vendor/github.com/bwmarrin/discordgo/webhook.go
generated
vendored
11
vendor/github.com/bwmarrin/discordgo/webhook.go
generated
vendored
@ -35,15 +35,16 @@ type WebhookParams struct {
|
||||
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"`
|
||||
// Only MessageFlagsSuppressEmbeds and MessageFlagsEphemeral can be set.
|
||||
// MessageFlagsEphemeral can only be set when using Followup Message Create endpoint.
|
||||
Flags MessageFlags `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"`
|
||||
Content *string `json:"content,omitempty"`
|
||||
Components *[]MessageComponent `json:"components,omitempty"`
|
||||
Embeds *[]*MessageEmbed `json:"embeds,omitempty"`
|
||||
Files []*File `json:"-"`
|
||||
AllowedMentions *MessageAllowedMentions `json:"allowed_mentions,omitempty"`
|
||||
}
|
||||
|
2
vendor/github.com/bwmarrin/discordgo/wsapi.go
generated
vendored
2
vendor/github.com/bwmarrin/discordgo/wsapi.go
generated
vendored
@ -77,7 +77,7 @@ func (s *Session) Open() error {
|
||||
s.log(LogInformational, "connecting to gateway %s", s.gateway)
|
||||
header := http.Header{}
|
||||
header.Add("accept-encoding", "zlib")
|
||||
s.wsConn, _, err = websocket.DefaultDialer.Dial(s.gateway, header)
|
||||
s.wsConn, _, err = s.Dialer.Dial(s.gateway, header)
|
||||
if err != nil {
|
||||
s.log(LogError, "error connecting to gateway %s, %s", s.gateway, err)
|
||||
s.gateway = "" // clear cached gateway
|
||||
|
24
vendor/github.com/d5/tengo/v2/compiler.go
generated
vendored
24
vendor/github.com/d5/tengo/v2/compiler.go
generated
vendored
@ -141,25 +141,7 @@ func (c *Compiler) Compile(node parser.Node) error {
|
||||
if node.Token == token.LAnd || node.Token == token.LOr {
|
||||
return c.compileLogical(node)
|
||||
}
|
||||
if node.Token == token.Less {
|
||||
if err := c.Compile(node.RHS); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := c.Compile(node.LHS); err != nil {
|
||||
return err
|
||||
}
|
||||
c.emit(node, parser.OpBinaryOp, int(token.Greater))
|
||||
return nil
|
||||
} else if node.Token == token.LessEq {
|
||||
if err := c.Compile(node.RHS); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := c.Compile(node.LHS); err != nil {
|
||||
return err
|
||||
}
|
||||
c.emit(node, parser.OpBinaryOp, int(token.GreaterEq))
|
||||
return nil
|
||||
}
|
||||
|
||||
if err := c.Compile(node.LHS); err != nil {
|
||||
return err
|
||||
}
|
||||
@ -182,6 +164,10 @@ func (c *Compiler) Compile(node parser.Node) error {
|
||||
c.emit(node, parser.OpBinaryOp, int(token.Greater))
|
||||
case token.GreaterEq:
|
||||
c.emit(node, parser.OpBinaryOp, int(token.GreaterEq))
|
||||
case token.Less:
|
||||
c.emit(node, parser.OpBinaryOp, int(token.Less))
|
||||
case token.LessEq:
|
||||
c.emit(node, parser.OpBinaryOp, int(token.LessEq))
|
||||
case token.Equal:
|
||||
c.emit(node, parser.OpEqual)
|
||||
case token.NotEqual:
|
||||
|
1
vendor/github.com/gomarkdown/markdown/ast/node.go
generated
vendored
1
vendor/github.com/gomarkdown/markdown/ast/node.go
generated
vendored
@ -272,6 +272,7 @@ type CrossReference struct {
|
||||
Container
|
||||
|
||||
Destination []byte // Destination is where the reference points to
|
||||
Suffix []byte // Potential citation suffix, i.e. (#myid, text)
|
||||
}
|
||||
|
||||
// Citation is a citation node.
|
||||
|
42
vendor/github.com/gomarkdown/markdown/html/renderer.go
generated
vendored
42
vendor/github.com/gomarkdown/markdown/html/renderer.go
generated
vendored
@ -11,7 +11,6 @@ import (
|
||||
"strings"
|
||||
|
||||
"github.com/gomarkdown/markdown/ast"
|
||||
"github.com/gomarkdown/markdown/internal/valid"
|
||||
"github.com/gomarkdown/markdown/parser"
|
||||
)
|
||||
|
||||
@ -133,7 +132,9 @@ type Renderer struct {
|
||||
// if > 0, will strip html tags in Out and Outs
|
||||
DisableTags int
|
||||
|
||||
// TODO: documentation
|
||||
// IsSafeURLOverride allows overriding the default URL matcher. URL is
|
||||
// safe if the overriding function returns true. Can be used to extend
|
||||
// the default list of safe URLs.
|
||||
IsSafeURLOverride func(url []byte) bool
|
||||
|
||||
sr *SPRenderer
|
||||
@ -216,6 +217,11 @@ func NewRenderer(opts RendererOptions) *Renderer {
|
||||
}
|
||||
|
||||
func isRelativeLink(link []byte) (yes bool) {
|
||||
// empty links considerd relative
|
||||
if len(link) == 0 {
|
||||
return true
|
||||
}
|
||||
|
||||
// a tag begin with '#'
|
||||
if link[0] == '#' {
|
||||
return true
|
||||
@ -245,6 +251,9 @@ func isRelativeLink(link []byte) (yes bool) {
|
||||
}
|
||||
|
||||
func (r *Renderer) addAbsPrefix(link []byte) []byte {
|
||||
if len(link) == 0 {
|
||||
return link
|
||||
}
|
||||
if r.opts.AbsolutePrefix != "" && isRelativeLink(link) && link[0] != '.' {
|
||||
newDest := r.opts.AbsolutePrefix
|
||||
if link[0] != '/' {
|
||||
@ -291,7 +300,7 @@ func needSkipLink(r *Renderer, dest []byte) bool {
|
||||
}
|
||||
isSafeURL := r.IsSafeURLOverride
|
||||
if isSafeURL == nil {
|
||||
isSafeURL = valid.IsSafeURL
|
||||
isSafeURL = parser.IsSafeURL
|
||||
}
|
||||
return flags&Safelink != 0 && !isSafeURL(dest) && !isMailto(dest)
|
||||
}
|
||||
@ -1269,33 +1278,6 @@ func slugify(in []byte) []byte {
|
||||
return out[a : b+1]
|
||||
}
|
||||
|
||||
// TODO: move to internal package
|
||||
// isAlnum returns true if c is a digit or letter
|
||||
// TODO: check when this is looking for ASCII alnum and when it should use unicode
|
||||
func isAlnum(c byte) bool {
|
||||
return (c >= '0' && c <= '9') || isLetter(c)
|
||||
}
|
||||
|
||||
// isSpace returns true if c is a white-space charactr
|
||||
func isSpace(c byte) bool {
|
||||
return c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '\f' || c == '\v'
|
||||
}
|
||||
|
||||
// isLetter returns true if c is ascii letter
|
||||
func isLetter(c byte) bool {
|
||||
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
|
||||
}
|
||||
|
||||
// isPunctuation returns true if c is a punctuation symbol.
|
||||
func isPunctuation(c byte) bool {
|
||||
for _, r := range []byte("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~") {
|
||||
if c == r {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// BlockAttrs takes a node and checks if it has block level attributes set. If so it
|
||||
// will return a slice each containing a "key=value(s)" string.
|
||||
func BlockAttrs(node ast.Node) []string {
|
||||
|
8
vendor/github.com/gomarkdown/markdown/html/smartypants.go
generated
vendored
8
vendor/github.com/gomarkdown/markdown/html/smartypants.go
generated
vendored
@ -3,10 +3,18 @@ package html
|
||||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
|
||||
"github.com/gomarkdown/markdown/parser"
|
||||
)
|
||||
|
||||
// SmartyPants rendering
|
||||
|
||||
var (
|
||||
isSpace = parser.IsSpace
|
||||
isAlnum = parser.IsAlnum
|
||||
isPunctuation = parser.IsPunctuation
|
||||
)
|
||||
|
||||
// SPRenderer is a struct containing state of a Smartypants renderer.
|
||||
type SPRenderer struct {
|
||||
inSingleQuote bool
|
||||
|
59
vendor/github.com/gomarkdown/markdown/internal/valid/valid.go
generated
vendored
59
vendor/github.com/gomarkdown/markdown/internal/valid/valid.go
generated
vendored
@ -1,59 +0,0 @@
|
||||
package valid
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
)
|
||||
|
||||
var URIs = [][]byte{
|
||||
[]byte("http://"),
|
||||
[]byte("https://"),
|
||||
[]byte("ftp://"),
|
||||
[]byte("mailto:"),
|
||||
}
|
||||
|
||||
var Paths = [][]byte{
|
||||
[]byte("/"),
|
||||
[]byte("./"),
|
||||
[]byte("../"),
|
||||
}
|
||||
|
||||
// TODO: documentation
|
||||
func IsSafeURL(url []byte) bool {
|
||||
nLink := len(url)
|
||||
for _, path := range Paths {
|
||||
nPath := len(path)
|
||||
linkPrefix := url[:nPath]
|
||||
if nLink >= nPath && bytes.Equal(linkPrefix, path) {
|
||||
if nLink == nPath {
|
||||
return true
|
||||
} else if isAlnum(url[nPath]) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for _, prefix := range URIs {
|
||||
// TODO: handle unicode here
|
||||
// case-insensitive prefix test
|
||||
nPrefix := len(prefix)
|
||||
if nLink > nPrefix {
|
||||
linkPrefix := bytes.ToLower(url[:nPrefix])
|
||||
if bytes.Equal(linkPrefix, prefix) && isAlnum(url[nPrefix]) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// isAlnum returns true if c is a digit or letter
|
||||
// TODO: check when this is looking for ASCII alnum and when it should use unicode
|
||||
func isAlnum(c byte) bool {
|
||||
return (c >= '0' && c <= '9') || isLetter(c)
|
||||
}
|
||||
|
||||
// isLetter returns true if c is ascii letter
|
||||
func isLetter(c byte) bool {
|
||||
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
|
||||
}
|
10
vendor/github.com/gomarkdown/markdown/parser/block.go
generated
vendored
10
vendor/github.com/gomarkdown/markdown/parser/block.go
generated
vendored
@ -909,18 +909,18 @@ func syntaxRange(data []byte, iout *int) (int, int) {
|
||||
|
||||
// strip all whitespace at the beginning and the end
|
||||
// of the {} block
|
||||
for syn > 0 && isSpace(data[syntaxStart]) {
|
||||
for syn > 0 && IsSpace(data[syntaxStart]) {
|
||||
syntaxStart++
|
||||
syn--
|
||||
}
|
||||
|
||||
for syn > 0 && isSpace(data[syntaxStart+syn-1]) {
|
||||
for syn > 0 && IsSpace(data[syntaxStart+syn-1]) {
|
||||
syn--
|
||||
}
|
||||
|
||||
i++
|
||||
} else {
|
||||
for i < n && !isSpace(data[i]) {
|
||||
for i < n && !IsSpace(data[i]) {
|
||||
syn++
|
||||
i++
|
||||
}
|
||||
@ -1767,7 +1767,7 @@ func skipUntilChar(data []byte, i int, c byte) int {
|
||||
|
||||
func skipAlnum(data []byte, i int) int {
|
||||
n := len(data)
|
||||
for i < n && isAlnum(data[i]) {
|
||||
for i < n && IsAlnum(data[i]) {
|
||||
i++
|
||||
}
|
||||
return i
|
||||
@ -1775,7 +1775,7 @@ func skipAlnum(data []byte, i int) int {
|
||||
|
||||
func skipSpace(data []byte, i int) int {
|
||||
n := len(data)
|
||||
for i < n && isSpace(data[i]) {
|
||||
for i < n && IsSpace(data[i]) {
|
||||
i++
|
||||
}
|
||||
return i
|
||||
|
2
vendor/github.com/gomarkdown/markdown/parser/caption.go
generated
vendored
2
vendor/github.com/gomarkdown/markdown/parser/caption.go
generated
vendored
@ -58,7 +58,7 @@ func captionID(data []byte) (string, int) {
|
||||
}
|
||||
// remains must be whitespace.
|
||||
for l := k + 1; l < end; l++ {
|
||||
if !isSpace(data[l]) {
|
||||
if !IsSpace(data[l]) {
|
||||
return "", 0
|
||||
}
|
||||
}
|
||||
|
48
vendor/github.com/gomarkdown/markdown/parser/inline.go
generated
vendored
48
vendor/github.com/gomarkdown/markdown/parser/inline.go
generated
vendored
@ -6,7 +6,6 @@ import (
|
||||
"strconv"
|
||||
|
||||
"github.com/gomarkdown/markdown/ast"
|
||||
"github.com/gomarkdown/markdown/internal/valid"
|
||||
)
|
||||
|
||||
// Parsing of inline elements
|
||||
@ -69,7 +68,7 @@ func emphasis(p *Parser, data []byte, offset int) (int, ast.Node) {
|
||||
if n > 2 && data[1] != c {
|
||||
// whitespace cannot follow an opening emphasis;
|
||||
// strikethrough only takes two characters '~~'
|
||||
if isSpace(data[1]) {
|
||||
if IsSpace(data[1]) {
|
||||
return 0, nil
|
||||
}
|
||||
if p.extensions&SuperSubscript != 0 && c == '~' {
|
||||
@ -81,7 +80,7 @@ func emphasis(p *Parser, data []byte, offset int) (int, ast.Node) {
|
||||
}
|
||||
ret++ // we started with data[1:] above.
|
||||
for i := 1; i < ret; i++ {
|
||||
if isSpace(data[i]) && !isEscape(data, i) {
|
||||
if IsSpace(data[i]) && !isEscape(data, i) {
|
||||
return 0, nil
|
||||
}
|
||||
}
|
||||
@ -98,7 +97,7 @@ func emphasis(p *Parser, data []byte, offset int) (int, ast.Node) {
|
||||
}
|
||||
|
||||
if n > 3 && data[1] == c && data[2] != c {
|
||||
if isSpace(data[2]) {
|
||||
if IsSpace(data[2]) {
|
||||
return 0, nil
|
||||
}
|
||||
ret, node := helperDoubleEmphasis(p, data[2:], c)
|
||||
@ -110,7 +109,7 @@ func emphasis(p *Parser, data []byte, offset int) (int, ast.Node) {
|
||||
}
|
||||
|
||||
if n > 4 && data[1] == c && data[2] == c && data[3] != c {
|
||||
if c == '~' || isSpace(data[3]) {
|
||||
if c == '~' || IsSpace(data[3]) {
|
||||
return 0, nil
|
||||
}
|
||||
ret, node := helperTripleEmphasis(p, data, 3, c)
|
||||
@ -156,7 +155,7 @@ func codeSpan(p *Parser, data []byte, offset int) (int, ast.Node) {
|
||||
if data[j] == '\n' {
|
||||
break
|
||||
}
|
||||
if !isSpace(data[j]) {
|
||||
if !IsSpace(data[j]) {
|
||||
hasCharsAfterDelimiter = true
|
||||
}
|
||||
}
|
||||
@ -256,7 +255,7 @@ func maybeInlineFootnoteOrSuper(p *Parser, data []byte, offset int) (int, ast.No
|
||||
return 0, nil
|
||||
}
|
||||
for i := offset; i < offset+ret; i++ {
|
||||
if isSpace(data[i]) && !isEscape(data, i) {
|
||||
if IsSpace(data[i]) && !isEscape(data, i) {
|
||||
return 0, nil
|
||||
}
|
||||
}
|
||||
@ -421,7 +420,7 @@ func link(p *Parser, data []byte, offset int) (int, ast.Node) {
|
||||
|
||||
// skip whitespace after title
|
||||
titleE = i - 1
|
||||
for titleE > titleB && isSpace(data[titleE]) {
|
||||
for titleE > titleB && IsSpace(data[titleE]) {
|
||||
titleE--
|
||||
}
|
||||
|
||||
@ -433,7 +432,7 @@ func link(p *Parser, data []byte, offset int) (int, ast.Node) {
|
||||
}
|
||||
|
||||
// remove whitespace at the end of the link
|
||||
for linkE > linkB && isSpace(data[linkE-1]) {
|
||||
for linkE > linkB && IsSpace(data[linkE-1]) {
|
||||
linkE--
|
||||
}
|
||||
|
||||
@ -602,9 +601,8 @@ func link(p *Parser, data []byte, offset int) (int, ast.Node) {
|
||||
}
|
||||
|
||||
// links need something to click on and somewhere to go
|
||||
if len(uLink) == 0 || (t == linkNormal && txtE <= 1) {
|
||||
return 0, nil
|
||||
}
|
||||
// [](http://bla) is legal in CommonMark, so allow txtE <=1 for linkNormal
|
||||
// [bla]() is also legal in CommonMark, so allow empty uLink
|
||||
}
|
||||
|
||||
// call the relevant rendering function
|
||||
@ -827,7 +825,9 @@ func linkEndsWithEntity(data []byte, linkEnd int) bool {
|
||||
}
|
||||
|
||||
// hasPrefixCaseInsensitive is a custom implementation of
|
||||
// strings.HasPrefix(strings.ToLower(s), prefix)
|
||||
//
|
||||
// strings.HasPrefix(strings.ToLower(s), prefix)
|
||||
//
|
||||
// we rolled our own because ToLower pulls in a huge machinery of lowercasing
|
||||
// anything from Unicode and that's very slow. Since this func will only be
|
||||
// used on ASCII protocol prefixes, we can take shortcuts.
|
||||
@ -889,7 +889,7 @@ func autoLink(p *Parser, data []byte, offset int) (int, ast.Node) {
|
||||
|
||||
// scan backward for a word boundary
|
||||
rewind := 0
|
||||
for offset-rewind > 0 && rewind <= 7 && isLetter(data[offset-rewind-1]) {
|
||||
for offset-rewind > 0 && rewind <= 7 && IsLetter(data[offset-rewind-1]) {
|
||||
rewind++
|
||||
}
|
||||
if rewind > 6 { // longest supported protocol is "mailto" which has 6 letters
|
||||
@ -901,7 +901,7 @@ func autoLink(p *Parser, data []byte, offset int) (int, ast.Node) {
|
||||
|
||||
isSafeURL := p.IsSafeURLOverride
|
||||
if isSafeURL == nil {
|
||||
isSafeURL = valid.IsSafeURL
|
||||
isSafeURL = IsSafeURL
|
||||
}
|
||||
if !isSafeURL(data) {
|
||||
return 0, nil
|
||||
@ -996,7 +996,7 @@ func autoLink(p *Parser, data []byte, offset int) (int, ast.Node) {
|
||||
}
|
||||
|
||||
func isEndOfLink(char byte) bool {
|
||||
return isSpace(char) || char == '<'
|
||||
return IsSpace(char) || char == '<'
|
||||
}
|
||||
|
||||
// return the length of the given tag, or 0 is it's not valid
|
||||
@ -1018,7 +1018,7 @@ func tagLength(data []byte) (autolink autolinkType, end int) {
|
||||
i = 1
|
||||
}
|
||||
|
||||
if !isAlnum(data[i]) {
|
||||
if !IsAlnum(data[i]) {
|
||||
return notAutolink, 0
|
||||
}
|
||||
|
||||
@ -1026,7 +1026,7 @@ func tagLength(data []byte) (autolink autolinkType, end int) {
|
||||
autolink = notAutolink
|
||||
|
||||
// try to find the beginning of an URI
|
||||
for i < len(data) && (isAlnum(data[i]) || data[i] == '.' || data[i] == '+' || data[i] == '-') {
|
||||
for i < len(data) && (IsAlnum(data[i]) || data[i] == '.' || data[i] == '+' || data[i] == '-') {
|
||||
i++
|
||||
}
|
||||
|
||||
@ -1051,7 +1051,7 @@ func tagLength(data []byte) (autolink autolinkType, end int) {
|
||||
for i < len(data) {
|
||||
if data[i] == '\\' {
|
||||
i += 2
|
||||
} else if data[i] == '>' || data[i] == '\'' || data[i] == '"' || isSpace(data[i]) {
|
||||
} else if data[i] == '>' || data[i] == '\'' || data[i] == '"' || IsSpace(data[i]) {
|
||||
break
|
||||
} else {
|
||||
i++
|
||||
@ -1083,7 +1083,7 @@ func isMailtoAutoLink(data []byte) int {
|
||||
|
||||
// address is assumed to be: [-@._a-zA-Z0-9]+ with exactly one '@'
|
||||
for i, c := range data {
|
||||
if isAlnum(c) {
|
||||
if IsAlnum(c) {
|
||||
continue
|
||||
}
|
||||
|
||||
@ -1204,10 +1204,10 @@ func helperEmphasis(p *Parser, data []byte, c byte) (int, ast.Node) {
|
||||
continue
|
||||
}
|
||||
|
||||
if data[i] == c && !isSpace(data[i-1]) {
|
||||
if data[i] == c && !IsSpace(data[i-1]) {
|
||||
|
||||
if p.extensions&NoIntraEmphasis != 0 {
|
||||
if !(i+1 == len(data) || isSpace(data[i+1]) || isPunctuation(data[i+1])) {
|
||||
if !(i+1 == len(data) || IsSpace(data[i+1]) || IsPunctuation(data[i+1])) {
|
||||
continue
|
||||
}
|
||||
}
|
||||
@ -1231,7 +1231,7 @@ func helperDoubleEmphasis(p *Parser, data []byte, c byte) (int, ast.Node) {
|
||||
}
|
||||
i += length
|
||||
|
||||
if i+1 < len(data) && data[i] == c && data[i+1] == c && i > 0 && !isSpace(data[i-1]) {
|
||||
if i+1 < len(data) && data[i] == c && data[i+1] == c && i > 0 && !IsSpace(data[i-1]) {
|
||||
var node ast.Node = &ast.Strong{}
|
||||
if c == '~' {
|
||||
node = &ast.Del{}
|
||||
@ -1257,7 +1257,7 @@ func helperTripleEmphasis(p *Parser, data []byte, offset int, c byte) (int, ast.
|
||||
i += length
|
||||
|
||||
// skip whitespace preceded symbols
|
||||
if data[i] != c || isSpace(data[i-1]) {
|
||||
if data[i] != c || IsSpace(data[i-1]) {
|
||||
continue
|
||||
}
|
||||
|
||||
|
95
vendor/github.com/gomarkdown/markdown/parser/parser.go
generated
vendored
95
vendor/github.com/gomarkdown/markdown/parser/parser.go
generated
vendored
@ -84,7 +84,9 @@ type Parser struct {
|
||||
// the bottom will be used to fill in the link details.
|
||||
ReferenceOverride ReferenceOverrideFunc
|
||||
|
||||
// TODO: documentation
|
||||
// IsSafeURLOverride allows overriding the default URL matcher. URL is
|
||||
// safe if the overriding function returns true. Can be used to extend
|
||||
// the default list of safe URLs.
|
||||
IsSafeURLOverride func(url []byte) bool
|
||||
|
||||
Opts Options
|
||||
@ -390,35 +392,35 @@ func (p *Parser) parseRefsToAST() {
|
||||
//
|
||||
// Consider this markdown with reference-style links:
|
||||
//
|
||||
// [link][ref]
|
||||
// [link][ref]
|
||||
//
|
||||
// [ref]: /url/ "tooltip title"
|
||||
// [ref]: /url/ "tooltip title"
|
||||
//
|
||||
// It will be ultimately converted to this HTML:
|
||||
//
|
||||
// <p><a href=\"/url/\" title=\"title\">link</a></p>
|
||||
// <p><a href=\"/url/\" title=\"title\">link</a></p>
|
||||
//
|
||||
// And a reference structure will be populated as follows:
|
||||
//
|
||||
// p.refs["ref"] = &reference{
|
||||
// link: "/url/",
|
||||
// title: "tooltip title",
|
||||
// }
|
||||
// p.refs["ref"] = &reference{
|
||||
// link: "/url/",
|
||||
// title: "tooltip title",
|
||||
// }
|
||||
//
|
||||
// Alternatively, reference can contain information about a footnote. Consider
|
||||
// this markdown:
|
||||
//
|
||||
// Text needing a footnote.[^a]
|
||||
// Text needing a footnote.[^a]
|
||||
//
|
||||
// [^a]: This is the note
|
||||
// [^a]: This is the note
|
||||
//
|
||||
// A reference structure will be populated as follows:
|
||||
//
|
||||
// p.refs["a"] = &reference{
|
||||
// link: "a",
|
||||
// title: "This is the note",
|
||||
// noteID: <some positive int>,
|
||||
// }
|
||||
// p.refs["a"] = &reference{
|
||||
// link: "a",
|
||||
// title: "This is the note",
|
||||
// noteID: <some positive int>,
|
||||
// }
|
||||
//
|
||||
// TODO: As you can see, it begs for splitting into two dedicated structures
|
||||
// for refs and for footnotes.
|
||||
@ -693,8 +695,8 @@ gatherLines:
|
||||
return
|
||||
}
|
||||
|
||||
// isPunctuation returns true if c is a punctuation symbol.
|
||||
func isPunctuation(c byte) bool {
|
||||
// IsPunctuation returns true if c is a punctuation symbol.
|
||||
func IsPunctuation(c byte) bool {
|
||||
for _, r := range []byte("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~") {
|
||||
if c == r {
|
||||
return true
|
||||
@ -703,20 +705,63 @@ func isPunctuation(c byte) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
// isSpace returns true if c is a white-space charactr
|
||||
func isSpace(c byte) bool {
|
||||
// IsSpace returns true if c is a white-space charactr
|
||||
func IsSpace(c byte) bool {
|
||||
return c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '\f' || c == '\v'
|
||||
}
|
||||
|
||||
// isLetter returns true if c is ascii letter
|
||||
func isLetter(c byte) bool {
|
||||
// IsLetter returns true if c is ascii letter
|
||||
func IsLetter(c byte) bool {
|
||||
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
|
||||
}
|
||||
|
||||
// isAlnum returns true if c is a digit or letter
|
||||
// IsAlnum returns true if c is a digit or letter
|
||||
// TODO: check when this is looking for ASCII alnum and when it should use unicode
|
||||
func isAlnum(c byte) bool {
|
||||
return (c >= '0' && c <= '9') || isLetter(c)
|
||||
func IsAlnum(c byte) bool {
|
||||
return (c >= '0' && c <= '9') || IsLetter(c)
|
||||
}
|
||||
|
||||
var URIs = [][]byte{
|
||||
[]byte("http://"),
|
||||
[]byte("https://"),
|
||||
[]byte("ftp://"),
|
||||
[]byte("mailto:"),
|
||||
}
|
||||
|
||||
var Paths = [][]byte{
|
||||
[]byte("/"),
|
||||
[]byte("./"),
|
||||
[]byte("../"),
|
||||
}
|
||||
|
||||
// IsSafeURL returns true if url starts with one of the valid schemes or is a relative path.
|
||||
func IsSafeURL(url []byte) bool {
|
||||
nLink := len(url)
|
||||
for _, path := range Paths {
|
||||
nPath := len(path)
|
||||
linkPrefix := url[:nPath]
|
||||
if nLink >= nPath && bytes.Equal(linkPrefix, path) {
|
||||
if nLink == nPath {
|
||||
return true
|
||||
} else if IsAlnum(url[nPath]) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for _, prefix := range URIs {
|
||||
// TODO: handle unicode here
|
||||
// case-insensitive prefix test
|
||||
nPrefix := len(prefix)
|
||||
if nLink > nPrefix {
|
||||
linkPrefix := bytes.ToLower(url[:nPrefix])
|
||||
if bytes.Equal(linkPrefix, prefix) && IsAlnum(url[nPrefix]) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// TODO: this is not used
|
||||
@ -809,7 +854,7 @@ func slugify(in []byte) []byte {
|
||||
sym := false
|
||||
|
||||
for _, ch := range in {
|
||||
if isAlnum(ch) {
|
||||
if IsAlnum(ch) {
|
||||
sym = false
|
||||
out = append(out, ch)
|
||||
} else if sym {
|
||||
|
23
vendor/github.com/gomarkdown/markdown/parser/ref.go
generated
vendored
23
vendor/github.com/gomarkdown/markdown/parser/ref.go
generated
vendored
@ -7,8 +7,8 @@ import (
|
||||
"github.com/gomarkdown/markdown/ast"
|
||||
)
|
||||
|
||||
// parse '(#r)', where r does not contain spaces. Or.
|
||||
// (!item) (!item, subitem), for an index, (!!item) signals primary.
|
||||
// parse '(#r, text)', where r does not contain spaces, but text may (similar to a citation). Or. (!item) (!item,
|
||||
// subitem), for an index, (!!item) signals primary.
|
||||
func maybeShortRefOrIndex(p *Parser, data []byte, offset int) (int, ast.Node) {
|
||||
if len(data[offset:]) < 4 {
|
||||
return 0, nil
|
||||
@ -25,8 +25,8 @@ func maybeShortRefOrIndex(p *Parser, data []byte, offset int) (int, ast.Node) {
|
||||
switch {
|
||||
case c == ')':
|
||||
break Loop
|
||||
case !isAlnum(c):
|
||||
if c == '_' || c == '-' || c == ':' {
|
||||
case !IsAlnum(c):
|
||||
if c == '_' || c == '-' || c == ':' || c == ' ' || c == ',' {
|
||||
i++
|
||||
continue
|
||||
}
|
||||
@ -45,6 +45,21 @@ func maybeShortRefOrIndex(p *Parser, data []byte, offset int) (int, ast.Node) {
|
||||
id := data[2:i]
|
||||
node := &ast.CrossReference{}
|
||||
node.Destination = id
|
||||
if c := bytes.Index(id, []byte(",")); c > 0 {
|
||||
idpart := id[:c]
|
||||
suff := id[c+1:]
|
||||
suff = bytes.TrimSpace(suff)
|
||||
node.Destination = idpart
|
||||
node.Suffix = suff
|
||||
}
|
||||
if bytes.Index(node.Destination, []byte(" ")) > 0 {
|
||||
// no spaces allowed in id
|
||||
return 0, nil
|
||||
}
|
||||
if bytes.Index(node.Destination, []byte(",")) > 0 {
|
||||
// nor comma
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
return i + 1, node
|
||||
|
||||
|
12
vendor/github.com/labstack/echo/v4/CHANGELOG.md
generated
vendored
12
vendor/github.com/labstack/echo/v4/CHANGELOG.md
generated
vendored
@ -1,5 +1,17 @@
|
||||
# Changelog
|
||||
|
||||
## v4.9.0 - 2022-09-04
|
||||
|
||||
**Security**
|
||||
|
||||
* Fix open redirect vulnerability in handlers serving static directories (e.Static, e.StaticFs, echo.StaticDirectoryHandler) [#2260](https://github.com/labstack/echo/pull/2260)
|
||||
|
||||
**Enhancements**
|
||||
|
||||
* Allow configuring ErrorHandler in CSRF middleware [#2257](https://github.com/labstack/echo/pull/2257)
|
||||
* Replace HTTP method constants in tests with stdlib constants [#2247](https://github.com/labstack/echo/pull/2247)
|
||||
|
||||
|
||||
## v4.8.0 - 2022-08-10
|
||||
|
||||
**Most notable things**
|
||||
|
42
vendor/github.com/labstack/echo/v4/context_fs.go
generated
vendored
42
vendor/github.com/labstack/echo/v4/context_fs.go
generated
vendored
@ -1,33 +1,49 @@
|
||||
//go:build !go1.16
|
||||
// +build !go1.16
|
||||
|
||||
package echo
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"io"
|
||||
"io/fs"
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
)
|
||||
|
||||
func (c *context) File(file string) (err error) {
|
||||
f, err := os.Open(file)
|
||||
func (c *context) File(file string) error {
|
||||
return fsFile(c, file, c.echo.Filesystem)
|
||||
}
|
||||
|
||||
// FileFS serves file from given file system.
|
||||
//
|
||||
// When dealing with `embed.FS` use `fs := echo.MustSubFS(fs, "rootDirectory") to create sub fs which uses necessary
|
||||
// prefix for directory path. This is necessary as `//go:embed assets/images` embeds files with paths
|
||||
// including `assets/images` as their prefix.
|
||||
func (c *context) FileFS(file string, filesystem fs.FS) error {
|
||||
return fsFile(c, file, filesystem)
|
||||
}
|
||||
|
||||
func fsFile(c Context, file string, filesystem fs.FS) error {
|
||||
f, err := filesystem.Open(file)
|
||||
if err != nil {
|
||||
return NotFoundHandler(c)
|
||||
return ErrNotFound
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
fi, _ := f.Stat()
|
||||
if fi.IsDir() {
|
||||
file = filepath.Join(file, indexPage)
|
||||
f, err = os.Open(file)
|
||||
file = filepath.ToSlash(filepath.Join(file, indexPage)) // ToSlash is necessary for Windows. fs.Open and os.Open are different in that aspect.
|
||||
f, err = filesystem.Open(file)
|
||||
if err != nil {
|
||||
return NotFoundHandler(c)
|
||||
return ErrNotFound
|
||||
}
|
||||
defer f.Close()
|
||||
if fi, err = f.Stat(); err != nil {
|
||||
return
|
||||
return err
|
||||
}
|
||||
}
|
||||
http.ServeContent(c.Response(), c.Request(), fi.Name(), fi.ModTime(), f)
|
||||
return
|
||||
ff, ok := f.(io.ReadSeeker)
|
||||
if !ok {
|
||||
return errors.New("file does not implement io.ReadSeeker")
|
||||
}
|
||||
http.ServeContent(c.Response(), c.Request(), fi.Name(), fi.ModTime(), ff)
|
||||
return nil
|
||||
}
|
||||
|
52
vendor/github.com/labstack/echo/v4/context_fs_go1.16.go
generated
vendored
52
vendor/github.com/labstack/echo/v4/context_fs_go1.16.go
generated
vendored
@ -1,52 +0,0 @@
|
||||
//go:build go1.16
|
||||
// +build go1.16
|
||||
|
||||
package echo
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"io"
|
||||
"io/fs"
|
||||
"net/http"
|
||||
"path/filepath"
|
||||
)
|
||||
|
||||
func (c *context) File(file string) error {
|
||||
return fsFile(c, file, c.echo.Filesystem)
|
||||
}
|
||||
|
||||
// FileFS serves file from given file system.
|
||||
//
|
||||
// When dealing with `embed.FS` use `fs := echo.MustSubFS(fs, "rootDirectory") to create sub fs which uses necessary
|
||||
// prefix for directory path. This is necessary as `//go:embed assets/images` embeds files with paths
|
||||
// including `assets/images` as their prefix.
|
||||
func (c *context) FileFS(file string, filesystem fs.FS) error {
|
||||
return fsFile(c, file, filesystem)
|
||||
}
|
||||
|
||||
func fsFile(c Context, file string, filesystem fs.FS) error {
|
||||
f, err := filesystem.Open(file)
|
||||
if err != nil {
|
||||
return ErrNotFound
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
fi, _ := f.Stat()
|
||||
if fi.IsDir() {
|
||||
file = filepath.ToSlash(filepath.Join(file, indexPage)) // ToSlash is necessary for Windows. fs.Open and os.Open are different in that aspect.
|
||||
f, err = filesystem.Open(file)
|
||||
if err != nil {
|
||||
return ErrNotFound
|
||||
}
|
||||
defer f.Close()
|
||||
if fi, err = f.Stat(); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
ff, ok := f.(io.ReadSeeker)
|
||||
if !ok {
|
||||
return errors.New("file does not implement io.ReadSeeker")
|
||||
}
|
||||
http.ServeContent(c.Response(), c.Request(), fi.Name(), fi.ModTime(), ff)
|
||||
return nil
|
||||
}
|
2
vendor/github.com/labstack/echo/v4/echo.go
generated
vendored
2
vendor/github.com/labstack/echo/v4/echo.go
generated
vendored
@ -248,7 +248,7 @@ const (
|
||||
|
||||
const (
|
||||
// Version of Echo
|
||||
Version = "4.8.0"
|
||||
Version = "4.9.0"
|
||||
website = "https://echo.labstack.com"
|
||||
// http://patorjk.com/software/taag/#p=display&f=Small%20Slant&t=Echo
|
||||
banner = `
|
||||
|
183
vendor/github.com/labstack/echo/v4/echo_fs.go
generated
vendored
183
vendor/github.com/labstack/echo/v4/echo_fs.go
generated
vendored
@ -1,62 +1,175 @@
|
||||
//go:build !go1.16
|
||||
// +build !go1.16
|
||||
|
||||
package echo
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/fs"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type filesystem struct {
|
||||
// Filesystem is file system used by Static and File handlers to access files.
|
||||
// Defaults to os.DirFS(".")
|
||||
//
|
||||
// When dealing with `embed.FS` use `fs := echo.MustSubFS(fs, "rootDirectory") to create sub fs which uses necessary
|
||||
// prefix for directory path. This is necessary as `//go:embed assets/images` embeds files with paths
|
||||
// including `assets/images` as their prefix.
|
||||
Filesystem fs.FS
|
||||
}
|
||||
|
||||
func createFilesystem() filesystem {
|
||||
return filesystem{}
|
||||
}
|
||||
|
||||
// Static registers a new route with path prefix to serve static files from the
|
||||
// provided root directory.
|
||||
func (e *Echo) Static(prefix, root string) *Route {
|
||||
if root == "" {
|
||||
root = "." // For security we want to restrict to CWD.
|
||||
return filesystem{
|
||||
Filesystem: newDefaultFS(),
|
||||
}
|
||||
return e.static(prefix, root, e.GET)
|
||||
}
|
||||
|
||||
func (common) static(prefix, root string, get func(string, HandlerFunc, ...MiddlewareFunc) *Route) *Route {
|
||||
h := func(c Context) error {
|
||||
p, err := url.PathUnescape(c.Param("*"))
|
||||
if err != nil {
|
||||
return err
|
||||
// Static registers a new route with path prefix to serve static files from the provided root directory.
|
||||
func (e *Echo) Static(pathPrefix, fsRoot string) *Route {
|
||||
subFs := MustSubFS(e.Filesystem, fsRoot)
|
||||
return e.Add(
|
||||
http.MethodGet,
|
||||
pathPrefix+"*",
|
||||
StaticDirectoryHandler(subFs, false),
|
||||
)
|
||||
}
|
||||
|
||||
// StaticFS registers a new route with path prefix to serve static files from the provided file system.
|
||||
//
|
||||
// When dealing with `embed.FS` use `fs := echo.MustSubFS(fs, "rootDirectory") to create sub fs which uses necessary
|
||||
// prefix for directory path. This is necessary as `//go:embed assets/images` embeds files with paths
|
||||
// including `assets/images` as their prefix.
|
||||
func (e *Echo) StaticFS(pathPrefix string, filesystem fs.FS) *Route {
|
||||
return e.Add(
|
||||
http.MethodGet,
|
||||
pathPrefix+"*",
|
||||
StaticDirectoryHandler(filesystem, false),
|
||||
)
|
||||
}
|
||||
|
||||
// StaticDirectoryHandler creates handler function to serve files from provided file system
|
||||
// When disablePathUnescaping is set then file name from path is not unescaped and is served as is.
|
||||
func StaticDirectoryHandler(fileSystem fs.FS, disablePathUnescaping bool) HandlerFunc {
|
||||
return func(c Context) error {
|
||||
p := c.Param("*")
|
||||
if !disablePathUnescaping { // when router is already unescaping we do not want to do is twice
|
||||
tmpPath, err := url.PathUnescape(p)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to unescape path variable: %w", err)
|
||||
}
|
||||
p = tmpPath
|
||||
}
|
||||
|
||||
name := filepath.Join(root, filepath.Clean("/"+p)) // "/"+ for security
|
||||
fi, err := os.Stat(name)
|
||||
// fs.FS.Open() already assumes that file names are relative to FS root path and considers name with prefix `/` as invalid
|
||||
name := filepath.ToSlash(filepath.Clean(strings.TrimPrefix(p, "/")))
|
||||
fi, err := fs.Stat(fileSystem, name)
|
||||
if err != nil {
|
||||
// The access path does not exist
|
||||
return NotFoundHandler(c)
|
||||
return ErrNotFound
|
||||
}
|
||||
|
||||
// If the request is for a directory and does not end with "/"
|
||||
p = c.Request().URL.Path // path must not be empty.
|
||||
if fi.IsDir() && p[len(p)-1] != '/' {
|
||||
if fi.IsDir() && len(p) > 0 && p[len(p)-1] != '/' {
|
||||
// Redirect to ends with "/"
|
||||
return c.Redirect(http.StatusMovedPermanently, p+"/")
|
||||
return c.Redirect(http.StatusMovedPermanently, sanitizeURI(p+"/"))
|
||||
}
|
||||
return c.File(name)
|
||||
return fsFile(c, name, fileSystem)
|
||||
}
|
||||
// Handle added routes based on trailing slash:
|
||||
// /prefix => exact route "/prefix" + any route "/prefix/*"
|
||||
// /prefix/ => only any route "/prefix/*"
|
||||
if prefix != "" {
|
||||
if prefix[len(prefix)-1] == '/' {
|
||||
// Only add any route for intentional trailing slash
|
||||
return get(prefix+"*", h)
|
||||
}
|
||||
get(prefix, h)
|
||||
}
|
||||
return get(prefix+"/*", h)
|
||||
}
|
||||
|
||||
// FileFS registers a new route with path to serve file from the provided file system.
|
||||
func (e *Echo) FileFS(path, file string, filesystem fs.FS, m ...MiddlewareFunc) *Route {
|
||||
return e.GET(path, StaticFileHandler(file, filesystem), m...)
|
||||
}
|
||||
|
||||
// StaticFileHandler creates handler function to serve file from provided file system
|
||||
func StaticFileHandler(file string, filesystem fs.FS) HandlerFunc {
|
||||
return func(c Context) error {
|
||||
return fsFile(c, file, filesystem)
|
||||
}
|
||||
}
|
||||
|
||||
// defaultFS exists to preserve pre v4.7.0 behaviour where files were open by `os.Open`.
|
||||
// v4.7 introduced `echo.Filesystem` field which is Go1.16+ `fs.Fs` interface.
|
||||
// Difference between `os.Open` and `fs.Open` is that FS does not allow opening path that start with `.`, `..` or `/`
|
||||
// etc. For example previously you could have `../images` in your application but `fs := os.DirFS("./")` would not
|
||||
// allow you to use `fs.Open("../images")` and this would break all old applications that rely on being able to
|
||||
// traverse up from current executable run path.
|
||||
// NB: private because you really should use fs.FS implementation instances
|
||||
type defaultFS struct {
|
||||
prefix string
|
||||
fs fs.FS
|
||||
}
|
||||
|
||||
func newDefaultFS() *defaultFS {
|
||||
dir, _ := os.Getwd()
|
||||
return &defaultFS{
|
||||
prefix: dir,
|
||||
fs: nil,
|
||||
}
|
||||
}
|
||||
|
||||
func (fs defaultFS) Open(name string) (fs.File, error) {
|
||||
if fs.fs == nil {
|
||||
return os.Open(name)
|
||||
}
|
||||
return fs.fs.Open(name)
|
||||
}
|
||||
|
||||
func subFS(currentFs fs.FS, root string) (fs.FS, error) {
|
||||
root = filepath.ToSlash(filepath.Clean(root)) // note: fs.FS operates only with slashes. `ToSlash` is necessary for Windows
|
||||
if dFS, ok := currentFs.(*defaultFS); ok {
|
||||
// we need to make exception for `defaultFS` instances as it interprets root prefix differently from fs.FS.
|
||||
// fs.Fs.Open does not like relative paths ("./", "../") and absolute paths at all but prior echo.Filesystem we
|
||||
// were able to use paths like `./myfile.log`, `/etc/hosts` and these would work fine with `os.Open` but not with fs.Fs
|
||||
if isRelativePath(root) {
|
||||
root = filepath.Join(dFS.prefix, root)
|
||||
}
|
||||
return &defaultFS{
|
||||
prefix: root,
|
||||
fs: os.DirFS(root),
|
||||
}, nil
|
||||
}
|
||||
return fs.Sub(currentFs, root)
|
||||
}
|
||||
|
||||
func isRelativePath(path string) bool {
|
||||
if path == "" {
|
||||
return true
|
||||
}
|
||||
if path[0] == '/' {
|
||||
return false
|
||||
}
|
||||
if runtime.GOOS == "windows" && strings.IndexByte(path, ':') != -1 {
|
||||
// https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file?redirectedfrom=MSDN#file_and_directory_names
|
||||
// https://docs.microsoft.com/en-us/dotnet/standard/io/file-path-formats
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// MustSubFS creates sub FS from current filesystem or panic on failure.
|
||||
// Panic happens when `fsRoot` contains invalid path according to `fs.ValidPath` rules.
|
||||
//
|
||||
// MustSubFS is helpful when dealing with `embed.FS` because for example `//go:embed assets/images` embeds files with
|
||||
// paths including `assets/images` as their prefix. In that case use `fs := echo.MustSubFS(fs, "rootDirectory") to
|
||||
// create sub fs which uses necessary prefix for directory path.
|
||||
func MustSubFS(currentFs fs.FS, fsRoot string) fs.FS {
|
||||
subFs, err := subFS(currentFs, fsRoot)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("can not create sub FS, invalid root given, err: %w", err))
|
||||
}
|
||||
return subFs
|
||||
}
|
||||
|
||||
func sanitizeURI(uri string) string {
|
||||
// double slash `\\`, `//` or even `\/` is absolute uri for browsers and by redirecting request to that uri
|
||||
// we are vulnerable to open redirect attack. so replace all slashes from the beginning with single slash
|
||||
if len(uri) > 1 && (uri[0] == '\\' || uri[0] == '/') && (uri[1] == '\\' || uri[1] == '/') {
|
||||
uri = "/" + strings.TrimLeft(uri, `/\`)
|
||||
}
|
||||
return uri
|
||||
}
|
||||
|
169
vendor/github.com/labstack/echo/v4/echo_fs_go1.16.go
generated
vendored
169
vendor/github.com/labstack/echo/v4/echo_fs_go1.16.go
generated
vendored
@ -1,169 +0,0 @@
|
||||
//go:build go1.16
|
||||
// +build go1.16
|
||||
|
||||
package echo
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/fs"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type filesystem struct {
|
||||
// Filesystem is file system used by Static and File handlers to access files.
|
||||
// Defaults to os.DirFS(".")
|
||||
//
|
||||
// When dealing with `embed.FS` use `fs := echo.MustSubFS(fs, "rootDirectory") to create sub fs which uses necessary
|
||||
// prefix for directory path. This is necessary as `//go:embed assets/images` embeds files with paths
|
||||
// including `assets/images` as their prefix.
|
||||
Filesystem fs.FS
|
||||
}
|
||||
|
||||
func createFilesystem() filesystem {
|
||||
return filesystem{
|
||||
Filesystem: newDefaultFS(),
|
||||
}
|
||||
}
|
||||
|
||||
// Static registers a new route with path prefix to serve static files from the provided root directory.
|
||||
func (e *Echo) Static(pathPrefix, fsRoot string) *Route {
|
||||
subFs := MustSubFS(e.Filesystem, fsRoot)
|
||||
return e.Add(
|
||||
http.MethodGet,
|
||||
pathPrefix+"*",
|
||||
StaticDirectoryHandler(subFs, false),
|
||||
)
|
||||
}
|
||||
|
||||
// StaticFS registers a new route with path prefix to serve static files from the provided file system.
|
||||
//
|
||||
// When dealing with `embed.FS` use `fs := echo.MustSubFS(fs, "rootDirectory") to create sub fs which uses necessary
|
||||
// prefix for directory path. This is necessary as `//go:embed assets/images` embeds files with paths
|
||||
// including `assets/images` as their prefix.
|
||||
func (e *Echo) StaticFS(pathPrefix string, filesystem fs.FS) *Route {
|
||||
return e.Add(
|
||||
http.MethodGet,
|
||||
pathPrefix+"*",
|
||||
StaticDirectoryHandler(filesystem, false),
|
||||
)
|
||||
}
|
||||
|
||||
// StaticDirectoryHandler creates handler function to serve files from provided file system
|
||||
// When disablePathUnescaping is set then file name from path is not unescaped and is served as is.
|
||||
func StaticDirectoryHandler(fileSystem fs.FS, disablePathUnescaping bool) HandlerFunc {
|
||||
return func(c Context) error {
|
||||
p := c.Param("*")
|
||||
if !disablePathUnescaping { // when router is already unescaping we do not want to do is twice
|
||||
tmpPath, err := url.PathUnescape(p)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to unescape path variable: %w", err)
|
||||
}
|
||||
p = tmpPath
|
||||
}
|
||||
|
||||
// fs.FS.Open() already assumes that file names are relative to FS root path and considers name with prefix `/` as invalid
|
||||
name := filepath.ToSlash(filepath.Clean(strings.TrimPrefix(p, "/")))
|
||||
fi, err := fs.Stat(fileSystem, name)
|
||||
if err != nil {
|
||||
return ErrNotFound
|
||||
}
|
||||
|
||||
// If the request is for a directory and does not end with "/"
|
||||
p = c.Request().URL.Path // path must not be empty.
|
||||
if fi.IsDir() && len(p) > 0 && p[len(p)-1] != '/' {
|
||||
// Redirect to ends with "/"
|
||||
return c.Redirect(http.StatusMovedPermanently, p+"/")
|
||||
}
|
||||
return fsFile(c, name, fileSystem)
|
||||
}
|
||||
}
|
||||
|
||||
// FileFS registers a new route with path to serve file from the provided file system.
|
||||
func (e *Echo) FileFS(path, file string, filesystem fs.FS, m ...MiddlewareFunc) *Route {
|
||||
return e.GET(path, StaticFileHandler(file, filesystem), m...)
|
||||
}
|
||||
|
||||
// StaticFileHandler creates handler function to serve file from provided file system
|
||||
func StaticFileHandler(file string, filesystem fs.FS) HandlerFunc {
|
||||
return func(c Context) error {
|
||||
return fsFile(c, file, filesystem)
|
||||
}
|
||||
}
|
||||
|
||||
// defaultFS exists to preserve pre v4.7.0 behaviour where files were open by `os.Open`.
|
||||
// v4.7 introduced `echo.Filesystem` field which is Go1.16+ `fs.Fs` interface.
|
||||
// Difference between `os.Open` and `fs.Open` is that FS does not allow opening path that start with `.`, `..` or `/`
|
||||
// etc. For example previously you could have `../images` in your application but `fs := os.DirFS("./")` would not
|
||||
// allow you to use `fs.Open("../images")` and this would break all old applications that rely on being able to
|
||||
// traverse up from current executable run path.
|
||||
// NB: private because you really should use fs.FS implementation instances
|
||||
type defaultFS struct {
|
||||
prefix string
|
||||
fs fs.FS
|
||||
}
|
||||
|
||||
func newDefaultFS() *defaultFS {
|
||||
dir, _ := os.Getwd()
|
||||
return &defaultFS{
|
||||
prefix: dir,
|
||||
fs: nil,
|
||||
}
|
||||
}
|
||||
|
||||
func (fs defaultFS) Open(name string) (fs.File, error) {
|
||||
if fs.fs == nil {
|
||||
return os.Open(name)
|
||||
}
|
||||
return fs.fs.Open(name)
|
||||
}
|
||||
|
||||
func subFS(currentFs fs.FS, root string) (fs.FS, error) {
|
||||
root = filepath.ToSlash(filepath.Clean(root)) // note: fs.FS operates only with slashes. `ToSlash` is necessary for Windows
|
||||
if dFS, ok := currentFs.(*defaultFS); ok {
|
||||
// we need to make exception for `defaultFS` instances as it interprets root prefix differently from fs.FS.
|
||||
// fs.Fs.Open does not like relative paths ("./", "../") and absolute paths at all but prior echo.Filesystem we
|
||||
// were able to use paths like `./myfile.log`, `/etc/hosts` and these would work fine with `os.Open` but not with fs.Fs
|
||||
if isRelativePath(root) {
|
||||
root = filepath.Join(dFS.prefix, root)
|
||||
}
|
||||
return &defaultFS{
|
||||
prefix: root,
|
||||
fs: os.DirFS(root),
|
||||
}, nil
|
||||
}
|
||||
return fs.Sub(currentFs, root)
|
||||
}
|
||||
|
||||
func isRelativePath(path string) bool {
|
||||
if path == "" {
|
||||
return true
|
||||
}
|
||||
if path[0] == '/' {
|
||||
return false
|
||||
}
|
||||
if runtime.GOOS == "windows" && strings.IndexByte(path, ':') != -1 {
|
||||
// https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file?redirectedfrom=MSDN#file_and_directory_names
|
||||
// https://docs.microsoft.com/en-us/dotnet/standard/io/file-path-formats
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// MustSubFS creates sub FS from current filesystem or panic on failure.
|
||||
// Panic happens when `fsRoot` contains invalid path according to `fs.ValidPath` rules.
|
||||
//
|
||||
// MustSubFS is helpful when dealing with `embed.FS` because for example `//go:embed assets/images` embeds files with
|
||||
// paths including `assets/images` as their prefix. In that case use `fs := echo.MustSubFS(fs, "rootDirectory") to
|
||||
// create sub fs which uses necessary prefix for directory path.
|
||||
func MustSubFS(currentFs fs.FS, fsRoot string) fs.FS {
|
||||
subFs, err := subFS(currentFs, fsRoot)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("can not create sub FS, invalid root given, err: %w", err))
|
||||
}
|
||||
return subFs
|
||||
}
|
31
vendor/github.com/labstack/echo/v4/group_fs.go
generated
vendored
31
vendor/github.com/labstack/echo/v4/group_fs.go
generated
vendored
@ -1,9 +1,30 @@
|
||||
//go:build !go1.16
|
||||
// +build !go1.16
|
||||
|
||||
package echo
|
||||
|
||||
import (
|
||||
"io/fs"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
// Static implements `Echo#Static()` for sub-routes within the Group.
|
||||
func (g *Group) Static(prefix, root string) {
|
||||
g.static(prefix, root, g.GET)
|
||||
func (g *Group) Static(pathPrefix, fsRoot string) {
|
||||
subFs := MustSubFS(g.echo.Filesystem, fsRoot)
|
||||
g.StaticFS(pathPrefix, subFs)
|
||||
}
|
||||
|
||||
// StaticFS implements `Echo#StaticFS()` for sub-routes within the Group.
|
||||
//
|
||||
// When dealing with `embed.FS` use `fs := echo.MustSubFS(fs, "rootDirectory") to create sub fs which uses necessary
|
||||
// prefix for directory path. This is necessary as `//go:embed assets/images` embeds files with paths
|
||||
// including `assets/images` as their prefix.
|
||||
func (g *Group) StaticFS(pathPrefix string, filesystem fs.FS) {
|
||||
g.Add(
|
||||
http.MethodGet,
|
||||
pathPrefix+"*",
|
||||
StaticDirectoryHandler(filesystem, false),
|
||||
)
|
||||
}
|
||||
|
||||
// FileFS implements `Echo#FileFS()` for sub-routes within the Group.
|
||||
func (g *Group) FileFS(path, file string, filesystem fs.FS, m ...MiddlewareFunc) *Route {
|
||||
return g.GET(path, StaticFileHandler(file, filesystem), m...)
|
||||
}
|
||||
|
33
vendor/github.com/labstack/echo/v4/group_fs_go1.16.go
generated
vendored
33
vendor/github.com/labstack/echo/v4/group_fs_go1.16.go
generated
vendored
@ -1,33 +0,0 @@
|
||||
//go:build go1.16
|
||||
// +build go1.16
|
||||
|
||||
package echo
|
||||
|
||||
import (
|
||||
"io/fs"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
// Static implements `Echo#Static()` for sub-routes within the Group.
|
||||
func (g *Group) Static(pathPrefix, fsRoot string) {
|
||||
subFs := MustSubFS(g.echo.Filesystem, fsRoot)
|
||||
g.StaticFS(pathPrefix, subFs)
|
||||
}
|
||||
|
||||
// StaticFS implements `Echo#StaticFS()` for sub-routes within the Group.
|
||||
//
|
||||
// When dealing with `embed.FS` use `fs := echo.MustSubFS(fs, "rootDirectory") to create sub fs which uses necessary
|
||||
// prefix for directory path. This is necessary as `//go:embed assets/images` embeds files with paths
|
||||
// including `assets/images` as their prefix.
|
||||
func (g *Group) StaticFS(pathPrefix string, filesystem fs.FS) {
|
||||
g.Add(
|
||||
http.MethodGet,
|
||||
pathPrefix+"*",
|
||||
StaticDirectoryHandler(filesystem, false),
|
||||
)
|
||||
}
|
||||
|
||||
// FileFS implements `Echo#FileFS()` for sub-routes within the Group.
|
||||
func (g *Group) FileFS(path, file string, filesystem fs.FS, m ...MiddlewareFunc) *Route {
|
||||
return g.GET(path, StaticFileHandler(file, filesystem), m...)
|
||||
}
|
18
vendor/github.com/labstack/echo/v4/middleware/csrf.go
generated
vendored
18
vendor/github.com/labstack/echo/v4/middleware/csrf.go
generated
vendored
@ -61,7 +61,13 @@ type (
|
||||
// Indicates SameSite mode of the CSRF cookie.
|
||||
// Optional. Default value SameSiteDefaultMode.
|
||||
CookieSameSite http.SameSite `yaml:"cookie_same_site"`
|
||||
|
||||
// ErrorHandler defines a function which is executed for returning custom errors.
|
||||
ErrorHandler CSRFErrorHandler
|
||||
}
|
||||
|
||||
// CSRFErrorHandler is a function which is executed for creating custom errors.
|
||||
CSRFErrorHandler func(err error, c echo.Context) error
|
||||
)
|
||||
|
||||
// ErrCSRFInvalid is returned when CSRF check fails
|
||||
@ -154,8 +160,9 @@ func CSRFWithConfig(config CSRFConfig) echo.MiddlewareFunc {
|
||||
lastTokenErr = ErrCSRFInvalid
|
||||
}
|
||||
}
|
||||
var finalErr error
|
||||
if lastTokenErr != nil {
|
||||
return lastTokenErr
|
||||
finalErr = lastTokenErr
|
||||
} else if lastExtractorErr != nil {
|
||||
// ugly part to preserve backwards compatible errors. someone could rely on them
|
||||
if lastExtractorErr == errQueryExtractorValueMissing {
|
||||
@ -167,7 +174,14 @@ func CSRFWithConfig(config CSRFConfig) echo.MiddlewareFunc {
|
||||
} else {
|
||||
lastExtractorErr = echo.NewHTTPError(http.StatusBadRequest, lastExtractorErr.Error())
|
||||
}
|
||||
return lastExtractorErr
|
||||
finalErr = lastExtractorErr
|
||||
}
|
||||
|
||||
if finalErr != nil {
|
||||
if config.ErrorHandler != nil {
|
||||
return config.ErrorHandler(finalErr, c)
|
||||
}
|
||||
return finalErr
|
||||
}
|
||||
}
|
||||
|
||||
|
22
vendor/github.com/lrstanley/girc/README.md
generated
vendored
22
vendor/github.com/lrstanley/girc/README.md
generated
vendored
@ -47,7 +47,13 @@
|
||||
<!-- do not edit anything in this "template" block, its auto-generated -->
|
||||
## :link: Table of Contents
|
||||
|
||||
- []()
|
||||
- [Features](#features)
|
||||
- [Installing](#installing)
|
||||
- [Examples](#examples)
|
||||
- [References](#references)
|
||||
- [Support & Assistance](#raising_hand_man-support--assistance)
|
||||
- [Contributing](#handshake-contributing)
|
||||
- [License](#balance_scale-license)
|
||||
<!-- template:end:toc -->
|
||||
|
||||
## Features
|
||||
@ -112,24 +118,24 @@ Working on a project and want to add it to the list? Submit a pull request!
|
||||
<!-- do not edit anything in this "template" block, its auto-generated -->
|
||||
## :raising_hand_man: Support & Assistance
|
||||
|
||||
* :heart: Please review the [Code of Conduct](.github/CODE_OF_CONDUCT.md) for
|
||||
* :heart: Please review the [Code of Conduct](.github/CODE_OF_CONDUCT.md) for
|
||||
guidelines on ensuring everyone has the best experience interacting with
|
||||
the community.
|
||||
* :raising_hand_man: Take a look at the [support](.github/SUPPORT.md) document on
|
||||
* :raising_hand_man: Take a look at the [support](.github/SUPPORT.md) document on
|
||||
guidelines for tips on how to ask the right questions.
|
||||
* :lady_beetle: For all features/bugs/issues/questions/etc, [head over here](https://github.com/lrstanley/girc/issues/new/choose).
|
||||
* :lady_beetle: For all features/bugs/issues/questions/etc, [head over here](https://github.com/lrstanley/girc/issues/new/choose).
|
||||
<!-- template:end:support -->
|
||||
|
||||
<!-- template:begin:contributing -->
|
||||
<!-- do not edit anything in this "template" block, its auto-generated -->
|
||||
## :handshake: Contributing
|
||||
|
||||
* :heart: Please review the [Code of Conduct](.github/CODE_OF_CONDUCT.md) for guidelines
|
||||
* :heart: Please review the [Code of Conduct](.github/CODE_OF_CONDUCT.md) for guidelines
|
||||
on ensuring everyone has the best experience interacting with the
|
||||
community.
|
||||
* :clipboard: Please review the [contributing](.github/CONTRIBUTING.md) doc for submitting
|
||||
community.
|
||||
* :clipboard: Please review the [contributing](.github/CONTRIBUTING.md) doc for submitting
|
||||
issues/a guide on submitting pull requests and helping out.
|
||||
* :old_key: For anything security related, please review this repositories [security policy](https://github.com/lrstanley/girc/security/policy).
|
||||
* :old_key: For anything security related, please review this repositories [security policy](https://github.com/lrstanley/girc/security/policy).
|
||||
<!-- template:end:contributing -->
|
||||
|
||||
<!-- template:begin:license -->
|
||||
|
1262
vendor/go.mau.fi/whatsmeow/binary/proto/def.pb.go
vendored
1262
vendor/go.mau.fi/whatsmeow/binary/proto/def.pb.go
vendored
File diff suppressed because it is too large
Load Diff
BIN
vendor/go.mau.fi/whatsmeow/binary/proto/def.pb.raw
vendored
BIN
vendor/go.mau.fi/whatsmeow/binary/proto/def.pb.raw
vendored
Binary file not shown.
@ -358,6 +358,7 @@ message HistorySyncNotification {
|
||||
FULL = 2;
|
||||
RECENT = 3;
|
||||
PUSH_NAME = 4;
|
||||
NON_BLOCKING_DATA = 5;
|
||||
}
|
||||
optional bytes fileSha256 = 1;
|
||||
optional uint64 fileLength = 2;
|
||||
@ -1014,6 +1015,7 @@ message SendPaymentMessage {
|
||||
enum RmrSource {
|
||||
FAVORITE_STICKER = 0;
|
||||
RECENT_STICKER = 1;
|
||||
RECENT_STICKER_INIT = 2;
|
||||
}
|
||||
message RequestPhoneNumberMessage {
|
||||
optional ContextInfo contextInfo = 1;
|
||||
@ -1132,6 +1134,7 @@ message StickerMetadata {
|
||||
optional string directPath = 8;
|
||||
optional uint64 fileLength = 9;
|
||||
optional float weight = 10;
|
||||
optional int64 lastStickerSentTs = 11;
|
||||
}
|
||||
|
||||
message Pushname {
|
||||
@ -1140,7 +1143,7 @@ message Pushname {
|
||||
}
|
||||
|
||||
message PastParticipants {
|
||||
required string groupJid = 1;
|
||||
optional string groupJid = 1;
|
||||
repeated PastParticipant pastParticipants = 2;
|
||||
}
|
||||
|
||||
@ -1149,9 +1152,9 @@ message PastParticipant {
|
||||
LEFT = 0;
|
||||
REMOVED = 1;
|
||||
}
|
||||
required string userJid = 1;
|
||||
required LeaveReason leaveReason = 2;
|
||||
required uint64 leaveTs = 3;
|
||||
optional string userJid = 1;
|
||||
optional LeaveReason leaveReason = 2;
|
||||
optional uint64 leaveTs = 3;
|
||||
}
|
||||
|
||||
enum MediaVisibility {
|
||||
@ -1166,7 +1169,7 @@ message HistorySync {
|
||||
FULL = 2;
|
||||
RECENT = 3;
|
||||
PUSH_NAME = 4;
|
||||
UNBLOCKING_DATA = 5;
|
||||
NON_BLOCKING_DATA = 5;
|
||||
}
|
||||
required HistorySyncType syncType = 1;
|
||||
repeated Conversation conversations = 2;
|
||||
@ -1297,6 +1300,7 @@ message MsgOpaqueData {
|
||||
repeated PollOption pollOptions = 18;
|
||||
optional uint32 pollSelectableOptionsCount = 20;
|
||||
optional bytes messageSecret = 21;
|
||||
optional string originalSelfAuthorJid = 51;
|
||||
optional int64 senderTimestampMs = 22;
|
||||
optional string pollUpdateParentKey = 23;
|
||||
optional PollEncValue encPollVote = 24;
|
||||
@ -1481,6 +1485,10 @@ message SecurityNotificationSetting {
|
||||
optional bool showNotification = 1;
|
||||
}
|
||||
|
||||
message RemoveRecentStickerAction {
|
||||
optional int64 lastStickerSentTs = 1;
|
||||
}
|
||||
|
||||
message RecentEmojiWeightsAction {
|
||||
repeated RecentEmojiWeight weights = 1;
|
||||
}
|
||||
@ -2006,6 +2014,8 @@ message WebMessageInfo {
|
||||
COMMUNITY_PARTICIPANT_PROMOTE = 147;
|
||||
COMMUNITY_PARTICIPANT_DEMOTE = 148;
|
||||
COMMUNITY_PARENT_GROUP_DELETED = 149;
|
||||
COMMUNITY_LINK_PARENT_GROUP_MEMBERSHIP_APPROVAL = 150;
|
||||
GROUP_PARTICIPANT_JOINED_GROUP_AND_PARENT_GROUP = 151;
|
||||
}
|
||||
enum Status {
|
||||
ERROR = 0;
|
||||
|
@ -74,7 +74,7 @@ func (vc WAVersionContainer) ProtoAppVersion() *waProto.ClientPayload_UserAgent_
|
||||
}
|
||||
|
||||
// waVersion is the WhatsApp web client version
|
||||
var waVersion = WAVersionContainer{2, 2228, 12}
|
||||
var waVersion = WAVersionContainer{2, 2230, 10}
|
||||
|
||||
// waVersionHash is the md5 hash of a dot-separated waVersion
|
||||
var waVersionHash [16]byte
|
||||
|
17
vendor/modules.txt
vendored
17
vendor/modules.txt
vendored
@ -55,10 +55,10 @@ github.com/av-elier/go-decimal-to-rational
|
||||
# github.com/blang/semver v3.5.1+incompatible
|
||||
## explicit
|
||||
github.com/blang/semver
|
||||
# github.com/bwmarrin/discordgo v0.25.0
|
||||
# github.com/bwmarrin/discordgo v0.26.1
|
||||
## explicit; go 1.13
|
||||
github.com/bwmarrin/discordgo
|
||||
# github.com/d5/tengo/v2 v2.12.1
|
||||
# github.com/d5/tengo/v2 v2.12.2
|
||||
## explicit; go 1.13
|
||||
github.com/d5/tengo/v2
|
||||
github.com/d5/tengo/v2/parser
|
||||
@ -93,12 +93,11 @@ github.com/golang-jwt/jwt
|
||||
## explicit; go 1.9
|
||||
github.com/golang/protobuf/proto
|
||||
github.com/golang/protobuf/protoc-gen-go/descriptor
|
||||
# github.com/gomarkdown/markdown v0.0.0-20220731190611-dcdaee8e7a53
|
||||
# github.com/gomarkdown/markdown v0.0.0-20220830015526-01a3c37d6f50
|
||||
## explicit; go 1.12
|
||||
github.com/gomarkdown/markdown
|
||||
github.com/gomarkdown/markdown/ast
|
||||
github.com/gomarkdown/markdown/html
|
||||
github.com/gomarkdown/markdown/internal/valid
|
||||
github.com/gomarkdown/markdown/parser
|
||||
# github.com/google/gops v0.3.25
|
||||
## explicit; go 1.13
|
||||
@ -199,7 +198,7 @@ github.com/klauspost/cpuid/v2
|
||||
# github.com/kyokomi/emoji/v2 v2.2.10
|
||||
## explicit; go 1.14
|
||||
github.com/kyokomi/emoji/v2
|
||||
# github.com/labstack/echo/v4 v4.8.0
|
||||
# github.com/labstack/echo/v4 v4.9.0
|
||||
## explicit; go 1.17
|
||||
github.com/labstack/echo/v4
|
||||
github.com/labstack/echo/v4/middleware
|
||||
@ -209,7 +208,7 @@ github.com/labstack/gommon/bytes
|
||||
github.com/labstack/gommon/color
|
||||
github.com/labstack/gommon/log
|
||||
github.com/labstack/gommon/random
|
||||
# github.com/lrstanley/girc v0.0.0-20220812131643-56459d73b75a
|
||||
# github.com/lrstanley/girc v0.0.0-20220821023908-8e7df6d970f8
|
||||
## explicit; go 1.18
|
||||
github.com/lrstanley/girc
|
||||
# github.com/magiconair/properties v1.8.6
|
||||
@ -514,7 +513,7 @@ go.mau.fi/libsignal/util/errorhelper
|
||||
go.mau.fi/libsignal/util/keyhelper
|
||||
go.mau.fi/libsignal/util/medium
|
||||
go.mau.fi/libsignal/util/optional
|
||||
# go.mau.fi/whatsmeow v0.0.0-20220804175245-31c5af44cb82
|
||||
# go.mau.fi/whatsmeow v0.0.0-20220811191500-f650c10b0068
|
||||
## explicit; go 1.17
|
||||
go.mau.fi/whatsmeow
|
||||
go.mau.fi/whatsmeow/appstate
|
||||
@ -567,7 +566,7 @@ golang.org/x/crypto/scrypt
|
||||
golang.org/x/crypto/ssh
|
||||
golang.org/x/crypto/ssh/internal/bcrypt_pbkdf
|
||||
golang.org/x/crypto/ssh/terminal
|
||||
# golang.org/x/image v0.0.0-20220722155232-062f8c9fd539
|
||||
# golang.org/x/image v0.0.0-20220902085622-e7cb96979f69
|
||||
## explicit; go 1.12
|
||||
golang.org/x/image/riff
|
||||
golang.org/x/image/vp8
|
||||
@ -589,7 +588,7 @@ golang.org/x/net/http2/hpack
|
||||
golang.org/x/net/idna
|
||||
golang.org/x/net/publicsuffix
|
||||
golang.org/x/net/websocket
|
||||
# golang.org/x/oauth2 v0.0.0-20220808172628-8227340efae7
|
||||
# golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094
|
||||
## explicit; go 1.17
|
||||
golang.org/x/oauth2
|
||||
golang.org/x/oauth2/clientcredentials
|
||||
|
Loading…
Reference in New Issue
Block a user