Compare commits
19 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
641ed1873b | ||
|
|
1d50da4b1c | ||
|
|
c7897cca5d | ||
|
|
4091b6f6b4 | ||
|
|
766f35554e | ||
|
|
c86137449e | ||
|
|
efec01a92f | ||
|
|
4fcad8e04b | ||
|
|
4b4b2d790e | ||
|
|
ec6ae343dd | ||
|
|
b9fb361959 | ||
|
|
a189298ab0 | ||
|
|
714a2ad730 | ||
|
|
fa8b96dfa1 | ||
|
|
01955a0df8 | ||
|
|
ac4aee39e3 | ||
|
|
a0bca42a7a | ||
|
|
af543dcd05 | ||
|
|
af77109a47 |
10
README.md
@@ -163,7 +163,7 @@ See <https://github.com/42wim/matterbridge/wiki>
|
||||
|
||||
### Binaries
|
||||
|
||||
- Latest stable release [v1.22.1](https://github.com/42wim/matterbridge/releases/latest)
|
||||
- Latest stable release [v1.22.2](https://github.com/42wim/matterbridge/releases/latest)
|
||||
- Development releases (follows master) can be downloaded [here](https://github.com/42wim/matterbridge/actions) selecting the latest green build and then artifacts.
|
||||
|
||||
To install or upgrade just download the latest [binary](https://github.com/42wim/matterbridge/releases/latest). On \*nix platforms you may need to make the binary executable - you can do this by running `chmod a+x` on the binary (example: `chmod a+x matterbridge-1.20.0-linux-64bit`). After downloading (and making the binary executable, if necessary), follow the instructions on the [howto](https://github.com/42wim/matterbridge/wiki/How-to-create-your-config) for a step by step walkthrough for creating your configuration.
|
||||
@@ -212,8 +212,8 @@ All possible [settings](https://github.com/42wim/matterbridge/wiki/Settings) for
|
||||
|
||||
```toml
|
||||
[irc]
|
||||
[irc.freenode]
|
||||
Server="irc.freenode.net:6667"
|
||||
[irc.libera]
|
||||
Server="irc.libera.chat:6667"
|
||||
Nick="yourbotname"
|
||||
|
||||
[mattermost]
|
||||
@@ -229,7 +229,7 @@ All possible [settings](https://github.com/42wim/matterbridge/wiki/Settings) for
|
||||
name="mygateway"
|
||||
enable=true
|
||||
[[gateway.inout]]
|
||||
account="irc.freenode"
|
||||
account="irc.libera"
|
||||
channel="#testing"
|
||||
|
||||
[[gateway.inout]]
|
||||
@@ -363,7 +363,7 @@ Matterbridge wouldn't exist without these libraries:
|
||||
|
||||
[mb-discord]: https://discord.gg/AkKPtrQ
|
||||
[mb-gitter]: https://gitter.im/42wim/matterbridge
|
||||
[mb-irc]: https://webchat.freenode.net/?channels=matterbridgechat
|
||||
[mb-irc]: https://web.libera.chat/#matterbridge
|
||||
[mb-keybase]: https://keybase.io/team/matterbridge
|
||||
[mb-matrix]: https://riot.im/app/#/room/#matterbridge:matrix.org
|
||||
[mb-mattermost]: https://framateam.org/signup_user_complete/?id=tfqm33ggop8x3qgu4boeieta6e
|
||||
|
||||
@@ -85,27 +85,28 @@ type ChannelMember struct {
|
||||
type ChannelMembers []ChannelMember
|
||||
|
||||
type Protocol struct {
|
||||
AuthCode string // steam
|
||||
BindAddress string // mattermost, slack // DEPRECATED
|
||||
Buffer int // api
|
||||
Charset string // irc
|
||||
ClientID string // msteams
|
||||
ColorNicks bool // only irc for now
|
||||
Debug bool // general
|
||||
DebugLevel int // only for irc now
|
||||
DisableWebPagePreview bool // telegram
|
||||
EditSuffix string // mattermost, slack, discord, telegram, gitter
|
||||
EditDisable bool // mattermost, slack, discord, telegram, gitter
|
||||
HTMLDisable bool // matrix
|
||||
IconURL string // mattermost, slack
|
||||
IgnoreFailureOnStart bool // general
|
||||
IgnoreNicks string // all protocols
|
||||
IgnoreMessages string // all protocols
|
||||
Jid string // xmpp
|
||||
JoinDelay string // all protocols
|
||||
Label string // all protocols
|
||||
Login string // mattermost, matrix
|
||||
LogFile string // general
|
||||
AllowMention []string // discord
|
||||
AuthCode string // steam
|
||||
BindAddress string // mattermost, slack // DEPRECATED
|
||||
Buffer int // api
|
||||
Charset string // irc
|
||||
ClientID string // msteams
|
||||
ColorNicks bool // only irc for now
|
||||
Debug bool // general
|
||||
DebugLevel int // only for irc now
|
||||
DisableWebPagePreview bool // telegram
|
||||
EditSuffix string // mattermost, slack, discord, telegram, gitter
|
||||
EditDisable bool // mattermost, slack, discord, telegram, gitter
|
||||
HTMLDisable bool // matrix
|
||||
IconURL string // mattermost, slack
|
||||
IgnoreFailureOnStart bool // general
|
||||
IgnoreNicks string // all protocols
|
||||
IgnoreMessages string // all protocols
|
||||
Jid string // xmpp
|
||||
JoinDelay string // all protocols
|
||||
Label string // all protocols
|
||||
Login string // mattermost, matrix
|
||||
LogFile string // general
|
||||
MediaDownloadBlackList []string
|
||||
MediaDownloadPath string // Basically MediaServerUpload, but instead of uploading it, just write it to a file on the same server.
|
||||
MediaDownloadSize int // all protocols
|
||||
@@ -119,6 +120,7 @@ type Protocol struct {
|
||||
MessageQueue int // IRC, size of message queue for flood control
|
||||
MessageSplit bool // IRC, split long messages with newlines on MessageLength instead of clipping
|
||||
Muc string // xmpp
|
||||
MxID string // matrix
|
||||
Name string // all protocols
|
||||
Nick string // all protocols
|
||||
NickFormatter string // mattermost, slack
|
||||
@@ -141,7 +143,7 @@ type Protocol struct {
|
||||
ReplaceNicks [][]string // all protocols
|
||||
RemoteNickFormat string // all protocols
|
||||
RunCommands []string // IRC
|
||||
Server string // IRC,mattermost,XMPP,discord
|
||||
Server string // IRC,mattermost,XMPP,discord,matrix
|
||||
SessionFile string // msteams,whatsapp
|
||||
ShowJoinPart bool // all protocols
|
||||
ShowTopicChange bool // slack
|
||||
@@ -156,7 +158,7 @@ type Protocol struct {
|
||||
Team string // mattermost, keybase
|
||||
TeamID string // msteams
|
||||
TenantID string // msteams
|
||||
Token string // gitter, slack, discord, api
|
||||
Token string // gitter, slack, discord, api, matrix
|
||||
Topic string // zulip
|
||||
URL string // mattermost, slack // DEPRECATED
|
||||
UseAPI bool // mattermost, slack
|
||||
|
||||
@@ -283,7 +283,7 @@ func (b *Bdiscord) handleEventBotUser(msg *config.Message, channelID string) (st
|
||||
// Upload a file if it exists
|
||||
if msg.Extra != nil {
|
||||
for _, rmsg := range helper.HandleExtra(msg, b.General) {
|
||||
rmsg.Text = helper.ClipMessage(rmsg.Text, MessageLength)
|
||||
rmsg.Text = helper.ClipMessage(rmsg.Text, MessageLength, b.GetString("MessageClipped"))
|
||||
if _, err := b.c.ChannelMessageSend(channelID, rmsg.Username+rmsg.Text); err != nil {
|
||||
b.Log.Errorf("Could not send message %#v: %s", rmsg, err)
|
||||
}
|
||||
@@ -294,7 +294,7 @@ func (b *Bdiscord) handleEventBotUser(msg *config.Message, channelID string) (st
|
||||
}
|
||||
}
|
||||
|
||||
msg.Text = helper.ClipMessage(msg.Text, MessageLength)
|
||||
msg.Text = helper.ClipMessage(msg.Text, MessageLength, b.GetString("MessageClipped"))
|
||||
msg.Text = b.replaceUserMentions(msg.Text)
|
||||
|
||||
// Edit message
|
||||
@@ -304,7 +304,8 @@ func (b *Bdiscord) handleEventBotUser(msg *config.Message, channelID string) (st
|
||||
}
|
||||
|
||||
m := discordgo.MessageSend{
|
||||
Content: msg.Username + msg.Text,
|
||||
Content: msg.Username + msg.Text,
|
||||
AllowedMentions: b.getAllowedMentions(),
|
||||
}
|
||||
|
||||
if msg.ParentValid() {
|
||||
@@ -335,8 +336,9 @@ func (b *Bdiscord) handleUploadFile(msg *config.Message, channelID string) (stri
|
||||
Reader: bytes.NewReader(*fi.Data),
|
||||
}
|
||||
m := discordgo.MessageSend{
|
||||
Content: msg.Username + fi.Comment,
|
||||
Files: []*discordgo.File{&file},
|
||||
Content: msg.Username + fi.Comment,
|
||||
Files: []*discordgo.File{&file},
|
||||
AllowedMentions: b.getAllowedMentions(),
|
||||
}
|
||||
_, err = b.c.ChannelMessageSendComplex(channelID, &m)
|
||||
if err != nil {
|
||||
|
||||
@@ -9,6 +9,30 @@ import (
|
||||
"github.com/matterbridge/discordgo"
|
||||
)
|
||||
|
||||
func (b *Bdiscord) getAllowedMentions() *discordgo.MessageAllowedMentions {
|
||||
// If AllowMention is not specified, then allow all mentions (default Discord behavior)
|
||||
if !b.IsKeySet("AllowMention") {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Otherwise, allow only the mentions that are specified
|
||||
allowedMentionTypes := make([]discordgo.AllowedMentionType, 0, 3)
|
||||
for _, m := range b.GetStringSlice("AllowMention") {
|
||||
switch m {
|
||||
case "everyone":
|
||||
allowedMentionTypes = append(allowedMentionTypes, discordgo.AllowedMentionTypeEveryone)
|
||||
case "roles":
|
||||
allowedMentionTypes = append(allowedMentionTypes, discordgo.AllowedMentionTypeRoles)
|
||||
case "users":
|
||||
allowedMentionTypes = append(allowedMentionTypes, discordgo.AllowedMentionTypeUsers)
|
||||
}
|
||||
}
|
||||
|
||||
return &discordgo.MessageAllowedMentions{
|
||||
Parse: allowedMentionTypes,
|
||||
}
|
||||
}
|
||||
|
||||
func (b *Bdiscord) getNick(user *discordgo.User, guildID string) string {
|
||||
b.membersMutex.RLock()
|
||||
defer b.membersMutex.RUnlock()
|
||||
|
||||
@@ -63,9 +63,10 @@ func (b *Bdiscord) webhookSend(msg *config.Message, channelID string) (*discordg
|
||||
res, err = b.transmitter.Send(
|
||||
channelID,
|
||||
&discordgo.WebhookParams{
|
||||
Content: msg.Text,
|
||||
Username: msg.Username,
|
||||
AvatarURL: msg.Avatar,
|
||||
Content: msg.Text,
|
||||
Username: msg.Username,
|
||||
AvatarURL: msg.Avatar,
|
||||
AllowedMentions: b.getAllowedMentions(),
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
@@ -88,10 +89,11 @@ func (b *Bdiscord) webhookSend(msg *config.Message, channelID string) (*discordg
|
||||
_, e2 := b.transmitter.Send(
|
||||
channelID,
|
||||
&discordgo.WebhookParams{
|
||||
Username: msg.Username,
|
||||
AvatarURL: msg.Avatar,
|
||||
File: &file,
|
||||
Content: content,
|
||||
Username: msg.Username,
|
||||
AvatarURL: msg.Avatar,
|
||||
File: &file,
|
||||
Content: content,
|
||||
AllowedMentions: b.getAllowedMentions(),
|
||||
},
|
||||
)
|
||||
if e2 != nil {
|
||||
@@ -114,7 +116,7 @@ func (b *Bdiscord) handleEventWebhook(msg *config.Message, channelID string) (st
|
||||
return "", nil
|
||||
}
|
||||
|
||||
msg.Text = helper.ClipMessage(msg.Text, MessageLength)
|
||||
msg.Text = helper.ClipMessage(msg.Text, MessageLength, b.GetString("MessageClipped"))
|
||||
msg.Text = b.replaceUserMentions(msg.Text)
|
||||
// discord username must be [0..32] max
|
||||
if len(msg.Username) > 32 {
|
||||
@@ -124,8 +126,9 @@ func (b *Bdiscord) handleEventWebhook(msg *config.Message, channelID string) (st
|
||||
if msg.ID != "" {
|
||||
b.Log.Debugf("Editing webhook message")
|
||||
err := b.transmitter.Edit(channelID, msg.ID, &discordgo.WebhookParams{
|
||||
Content: msg.Text,
|
||||
Username: msg.Username,
|
||||
Content: msg.Text,
|
||||
Username: msg.Username,
|
||||
AllowedMentions: b.getAllowedMentions(),
|
||||
})
|
||||
if err == nil {
|
||||
return msg.ID, nil
|
||||
|
||||
@@ -82,8 +82,10 @@ func DownloadFileAuthRocket(url, token, userID string) (*[]byte, error) {
|
||||
// TODO: The current implementation has the inconvenient that it disregards
|
||||
// word boundaries when splitting but this is hard to solve without potentially
|
||||
// breaking formatting and other stylistic effects.
|
||||
func GetSubLines(message string, maxLineLength int) []string {
|
||||
const clippingMessage = " <clipped message>"
|
||||
func GetSubLines(message string, maxLineLength int, clippingMessage string) []string {
|
||||
if clippingMessage == "" {
|
||||
clippingMessage = " <clipped message>"
|
||||
}
|
||||
|
||||
var lines []string
|
||||
for _, line := range strings.Split(strings.TrimSpace(message), "\n") {
|
||||
@@ -193,8 +195,11 @@ func RemoveEmptyNewLines(msg string) string {
|
||||
|
||||
// ClipMessage trims a message to the specified length if it exceeds it and adds a warning
|
||||
// to the message in case it does so.
|
||||
func ClipMessage(text string, length int) string {
|
||||
const clippingMessage = " <clipped message>"
|
||||
func ClipMessage(text string, length int, clippingMessage string) string {
|
||||
if clippingMessage == "" {
|
||||
clippingMessage = " <clipped message>"
|
||||
}
|
||||
|
||||
if len(text) > length {
|
||||
text = text[:length-len(clippingMessage)]
|
||||
if r, size := utf8.DecodeLastRuneInString(text); r == utf8.RuneError {
|
||||
|
||||
@@ -10,98 +10,96 @@ import (
|
||||
|
||||
const testLineLength = 64
|
||||
|
||||
var (
|
||||
lineSplittingTestCases = map[string]struct {
|
||||
input string
|
||||
splitOutput []string
|
||||
nonSplitOutput []string
|
||||
}{
|
||||
"Short single-line message": {
|
||||
input: "short",
|
||||
splitOutput: []string{"short"},
|
||||
nonSplitOutput: []string{"short"},
|
||||
var lineSplittingTestCases = map[string]struct {
|
||||
input string
|
||||
splitOutput []string
|
||||
nonSplitOutput []string
|
||||
}{
|
||||
"Short single-line message": {
|
||||
input: "short",
|
||||
splitOutput: []string{"short"},
|
||||
nonSplitOutput: []string{"short"},
|
||||
},
|
||||
"Long single-line message": {
|
||||
input: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
|
||||
splitOutput: []string{
|
||||
"Lorem ipsum dolor sit amet, consectetur adipis <clipped message>",
|
||||
"cing elit, sed do eiusmod tempor incididunt ut <clipped message>",
|
||||
" labore et dolore magna aliqua.",
|
||||
},
|
||||
"Long single-line message": {
|
||||
input: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
|
||||
splitOutput: []string{
|
||||
"Lorem ipsum dolor sit amet, consectetur adipis <clipped message>",
|
||||
"cing elit, sed do eiusmod tempor incididunt ut <clipped message>",
|
||||
" labore et dolore magna aliqua.",
|
||||
},
|
||||
nonSplitOutput: []string{"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."},
|
||||
nonSplitOutput: []string{"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."},
|
||||
},
|
||||
"Short multi-line message": {
|
||||
input: "I\ncan't\nget\nno\nsatisfaction!",
|
||||
splitOutput: []string{
|
||||
"I",
|
||||
"can't",
|
||||
"get",
|
||||
"no",
|
||||
"satisfaction!",
|
||||
},
|
||||
"Short multi-line message": {
|
||||
input: "I\ncan't\nget\nno\nsatisfaction!",
|
||||
splitOutput: []string{
|
||||
"I",
|
||||
"can't",
|
||||
"get",
|
||||
"no",
|
||||
"satisfaction!",
|
||||
},
|
||||
nonSplitOutput: []string{
|
||||
"I",
|
||||
"can't",
|
||||
"get",
|
||||
"no",
|
||||
"satisfaction!",
|
||||
},
|
||||
nonSplitOutput: []string{
|
||||
"I",
|
||||
"can't",
|
||||
"get",
|
||||
"no",
|
||||
"satisfaction!",
|
||||
},
|
||||
"Long multi-line message": {
|
||||
input: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n" +
|
||||
"Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n" +
|
||||
"Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\n" +
|
||||
"Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
|
||||
splitOutput: []string{
|
||||
"Lorem ipsum dolor sit amet, consectetur adipis <clipped message>",
|
||||
"cing elit, sed do eiusmod tempor incididunt ut <clipped message>",
|
||||
" labore et dolore magna aliqua.",
|
||||
"Ut enim ad minim veniam, quis nostrud exercita <clipped message>",
|
||||
"tion ullamco laboris nisi ut aliquip ex ea com <clipped message>",
|
||||
"modo consequat.",
|
||||
"Duis aute irure dolor in reprehenderit in volu <clipped message>",
|
||||
"ptate velit esse cillum dolore eu fugiat nulla <clipped message>",
|
||||
" pariatur.",
|
||||
"Excepteur sint occaecat cupidatat non proident <clipped message>",
|
||||
", sunt in culpa qui officia deserunt mollit an <clipped message>",
|
||||
"im id est laborum.",
|
||||
},
|
||||
nonSplitOutput: []string{
|
||||
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
|
||||
"Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.",
|
||||
"Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.",
|
||||
"Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
|
||||
},
|
||||
},
|
||||
"Long multi-line message": {
|
||||
input: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n" +
|
||||
"Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n" +
|
||||
"Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\n" +
|
||||
"Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
|
||||
splitOutput: []string{
|
||||
"Lorem ipsum dolor sit amet, consectetur adipis <clipped message>",
|
||||
"cing elit, sed do eiusmod tempor incididunt ut <clipped message>",
|
||||
" labore et dolore magna aliqua.",
|
||||
"Ut enim ad minim veniam, quis nostrud exercita <clipped message>",
|
||||
"tion ullamco laboris nisi ut aliquip ex ea com <clipped message>",
|
||||
"modo consequat.",
|
||||
"Duis aute irure dolor in reprehenderit in volu <clipped message>",
|
||||
"ptate velit esse cillum dolore eu fugiat nulla <clipped message>",
|
||||
" pariatur.",
|
||||
"Excepteur sint occaecat cupidatat non proident <clipped message>",
|
||||
", sunt in culpa qui officia deserunt mollit an <clipped message>",
|
||||
"im id est laborum.",
|
||||
},
|
||||
"Message ending with new-line.": {
|
||||
input: "Newline ending\n",
|
||||
splitOutput: []string{"Newline ending"},
|
||||
nonSplitOutput: []string{"Newline ending"},
|
||||
nonSplitOutput: []string{
|
||||
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
|
||||
"Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.",
|
||||
"Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.",
|
||||
"Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
|
||||
},
|
||||
"Long message containing UTF-8 multi-byte runes": {
|
||||
input: "不布人個我此而及單石業喜資富下我河下日沒一我臺空達的常景便物沒為……子大我別名解成?生賣的全直黑,我自我結毛分洲了世當,是政福那是東;斯說",
|
||||
splitOutput: []string{
|
||||
"不布人個我此而及單石業喜資富下 <clipped message>",
|
||||
"我河下日沒一我臺空達的常景便物 <clipped message>",
|
||||
"沒為……子大我別名解成?生賣的 <clipped message>",
|
||||
"全直黑,我自我結毛分洲了世當, <clipped message>",
|
||||
"是政福那是東;斯說",
|
||||
},
|
||||
nonSplitOutput: []string{"不布人個我此而及單石業喜資富下我河下日沒一我臺空達的常景便物沒為……子大我別名解成?生賣的全直黑,我自我結毛分洲了世當,是政福那是東;斯說"},
|
||||
},
|
||||
"Message ending with new-line.": {
|
||||
input: "Newline ending\n",
|
||||
splitOutput: []string{"Newline ending"},
|
||||
nonSplitOutput: []string{"Newline ending"},
|
||||
},
|
||||
"Long message containing UTF-8 multi-byte runes": {
|
||||
input: "不布人個我此而及單石業喜資富下我河下日沒一我臺空達的常景便物沒為……子大我別名解成?生賣的全直黑,我自我結毛分洲了世當,是政福那是東;斯說",
|
||||
splitOutput: []string{
|
||||
"不布人個我此而及單石業喜資富下 <clipped message>",
|
||||
"我河下日沒一我臺空達的常景便物 <clipped message>",
|
||||
"沒為……子大我別名解成?生賣的 <clipped message>",
|
||||
"全直黑,我自我結毛分洲了世當, <clipped message>",
|
||||
"是政福那是東;斯說",
|
||||
},
|
||||
}
|
||||
)
|
||||
nonSplitOutput: []string{"不布人個我此而及單石業喜資富下我河下日沒一我臺空達的常景便物沒為……子大我別名解成?生賣的全直黑,我自我結毛分洲了世當,是政福那是東;斯說"},
|
||||
},
|
||||
}
|
||||
|
||||
func TestGetSubLines(t *testing.T) {
|
||||
for testname, testcase := range lineSplittingTestCases {
|
||||
splitLines := GetSubLines(testcase.input, testLineLength)
|
||||
splitLines := GetSubLines(testcase.input, testLineLength, "")
|
||||
assert.Equalf(t, testcase.splitOutput, splitLines, "'%s' testcase should give expected lines with splitting.", testname)
|
||||
for _, splitLine := range splitLines {
|
||||
byteLength := len([]byte(splitLine))
|
||||
assert.True(t, byteLength <= testLineLength, "Splitted line '%s' of testcase '%s' should not exceed the maximum byte-length (%d vs. %d).", splitLine, testcase, byteLength, testLineLength)
|
||||
}
|
||||
|
||||
nonSplitLines := GetSubLines(testcase.input, 0)
|
||||
nonSplitLines := GetSubLines(testcase.input, 0, "")
|
||||
assert.Equalf(t, testcase.nonSplitOutput, nonSplitLines, "'%s' testcase should give expected lines without splitting.", testname)
|
||||
}
|
||||
}
|
||||
@@ -110,16 +108,19 @@ func TestConvertWebPToPNG(t *testing.T) {
|
||||
if os.Getenv("LOCAL_TEST") == "" {
|
||||
t.Skip()
|
||||
}
|
||||
|
||||
input, err := ioutil.ReadFile("test.webp")
|
||||
if err != nil {
|
||||
t.Fail()
|
||||
}
|
||||
|
||||
d := &input
|
||||
err = ConvertWebPToPNG(d)
|
||||
if err != nil {
|
||||
t.Fail()
|
||||
}
|
||||
err = ioutil.WriteFile("test.png", *d, 0644)
|
||||
|
||||
err = ioutil.WriteFile("test.png", *d, 0o644) // nolint:gosec
|
||||
if err != nil {
|
||||
t.Fail()
|
||||
}
|
||||
|
||||
@@ -167,9 +167,9 @@ func (b *Birc) Send(msg config.Message) (string, error) {
|
||||
}
|
||||
|
||||
if b.GetBool("MessageSplit") {
|
||||
msgLines = helper.GetSubLines(msg.Text, b.MessageLength)
|
||||
msgLines = helper.GetSubLines(msg.Text, b.MessageLength, b.GetString("MessageClipped"))
|
||||
} else {
|
||||
msgLines = helper.GetSubLines(msg.Text, 0)
|
||||
msgLines = helper.GetSubLines(msg.Text, 0, b.GetString("MessageClipped"))
|
||||
}
|
||||
for i := range msgLines {
|
||||
if len(b.Local) >= b.MessageQueue {
|
||||
@@ -316,12 +316,16 @@ func (b *Birc) endNames(client *girc.Client, event girc.Event) {
|
||||
sort.Strings(b.names[channel])
|
||||
maxNamesPerPost := (300 / b.nicksPerRow()) * b.nicksPerRow()
|
||||
for len(b.names[channel]) > maxNamesPerPost {
|
||||
b.Remote <- config.Message{Username: b.Nick, Text: b.formatnicks(b.names[channel][0:maxNamesPerPost]),
|
||||
Channel: channel, Account: b.Account}
|
||||
b.Remote <- config.Message{
|
||||
Username: b.Nick, Text: b.formatnicks(b.names[channel][0:maxNamesPerPost]),
|
||||
Channel: channel, Account: b.Account,
|
||||
}
|
||||
b.names[channel] = b.names[channel][maxNamesPerPost:]
|
||||
}
|
||||
b.Remote <- config.Message{Username: b.Nick, Text: b.formatnicks(b.names[channel]),
|
||||
Channel: channel, Account: b.Account}
|
||||
b.Remote <- config.Message{
|
||||
Username: b.Nick, Text: b.formatnicks(b.names[channel]),
|
||||
Channel: channel, Account: b.Account,
|
||||
}
|
||||
b.names[channel] = nil
|
||||
b.i.Handlers.Clear(girc.RPL_NAMREPLY)
|
||||
b.i.Handlers.Clear(girc.RPL_ENDOFNAMES)
|
||||
|
||||
@@ -75,22 +75,33 @@ func New(cfg *bridge.Config) bridge.Bridger {
|
||||
func (b *Bmatrix) Connect() error {
|
||||
var err error
|
||||
b.Log.Infof("Connecting %s", b.GetString("Server"))
|
||||
b.mc, err = matrix.NewClient(b.GetString("Server"), "", "")
|
||||
if err != nil {
|
||||
return err
|
||||
if b.GetString("MxID") != "" && b.GetString("Token") != "" {
|
||||
b.mc, err = matrix.NewClient(
|
||||
b.GetString("Server"), b.GetString("MxID"), b.GetString("Token"),
|
||||
)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
b.UserID = b.GetString("MxID")
|
||||
b.Log.Info("Using existing Matrix credentials")
|
||||
} else {
|
||||
b.mc, err = matrix.NewClient(b.GetString("Server"), "", "")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
resp, err := b.mc.Login(&matrix.ReqLogin{
|
||||
Type: "m.login.password",
|
||||
User: b.GetString("Login"),
|
||||
Password: b.GetString("Password"),
|
||||
Identifier: matrix.NewUserIdentifier(b.GetString("Login")),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
b.mc.SetCredentials(resp.UserID, resp.AccessToken)
|
||||
b.UserID = resp.UserID
|
||||
b.Log.Info("Connection succeeded")
|
||||
}
|
||||
resp, err := b.mc.Login(&matrix.ReqLogin{
|
||||
Type: "m.login.password",
|
||||
User: b.GetString("Login"),
|
||||
Password: b.GetString("Password"),
|
||||
Identifier: matrix.NewUserIdentifier(b.GetString("Login")),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
b.mc.SetCredentials(resp.UserID, resp.AccessToken)
|
||||
b.UserID = resp.UserID
|
||||
b.Log.Info("Connection succeeded")
|
||||
go b.handlematrix()
|
||||
return nil
|
||||
}
|
||||
@@ -357,13 +368,6 @@ func (b *Bmatrix) handleEvent(ev *matrix.Event) {
|
||||
Avatar: b.getAvatarURL(ev.Sender),
|
||||
}
|
||||
|
||||
// Text must be a string
|
||||
if rmsg.Text, ok = ev.Content["body"].(string); !ok {
|
||||
b.Log.Errorf("Content[body] is not a string: %T\n%#v",
|
||||
ev.Content["body"], ev.Content)
|
||||
return
|
||||
}
|
||||
|
||||
// Remove homeserver suffix if configured
|
||||
if b.GetBool("NoHomeServerSuffix") {
|
||||
re := regexp.MustCompile("(.*?):.*")
|
||||
@@ -379,6 +383,13 @@ func (b *Bmatrix) handleEvent(ev *matrix.Event) {
|
||||
return
|
||||
}
|
||||
|
||||
// Text must be a string
|
||||
if rmsg.Text, ok = ev.Content["body"].(string); !ok {
|
||||
b.Log.Errorf("Content[body] is not a string: %T\n%#v",
|
||||
ev.Content["body"], ev.Content)
|
||||
return
|
||||
}
|
||||
|
||||
// Do we have a /me action
|
||||
if ev.Content["msgtype"].(string) == "m.emote" {
|
||||
rmsg.Event = config.EventUserAction
|
||||
|
||||
@@ -248,9 +248,9 @@ func (b *Bmumble) processMessage(msg *config.Message) {
|
||||
// If there is a maximum message length, split and truncate the lines
|
||||
var msgLines []string
|
||||
if maxLength := b.serverConfig.MaximumMessageLength; maxLength != nil {
|
||||
msgLines = helper.GetSubLines(msg.Text, *maxLength-len(msg.Username))
|
||||
msgLines = helper.GetSubLines(msg.Text, *maxLength-len(msg.Username), b.GetString("MessageClipped"))
|
||||
} else {
|
||||
msgLines = helper.GetSubLines(msg.Text, 0)
|
||||
msgLines = helper.GetSubLines(msg.Text, 0, b.GetString("MessageClipped"))
|
||||
}
|
||||
// Send the individual lindes
|
||||
for i := range msgLines {
|
||||
|
||||
@@ -74,12 +74,6 @@ func (b *Btalk) JoinChannel(channel config.ChannelInfo) error {
|
||||
}
|
||||
b.rooms = append(b.rooms, newRoom)
|
||||
|
||||
// Config
|
||||
guestSuffix := " (Guest)"
|
||||
if b.IsKeySet("GuestSuffix") {
|
||||
guestSuffix = b.GetString("GuestSuffix")
|
||||
}
|
||||
|
||||
go func() {
|
||||
for msg := range c {
|
||||
msg := msg
|
||||
@@ -90,35 +84,23 @@ func (b *Btalk) JoinChannel(channel config.ChannelInfo) error {
|
||||
return
|
||||
}
|
||||
|
||||
// ignore messages that are one of the following
|
||||
// * not a message from a user
|
||||
// * from ourselves
|
||||
if msg.MessageType != ocs.MessageComment || msg.ActorID == b.user.User {
|
||||
continue
|
||||
}
|
||||
remoteMessage := config.Message{
|
||||
Text: formatRichObjectString(msg.Message, msg.MessageParameters),
|
||||
Channel: newRoom.room.Token,
|
||||
Username: DisplayName(msg, guestSuffix),
|
||||
UserID: msg.ActorID,
|
||||
Account: b.Account,
|
||||
}
|
||||
// It is possible for the ID to not be set on older versions of Talk so we only set it if
|
||||
// the ID is not blank
|
||||
if msg.ID != 0 {
|
||||
remoteMessage.ID = strconv.Itoa(msg.ID)
|
||||
}
|
||||
|
||||
// Handle Files
|
||||
err = b.handleFiles(&remoteMessage, &msg)
|
||||
if err != nil {
|
||||
b.Log.Errorf("Error handling file: %#v", msg)
|
||||
|
||||
// Ignore messages that are from the bot user
|
||||
if msg.ActorID == b.user.User {
|
||||
continue
|
||||
}
|
||||
|
||||
// Handle deleting messages
|
||||
if msg.MessageType == ocs.MessageSystem && msg.Parent != nil && msg.Parent.MessageType == ocs.MessageDelete {
|
||||
b.handleDeletingMessage(&msg, &newRoom)
|
||||
continue
|
||||
}
|
||||
|
||||
// Handle sending messages
|
||||
if msg.MessageType == ocs.MessageComment {
|
||||
b.handleSendingMessage(&msg, &newRoom)
|
||||
continue
|
||||
}
|
||||
|
||||
b.Log.Debugf("<= Message is %#v", remoteMessage)
|
||||
b.Remote <- remoteMessage
|
||||
}
|
||||
}()
|
||||
return nil
|
||||
@@ -131,16 +113,40 @@ func (b *Btalk) Send(msg config.Message) (string, error) {
|
||||
return "", nil
|
||||
}
|
||||
|
||||
// Talk currently only supports sending normal messages
|
||||
if msg.Event != "" {
|
||||
return "", nil
|
||||
// Standard Message Send
|
||||
if msg.Event == "" {
|
||||
// Handle sending files if they are included
|
||||
err := b.handleSendingFile(&msg, r)
|
||||
if err != nil {
|
||||
b.Log.Errorf("Could not send files in message to room %v from %v: %v", msg.Channel, msg.Username, err)
|
||||
|
||||
return "", nil
|
||||
}
|
||||
|
||||
sentMessage, err := r.room.SendMessage(msg.Username + msg.Text)
|
||||
if err != nil {
|
||||
b.Log.Errorf("Could not send message to room %v from %v: %v", msg.Channel, msg.Username, err)
|
||||
|
||||
return "", nil
|
||||
}
|
||||
return strconv.Itoa(sentMessage.ID), nil
|
||||
}
|
||||
sentMessage, err := r.room.SendMessage(msg.Username + msg.Text)
|
||||
if err != nil {
|
||||
b.Log.Errorf("Could not send message to room %v from %v: %v", msg.Channel, msg.Username, err)
|
||||
return "", nil
|
||||
|
||||
// Message Deletion
|
||||
if msg.Event == config.EventMsgDelete {
|
||||
messageID, err := strconv.Atoi(msg.ID)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
data, err := r.room.DeleteMessage(messageID)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return strconv.Itoa(data.ID), nil
|
||||
}
|
||||
return strconv.Itoa(sentMessage.ID), nil
|
||||
|
||||
// Message is not a type that is currently supported
|
||||
return "", nil
|
||||
}
|
||||
|
||||
func (b *Btalk) getRoom(token string) *Broom {
|
||||
@@ -177,6 +183,74 @@ func (b *Btalk) handleFiles(mmsg *config.Message, message *ocs.TalkRoomMessageDa
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Btalk) handleSendingFile(msg *config.Message, r *Broom) error {
|
||||
for _, f := range msg.Extra["file"] {
|
||||
fi := f.(config.FileInfo)
|
||||
if fi.URL == "" {
|
||||
continue
|
||||
}
|
||||
|
||||
message := msg.Username
|
||||
if fi.Comment != "" {
|
||||
message += fi.Comment + " "
|
||||
}
|
||||
message += fi.URL
|
||||
_, err := r.room.SendMessage(message)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Btalk) handleSendingMessage(msg *ocs.TalkRoomMessageData, r *Broom) {
|
||||
remoteMessage := config.Message{
|
||||
Text: formatRichObjectString(msg.Message, msg.MessageParameters),
|
||||
Channel: r.room.Token,
|
||||
Username: DisplayName(msg, b.guestSuffix()),
|
||||
UserID: msg.ActorID,
|
||||
Account: b.Account,
|
||||
}
|
||||
// It is possible for the ID to not be set on older versions of Talk so we only set it if
|
||||
// the ID is not blank
|
||||
if msg.ID != 0 {
|
||||
remoteMessage.ID = strconv.Itoa(msg.ID)
|
||||
}
|
||||
|
||||
// Handle Files
|
||||
err := b.handleFiles(&remoteMessage, msg)
|
||||
if err != nil {
|
||||
b.Log.Errorf("Error handling file: %#v", msg)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
b.Log.Debugf("<= Message is %#v", remoteMessage)
|
||||
b.Remote <- remoteMessage
|
||||
}
|
||||
|
||||
func (b *Btalk) handleDeletingMessage(msg *ocs.TalkRoomMessageData, r *Broom) {
|
||||
remoteMessage := config.Message{
|
||||
Event: config.EventMsgDelete,
|
||||
Text: config.EventMsgDelete,
|
||||
Channel: r.room.Token,
|
||||
ID: strconv.Itoa(msg.Parent.ID),
|
||||
Account: b.Account,
|
||||
}
|
||||
b.Log.Debugf("<= Message being deleted is %#v", remoteMessage)
|
||||
b.Remote <- remoteMessage
|
||||
}
|
||||
|
||||
func (b *Btalk) guestSuffix() string {
|
||||
guestSuffix := " (Guest)"
|
||||
if b.IsKeySet("GuestSuffix") {
|
||||
guestSuffix = b.GetString("GuestSuffix")
|
||||
}
|
||||
|
||||
return guestSuffix
|
||||
}
|
||||
|
||||
// Spec: https://github.com/nextcloud/server/issues/1706#issue-182308785
|
||||
func formatRichObjectString(message string, parameters map[string]ocs.RichObjectString) string {
|
||||
for id, parameter := range parameters {
|
||||
@@ -197,7 +271,7 @@ func formatRichObjectString(message string, parameters map[string]ocs.RichObject
|
||||
return message
|
||||
}
|
||||
|
||||
func DisplayName(msg ocs.TalkRoomMessageData, suffix string) string {
|
||||
func DisplayName(msg *ocs.TalkRoomMessageData, suffix string) string {
|
||||
if msg.ActorType == ocs.ActorGuest {
|
||||
if msg.ActorDisplayName == "" {
|
||||
return "Guest"
|
||||
|
||||
@@ -156,7 +156,7 @@ func (b *Bslack) JoinChannel(channel config.ChannelInfo) error {
|
||||
|
||||
// try to join a channel when in legacy
|
||||
if b.legacy {
|
||||
_, err := b.sc.JoinChannel(channel.Name)
|
||||
_, _, _, err := b.sc.JoinConversation(channel.Name)
|
||||
if err != nil {
|
||||
switch err.Error() {
|
||||
case "name_taken", "restricted_action":
|
||||
@@ -195,7 +195,7 @@ func (b *Bslack) Send(msg config.Message) (string, error) {
|
||||
b.Log.Debugf("=> Receiving %#v", msg)
|
||||
}
|
||||
|
||||
msg.Text = helper.ClipMessage(msg.Text, messageLength)
|
||||
msg.Text = helper.ClipMessage(msg.Text, messageLength, b.GetString("MessageClipped"))
|
||||
msg.Text = b.replaceCodeFence(msg.Text)
|
||||
|
||||
// Make a action /me of the message
|
||||
|
||||
@@ -283,7 +283,7 @@ func (b *channels) populateChannels(wait bool) {
|
||||
// We only retrieve public and private channels, not IMs
|
||||
// and MPIMs as those do not have a channel name.
|
||||
queryParams := &slack.GetConversationsParameters{
|
||||
ExcludeArchived: "true",
|
||||
ExcludeArchived: true,
|
||||
Types: []string{"public_channel,private_channel"},
|
||||
}
|
||||
for {
|
||||
|
||||
@@ -175,6 +175,11 @@ func (b *Bwhatsapp) HandleImageMessage(message whatsapp.ImageMessage) {
|
||||
fileExt[0] = ".jpg"
|
||||
}
|
||||
|
||||
// rename .jpe to .jpg https://github.com/42wim/matterbridge/issues/1463
|
||||
if fileExt[0] == ".jpe" {
|
||||
fileExt[0] = ".jpg"
|
||||
}
|
||||
|
||||
filename := fmt.Sprintf("%v%v", message.Info.Id, fileExt[0])
|
||||
|
||||
b.Log.Debugf("Trying to download %s with type %s", filename, message.Type)
|
||||
@@ -232,6 +237,10 @@ func (b *Bwhatsapp) HandleVideoMessage(message whatsapp.VideoMessage) {
|
||||
return
|
||||
}
|
||||
|
||||
if len(fileExt) == 0 {
|
||||
fileExt = append(fileExt, ".mp4")
|
||||
}
|
||||
|
||||
filename := fmt.Sprintf("%v%v", message.Info.Id, fileExt[0])
|
||||
|
||||
b.Log.Debugf("Trying to download %s with size %#v and type %s", filename, message.Length, message.Type)
|
||||
@@ -312,3 +321,60 @@ func (b *Bwhatsapp) HandleAudioMessage(message whatsapp.AudioMessage) {
|
||||
|
||||
b.Remote <- rmsg
|
||||
}
|
||||
|
||||
// HandleDocumentMessage downloads documents
|
||||
func (b *Bwhatsapp) HandleDocumentMessage(message whatsapp.DocumentMessage) {
|
||||
if message.Info.FromMe || message.Info.Timestamp < b.startedAt {
|
||||
return
|
||||
}
|
||||
|
||||
senderJID := message.Info.SenderJid
|
||||
if len(message.Info.SenderJid) == 0 && message.Info.Source != nil && message.Info.Source.Participant != nil {
|
||||
senderJID = *message.Info.Source.Participant
|
||||
}
|
||||
|
||||
senderName := b.getSenderName(message.Info.SenderJid)
|
||||
if senderName == "" {
|
||||
senderName = "Someone" // don't expose telephone number
|
||||
}
|
||||
|
||||
rmsg := config.Message{
|
||||
UserID: senderJID,
|
||||
Username: senderName,
|
||||
Channel: message.Info.RemoteJid,
|
||||
Account: b.Account,
|
||||
Protocol: b.Protocol,
|
||||
Extra: make(map[string][]interface{}),
|
||||
ID: message.Info.Id,
|
||||
}
|
||||
|
||||
if avatarURL, exists := b.userAvatars[senderJID]; exists {
|
||||
rmsg.Avatar = avatarURL
|
||||
}
|
||||
|
||||
fileExt, err := mime.ExtensionsByType(message.Type)
|
||||
if err != nil {
|
||||
b.Log.Errorf("Mimetype detection error: %s", err)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
filename := fmt.Sprintf("%v", message.FileName)
|
||||
|
||||
b.Log.Debugf("Trying to download %s with extension %s and type %s", filename, fileExt, message.Type)
|
||||
|
||||
data, err := message.Download()
|
||||
if err != nil {
|
||||
b.Log.Errorf("Download document message failed: %s", err)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// Move file to bridge storage
|
||||
helper.HandleDownloadData(b.Log, &rmsg, filename, "document", "", &data, b.General)
|
||||
|
||||
b.Log.Debugf("<= Sending message from %s on %s to gateway", senderJID, b.Account)
|
||||
b.Log.Debugf("<= Message is %#v", rmsg)
|
||||
|
||||
b.Remote <- rmsg
|
||||
}
|
||||
|
||||
22
changelog.md
@@ -1,3 +1,25 @@
|
||||
# v1.22.2
|
||||
|
||||
## Enhancements
|
||||
|
||||
- general: Add a MessageClipped option to set your own clipped message. Closes #1359 (#1487)
|
||||
- discord: Add AllowMention to restrict allowed mentions (#1462)
|
||||
- matrix: Add MxId/Token login option for Matrix (#1438)
|
||||
- nctalk: Support sending file URLs (nctalk) (#1489)
|
||||
- nctalk: Add support for message deletion (nctalk) (#1492)
|
||||
- whatsapp: Handle document messages (whatsapp) (#1475)
|
||||
|
||||
## Bugfixes
|
||||
|
||||
- general: Update vendored libs
|
||||
- matrix: Fix content body issue for redactions (matrix) (#1496)
|
||||
- telegram: Add libwebp-dev to tgs.Dockerfile fixes Telegram sticker to WebP rendering (#1476)
|
||||
- whatsapp: Rename .jpe files to .jpg Fixes #1463 (whatsapp) (#1485)
|
||||
- whatsapp: Fix crash on encountering VideoMessage (whatsapp) (#1483)
|
||||
|
||||
This release couldn't exist without the following contributors:
|
||||
@AvinashReddy3108, @chrisbobbe, @jaywink, @Funatiker, @computeronix, @alexandregv, @gary-kim, @SuperSandro2000
|
||||
|
||||
# v1.22.1
|
||||
|
||||
## Enhancements
|
||||
|
||||
19
go.mod
@@ -5,14 +5,14 @@ require (
|
||||
github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f
|
||||
github.com/Jeffail/gabs v1.4.0 // indirect
|
||||
github.com/Philipp15b/go-steam v1.0.1-0.20200727090957-6ae9b3c0a560
|
||||
github.com/Rhymen/go-whatsapp v0.1.2-0.20210126174449-3c094ebae0ce
|
||||
github.com/SevereCloud/vksdk/v2 v2.9.0
|
||||
github.com/Rhymen/go-whatsapp v0.1.2-0.20210407153411-c58e164e05b8
|
||||
github.com/SevereCloud/vksdk/v2 v2.9.2
|
||||
github.com/d5/tengo/v2 v2.7.0
|
||||
github.com/davecgh/go-spew v1.1.1
|
||||
github.com/fsnotify/fsnotify v1.4.9
|
||||
github.com/go-telegram-bot-api/telegram-bot-api v1.0.1-0.20200524105306-7434b0456e81
|
||||
github.com/gomarkdown/markdown v0.0.0-20210208175418-bda154fe17d8
|
||||
github.com/google/gops v0.3.17
|
||||
github.com/gomarkdown/markdown v0.0.0-20210514010506-3b9f47219fe7
|
||||
github.com/google/gops v0.3.18
|
||||
github.com/gopackage/ddp v0.0.0-20170117053602-652027933df4 // indirect
|
||||
github.com/gorilla/schema v1.2.0
|
||||
github.com/gorilla/websocket v1.4.2
|
||||
@@ -20,7 +20,7 @@ require (
|
||||
github.com/jpillora/backoff v1.0.0
|
||||
github.com/keybase/go-keybase-chat-bot v0.0.0-20200505163032-5cacf52379da
|
||||
github.com/kyokomi/emoji/v2 v2.2.8
|
||||
github.com/labstack/echo/v4 v4.2.1
|
||||
github.com/labstack/echo/v4 v4.3.0
|
||||
github.com/lrstanley/girc v0.0.0-20190801035559-4fc93959e1a7
|
||||
github.com/matrix-org/gomatrix v0.0.0-20210324163249-be2af5ef2e16
|
||||
github.com/matterbridge/Rocket.Chat.Go.SDK v0.0.0-20210403163225-761e8622445d
|
||||
@@ -41,7 +41,8 @@ require (
|
||||
github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca
|
||||
github.com/shazow/ssh-chat v1.10.1
|
||||
github.com/sirupsen/logrus v1.8.1
|
||||
github.com/slack-go/slack v0.8.2
|
||||
github.com/skip2/go-qrcode v0.0.0-20190110000554-dc11ecdae0a9 // indirect
|
||||
github.com/slack-go/slack v0.9.1
|
||||
github.com/spf13/afero v1.3.4 // indirect
|
||||
github.com/spf13/cast v1.3.1 // indirect
|
||||
github.com/spf13/viper v1.7.1
|
||||
@@ -51,9 +52,9 @@ require (
|
||||
github.com/x-cray/logrus-prefixed-formatter v0.5.2 // indirect
|
||||
github.com/yaegashi/msgraph.go v0.1.4
|
||||
github.com/zfjagann/golang-ring v0.0.0-20210116075443-7c86fdb43134
|
||||
golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb
|
||||
golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602
|
||||
gomod.garykim.dev/nc-talk v0.1.7
|
||||
golang.org/x/image v0.0.0-20210504121937-7319ad40d33e
|
||||
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c
|
||||
gomod.garykim.dev/nc-talk v0.2.2
|
||||
gopkg.in/olahol/melody.v1 v1.0.0-20170518105555-d52139073376
|
||||
layeh.com/gumble v0.0.0-20200818122324-146f9205029b
|
||||
)
|
||||
|
||||
66
go.sum
@@ -76,17 +76,12 @@ github.com/Philipp15b/go-steam v1.0.1-0.20200727090957-6ae9b3c0a560 h1:ItnC9PEEM
|
||||
github.com/Philipp15b/go-steam v1.0.1-0.20200727090957-6ae9b3c0a560/go.mod h1:o38AwUFFS4gzbjSoyIgrZ1h9UeDrKwcci1Pj6baifvI=
|
||||
github.com/PuerkitoBio/goquery v1.4.1/go.mod h1:T9ezsOHcCrDCgA8aF1Cqr3sSYbO/xgdy8/R/XiIMAhA=
|
||||
github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc=
|
||||
github.com/Rhymen/go-whatsapp v0.0.0/go.mod h1:rdQr95g2C1xcOfM7QGOhza58HeI3I+tZ/bbluv7VazA=
|
||||
github.com/Rhymen/go-whatsapp v0.1.2-0.20210126174449-3c094ebae0ce h1:qitALaMtz6i05smexphqLty1gGc7Viwhn8bdSRmp4UM=
|
||||
github.com/Rhymen/go-whatsapp v0.1.2-0.20210126174449-3c094ebae0ce/go.mod h1:o7jjkvKnigfu432dMbQ/w4PH0Yp5u4Y6ysCNjUlcYCk=
|
||||
github.com/Rhymen/go-whatsapp/examples/echo v0.0.0-20190325075644-cc2581bbf24d/go.mod h1:zgCiQtBtZ4P4gFWvwl9aashsdwOcbb/EHOGRmSzM8ME=
|
||||
github.com/Rhymen/go-whatsapp/examples/restoreSession v0.0.0-20190325075644-cc2581bbf24d/go.mod h1:5sCUSpG616ZoSJhlt9iBNI/KXBqrVLcNUJqg7J9+8pU=
|
||||
github.com/Rhymen/go-whatsapp/examples/sendImage v0.0.0-20190325075644-cc2581bbf24d/go.mod h1:RdiyhanVEGXTam+mZ3k6Y3VDCCvXYCwReOoxGozqhHw=
|
||||
github.com/Rhymen/go-whatsapp/examples/sendTextMessages v0.0.0-20190325075644-cc2581bbf24d/go.mod h1:suwzklatySS3Q0+NCxCDh5hYfgXdQUWU1DNcxwAxStM=
|
||||
github.com/Rhymen/go-whatsapp v0.1.2-0.20210407153411-c58e164e05b8 h1:jqbWlca7CrvFdc3NygtKVCILnssbRkE7J9gRmY+Olc4=
|
||||
github.com/Rhymen/go-whatsapp v0.1.2-0.20210407153411-c58e164e05b8/go.mod h1:DNSFRLFDFIqm2+0aJzSOVfn25020vldM4SRqz6YtLgI=
|
||||
github.com/RoaringBitmap/roaring v0.4.23/go.mod h1:D0gp8kJQgE1A4LQ5wFLggQEyvDi06Mq5mKs52e1TwOo=
|
||||
github.com/RoaringBitmap/roaring v0.5.1/go.mod h1:D0gp8kJQgE1A4LQ5wFLggQEyvDi06Mq5mKs52e1TwOo=
|
||||
github.com/SevereCloud/vksdk/v2 v2.9.0 h1:39qjzmozK5FDfnDkfA+YN0CtKi4mDrzjPtoT5GN9Xg0=
|
||||
github.com/SevereCloud/vksdk/v2 v2.9.0/go.mod h1:IBmfJ3rs+zDLD9NHCoJEpgg5A4UOoxgUU/g8p5lYb48=
|
||||
github.com/SevereCloud/vksdk/v2 v2.9.2 h1:+6s5w18VtWeGzsad8tRcraDGRPxgvuMtEPlRg7NrDM4=
|
||||
github.com/SevereCloud/vksdk/v2 v2.9.2/go.mod h1:jCicWsIOXu4bfbGGuvVw4dM/EbrC8dOyA+0ccvhiFEo=
|
||||
github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0=
|
||||
github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
|
||||
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
|
||||
@@ -303,7 +298,6 @@ github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt
|
||||
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
||||
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0=
|
||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
||||
@@ -320,8 +314,8 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw
|
||||
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/gomarkdown/markdown v0.0.0-20210208175418-bda154fe17d8 h1:nWU6p08f1VgIalT6iZyqXi4o5cZsz4X6qa87nusfcsc=
|
||||
github.com/gomarkdown/markdown v0.0.0-20210208175418-bda154fe17d8/go.mod h1:aii0r/K0ZnHv7G0KF7xy1v0A7s2Ljrb5byB7MO5p6TU=
|
||||
github.com/gomarkdown/markdown v0.0.0-20210514010506-3b9f47219fe7 h1:oKYOfNR7Hp6XpZ4JqolL5u642Js5Z0n7psPVl+S5heo=
|
||||
github.com/gomarkdown/markdown v0.0.0-20210514010506-3b9f47219fe7/go.mod h1:aii0r/K0ZnHv7G0KF7xy1v0A7s2Ljrb5byB7MO5p6TU=
|
||||
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=
|
||||
@@ -338,8 +332,8 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
|
||||
github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
|
||||
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/google/gops v0.3.17 h1:CguOcnDVYG32soOj2YevV8mW9asrIh1lZw3d7Ovty/o=
|
||||
github.com/google/gops v0.3.17/go.mod h1:Pfp8hWGIFdV/7rY9/O/U5WgdjYQXf/GiEK4NVuVd2ZE=
|
||||
github.com/google/gops v0.3.18 h1:my259V+172PVFmduS2RAsq4FKH+HjKqdh7pLr17Ot8c=
|
||||
github.com/google/gops v0.3.18/go.mod h1:Pfp8hWGIFdV/7rY9/O/U5WgdjYQXf/GiEK4NVuVd2ZE=
|
||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
||||
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
||||
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||
@@ -509,8 +503,8 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||
github.com/kyokomi/emoji/v2 v2.2.8 h1:jcofPxjHWEkJtkIbcLHvZhxKgCPl6C7MyjTrD4KDqUE=
|
||||
github.com/kyokomi/emoji/v2 v2.2.8/go.mod h1:JUcn42DTdsXJo1SWanHh4HKDEyPaR5CqkmoirZZP9qE=
|
||||
github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g=
|
||||
github.com/labstack/echo/v4 v4.2.1 h1:LF5Iq7t/jrtUuSutNuiEWtB5eiHfZ5gSe2pcu5exjQw=
|
||||
github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg=
|
||||
github.com/labstack/echo/v4 v4.3.0 h1:DCP6cbtT+Zu++K6evHOJzSgA2115cPMuCx0xg55q1EQ=
|
||||
github.com/labstack/echo/v4 v4.3.0/go.mod h1:PvmtTvhVqKDzDQy4d3bWzPjZLzom4iQbAZy2sgZ/qI8=
|
||||
github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0=
|
||||
github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k=
|
||||
github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o=
|
||||
@@ -556,15 +550,12 @@ github.com/mattermost/mattermost-server/v5 v5.30.1 h1:vsTTMyQcsZGevgsvR1EbQM4/RA
|
||||
github.com/mattermost/mattermost-server/v5 v5.30.1/go.mod h1:+6oGzqA4hEsoYpmFHT9j+3BtAscj7LJa/qNDxbGvrp4=
|
||||
github.com/mattermost/rsc v0.0.0-20160330161541-bbaefb05eaa0/go.mod h1:nV5bfVpT//+B1RPD2JvRnxbkLmJEYXmRaaVl15fsXjs=
|
||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
||||
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
|
||||
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
||||
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
||||
github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||
github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8=
|
||||
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||
github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||
github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
|
||||
@@ -816,8 +807,8 @@ github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE
|
||||
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||
github.com/skip2/go-qrcode v0.0.0-20190110000554-dc11ecdae0a9 h1:lpEzuenPuO1XNTeikEmvqYFcU37GVLl8SRNblzyvGBE=
|
||||
github.com/skip2/go-qrcode v0.0.0-20190110000554-dc11ecdae0a9/go.mod h1:PLPIyL7ikehBD1OAjmKKiOEhbvWyHGaNDjquXMcYABo=
|
||||
github.com/slack-go/slack v0.8.2 h1:D7jNu0AInBfdQ4QyKPtVSp+ZxQes3EzWW17RZ/va4JE=
|
||||
github.com/slack-go/slack v0.8.2/go.mod h1:FGqNzJBmxIsZURAxh2a8D21AnOVvvXZvGligs4npPUM=
|
||||
github.com/slack-go/slack v0.9.1 h1:pekQBs0RmrdAgoqzcMCzUCWSyIkhzUU3F83ExAdZrKo=
|
||||
github.com/slack-go/slack v0.9.1/go.mod h1:wWL//kk0ho+FcQXcBTmEafUI5dz4qz5f4mMk8oIkioQ=
|
||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||
github.com/smartystreets/assertions v1.0.0 h1:UVQPSSmc3qtTi+zPPkCXvZX9VvW/xT/NsRvKfwY81a8=
|
||||
github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM=
|
||||
@@ -982,7 +973,6 @@ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnf
|
||||
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20190131182504-b8fe1690c613/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
@@ -993,10 +983,10 @@ golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 h1:pLI5jrR7OSLijeIDcmRxNmw2api+jEfxLoykJVice/E=
|
||||
golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w=
|
||||
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||
@@ -1014,8 +1004,8 @@ golang.org/x/image v0.0.0-20190321063152-3fc05d484e9f/go.mod h1:kZ7UVZpmo3dzQBMx
|
||||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/image v0.0.0-20200927104501-e162460cd6b5/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb h1:fqpd0EBDzlHRCjiphRR5Zo/RSWWQlWv34418dnEixWk=
|
||||
golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/image v0.0.0-20210504121937-7319ad40d33e h1:PzJMNfFQx+QO9hrC1GwZ4BoPGeNGhfeQEgcQFArEjPk=
|
||||
golang.org/x/image v0.0.0-20210504121937-7319ad40d33e/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
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=
|
||||
@@ -1084,8 +1074,10 @@ golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/
|
||||
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0 h1:wBouT66WTYFXdxfVdz9sVWARVd/2vfGcmI45D2gj45M=
|
||||
golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0=
|
||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
@@ -1094,8 +1086,8 @@ golang.org/x/oauth2 v0.0.0-20190319182350-c85d3e98c914/go.mod h1:gOpvHmFTYa4Iltr
|
||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602 h1:0Ja1LBD+yisY6RWM/BH7TJVXWsSjs2VwBSmvSX4HdBc=
|
||||
golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c h1:pkQiBZBvdos9qq4wBAHqlzuZHEXo07pqV06ef90u1WI=
|
||||
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||
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=
|
||||
@@ -1160,19 +1152,25 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w
|
||||
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201007165808-a893ed343c85/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201110211018-35f3e6cf4a65/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210217105451-b926d437f341 h1:2/QtM1mL37YmcsT8HaDNHDgTqqFVw+zr8UzMiBVLzYU=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210217105451-b926d437f341/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57 h1:F5Gozwx4I1xtr/sr/8CFbb57iKi3297KFs0QDbGN60A=
|
||||
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc=
|
||||
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
@@ -1242,8 +1240,8 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
gomod.garykim.dev/nc-talk v0.1.7 h1:G2qsiRcyaj5FEADQlulsBAFJHs27tPmH9VtKK+at9SM=
|
||||
gomod.garykim.dev/nc-talk v0.1.7/go.mod h1:DNucAJ6zeaumBEwV5NiYk+Eea8Ca+Q5f+plhz9F7d58=
|
||||
gomod.garykim.dev/nc-talk v0.2.2 h1:+U+daJFPPuwM7yRXYazeMHZgIBSGP6SeQURO0O5a32I=
|
||||
gomod.garykim.dev/nc-talk v0.2.2/go.mod h1:q/Adot/H7iqi+H4lANopV7/xcMf+sX3AZXUXqiITwok=
|
||||
google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
|
||||
google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
|
||||
google.golang.org/api v0.0.0-20181220000619-583d854617af/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
|
||||
|
||||
|
Before Width: | Height: | Size: 270 KiB |
|
Before Width: | Height: | Size: 170 KiB |
|
Before Width: | Height: | Size: 282 KiB |
|
Before Width: | Height: | Size: 204 KiB |
|
Before Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 62 KiB |
@@ -16,7 +16,7 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
version = "1.22.1"
|
||||
version = "1.22.2"
|
||||
githash string
|
||||
|
||||
flagConfig = flag.String("conf", "matterbridge.toml", "config file")
|
||||
|
||||
@@ -9,12 +9,12 @@
|
||||
[irc]
|
||||
|
||||
#You can configure multiple servers "[irc.name]" or "[irc.name2]"
|
||||
#In this example we use [irc.freenode]
|
||||
#In this example we use [irc.libera]
|
||||
#REQUIRED
|
||||
[irc.freenode]
|
||||
[irc.libera]
|
||||
#irc server to connect to.
|
||||
#REQUIRED
|
||||
Server="irc.freenode.net:6667"
|
||||
Server="irc.libera.chat:6667"
|
||||
|
||||
#Password for irc server (if necessary)
|
||||
#OPTIONAL (default "")
|
||||
@@ -24,7 +24,7 @@ Password=""
|
||||
#OPTIONAL (default false)
|
||||
UseTLS=false
|
||||
|
||||
#Enable SASL (PLAIN) authentication. (freenode requires this from eg AWS hosts)
|
||||
#Enable SASL (PLAIN) authentication. (libera requires this from eg AWS hosts)
|
||||
#It uses NickServNick and NickServPassword as login and password
|
||||
#OPTIONAL (default false)
|
||||
UseSASL=false
|
||||
@@ -55,7 +55,7 @@ Charset=""
|
||||
#REQUIRED
|
||||
Nick="matterbot"
|
||||
|
||||
#If you registered your bot with a service like Nickserv on freenode.
|
||||
#If you registered your bot with a service like Nickserv on libera.
|
||||
#Also being used when UseSASL=true
|
||||
#
|
||||
#Note: if you want do to quakenet auth, set NickServNick="Q@CServe.quakenet.org"
|
||||
@@ -76,20 +76,24 @@ MessageDelay=1300
|
||||
|
||||
#Maximum amount of messages to hold in queue. If queue is full
|
||||
#messages will be dropped.
|
||||
#<message clipped> will be add to the message that fills the queue.
|
||||
#<clipped message> will be add to the message that fills the queue.
|
||||
#OPTIONAL (default 30)
|
||||
MessageQueue=30
|
||||
|
||||
#Maximum length of message sent to irc server. If it exceeds
|
||||
#<message clipped> will be add to the message.
|
||||
#<clipped message> will be add to the message.
|
||||
#OPTIONAL (default 400)
|
||||
MessageLength=400
|
||||
|
||||
#Split messages on MessageLength instead of showing the <message clipped>
|
||||
#Split messages on MessageLength instead of showing the <clipped message>
|
||||
#WARNING: this could lead to flooding
|
||||
#OPTIONAL (default false)
|
||||
MessageSplit=false
|
||||
|
||||
#Message to show when a message is too big
|
||||
#Default "<clipped message>"
|
||||
MessageClipped="<clipped message>"
|
||||
|
||||
#Delay in seconds to rejoin a channel when kicked
|
||||
#OPTIONAL (default 0)
|
||||
RejoinDelay=0
|
||||
@@ -826,6 +830,10 @@ PreserveThreading=false
|
||||
#OPTIONAL (default false)
|
||||
ShowUserTyping=false
|
||||
|
||||
#Message to show when a message is too big
|
||||
#Default "<clipped message>"
|
||||
MessageClipped="<clipped message>"
|
||||
|
||||
###################################################################
|
||||
#discord section
|
||||
###################################################################
|
||||
@@ -848,6 +856,14 @@ Server="yourservername"
|
||||
## All settings below can be reloaded by editing the file.
|
||||
## They are also all optional.
|
||||
|
||||
# AllowMention controls which mentions are allowed. If not specified, all mentions are allowed.
|
||||
# Note that even when a mention is not allowed, it will still be displayed nicely and be clickable. It just prevents the ping/notification.
|
||||
#
|
||||
# "everyone" allows @everyone and @here mentions
|
||||
# "roles" allows @role mentions
|
||||
# "users" allows @user mentions
|
||||
AllowMention=["everyone", "roles", "users"]
|
||||
|
||||
# ShowEmbeds shows the title, description and URL of embedded messages (sent by other bots)
|
||||
ShowEmbeds=false
|
||||
|
||||
@@ -953,6 +969,10 @@ ShowTopicChange=false
|
||||
# Supported from the following bridges: slack
|
||||
SyncTopic=false
|
||||
|
||||
#Message to show when a message is too big
|
||||
#Default "<clipped message>"
|
||||
MessageClipped="<clipped message>"
|
||||
|
||||
###################################################################
|
||||
#telegram section
|
||||
###################################################################
|
||||
@@ -1011,6 +1031,13 @@ QuoteFormat="{MESSAGE} (re @{QUOTENICK}: {QUOTEMESSAGE})"
|
||||
#OPTIONAL (default false)
|
||||
MediaConvertWebPToPNG=false
|
||||
|
||||
#Convert Tgs (Telegram animated sticker) images to PNG before upload.
|
||||
#This is useful when your bridge also contains platforms that do not support animated WebP files, like Discord.
|
||||
#This requires the external dependency `lottie`, which can be installed like this:
|
||||
#`pip install lottie cairosvg`
|
||||
#https://github.com/42wim/matterbridge/issues/874
|
||||
#MediaConvertTgs="png"
|
||||
|
||||
#Disable sending of edits to other bridges
|
||||
#OPTIONAL (default false)
|
||||
EditDisable=false
|
||||
@@ -1230,12 +1257,16 @@ ShowTopicChange=false
|
||||
#REQUIRED
|
||||
Server="https://matrix.org"
|
||||
|
||||
#login/pass of your bot.
|
||||
#Authentication for your bot.
|
||||
#You can use either login/password OR mxid/token. The latter will be preferred if found.
|
||||
#Use a dedicated user for this and not your own!
|
||||
#Messages sent from this user will not be relayed to avoid loops.
|
||||
#REQUIRED
|
||||
Login="yourlogin"
|
||||
Password="yourpass"
|
||||
#OR
|
||||
MxID="@yourlogin:domain.tld"
|
||||
Token="tokenforthebotuser"
|
||||
|
||||
#Whether to send the homeserver suffix. eg ":matrix.org" in @username:matrix.org
|
||||
#to other bridges, or only send "username".(true only sends username)
|
||||
@@ -1416,9 +1447,7 @@ StripNick=false
|
||||
ShowTopicChange=false
|
||||
|
||||
###################################################################
|
||||
#
|
||||
# NCTalk (Nextcloud Talk)
|
||||
#
|
||||
###################################################################
|
||||
|
||||
[nctalk.bridge]
|
||||
@@ -1441,9 +1470,7 @@ Password = "talkuserpass"
|
||||
GuestSuffix = " (Guest)"
|
||||
|
||||
###################################################################
|
||||
#
|
||||
# Mumble
|
||||
#
|
||||
###################################################################
|
||||
|
||||
[mumble.bridge]
|
||||
@@ -1486,9 +1513,14 @@ TLSCACertificate=mumble-ca.crt
|
||||
# OPTIONAL (default false)
|
||||
SkipTLSVerify=false
|
||||
|
||||
#Message to show when a message is too big
|
||||
#Default "<clipped message>"
|
||||
MessageClipped="<clipped message>"
|
||||
|
||||
###################################################################
|
||||
#VK
|
||||
###################################################################
|
||||
#
|
||||
[vk.myvk]
|
||||
#Group access token
|
||||
#See https://vk.com/dev/bots_docs
|
||||
@@ -1499,9 +1531,7 @@ Token="Yourtokenhere"
|
||||
GroupID=123456789
|
||||
|
||||
###################################################################
|
||||
#
|
||||
# WhatsApp
|
||||
#
|
||||
###################################################################
|
||||
|
||||
[whatsapp.bridge]
|
||||
@@ -1528,9 +1558,7 @@ Label="Organization"
|
||||
|
||||
|
||||
###################################################################
|
||||
#
|
||||
# zulip
|
||||
#
|
||||
###################################################################
|
||||
|
||||
[zulip]
|
||||
@@ -1819,7 +1847,7 @@ enable=true
|
||||
|
||||
# account specified above
|
||||
# REQUIRED
|
||||
account="irc.freenode"
|
||||
account="irc.libera"
|
||||
|
||||
# The channel key in each gateway is mapped to a similar group chat ID on the chat platform
|
||||
# To find the group chat ID for different platforms, refer to the table below
|
||||
@@ -1877,7 +1905,7 @@ enable=true
|
||||
|
||||
#[[gateway.out]] specifies the account and channels we will sent messages to.
|
||||
[[gateway.out]]
|
||||
account="irc.freenode"
|
||||
account="irc.libera"
|
||||
channel="#testing"
|
||||
|
||||
#OPTIONAL - only used for IRC and XMPP protocols at the moment
|
||||
|
||||
@@ -1,21 +1,18 @@
|
||||
FROM alpine AS builder
|
||||
|
||||
COPY . /go/src/github.com/42wim/matterbridge
|
||||
COPY . /go/src/matterbridge
|
||||
RUN apk add \
|
||||
go \
|
||||
git \
|
||||
gcc \
|
||||
musl-dev \
|
||||
&& cd /go/src/github.com/42wim/matterbridge \
|
||||
&& export GOPATH=/go \
|
||||
&& go get \
|
||||
&& go build -x -ldflags "-X main.githash=$(git log --pretty=format:'%h' -n 1)" -o /bin/matterbridge
|
||||
&& cd /go/src/matterbridge \
|
||||
&& go build -mod vendor -ldflags "-X main.githash=$(git log --pretty=format:'%h' -n 1)" -o /bin/matterbridge
|
||||
|
||||
FROM alpine
|
||||
RUN apk --no-cache add \
|
||||
ca-certificates \
|
||||
cairo \
|
||||
libjpeg-turbo \
|
||||
libwebp-dev \
|
||||
mailcap \
|
||||
py3-webencodings \
|
||||
python3 \
|
||||
|
||||
14842
vendor/github.com/Rhymen/go-whatsapp/binary/proto/def.pb.go
generated
vendored
445
vendor/github.com/Rhymen/go-whatsapp/binary/proto/def.proto
generated
vendored
@@ -1,6 +1,12 @@
|
||||
syntax = "proto2";
|
||||
package proto;
|
||||
|
||||
message PaymentMoney {
|
||||
optional int64 value = 1;
|
||||
optional uint32 offset = 2;
|
||||
optional string currencyCode = 3;
|
||||
}
|
||||
|
||||
message HydratedQuickReplyButton {
|
||||
optional string displayText = 1;
|
||||
optional string id = 2;
|
||||
@@ -69,18 +75,46 @@ message InteractiveAnnotation {
|
||||
}
|
||||
}
|
||||
|
||||
message DeviceListMetadata {
|
||||
optional bytes senderKeyHash = 1;
|
||||
optional uint64 senderTimestamp = 2;
|
||||
optional bytes recipientKeyHash = 8;
|
||||
optional uint64 recipientTimestamp = 9;
|
||||
}
|
||||
|
||||
message MessageContextInfo {
|
||||
optional DeviceListMetadata deviceListMetadata = 1;
|
||||
}
|
||||
|
||||
message AdReplyInfo {
|
||||
optional string advertiserName = 1;
|
||||
enum AD_REPLY_INFO_MEDIATYPE {
|
||||
enum AdReplyInfoMediaType {
|
||||
NONE = 0;
|
||||
IMAGE = 1;
|
||||
VIDEO = 2;
|
||||
}
|
||||
optional AD_REPLY_INFO_MEDIATYPE mediaType = 2;
|
||||
optional AdReplyInfoMediaType mediaType = 2;
|
||||
optional bytes jpegThumbnail = 16;
|
||||
optional string caption = 17;
|
||||
}
|
||||
|
||||
message ExternalAdReplyInfo {
|
||||
optional string title = 1;
|
||||
optional string body = 2;
|
||||
enum ExternalAdReplyInfoMediaType {
|
||||
NONE = 0;
|
||||
IMAGE = 1;
|
||||
VIDEO = 2;
|
||||
}
|
||||
optional ExternalAdReplyInfoMediaType mediaType = 3;
|
||||
optional string thumbnailUrl = 4;
|
||||
optional string mediaUrl = 5;
|
||||
optional bytes thumbnail = 6;
|
||||
optional string sourceType = 7;
|
||||
optional string sourceId = 8;
|
||||
optional string sourceUrl = 9;
|
||||
}
|
||||
|
||||
message ContextInfo {
|
||||
optional string stanzaId = 1;
|
||||
optional string participant = 2;
|
||||
@@ -96,6 +130,8 @@ message ContextInfo {
|
||||
optional MessageKey placeholderKey = 24;
|
||||
optional uint32 expiration = 25;
|
||||
optional int64 ephemeralSettingTimestamp = 26;
|
||||
optional bytes ephemeralSharedSecret = 27;
|
||||
optional ExternalAdReplyInfo externalAdReply = 28;
|
||||
}
|
||||
|
||||
message SenderKeyDistributionMessage {
|
||||
@@ -125,6 +161,27 @@ message ImageMessage {
|
||||
repeated uint32 scanLengths = 22;
|
||||
optional bytes midQualityFileSha256 = 23;
|
||||
optional bytes midQualityFileEncSha256 = 24;
|
||||
optional bool viewOnce = 25;
|
||||
optional string thumbnailDirectPath = 26;
|
||||
optional bytes thumbnailSha256 = 27;
|
||||
optional bytes thumbnailEncSha256 = 28;
|
||||
}
|
||||
|
||||
message InvoiceMessage {
|
||||
optional string note = 1;
|
||||
optional string token = 2;
|
||||
enum InvoiceMessageAttachmentType {
|
||||
IMAGE = 0;
|
||||
PDF = 1;
|
||||
}
|
||||
optional InvoiceMessageAttachmentType attachmentType = 3;
|
||||
optional string attachmentMimetype = 4;
|
||||
optional bytes attachmentMediaKey = 5;
|
||||
optional int64 attachmentMediaKeyTimestamp = 6;
|
||||
optional bytes attachmentFileSha256 = 7;
|
||||
optional bytes attachmentFileEncSha256 = 8;
|
||||
optional string attachmentDirectPath = 9;
|
||||
optional bytes attachmentJpegThumbnail = 10;
|
||||
}
|
||||
|
||||
message ContactMessage {
|
||||
@@ -156,7 +213,7 @@ message ExtendedTextMessage {
|
||||
optional string title = 6;
|
||||
optional fixed32 textArgb = 7;
|
||||
optional fixed32 backgroundArgb = 8;
|
||||
enum EXTENDED_TEXT_MESSAGE_FONTTYPE {
|
||||
enum ExtendedTextMessageFontType {
|
||||
SANS_SERIF = 0;
|
||||
SERIF = 1;
|
||||
NORICAN_REGULAR = 2;
|
||||
@@ -164,12 +221,12 @@ message ExtendedTextMessage {
|
||||
BEBASNEUE_REGULAR = 4;
|
||||
OSWALD_HEAVY = 5;
|
||||
}
|
||||
optional EXTENDED_TEXT_MESSAGE_FONTTYPE font = 9;
|
||||
enum EXTENDED_TEXT_MESSAGE_PREVIEWTYPE {
|
||||
optional ExtendedTextMessageFontType font = 9;
|
||||
enum ExtendedTextMessagePreviewType {
|
||||
NONE = 0;
|
||||
VIDEO = 1;
|
||||
}
|
||||
optional EXTENDED_TEXT_MESSAGE_PREVIEWTYPE previewType = 10;
|
||||
optional ExtendedTextMessagePreviewType previewType = 10;
|
||||
optional bytes jpegThumbnail = 16;
|
||||
optional ContextInfo contextInfo = 17;
|
||||
optional bool doNotPlayInline = 18;
|
||||
@@ -187,8 +244,14 @@ message DocumentMessage {
|
||||
optional bytes fileEncSha256 = 9;
|
||||
optional string directPath = 10;
|
||||
optional int64 mediaKeyTimestamp = 11;
|
||||
optional bool contactVcard = 12;
|
||||
optional string thumbnailDirectPath = 13;
|
||||
optional bytes thumbnailSha256 = 14;
|
||||
optional bytes thumbnailEncSha256 = 15;
|
||||
optional bytes jpegThumbnail = 16;
|
||||
optional ContextInfo contextInfo = 17;
|
||||
optional uint32 thumbnailHeight = 18;
|
||||
optional uint32 thumbnailWidth = 19;
|
||||
}
|
||||
|
||||
message AudioMessage {
|
||||
@@ -224,12 +287,16 @@ message VideoMessage {
|
||||
optional bytes jpegThumbnail = 16;
|
||||
optional ContextInfo contextInfo = 17;
|
||||
optional bytes streamingSidecar = 18;
|
||||
enum VIDEO_MESSAGE_ATTRIBUTION {
|
||||
enum VideoMessageAttribution {
|
||||
NONE = 0;
|
||||
GIPHY = 1;
|
||||
TENOR = 2;
|
||||
}
|
||||
optional VIDEO_MESSAGE_ATTRIBUTION gifAttribution = 19;
|
||||
optional VideoMessageAttribution gifAttribution = 19;
|
||||
optional bool viewOnce = 20;
|
||||
optional string thumbnailDirectPath = 21;
|
||||
optional bytes thumbnailSha256 = 22;
|
||||
optional bytes thumbnailEncSha256 = 23;
|
||||
}
|
||||
|
||||
message Call {
|
||||
@@ -243,16 +310,25 @@ message Chat {
|
||||
|
||||
message ProtocolMessage {
|
||||
optional MessageKey key = 1;
|
||||
enum PROTOCOL_MESSAGE_TYPE {
|
||||
enum ProtocolMessageType {
|
||||
REVOKE = 0;
|
||||
EPHEMERAL_SETTING = 3;
|
||||
EPHEMERAL_SYNC_RESPONSE = 4;
|
||||
HISTORY_SYNC_NOTIFICATION = 5;
|
||||
APP_STATE_SYNC_KEY_SHARE = 6;
|
||||
APP_STATE_SYNC_KEY_REQUEST = 7;
|
||||
MSG_FANOUT_BACKFILL_REQUEST = 8;
|
||||
INITIAL_SECURITY_NOTIFICATION_SETTING_SYNC = 9;
|
||||
APP_STATE_FATAL_EXCEPTION_NOTIFICATION = 10;
|
||||
}
|
||||
optional PROTOCOL_MESSAGE_TYPE type = 2;
|
||||
optional ProtocolMessageType type = 2;
|
||||
optional uint32 ephemeralExpiration = 4;
|
||||
optional int64 ephemeralSettingTimestamp = 5;
|
||||
optional HistorySyncNotification historySyncNotification = 6;
|
||||
optional AppStateSyncKeyShare appStateSyncKeyShare = 7;
|
||||
optional AppStateSyncKeyRequest appStateSyncKeyRequest = 8;
|
||||
optional InitialSecurityNotificationSettingSync initialSecurityNotificationSettingSync = 9;
|
||||
optional AppStateFatalExceptionNotification appStateFatalExceptionNotification = 10;
|
||||
}
|
||||
|
||||
message HistorySyncNotification {
|
||||
@@ -261,14 +337,54 @@ message HistorySyncNotification {
|
||||
optional bytes mediaKey = 3;
|
||||
optional bytes fileEncSha256 = 4;
|
||||
optional string directPath = 5;
|
||||
enum HISTORY_SYNC_NOTIFICATION_HISTORYSYNCTYPE {
|
||||
enum HistorySyncNotificationHistorySyncType {
|
||||
INITIAL_BOOTSTRAP = 0;
|
||||
INITIAL_STATUS_V3 = 1;
|
||||
FULL = 2;
|
||||
RECENT = 3;
|
||||
PUSH_NAME = 4;
|
||||
}
|
||||
optional HISTORY_SYNC_NOTIFICATION_HISTORYSYNCTYPE syncType = 6;
|
||||
optional HistorySyncNotificationHistorySyncType syncType = 6;
|
||||
optional uint32 chunkOrder = 7;
|
||||
optional string originalMessageId = 8;
|
||||
}
|
||||
|
||||
message AppStateSyncKey {
|
||||
optional AppStateSyncKeyId keyId = 1;
|
||||
optional AppStateSyncKeyData keyData = 2;
|
||||
}
|
||||
|
||||
message AppStateSyncKeyId {
|
||||
optional bytes keyId = 1;
|
||||
}
|
||||
|
||||
message AppStateSyncKeyFingerprint {
|
||||
optional uint32 rawId = 1;
|
||||
optional uint32 currentIndex = 2;
|
||||
repeated uint32 deviceIndexes = 3 [packed=true];
|
||||
}
|
||||
|
||||
message AppStateSyncKeyData {
|
||||
optional bytes keyData = 1;
|
||||
optional AppStateSyncKeyFingerprint fingerprint = 2;
|
||||
optional int64 timestamp = 3;
|
||||
}
|
||||
|
||||
message AppStateSyncKeyShare {
|
||||
repeated AppStateSyncKey keys = 1;
|
||||
}
|
||||
|
||||
message AppStateSyncKeyRequest {
|
||||
repeated AppStateSyncKeyId keyIds = 1;
|
||||
}
|
||||
|
||||
message AppStateFatalExceptionNotification {
|
||||
repeated string collectionNames = 1;
|
||||
optional int64 timestamp = 2;
|
||||
}
|
||||
|
||||
message InitialSecurityNotificationSettingSync {
|
||||
optional bool securityNotificationEnabled = 1;
|
||||
}
|
||||
|
||||
message ContactsArrayMessage {
|
||||
@@ -283,7 +399,7 @@ message HSMCurrency {
|
||||
}
|
||||
|
||||
message HSMDateTimeComponent {
|
||||
enum HSM_DATE_TIME_COMPONENT_DAYOFWEEKTYPE {
|
||||
enum HSMDateTimeComponentDayOfWeekType {
|
||||
MONDAY = 1;
|
||||
TUESDAY = 2;
|
||||
WEDNESDAY = 3;
|
||||
@@ -292,17 +408,17 @@ message HSMDateTimeComponent {
|
||||
SATURDAY = 6;
|
||||
SUNDAY = 7;
|
||||
}
|
||||
optional HSM_DATE_TIME_COMPONENT_DAYOFWEEKTYPE dayOfWeek = 1;
|
||||
optional HSMDateTimeComponentDayOfWeekType dayOfWeek = 1;
|
||||
optional uint32 year = 2;
|
||||
optional uint32 month = 3;
|
||||
optional uint32 dayOfMonth = 4;
|
||||
optional uint32 hour = 5;
|
||||
optional uint32 minute = 6;
|
||||
enum HSM_DATE_TIME_COMPONENT_CALENDARTYPE {
|
||||
enum HSMDateTimeComponentCalendarType {
|
||||
GREGORIAN = 1;
|
||||
SOLAR_HIJRI = 2;
|
||||
}
|
||||
optional HSM_DATE_TIME_COMPONENT_CALENDARTYPE calendar = 7;
|
||||
optional HSMDateTimeComponentCalendarType calendar = 7;
|
||||
}
|
||||
|
||||
message HSMDateTimeUnixEpoch {
|
||||
@@ -347,6 +463,7 @@ message RequestPaymentMessage {
|
||||
optional uint64 amount1000 = 2;
|
||||
optional string requestFrom = 3;
|
||||
optional int64 expiryTimestamp = 5;
|
||||
optional PaymentMoney amount = 6;
|
||||
}
|
||||
|
||||
message DeclinePaymentRequestMessage {
|
||||
@@ -457,6 +574,66 @@ message ProductMessage {
|
||||
optional ContextInfo contextInfo = 17;
|
||||
}
|
||||
|
||||
message OrderMessage {
|
||||
optional string orderId = 1;
|
||||
optional bytes thumbnail = 2;
|
||||
optional int32 itemCount = 3;
|
||||
enum OrderMessageOrderStatus {
|
||||
INQUIRY = 1;
|
||||
}
|
||||
optional OrderMessageOrderStatus status = 4;
|
||||
enum OrderMessageOrderSurface {
|
||||
CATALOG = 1;
|
||||
}
|
||||
optional OrderMessageOrderSurface surface = 5;
|
||||
optional string message = 6;
|
||||
optional string orderTitle = 7;
|
||||
optional string sellerJid = 8;
|
||||
optional string token = 9;
|
||||
optional int64 totalAmount1000 = 10;
|
||||
optional string totalCurrencyCode = 11;
|
||||
optional ContextInfo contextInfo = 17;
|
||||
}
|
||||
|
||||
message Row {
|
||||
optional string title = 1;
|
||||
optional string description = 2;
|
||||
optional string rowId = 3;
|
||||
}
|
||||
|
||||
message Section {
|
||||
optional string title = 1;
|
||||
repeated Row rows = 2;
|
||||
}
|
||||
|
||||
message ListMessage {
|
||||
optional string title = 1;
|
||||
optional string description = 2;
|
||||
optional string buttonText = 3;
|
||||
enum ListMessageListType {
|
||||
UNKNOWN = 0;
|
||||
SINGLE_SELECT = 1;
|
||||
}
|
||||
optional ListMessageListType listType = 4;
|
||||
repeated Section sections = 5;
|
||||
}
|
||||
|
||||
message SingleSelectReply {
|
||||
optional string selectedRowId = 1;
|
||||
}
|
||||
|
||||
message ListResponseMessage {
|
||||
optional string title = 1;
|
||||
enum ListResponseMessageListType {
|
||||
UNKNOWN = 0;
|
||||
SINGLE_SELECT = 1;
|
||||
}
|
||||
optional ListResponseMessageListType listType = 2;
|
||||
optional SingleSelectReply singleSelectReply = 3;
|
||||
optional ContextInfo contextInfo = 4;
|
||||
optional string description = 5;
|
||||
}
|
||||
|
||||
message GroupInviteMessage {
|
||||
optional string groupJid = 1;
|
||||
optional string inviteCode = 2;
|
||||
@@ -467,13 +644,72 @@ message GroupInviteMessage {
|
||||
optional ContextInfo contextInfo = 7;
|
||||
}
|
||||
|
||||
message EphemeralSetting {
|
||||
optional string chatJid = 1;
|
||||
optional uint32 ephemeralExpiration = 2;
|
||||
optional int64 ephemeralSettingTimestamp = 3;
|
||||
}
|
||||
|
||||
message DeviceSentMessage {
|
||||
optional string destinationJid = 1;
|
||||
optional Message message = 2;
|
||||
optional string phash = 3;
|
||||
repeated EphemeralSetting broadcastEphemeralSettings = 4;
|
||||
}
|
||||
|
||||
message DeviceSyncMessage {
|
||||
optional bytes serializedXmlBytes = 1;
|
||||
message FutureProofMessage {
|
||||
optional Message message = 1;
|
||||
}
|
||||
|
||||
message ButtonText {
|
||||
optional string displayText = 1;
|
||||
}
|
||||
|
||||
message Button {
|
||||
optional string buttonId = 1;
|
||||
optional ButtonText buttonText = 2;
|
||||
enum ButtonType {
|
||||
UNKNOWN = 0;
|
||||
RESPONSE = 1;
|
||||
}
|
||||
optional ButtonType type = 3;
|
||||
}
|
||||
|
||||
message ButtonsMessage {
|
||||
optional string contentText = 6;
|
||||
optional string footerText = 7;
|
||||
optional ContextInfo contextInfo = 8;
|
||||
repeated Button buttons = 9;
|
||||
enum ButtonsMessageHeaderType {
|
||||
UNKNOWN = 0;
|
||||
EMPTY = 1;
|
||||
TEXT = 2;
|
||||
DOCUMENT = 3;
|
||||
IMAGE = 4;
|
||||
VIDEO = 5;
|
||||
LOCATION = 6;
|
||||
}
|
||||
optional ButtonsMessageHeaderType headerType = 10;
|
||||
oneof header {
|
||||
string text = 1;
|
||||
DocumentMessage documentMessage = 2;
|
||||
ImageMessage imageMessage = 3;
|
||||
VideoMessage videoMessage = 4;
|
||||
LocationMessage locationMessage = 5;
|
||||
}
|
||||
}
|
||||
|
||||
message ButtonsResponseMessage {
|
||||
optional string selectedButtonId = 1;
|
||||
optional ContextInfo contextInfo = 3;
|
||||
enum ButtonsResponseMessageType {
|
||||
UNKNOWN = 0;
|
||||
DISPLAY_TEXT = 1;
|
||||
}
|
||||
optional ButtonsResponseMessageType type = 4;
|
||||
oneof response {
|
||||
string selectedDisplayText = 2;
|
||||
}
|
||||
}
|
||||
|
||||
message Message {
|
||||
@@ -503,7 +739,15 @@ message Message {
|
||||
optional TemplateButtonReplyMessage templateButtonReplyMessage = 29;
|
||||
optional ProductMessage productMessage = 30;
|
||||
optional DeviceSentMessage deviceSentMessage = 31;
|
||||
optional DeviceSyncMessage deviceSyncMessage = 32;
|
||||
optional MessageContextInfo messageContextInfo = 35;
|
||||
optional ListMessage listMessage = 36;
|
||||
optional FutureProofMessage viewOnceMessage = 37;
|
||||
optional OrderMessage orderMessage = 38;
|
||||
optional ListResponseMessage listResponseMessage = 39;
|
||||
optional FutureProofMessage ephemeralMessage = 40;
|
||||
optional InvoiceMessage invoiceMessage = 41;
|
||||
optional ButtonsMessage buttonsMessage = 42;
|
||||
optional ButtonsResponseMessage buttonsResponseMessage = 43;
|
||||
}
|
||||
|
||||
message MessageKey {
|
||||
@@ -514,51 +758,52 @@ message MessageKey {
|
||||
}
|
||||
|
||||
message WebFeatures {
|
||||
enum WEB_FEATURES_FLAG {
|
||||
enum WebFeaturesFlag {
|
||||
NOT_STARTED = 0;
|
||||
FORCE_UPGRADE = 1;
|
||||
DEVELOPMENT = 2;
|
||||
PRODUCTION = 3;
|
||||
}
|
||||
optional WEB_FEATURES_FLAG labelsDisplay = 1;
|
||||
optional WEB_FEATURES_FLAG voipIndividualOutgoing = 2;
|
||||
optional WEB_FEATURES_FLAG groupsV3 = 3;
|
||||
optional WEB_FEATURES_FLAG groupsV3Create = 4;
|
||||
optional WEB_FEATURES_FLAG changeNumberV2 = 5;
|
||||
optional WEB_FEATURES_FLAG queryStatusV3Thumbnail = 6;
|
||||
optional WEB_FEATURES_FLAG liveLocations = 7;
|
||||
optional WEB_FEATURES_FLAG queryVname = 8;
|
||||
optional WEB_FEATURES_FLAG voipIndividualIncoming = 9;
|
||||
optional WEB_FEATURES_FLAG quickRepliesQuery = 10;
|
||||
optional WEB_FEATURES_FLAG payments = 11;
|
||||
optional WEB_FEATURES_FLAG stickerPackQuery = 12;
|
||||
optional WEB_FEATURES_FLAG liveLocationsFinal = 13;
|
||||
optional WEB_FEATURES_FLAG labelsEdit = 14;
|
||||
optional WEB_FEATURES_FLAG mediaUpload = 15;
|
||||
optional WEB_FEATURES_FLAG mediaUploadRichQuickReplies = 18;
|
||||
optional WEB_FEATURES_FLAG vnameV2 = 19;
|
||||
optional WEB_FEATURES_FLAG videoPlaybackUrl = 20;
|
||||
optional WEB_FEATURES_FLAG statusRanking = 21;
|
||||
optional WEB_FEATURES_FLAG voipIndividualVideo = 22;
|
||||
optional WEB_FEATURES_FLAG thirdPartyStickers = 23;
|
||||
optional WEB_FEATURES_FLAG frequentlyForwardedSetting = 24;
|
||||
optional WEB_FEATURES_FLAG groupsV4JoinPermission = 25;
|
||||
optional WEB_FEATURES_FLAG recentStickers = 26;
|
||||
optional WEB_FEATURES_FLAG catalog = 27;
|
||||
optional WEB_FEATURES_FLAG starredStickers = 28;
|
||||
optional WEB_FEATURES_FLAG voipGroupCall = 29;
|
||||
optional WEB_FEATURES_FLAG templateMessage = 30;
|
||||
optional WEB_FEATURES_FLAG templateMessageInteractivity = 31;
|
||||
optional WEB_FEATURES_FLAG ephemeralMessages = 32;
|
||||
optional WEB_FEATURES_FLAG e2ENotificationSync = 33;
|
||||
optional WEB_FEATURES_FLAG recentStickersV2 = 34;
|
||||
}
|
||||
|
||||
message TabletNotificationsInfo {
|
||||
optional uint64 timestamp = 2;
|
||||
optional uint32 unreadChats = 3;
|
||||
optional uint32 notifyMessageCount = 4;
|
||||
repeated NotificationMessageInfo notifyMessage = 5;
|
||||
optional WebFeaturesFlag labelsDisplay = 1;
|
||||
optional WebFeaturesFlag voipIndividualOutgoing = 2;
|
||||
optional WebFeaturesFlag groupsV3 = 3;
|
||||
optional WebFeaturesFlag groupsV3Create = 4;
|
||||
optional WebFeaturesFlag changeNumberV2 = 5;
|
||||
optional WebFeaturesFlag queryStatusV3Thumbnail = 6;
|
||||
optional WebFeaturesFlag liveLocations = 7;
|
||||
optional WebFeaturesFlag queryVname = 8;
|
||||
optional WebFeaturesFlag voipIndividualIncoming = 9;
|
||||
optional WebFeaturesFlag quickRepliesQuery = 10;
|
||||
optional WebFeaturesFlag payments = 11;
|
||||
optional WebFeaturesFlag stickerPackQuery = 12;
|
||||
optional WebFeaturesFlag liveLocationsFinal = 13;
|
||||
optional WebFeaturesFlag labelsEdit = 14;
|
||||
optional WebFeaturesFlag mediaUpload = 15;
|
||||
optional WebFeaturesFlag mediaUploadRichQuickReplies = 18;
|
||||
optional WebFeaturesFlag vnameV2 = 19;
|
||||
optional WebFeaturesFlag videoPlaybackUrl = 20;
|
||||
optional WebFeaturesFlag statusRanking = 21;
|
||||
optional WebFeaturesFlag voipIndividualVideo = 22;
|
||||
optional WebFeaturesFlag thirdPartyStickers = 23;
|
||||
optional WebFeaturesFlag frequentlyForwardedSetting = 24;
|
||||
optional WebFeaturesFlag groupsV4JoinPermission = 25;
|
||||
optional WebFeaturesFlag recentStickers = 26;
|
||||
optional WebFeaturesFlag catalog = 27;
|
||||
optional WebFeaturesFlag starredStickers = 28;
|
||||
optional WebFeaturesFlag voipGroupCall = 29;
|
||||
optional WebFeaturesFlag templateMessage = 30;
|
||||
optional WebFeaturesFlag templateMessageInteractivity = 31;
|
||||
optional WebFeaturesFlag ephemeralMessages = 32;
|
||||
optional WebFeaturesFlag e2ENotificationSync = 33;
|
||||
optional WebFeaturesFlag recentStickersV2 = 34;
|
||||
optional WebFeaturesFlag syncdRelease1 = 35;
|
||||
optional WebFeaturesFlag recentStickersV3 = 36;
|
||||
optional WebFeaturesFlag userNotice = 37;
|
||||
optional WebFeaturesFlag syncdRelease11 = 38;
|
||||
optional WebFeaturesFlag support = 39;
|
||||
optional WebFeaturesFlag groupUiiCleanup = 40;
|
||||
optional WebFeaturesFlag groupDogfoodingInternalOnly = 41;
|
||||
optional WebFeaturesFlag settingsSync = 42;
|
||||
}
|
||||
|
||||
message NotificationMessageInfo {
|
||||
@@ -576,14 +821,14 @@ message WebNotificationsInfo {
|
||||
}
|
||||
|
||||
message PaymentInfo {
|
||||
enum PAYMENT_INFO_CURRENCY {
|
||||
enum PaymentInfoCurrency {
|
||||
UNKNOWN_CURRENCY = 0;
|
||||
INR = 1;
|
||||
}
|
||||
optional PAYMENT_INFO_CURRENCY currencyDeprecated = 1;
|
||||
optional PaymentInfoCurrency currencyDeprecated = 1;
|
||||
optional uint64 amount1000 = 2;
|
||||
optional string receiverJid = 3;
|
||||
enum PAYMENT_INFO_STATUS {
|
||||
enum PaymentInfoStatus {
|
||||
UNKNOWN_STATUS = 0;
|
||||
PROCESSING = 1;
|
||||
SENT = 2;
|
||||
@@ -597,13 +842,13 @@ message PaymentInfo {
|
||||
WAITING_FOR_PAYER = 10;
|
||||
WAITING = 11;
|
||||
}
|
||||
optional PAYMENT_INFO_STATUS status = 4;
|
||||
optional PaymentInfoStatus status = 4;
|
||||
optional uint64 transactionTimestamp = 5;
|
||||
optional MessageKey requestMessageKey = 6;
|
||||
optional uint64 expiryTimestamp = 7;
|
||||
optional bool futureproofed = 8;
|
||||
optional string currency = 9;
|
||||
enum PAYMENT_INFO_TXNSTATUS {
|
||||
enum PaymentInfoTxnStatus {
|
||||
UNKNOWN = 0;
|
||||
PENDING_SETUP = 1;
|
||||
PENDING_RECEIVER_SETUP = 2;
|
||||
@@ -633,14 +878,17 @@ message PaymentInfo {
|
||||
COLLECT_CANCELED = 26;
|
||||
COLLECT_CANCELLING = 27;
|
||||
}
|
||||
optional PAYMENT_INFO_TXNSTATUS txnStatus = 10;
|
||||
optional PaymentInfoTxnStatus txnStatus = 10;
|
||||
optional bool useNoviFiatFormat = 11;
|
||||
optional PaymentMoney primaryAmount = 12;
|
||||
optional PaymentMoney exchangeAmount = 13;
|
||||
}
|
||||
|
||||
message WebMessageInfo {
|
||||
required MessageKey key = 1;
|
||||
optional Message message = 2;
|
||||
optional uint64 messageTimestamp = 3;
|
||||
enum WEB_MESSAGE_INFO_STATUS {
|
||||
enum WebMessageInfoStatus {
|
||||
ERROR = 0;
|
||||
PENDING = 1;
|
||||
SERVER_ACK = 2;
|
||||
@@ -648,7 +896,7 @@ message WebMessageInfo {
|
||||
READ = 4;
|
||||
PLAYED = 5;
|
||||
}
|
||||
optional WEB_MESSAGE_INFO_STATUS status = 4;
|
||||
optional WebMessageInfoStatus status = 4;
|
||||
optional string participant = 5;
|
||||
optional bool ignore = 16;
|
||||
optional bool starred = 17;
|
||||
@@ -658,7 +906,7 @@ message WebMessageInfo {
|
||||
optional bool multicast = 21;
|
||||
optional bool urlText = 22;
|
||||
optional bool urlNumber = 23;
|
||||
enum WEB_MESSAGE_INFO_STUBTYPE {
|
||||
enum WebMessageInfoStubType {
|
||||
UNKNOWN = 0;
|
||||
REVOKE = 1;
|
||||
CIPHERTEXT = 2;
|
||||
@@ -732,8 +980,54 @@ message WebMessageInfo {
|
||||
GROUP_V4_ADD_INVITE_SENT = 70;
|
||||
GROUP_PARTICIPANT_ADD_REQUEST_JOIN = 71;
|
||||
CHANGE_EPHEMERAL_SETTING = 72;
|
||||
E2E_DEVICE_CHANGED = 73;
|
||||
VIEWED_ONCE = 74;
|
||||
E2E_ENCRYPTED_NOW = 75;
|
||||
BLUE_MSG_BSP_FB_TO_BSP_PREMISE = 76;
|
||||
BLUE_MSG_BSP_FB_TO_SELF_FB = 77;
|
||||
BLUE_MSG_BSP_FB_TO_SELF_PREMISE = 78;
|
||||
BLUE_MSG_BSP_FB_UNVERIFIED = 79;
|
||||
BLUE_MSG_BSP_FB_UNVERIFIED_TO_SELF_PREMISE_VERIFIED = 80;
|
||||
BLUE_MSG_BSP_FB_VERIFIED = 81;
|
||||
BLUE_MSG_BSP_FB_VERIFIED_TO_SELF_PREMISE_UNVERIFIED = 82;
|
||||
BLUE_MSG_BSP_PREMISE_TO_SELF_PREMISE = 83;
|
||||
BLUE_MSG_BSP_PREMISE_UNVERIFIED = 84;
|
||||
BLUE_MSG_BSP_PREMISE_UNVERIFIED_TO_SELF_PREMISE_VERIFIED = 85;
|
||||
BLUE_MSG_BSP_PREMISE_VERIFIED = 86;
|
||||
BLUE_MSG_BSP_PREMISE_VERIFIED_TO_SELF_PREMISE_UNVERIFIED = 87;
|
||||
BLUE_MSG_CONSUMER_TO_BSP_FB_UNVERIFIED = 88;
|
||||
BLUE_MSG_CONSUMER_TO_BSP_PREMISE_UNVERIFIED = 89;
|
||||
BLUE_MSG_CONSUMER_TO_SELF_FB_UNVERIFIED = 90;
|
||||
BLUE_MSG_CONSUMER_TO_SELF_PREMISE_UNVERIFIED = 91;
|
||||
BLUE_MSG_SELF_FB_TO_BSP_PREMISE = 92;
|
||||
BLUE_MSG_SELF_FB_TO_SELF_PREMISE = 93;
|
||||
BLUE_MSG_SELF_FB_UNVERIFIED = 94;
|
||||
BLUE_MSG_SELF_FB_UNVERIFIED_TO_SELF_PREMISE_VERIFIED = 95;
|
||||
BLUE_MSG_SELF_FB_VERIFIED = 96;
|
||||
BLUE_MSG_SELF_FB_VERIFIED_TO_SELF_PREMISE_UNVERIFIED = 97;
|
||||
BLUE_MSG_SELF_PREMISE_TO_BSP_PREMISE = 98;
|
||||
BLUE_MSG_SELF_PREMISE_UNVERIFIED = 99;
|
||||
BLUE_MSG_SELF_PREMISE_VERIFIED = 100;
|
||||
BLUE_MSG_TO_BSP_FB = 101;
|
||||
BLUE_MSG_TO_CONSUMER = 102;
|
||||
BLUE_MSG_TO_SELF_FB = 103;
|
||||
BLUE_MSG_UNVERIFIED_TO_BSP_FB_VERIFIED = 104;
|
||||
BLUE_MSG_UNVERIFIED_TO_BSP_PREMISE_VERIFIED = 105;
|
||||
BLUE_MSG_UNVERIFIED_TO_SELF_FB_VERIFIED = 106;
|
||||
BLUE_MSG_UNVERIFIED_TO_VERIFIED = 107;
|
||||
BLUE_MSG_VERIFIED_TO_BSP_FB_UNVERIFIED = 108;
|
||||
BLUE_MSG_VERIFIED_TO_BSP_PREMISE_UNVERIFIED = 109;
|
||||
BLUE_MSG_VERIFIED_TO_SELF_FB_UNVERIFIED = 110;
|
||||
BLUE_MSG_VERIFIED_TO_UNVERIFIED = 111;
|
||||
BLUE_MSG_BSP_FB_UNVERIFIED_TO_BSP_PREMISE_VERIFIED = 112;
|
||||
BLUE_MSG_BSP_FB_UNVERIFIED_TO_SELF_FB_VERIFIED = 113;
|
||||
BLUE_MSG_BSP_FB_VERIFIED_TO_BSP_PREMISE_UNVERIFIED = 114;
|
||||
BLUE_MSG_BSP_FB_VERIFIED_TO_SELF_FB_UNVERIFIED = 115;
|
||||
BLUE_MSG_SELF_FB_UNVERIFIED_TO_BSP_PREMISE_VERIFIED = 116;
|
||||
BLUE_MSG_SELF_FB_VERIFIED_TO_BSP_PREMISE_UNVERIFIED = 117;
|
||||
E2E_IDENTITY_UNAVAILABLE = 118;
|
||||
}
|
||||
optional WEB_MESSAGE_INFO_STUBTYPE messageStubType = 24;
|
||||
optional WebMessageInfoStubType messageStubType = 24;
|
||||
optional bool clearMedia = 25;
|
||||
repeated string messageStubParameters = 26;
|
||||
optional uint32 duration = 27;
|
||||
@@ -743,5 +1037,14 @@ message WebMessageInfo {
|
||||
optional PaymentInfo quotedPaymentInfo = 31;
|
||||
optional uint64 ephemeralStartTimestamp = 32;
|
||||
optional uint32 ephemeralDuration = 33;
|
||||
}
|
||||
|
||||
optional bool ephemeralOffToOn = 34;
|
||||
optional bool ephemeralOutOfSync = 35;
|
||||
enum WebMessageInfoBizPrivacyStatus {
|
||||
E2EE = 0;
|
||||
FB = 2;
|
||||
BSP = 1;
|
||||
BSP_AND_FB = 3;
|
||||
}
|
||||
optional WebMessageInfoBizPrivacyStatus bizPrivacyStatus = 36;
|
||||
optional string verifiedBizName = 37;
|
||||
}
|
||||
34
vendor/github.com/Rhymen/go-whatsapp/contact.go
generated
vendored
@@ -286,3 +286,37 @@ func (wac *Conn) handleBlockContact(action, jid string) (<-chan string, error) {
|
||||
|
||||
return wac.writeBinary(n, contact, ignore, tag)
|
||||
}
|
||||
|
||||
// Search product details on order
|
||||
func (wac *Conn) SearchProductDetails(id, orderId, token string) (<-chan string, error) {
|
||||
data := []interface{}{"query", "order", map[string]string{
|
||||
"id": id,
|
||||
"orderId": orderId,
|
||||
"imageHeight": strconv.Itoa(80),
|
||||
"imageWidth": strconv.Itoa(80),
|
||||
"token": token,
|
||||
}}
|
||||
return wac.writeJson(data)
|
||||
}
|
||||
|
||||
// Order search and get product catalog reh
|
||||
func (wac *Conn) SearchOrder(catalogWid, stanzaId string) (<-chan string, error) {
|
||||
data := []interface{}{"query", "bizCatalog", map[string]string{
|
||||
"catalogWid": catalogWid,
|
||||
"limit": strconv.Itoa(10),
|
||||
"height": strconv.Itoa(100),
|
||||
"width": strconv.Itoa(100),
|
||||
"stanza_id": stanzaId,
|
||||
"type": "get_product_catalog_reh",
|
||||
}}
|
||||
return wac.writeJson(data)
|
||||
}
|
||||
|
||||
// Company details for Whatsapp Business
|
||||
func (wac *Conn) BusinessProfile(wid string) (<-chan string, error) {
|
||||
query := map[string]string{
|
||||
"wid": wid,
|
||||
}
|
||||
data := []interface{}{"query", "businessProfile", []map[string]string{query}}
|
||||
return wac.writeJson(data)
|
||||
}
|
||||
|
||||
7
vendor/github.com/Rhymen/go-whatsapp/go.mod
generated
vendored
@@ -1,14 +1,11 @@
|
||||
module github.com/Rhymen/go-whatsapp
|
||||
|
||||
require (
|
||||
github.com/Rhymen/go-whatsapp/examples/echo v0.0.0-20190325075644-cc2581bbf24d // indirect
|
||||
github.com/Rhymen/go-whatsapp/examples/restoreSession v0.0.0-20190325075644-cc2581bbf24d // indirect
|
||||
github.com/Rhymen/go-whatsapp/examples/sendImage v0.0.0-20190325075644-cc2581bbf24d // indirect
|
||||
github.com/Rhymen/go-whatsapp/examples/sendTextMessages v0.0.0-20190325075644-cc2581bbf24d // indirect
|
||||
github.com/golang/protobuf v1.3.0
|
||||
github.com/golang/protobuf v1.4.1
|
||||
github.com/gorilla/websocket v1.4.1
|
||||
github.com/pkg/errors v0.8.1
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2
|
||||
google.golang.org/protobuf v1.25.0
|
||||
)
|
||||
|
||||
go 1.13
|
||||
|
||||
88
vendor/github.com/Rhymen/go-whatsapp/go.sum
generated
vendored
@@ -1,37 +1,71 @@
|
||||
github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f h1:2dk3eOnYllh+wUOuDhOoC2vUVoJF/5z478ryJ+wzEII=
|
||||
github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f/go.mod h1:4a58ifQTEe2uwwsaqbh3i2un5/CBPg+At/qHpt18Tmk=
|
||||
github.com/Rhymen/go-whatsapp v0.0.0/go.mod h1:rdQr95g2C1xcOfM7QGOhza58HeI3I+tZ/bbluv7VazA=
|
||||
github.com/Rhymen/go-whatsapp/examples/echo v0.0.0-20190325075644-cc2581bbf24d h1:m3wkrunHupL9XzzM+JZu1pgoDV1d9LFtD0gedNTHVDU=
|
||||
github.com/Rhymen/go-whatsapp/examples/echo v0.0.0-20190325075644-cc2581bbf24d/go.mod h1:zgCiQtBtZ4P4gFWvwl9aashsdwOcbb/EHOGRmSzM8ME=
|
||||
github.com/Rhymen/go-whatsapp/examples/restoreSession v0.0.0-20190325075644-cc2581bbf24d h1:muQlzqfZxjptOBjPdv+UoxVMr8Y1rPx7VMGPJIAFc5w=
|
||||
github.com/Rhymen/go-whatsapp/examples/restoreSession v0.0.0-20190325075644-cc2581bbf24d/go.mod h1:5sCUSpG616ZoSJhlt9iBNI/KXBqrVLcNUJqg7J9+8pU=
|
||||
github.com/Rhymen/go-whatsapp/examples/sendImage v0.0.0-20190325075644-cc2581bbf24d h1:xP//3V77YvHd1cj2Z3ttuQWAvs5WmIwBbjKe/t0g/tM=
|
||||
github.com/Rhymen/go-whatsapp/examples/sendImage v0.0.0-20190325075644-cc2581bbf24d/go.mod h1:RdiyhanVEGXTam+mZ3k6Y3VDCCvXYCwReOoxGozqhHw=
|
||||
github.com/Rhymen/go-whatsapp/examples/sendTextMessages v0.0.0-20190325075644-cc2581bbf24d h1:IRmRE0SPMByczwE2dhnTcVojje3w2TCSKwFrboLUbDg=
|
||||
github.com/Rhymen/go-whatsapp/examples/sendTextMessages v0.0.0-20190325075644-cc2581bbf24d/go.mod h1:suwzklatySS3Q0+NCxCDh5hYfgXdQUWU1DNcxwAxStM=
|
||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.0 h1:kbxbvI4Un1LUWKxufD+BiE6AEExYYgkQLQmLFqA1LFk=
|
||||
github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0=
|
||||
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
||||
github.com/golang/protobuf v1.4.1 h1:ZFgWrT+bLgsYPirOnRfKLYJLvssAegOj/hgyMFdJZe0=
|
||||
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
|
||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w=
|
||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=
|
||||
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||
github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg=
|
||||
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
|
||||
github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw=
|
||||
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/skip2/go-qrcode v0.0.0-20190110000554-dc11ecdae0a9 h1:lpEzuenPuO1XNTeikEmvqYFcU37GVLl8SRNblzyvGBE=
|
||||
github.com/skip2/go-qrcode v0.0.0-20190110000554-dc11ecdae0a9/go.mod h1:PLPIyL7ikehBD1OAjmKKiOEhbvWyHGaNDjquXMcYABo=
|
||||
golang.org/x/crypto v0.0.0-20190131182504-b8fe1690c613/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA=
|
||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8=
|
||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
||||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
||||
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
|
||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
|
||||
42
vendor/github.com/Rhymen/go-whatsapp/handler.go
generated
vendored
@@ -97,6 +97,22 @@ type ContactMessageHandler interface {
|
||||
HandleContactMessage(message ContactMessage)
|
||||
}
|
||||
|
||||
/*
|
||||
The ProductMessageHandler interface needs to be implemented to receive product messages dispatched by the dispatcher.
|
||||
*/
|
||||
type ProductMessageHandler interface {
|
||||
Handler
|
||||
HandleProductMessage(message ProductMessage)
|
||||
}
|
||||
|
||||
/*
|
||||
The OrderMessageHandler interface needs to be implemented to receive order messages dispatched by the dispatcher.
|
||||
*/
|
||||
type OrderMessageHandler interface {
|
||||
Handler
|
||||
HandleOrderMessage(message OrderMessage)
|
||||
}
|
||||
|
||||
/*
|
||||
The JsonMessageHandler interface needs to be implemented to receive json messages dispatched by the dispatcher.
|
||||
These json messages contain status updates of every kind sent by WhatsAppWeb servers. WhatsAppWeb uses these messages
|
||||
@@ -301,7 +317,7 @@ func (wac *Conn) handleWithCustomHandlers(message interface{}, handlers []Handle
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
case BatteryMessage:
|
||||
for _, h := range handlers {
|
||||
if x, ok := h.(BatteryMessageHandler); ok {
|
||||
@@ -312,7 +328,7 @@ func (wac *Conn) handleWithCustomHandlers(message interface{}, handlers []Handle
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
case Contact:
|
||||
for _, h := range handlers {
|
||||
if x, ok := h.(NewContactHandler); ok {
|
||||
@@ -324,6 +340,28 @@ func (wac *Conn) handleWithCustomHandlers(message interface{}, handlers []Handle
|
||||
}
|
||||
}
|
||||
|
||||
case ProductMessage:
|
||||
for _, h := range handlers {
|
||||
if x, ok := h.(ProductMessageHandler); ok {
|
||||
if wac.shouldCallSynchronously(h) {
|
||||
x.HandleProductMessage(m)
|
||||
} else {
|
||||
go x.HandleProductMessage(m)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
case OrderMessage:
|
||||
for _, h := range handlers {
|
||||
if x, ok := h.(OrderMessageHandler); ok {
|
||||
if wac.shouldCallSynchronously(h) {
|
||||
x.HandleOrderMessage(m)
|
||||
} else {
|
||||
go x.HandleOrderMessage(m)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
case *proto.WebMessageInfo:
|
||||
for _, h := range handlers {
|
||||
if x, ok := h.(RawMessageHandler); ok {
|
||||
|
||||
119
vendor/github.com/Rhymen/go-whatsapp/message.go
generated
vendored
@@ -65,6 +65,10 @@ func (wac *Conn) Send(msg interface{}) (string, error) {
|
||||
msgProto = GetLiveLocationProto(m)
|
||||
case ContactMessage:
|
||||
msgProto = getContactMessageProto(m)
|
||||
case ProductMessage:
|
||||
msgProto = getProductMessageProto(m)
|
||||
case OrderMessage:
|
||||
msgProto = getOrderMessageProto(m)
|
||||
default:
|
||||
return "ERROR", fmt.Errorf("cannot match type %T, use message types declared in the package", msg)
|
||||
}
|
||||
@@ -258,7 +262,7 @@ func getInfoProto(info *MessageInfo) *proto.WebMessageInfo {
|
||||
}
|
||||
info.FromMe = true
|
||||
|
||||
status := proto.WebMessageInfo_WEB_MESSAGE_INFO_STATUS(info.Status)
|
||||
status := proto.WebMessageInfo_WebMessageInfoStatus(info.Status)
|
||||
|
||||
return &proto.WebMessageInfo{
|
||||
Key: &proto.MessageKey{
|
||||
@@ -802,6 +806,113 @@ func getContactMessageProto(msg ContactMessage) *proto.WebMessageInfo {
|
||||
return p
|
||||
}
|
||||
|
||||
/*
|
||||
OrderMessage represents a order message.
|
||||
*/
|
||||
|
||||
type OrderMessage struct {
|
||||
Info MessageInfo
|
||||
OrderId string
|
||||
Thumbnail []byte
|
||||
ItemCount int32
|
||||
Status proto.OrderMessage_OrderMessageOrderStatus
|
||||
Surface proto.OrderMessage_OrderMessageOrderSurface
|
||||
Message string
|
||||
OrderTitle string
|
||||
SellerJid string
|
||||
Token string
|
||||
TotalAmount1000 int64
|
||||
TotalCurrencyCode string
|
||||
ContextInfo ContextInfo
|
||||
}
|
||||
|
||||
func getOrderMessage(msg *proto.WebMessageInfo) OrderMessage {
|
||||
order := msg.GetMessage().GetOrderMessage()
|
||||
|
||||
orderMessage := OrderMessage{
|
||||
Info: getMessageInfo(msg),
|
||||
OrderId: order.GetOrderId(),
|
||||
Thumbnail: order.GetThumbnail(),
|
||||
ItemCount: order.GetItemCount(),
|
||||
Status: order.GetStatus(),
|
||||
Surface: order.GetSurface(),
|
||||
Message: order.GetMessage(),
|
||||
OrderTitle: order.GetOrderTitle(),
|
||||
SellerJid: order.GetSellerJid(),
|
||||
Token: order.GetToken(),
|
||||
TotalAmount1000: order.GetTotalAmount1000(),
|
||||
TotalCurrencyCode: order.GetTotalCurrencyCode(),
|
||||
ContextInfo: getMessageContext(order.GetContextInfo()),
|
||||
}
|
||||
|
||||
return orderMessage
|
||||
}
|
||||
|
||||
func getOrderMessageProto(msg OrderMessage) *proto.WebMessageInfo {
|
||||
p := getInfoProto(&msg.Info)
|
||||
contextInfo := getContextInfoProto(&msg.ContextInfo)
|
||||
|
||||
p.Message = &proto.Message{
|
||||
OrderMessage: &proto.OrderMessage{
|
||||
Thumbnail: msg.Thumbnail,
|
||||
ItemCount: &msg.ItemCount,
|
||||
Status: &msg.Status,
|
||||
Surface: &msg.Surface,
|
||||
Message: &msg.Message,
|
||||
OrderTitle: &msg.OrderTitle,
|
||||
SellerJid: &msg.SellerJid,
|
||||
Token: &msg.Token,
|
||||
TotalAmount1000: &msg.TotalAmount1000,
|
||||
TotalCurrencyCode: &msg.TotalCurrencyCode,
|
||||
ContextInfo: contextInfo,
|
||||
},
|
||||
}
|
||||
|
||||
return p
|
||||
}
|
||||
|
||||
/*
|
||||
ProductMessage represents a product message.
|
||||
*/
|
||||
|
||||
type ProductMessage struct {
|
||||
Info MessageInfo
|
||||
Product *proto.ProductSnapshot
|
||||
BusinessOwnerJid string
|
||||
Catalog *proto.CatalogSnapshot
|
||||
ContextInfo ContextInfo
|
||||
}
|
||||
|
||||
func getProductMessage(msg *proto.WebMessageInfo) ProductMessage {
|
||||
prod := msg.GetMessage().GetProductMessage()
|
||||
|
||||
productMessage := ProductMessage{
|
||||
Info: getMessageInfo(msg),
|
||||
Product: prod.GetProduct(),
|
||||
BusinessOwnerJid: prod.GetBusinessOwnerJid(),
|
||||
Catalog: prod.GetCatalog(),
|
||||
ContextInfo: getMessageContext(prod.GetContextInfo()),
|
||||
}
|
||||
|
||||
return productMessage
|
||||
}
|
||||
|
||||
func getProductMessageProto(msg ProductMessage) *proto.WebMessageInfo {
|
||||
p := getInfoProto(&msg.Info)
|
||||
contextInfo := getContextInfoProto(&msg.ContextInfo)
|
||||
|
||||
p.Message = &proto.Message{
|
||||
ProductMessage: &proto.ProductMessage{
|
||||
Product: msg.Product,
|
||||
BusinessOwnerJid: &msg.BusinessOwnerJid,
|
||||
Catalog: msg.Catalog,
|
||||
ContextInfo: contextInfo,
|
||||
},
|
||||
}
|
||||
|
||||
return p
|
||||
}
|
||||
|
||||
func ParseProtoMessage(msg *proto.WebMessageInfo) interface{} {
|
||||
|
||||
switch {
|
||||
@@ -836,6 +947,12 @@ func ParseProtoMessage(msg *proto.WebMessageInfo) interface{} {
|
||||
case msg.GetMessage().GetContactMessage() != nil:
|
||||
return getContactMessage(msg)
|
||||
|
||||
case msg.GetMessage().GetProductMessage() != nil:
|
||||
return getProductMessage(msg)
|
||||
|
||||
case msg.GetMessage().GetOrderMessage() != nil:
|
||||
return getOrderMessage(msg)
|
||||
|
||||
default:
|
||||
//cannot match message
|
||||
return ErrMessageTypeNotImplemented
|
||||
|
||||
24
vendor/github.com/Rhymen/go-whatsapp/profile.go
generated
vendored
@@ -2,9 +2,10 @@ package whatsapp
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/Rhymen/go-whatsapp/binary"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/Rhymen/go-whatsapp/binary"
|
||||
)
|
||||
|
||||
// Pictures must be JPG 640x640 and 96x96, respectively
|
||||
@@ -41,3 +42,24 @@ func (wac *Conn) UploadProfilePic(image, preview []byte) (<-chan string, error)
|
||||
}
|
||||
return wac.writeBinary(n, profile, 136, tag)
|
||||
}
|
||||
|
||||
func (wac *Conn) UpdateProfileName(name string) (<-chan string, error) {
|
||||
tag := fmt.Sprintf("%d.--%d", time.Now().Unix(), wac.msgCount*19)
|
||||
n := binary.Node{
|
||||
Description: "action",
|
||||
Attributes: map[string]string{
|
||||
"type": "set",
|
||||
"epoch": strconv.Itoa(wac.msgCount),
|
||||
},
|
||||
Content: []interface{}{
|
||||
binary.Node{
|
||||
Description: "profile",
|
||||
Attributes: map[string]string{
|
||||
"name": name,
|
||||
},
|
||||
Content: []binary.Node{},
|
||||
},
|
||||
},
|
||||
}
|
||||
return wac.writeBinary(n, profile, ignore, tag)
|
||||
}
|
||||
|
||||
2
vendor/github.com/Rhymen/go-whatsapp/session.go
generated
vendored
@@ -18,7 +18,7 @@ import (
|
||||
)
|
||||
|
||||
//represents the WhatsAppWeb client version
|
||||
var waVersion = []int{2, 2039, 9}
|
||||
var waVersion = []int{2, 2110, 10}
|
||||
|
||||
/*
|
||||
Session contains session individual information. To be able to resume the connection without scanning the qr code
|
||||
|
||||
24
vendor/github.com/SevereCloud/vksdk/v2/.golangci.yml
generated
vendored
@@ -10,14 +10,11 @@ linters:
|
||||
- gocritic
|
||||
- gofmt
|
||||
- goimports
|
||||
- golint
|
||||
- goprintffuncname
|
||||
- gosec
|
||||
- gosimple
|
||||
- govet
|
||||
- ineffassign
|
||||
- interfacer
|
||||
- maligned
|
||||
- misspell
|
||||
- nakedret
|
||||
- prealloc
|
||||
@@ -39,10 +36,23 @@ linters:
|
||||
- tparallel
|
||||
- errorlint
|
||||
- paralleltest
|
||||
- forbidigo
|
||||
- makezero
|
||||
- thelper
|
||||
- predeclared
|
||||
- ifshort
|
||||
- revive
|
||||
- durationcheck
|
||||
- gomoddirectives
|
||||
- importas
|
||||
- nilerr
|
||||
- revive
|
||||
- wastedassign
|
||||
|
||||
# - wrapcheck # TODO: v3 Fix
|
||||
# - testpackage # TODO: Fix testpackage
|
||||
# - nestif # TODO: Fix nestif
|
||||
# - noctx # TODO: Fix noctx
|
||||
|
||||
# don't enable:
|
||||
# - depguard
|
||||
@@ -62,6 +72,14 @@ linters:
|
||||
# - nlreturn
|
||||
# - gci
|
||||
# - exhaustivestruct
|
||||
# - cyclop
|
||||
# - promlinter
|
||||
# - tagliatelle
|
||||
|
||||
# depricated
|
||||
# - maligned
|
||||
# - interfacer
|
||||
# - golint
|
||||
|
||||
issues:
|
||||
exclude-rules:
|
||||
|
||||
2
vendor/github.com/SevereCloud/vksdk/v2/doc.go
generated
vendored
@@ -7,6 +7,6 @@ package vksdk
|
||||
|
||||
// Module constants.
|
||||
const (
|
||||
Version = "2.9.0"
|
||||
Version = "2.9.2"
|
||||
API = "5.126"
|
||||
)
|
||||
|
||||
20
vendor/github.com/SevereCloud/vksdk/v2/events/objects.go
generated
vendored
@@ -316,40 +316,40 @@ type LikeRemoveObject struct {
|
||||
|
||||
// DonutSubscriptionCreateObject struct.
|
||||
type DonutSubscriptionCreateObject struct {
|
||||
Amount int `json:"amount"`
|
||||
Amount float64 `json:"amount"`
|
||||
AmountWithoutFee float64 `json:"amount_without_fee"`
|
||||
UserID int `json:"user_id"`
|
||||
UserID float64 `json:"user_id"`
|
||||
}
|
||||
|
||||
// DonutSubscriptionProlongedObject struct.
|
||||
type DonutSubscriptionProlongedObject struct {
|
||||
Amount int `json:"amount"`
|
||||
Amount float64 `json:"amount"`
|
||||
AmountWithoutFee float64 `json:"amount_without_fee"`
|
||||
UserID int `json:"user_id"`
|
||||
UserID float64 `json:"user_id"`
|
||||
}
|
||||
|
||||
// DonutSubscriptionExpiredObject struct.
|
||||
type DonutSubscriptionExpiredObject struct {
|
||||
UserID int `json:"user_id"`
|
||||
UserID float64 `json:"user_id"`
|
||||
}
|
||||
|
||||
// DonutSubscriptionCancelledObject struct.
|
||||
type DonutSubscriptionCancelledObject struct {
|
||||
UserID int `json:"user_id"`
|
||||
UserID float64 `json:"user_id"`
|
||||
}
|
||||
|
||||
// DonutSubscriptionPriceChangedObject struct.
|
||||
type DonutSubscriptionPriceChangedObject struct {
|
||||
AmountOld int `json:"amount_old"`
|
||||
AmountNew int `json:"amount_new"`
|
||||
AmountOld float64 `json:"amount_old"`
|
||||
AmountNew float64 `json:"amount_new"`
|
||||
AmountDiff float64 `json:"amount_diff"`
|
||||
AmountDiffWithoutFee float64 `json:"amount_diff_without_fee"`
|
||||
UserID int `json:"user_id"`
|
||||
UserID float64 `json:"user_id"`
|
||||
}
|
||||
|
||||
// DonutMoneyWithdrawObject struct.
|
||||
type DonutMoneyWithdrawObject struct {
|
||||
Amount int `json:"amount"`
|
||||
Amount float64 `json:"amount"`
|
||||
AmountWithoutFee float64 `json:"amount_without_fee"`
|
||||
}
|
||||
|
||||
|
||||
4
vendor/github.com/SevereCloud/vksdk/v2/go.mod
generated
vendored
@@ -5,6 +5,6 @@ go 1.13
|
||||
require (
|
||||
github.com/gorilla/schema v1.2.0
|
||||
github.com/gorilla/websocket v1.4.2
|
||||
github.com/stretchr/testify v1.6.1
|
||||
golang.org/x/text v0.3.4
|
||||
github.com/stretchr/testify v1.7.0
|
||||
golang.org/x/text v0.3.5
|
||||
)
|
||||
|
||||
8
vendor/github.com/SevereCloud/vksdk/v2/go.sum
generated
vendored
@@ -7,10 +7,10 @@ github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
|
||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc=
|
||||
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ=
|
||||
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
|
||||
3
vendor/github.com/SevereCloud/vksdk/v2/longpoll-bot/longpoll.go
generated
vendored
@@ -173,8 +173,7 @@ func (lp *LongPoll) RunWithContext(ctx context.Context) error {
|
||||
func (lp *LongPoll) run(ctx context.Context) error {
|
||||
ctx, lp.cancel = context.WithCancel(ctx)
|
||||
|
||||
err := lp.autoSetting(ctx)
|
||||
if err != nil {
|
||||
if err := lp.autoSetting(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
3
vendor/github.com/SevereCloud/vksdk/v2/object/ads.go
generated
vendored
@@ -207,8 +207,7 @@ type AdsStatsSexAge struct {
|
||||
}
|
||||
|
||||
// AdsTargSettings struct.
|
||||
type AdsTargSettings struct {
|
||||
}
|
||||
type AdsTargSettings struct{}
|
||||
|
||||
// AdsTargStats struct.
|
||||
type AdsTargStats struct {
|
||||
|
||||
3
vendor/github.com/SevereCloud/vksdk/v2/object/messages.go
generated
vendored
@@ -721,8 +721,7 @@ type MessagesPinnedMessage struct {
|
||||
}
|
||||
|
||||
// MessagesUserXtrInvitedBy struct.
|
||||
type MessagesUserXtrInvitedBy struct {
|
||||
}
|
||||
type MessagesUserXtrInvitedBy struct{}
|
||||
|
||||
// MessagesForward struct.
|
||||
type MessagesForward struct {
|
||||
|
||||
10
vendor/github.com/SevereCloud/vksdk/v2/object/newsfeed.go
generated
vendored
@@ -87,11 +87,11 @@ type NewsfeedItemStoriesBlock struct {
|
||||
}
|
||||
|
||||
// NewsfeedItemTopic struct.
|
||||
type NewsfeedItemTopic struct {
|
||||
// Comments BaseCommentsInfo `json:"comments"`
|
||||
// Likes BaseLikesInfo `json:"likes"`
|
||||
// Text string `json:"text"` // Post text
|
||||
}
|
||||
//
|
||||
// Comments BaseCommentsInfo `json:"comments"`
|
||||
// Likes BaseLikesInfo `json:"likes"`
|
||||
// Text string `json:"text"` // Post text.
|
||||
type NewsfeedItemTopic struct{}
|
||||
|
||||
// NewsfeedItemVideo struct.
|
||||
type NewsfeedItemVideo struct {
|
||||
|
||||
4
vendor/github.com/SevereCloud/vksdk/v2/object/photos.go
generated
vendored
@@ -134,7 +134,7 @@ type PhotosOwnerUploadResponse struct {
|
||||
type PhotosPhotoAlbum struct {
|
||||
Created int `json:"created"` // Date when the album has been created in Unixtime
|
||||
Description string `json:"description"` // Photo album description
|
||||
ID string `json:"id"` // BUG(VK): Photo album ID
|
||||
ID int `json:"id"` // Photo album ID
|
||||
OwnerID int `json:"owner_id"` // Album owner's ID
|
||||
Size int `json:"size"` // Photos number
|
||||
Thumb PhotosPhoto `json:"thumb"`
|
||||
@@ -144,7 +144,7 @@ type PhotosPhotoAlbum struct {
|
||||
|
||||
// ToAttachment return attachment format.
|
||||
func (album PhotosPhotoAlbum) ToAttachment() string {
|
||||
return fmt.Sprintf("album%d_%s", album.OwnerID, album.ID)
|
||||
return fmt.Sprintf("album%d_%d", album.OwnerID, album.ID)
|
||||
}
|
||||
|
||||
// PhotosPhotoAlbumFull struct.
|
||||
|
||||
24
vendor/github.com/SevereCloud/vksdk/v2/object/users.go
generated
vendored
@@ -1,6 +1,8 @@
|
||||
package object // import "github.com/SevereCloud/vksdk/v2/object"
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
@@ -233,6 +235,28 @@ type UsersPersonal struct {
|
||||
ReligionID int `json:"religion_id"`
|
||||
}
|
||||
|
||||
// UnmarshalJSON UsersPersonal.
|
||||
//
|
||||
// BUG(VK): UsersPersonal return [].
|
||||
func (personal *UsersPersonal) UnmarshalJSON(data []byte) error {
|
||||
if bytes.Equal(data, []byte("[]")) {
|
||||
return nil
|
||||
}
|
||||
|
||||
type renamedUsersPersonal UsersPersonal
|
||||
|
||||
var r renamedUsersPersonal
|
||||
|
||||
err := json.Unmarshal(data, &r)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
*personal = UsersPersonal(r)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// UsersRelative struct.
|
||||
type UsersRelative struct {
|
||||
BirthDate string `json:"birth_date"` // Date of child birthday (format dd.mm.yyyy)
|
||||
|
||||
2
vendor/github.com/SevereCloud/vksdk/v2/object/video.go
generated
vendored
@@ -35,7 +35,7 @@ type VideoVideo struct {
|
||||
IsPrivate BaseBoolInt `json:"is_private"`
|
||||
Added BaseBoolInt `json:"added"`
|
||||
Repeat BaseBoolInt `json:"repeat"` // Information whether the video is repeated
|
||||
ContentRestricted BaseBoolInt `json:"content_restricted"`
|
||||
ContentRestricted int `json:"content_restricted"`
|
||||
Live BaseBoolInt `json:"live"` // Returns if the video is a live stream
|
||||
Upcoming BaseBoolInt `json:"upcoming"`
|
||||
Comments int `json:"comments"` // Number of comments
|
||||
|
||||
2
vendor/github.com/SevereCloud/vksdk/v2/object/wall.go
generated
vendored
@@ -142,7 +142,7 @@ type WallWallpost struct {
|
||||
FriendsOnly int `json:"friends_only"`
|
||||
Comments BaseCommentsInfo `json:"comments"`
|
||||
Likes BaseLikesInfo `json:"likes"` // Count of likes
|
||||
Reposts BaseRepostsInfo `json:"reposts"` // Count of views
|
||||
Reposts BaseRepostsInfo `json:"reposts"` // Count of reposts
|
||||
Views WallViews `json:"views"` // Count of views
|
||||
PostType string `json:"post_type"`
|
||||
PostSource WallPostSource `json:"post_source"`
|
||||
|
||||
2
vendor/github.com/gomarkdown/markdown/html/doc.go
generated
vendored
@@ -9,7 +9,7 @@ A renderer can be configured with multiple options:
|
||||
|
||||
flags := html.CommonFlags | html.CompletePage | html.HrefTargetBlank
|
||||
opts := html.RendererOptions{
|
||||
TItle: "A custom title",
|
||||
Title: "A custom title",
|
||||
Flags: flags,
|
||||
}
|
||||
renderer := html.NewRenderer(opts)
|
||||
|
||||
7
vendor/github.com/gomarkdown/markdown/html/renderer.go
generated
vendored
@@ -43,6 +43,7 @@ const (
|
||||
SmartypantsAngledQuotes // Enable angled double quotes (with Smartypants) for double quotes rendering
|
||||
SmartypantsQuotesNBSP // Enable « French guillemets » (with Smartypants)
|
||||
TOC // Generate a table of contents
|
||||
LazyLoadImages // Include loading="lazy" with images
|
||||
|
||||
CommonFlags Flags = Smartypants | SmartypantsFractions | SmartypantsDashes | SmartypantsLatexDashes
|
||||
)
|
||||
@@ -589,7 +590,11 @@ func (r *Renderer) imageEnter(w io.Writer, image *ast.Image) {
|
||||
//if options.safe && potentiallyUnsafe(dest) {
|
||||
//out(w, `<img src="" alt="`)
|
||||
//} else {
|
||||
r.Outs(w, `<img src="`)
|
||||
if r.opts.Flags&LazyLoadImages != 0 {
|
||||
r.Outs(w, `<img loading="lazy" src="`)
|
||||
} else {
|
||||
r.Outs(w, `<img src="`)
|
||||
}
|
||||
escLink(w, dest)
|
||||
r.Outs(w, `" alt="`)
|
||||
//}
|
||||
|
||||
2
vendor/github.com/gomarkdown/markdown/parser/block.go
generated
vendored
@@ -1221,7 +1221,7 @@ func (p *Parser) tableRow(data []byte, columns []ast.CellAlignFlags, header bool
|
||||
|
||||
// skip the end-of-cell marker, possibly taking us past end of buffer
|
||||
// each _extra_ | means a colspan
|
||||
for data[i] == '|' && !isBackslashEscaped(data, i) {
|
||||
for i < len(data) && data[i] == '|' && !isBackslashEscaped(data, i) {
|
||||
i++
|
||||
colspan++
|
||||
}
|
||||
|
||||
2
vendor/github.com/google/gops/agent/agent.go
generated
vendored
@@ -59,7 +59,7 @@ type Options struct {
|
||||
ShutdownCleanup bool
|
||||
|
||||
// ReuseSocketAddrAndPort determines whether the SO_REUSEADDR and
|
||||
// SO_REUSEADDR socket options should be set on the listening socket of
|
||||
// SO_REUSEPORT socket options should be set on the listening socket of
|
||||
// the agent. This option is only effective on unix-like OSes and if
|
||||
// Addr is set to a fixed host:port.
|
||||
// Optional.
|
||||
|
||||
38
vendor/github.com/labstack/echo/v4/CHANGELOG.md
generated
vendored
@@ -1,6 +1,40 @@
|
||||
# Changelog
|
||||
|
||||
## v4.2.1 - 2020-03-08
|
||||
## v4.3.0 - 2021-05-08
|
||||
|
||||
**Important notes**
|
||||
|
||||
* Route matching has improvements for following cases:
|
||||
1. Correctly match routes with parameter part as last part of route (with trailing backslash)
|
||||
2. Considering handlers when resolving routes and search for matching http method handler
|
||||
* Echo minimal Go version is now 1.13.
|
||||
|
||||
**Fixes**
|
||||
|
||||
* When url ends with slash first param route is the match [#1804](https://github.com/labstack/echo/pull/1812)
|
||||
* Router should check if node is suitable as matching route by path+method and if not then continue search in tree [#1808](https://github.com/labstack/echo/issues/1808)
|
||||
* Fix timeout middleware not writing response correctly when handler panics [#1864](https://github.com/labstack/echo/pull/1864)
|
||||
* Fix binder not working with embedded pointer structs [#1861](https://github.com/labstack/echo/pull/1861)
|
||||
* Add Go 1.16 to CI and drop 1.12 specific code [#1850](https://github.com/labstack/echo/pull/1850)
|
||||
|
||||
**Enhancements**
|
||||
|
||||
* Make KeyFunc public in JWT middleware [#1756](https://github.com/labstack/echo/pull/1756)
|
||||
* Add support for optional filesystem to the static middleware [#1797](https://github.com/labstack/echo/pull/1797)
|
||||
* Add a custom error handler to key-auth middleware [#1847](https://github.com/labstack/echo/pull/1847)
|
||||
* Allow JWT token to be looked up from multiple sources [#1845](https://github.com/labstack/echo/pull/1845)
|
||||
|
||||
## v4.2.2 - 2021-04-07
|
||||
|
||||
**Fixes**
|
||||
|
||||
* Allow proxy middleware to use query part in rewrite (#1802)
|
||||
* Fix timeout middleware not sending status code when handler returns an error (#1805)
|
||||
* Fix Bind() when target is array/slice and path/query params complains bind target not being struct (#1835)
|
||||
* Fix panic in redirect middleware on short host name (#1813)
|
||||
* Fix timeout middleware docs (#1836)
|
||||
|
||||
## v4.2.1 - 2021-03-08
|
||||
|
||||
**Important notes**
|
||||
|
||||
@@ -22,7 +56,7 @@ A performance regression has been fixed, even bringing better performance than b
|
||||
This release was made possible by our **contributors**:
|
||||
aldas, clwluvw, lammel, Le0tk0k, maciej-jezierski, rkilingr, stffabi, withshubh
|
||||
|
||||
## v4.2.0 - 2020-02-11
|
||||
## v4.2.0 - 2021-02-11
|
||||
|
||||
**Important notes**
|
||||
|
||||
|
||||
2
vendor/github.com/labstack/echo/v4/LICENSE
generated
vendored
@@ -1,6 +1,6 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2017 LabStack
|
||||
Copyright (c) 2021 LabStack
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
||||
13
vendor/github.com/labstack/echo/v4/bind.go
generated
vendored
@@ -134,17 +134,30 @@ func (b *DefaultBinder) bindData(destination interface{}, data map[string][]stri
|
||||
|
||||
// !struct
|
||||
if typ.Kind() != reflect.Struct {
|
||||
if tag == "param" || tag == "query" {
|
||||
// incompatible type, data is probably to be found in the body
|
||||
return nil
|
||||
}
|
||||
return errors.New("binding element must be a struct")
|
||||
}
|
||||
|
||||
for i := 0; i < typ.NumField(); i++ {
|
||||
typeField := typ.Field(i)
|
||||
structField := val.Field(i)
|
||||
if typeField.Anonymous {
|
||||
if structField.Kind() == reflect.Ptr {
|
||||
structField = structField.Elem()
|
||||
}
|
||||
}
|
||||
if !structField.CanSet() {
|
||||
continue
|
||||
}
|
||||
structFieldKind := structField.Kind()
|
||||
inputFieldName := typeField.Tag.Get(tag)
|
||||
if typeField.Anonymous && structField.Kind() == reflect.Struct && inputFieldName != "" {
|
||||
// if anonymous struct with query/param/form tags, report an error
|
||||
return errors.New("query/param/form tags are not allowed with anonymous struct field")
|
||||
}
|
||||
|
||||
if inputFieldName == "" {
|
||||
// If tag is nil, we inspect if the field is a not BindUnmarshaler struct and try to bind data into it (might contains fields with tags).
|
||||
|
||||
2
vendor/github.com/labstack/echo/v4/echo.go
generated
vendored
@@ -234,7 +234,7 @@ const (
|
||||
|
||||
const (
|
||||
// Version of Echo
|
||||
Version = "4.2.1"
|
||||
Version = "4.3.0"
|
||||
website = "https://echo.labstack.com"
|
||||
// http://patorjk.com/software/taag/#p=display&f=Small%20Slant&t=Echo
|
||||
banner = `
|
||||
|
||||
10
vendor/github.com/labstack/echo/v4/go.mod
generated
vendored
@@ -5,12 +5,12 @@ go 1.15
|
||||
require (
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible
|
||||
github.com/labstack/gommon v0.3.0
|
||||
github.com/mattn/go-colorable v0.1.7 // indirect
|
||||
github.com/mattn/go-colorable v0.1.8 // indirect
|
||||
github.com/stretchr/testify v1.4.0
|
||||
github.com/valyala/fasttemplate v1.2.1
|
||||
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a
|
||||
golang.org/x/net v0.0.0-20200822124328-c89045814202
|
||||
golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6 // indirect
|
||||
golang.org/x/text v0.3.3 // indirect
|
||||
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2
|
||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4
|
||||
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57 // indirect
|
||||
golang.org/x/text v0.3.6 // indirect
|
||||
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324
|
||||
)
|
||||
|
||||
36
vendor/github.com/labstack/echo/v4/go.sum
generated
vendored
@@ -4,12 +4,10 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumC
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||
github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0=
|
||||
github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k=
|
||||
github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU=
|
||||
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
||||
github.com/mattn/go-colorable v0.1.7 h1:bQGKb3vps/j0E9GfJQ03JyhRuxsvdAanXlT9BTw3mdw=
|
||||
github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||
github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8=
|
||||
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||
github.com/mattn/go-isatty v0.0.9 h1:d5US/mDsogSGW37IV293h//ZFaeajb69h+EHFsv2xGg=
|
||||
github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
|
||||
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
|
||||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||
@@ -20,32 +18,26 @@ github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJy
|
||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
|
||||
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
|
||||
github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8WdUSz8=
|
||||
github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
|
||||
github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4=
|
||||
github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM=
|
||||
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA=
|
||||
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w=
|
||||
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0=
|
||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a h1:aYOabOQFp6Vj6W1F80affTUvO9UxmJRx8K0gsfABByQ=
|
||||
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8=
|
||||
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6 h1:DvY3Zkh7KabQE/kfzMvYvKirSiguP9Q/veMtkYyf0o8=
|
||||
golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57 h1:F5Gozwx4I1xtr/sr/8CFbb57iKi3297KFs0QDbGN60A=
|
||||
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE=
|
||||
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
|
||||
2
vendor/github.com/labstack/echo/v4/middleware/csrf.go
generated
vendored
@@ -110,7 +110,7 @@ func CSRFWithConfig(config CSRFConfig) echo.MiddlewareFunc {
|
||||
if config.CookieMaxAge == 0 {
|
||||
config.CookieMaxAge = DefaultCSRFConfig.CookieMaxAge
|
||||
}
|
||||
if config.CookieSameSite == SameSiteNoneMode {
|
||||
if config.CookieSameSite == http.SameSiteNoneMode {
|
||||
config.CookieSecure = true
|
||||
}
|
||||
|
||||
|
||||
12
vendor/github.com/labstack/echo/v4/middleware/csrf_samesite.go
generated
vendored
@@ -1,12 +0,0 @@
|
||||
// +build go1.13
|
||||
|
||||
package middleware
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
)
|
||||
|
||||
const (
|
||||
// SameSiteNoneMode required to be redefined for Go 1.12 support (see #1524)
|
||||
SameSiteNoneMode http.SameSite = http.SameSiteNoneMode
|
||||
)
|
||||
12
vendor/github.com/labstack/echo/v4/middleware/csrf_samesite_1.12.go
generated
vendored
@@ -1,12 +0,0 @@
|
||||
// +build !go1.13
|
||||
|
||||
package middleware
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
)
|
||||
|
||||
const (
|
||||
// SameSiteNoneMode required to be redefined for Go 1.12 support (see #1524)
|
||||
SameSiteNoneMode http.SameSite = 4
|
||||
)
|
||||
108
vendor/github.com/labstack/echo/v4/middleware/jwt.go
generated
vendored
@@ -29,15 +29,19 @@ type (
|
||||
// ErrorHandlerWithContext is almost identical to ErrorHandler, but it's passed the current context.
|
||||
ErrorHandlerWithContext JWTErrorHandlerWithContext
|
||||
|
||||
// Signing key to validate token. Used as fallback if SigningKeys has length 0.
|
||||
// Required. This or SigningKeys.
|
||||
// Signing key to validate token.
|
||||
// This is one of the three options to provide a token validation key.
|
||||
// The order of precedence is a user-defined KeyFunc, SigningKeys and SigningKey.
|
||||
// Required if neither user-defined KeyFunc nor SigningKeys is provided.
|
||||
SigningKey interface{}
|
||||
|
||||
// Map of signing keys to validate token with kid field usage.
|
||||
// Required. This or SigningKey.
|
||||
// This is one of the three options to provide a token validation key.
|
||||
// The order of precedence is a user-defined KeyFunc, SigningKeys and SigningKey.
|
||||
// Required if neither user-defined KeyFunc nor SigningKey is provided.
|
||||
SigningKeys map[string]interface{}
|
||||
|
||||
// Signing method, used to check token signing method.
|
||||
// Signing method used to check the token's signing algorithm.
|
||||
// Optional. Default value HS256.
|
||||
SigningMethod string
|
||||
|
||||
@@ -64,7 +68,16 @@ type (
|
||||
// Optional. Default value "Bearer".
|
||||
AuthScheme string
|
||||
|
||||
keyFunc jwt.Keyfunc
|
||||
// KeyFunc defines a user-defined function that supplies the public key for a token validation.
|
||||
// The function shall take care of verifying the signing algorithm and selecting the proper key.
|
||||
// A user-defined KeyFunc can be useful if tokens are issued by an external party.
|
||||
//
|
||||
// When a user-defined KeyFunc is provided, SigningKey, SigningKeys, and SigningMethod are ignored.
|
||||
// This is one of the three options to provide a token validation key.
|
||||
// The order of precedence is a user-defined KeyFunc, SigningKeys and SigningKey.
|
||||
// Required if neither SigningKeys nor SigningKey is provided.
|
||||
// Default to an internal implementation verifying the signing algorithm and selecting the proper key.
|
||||
KeyFunc jwt.Keyfunc
|
||||
}
|
||||
|
||||
// JWTSuccessHandler defines a function which is executed for a valid token.
|
||||
@@ -99,6 +112,7 @@ var (
|
||||
TokenLookup: "header:" + echo.HeaderAuthorization,
|
||||
AuthScheme: "Bearer",
|
||||
Claims: jwt.MapClaims{},
|
||||
KeyFunc: nil,
|
||||
}
|
||||
)
|
||||
|
||||
@@ -123,7 +137,7 @@ func JWTWithConfig(config JWTConfig) echo.MiddlewareFunc {
|
||||
if config.Skipper == nil {
|
||||
config.Skipper = DefaultJWTConfig.Skipper
|
||||
}
|
||||
if config.SigningKey == nil && len(config.SigningKeys) == 0 {
|
||||
if config.SigningKey == nil && len(config.SigningKeys) == 0 && config.KeyFunc == nil {
|
||||
panic("echo: jwt middleware requires signing key")
|
||||
}
|
||||
if config.SigningMethod == "" {
|
||||
@@ -141,35 +155,29 @@ func JWTWithConfig(config JWTConfig) echo.MiddlewareFunc {
|
||||
if config.AuthScheme == "" {
|
||||
config.AuthScheme = DefaultJWTConfig.AuthScheme
|
||||
}
|
||||
config.keyFunc = func(t *jwt.Token) (interface{}, error) {
|
||||
// Check the signing method
|
||||
if t.Method.Alg() != config.SigningMethod {
|
||||
return nil, fmt.Errorf("unexpected jwt signing method=%v", t.Header["alg"])
|
||||
}
|
||||
if len(config.SigningKeys) > 0 {
|
||||
if kid, ok := t.Header["kid"].(string); ok {
|
||||
if key, ok := config.SigningKeys[kid]; ok {
|
||||
return key, nil
|
||||
}
|
||||
}
|
||||
return nil, fmt.Errorf("unexpected jwt key id=%v", t.Header["kid"])
|
||||
}
|
||||
|
||||
return config.SigningKey, nil
|
||||
if config.KeyFunc == nil {
|
||||
config.KeyFunc = config.defaultKeyFunc
|
||||
}
|
||||
|
||||
// Initialize
|
||||
parts := strings.Split(config.TokenLookup, ":")
|
||||
extractor := jwtFromHeader(parts[1], config.AuthScheme)
|
||||
switch parts[0] {
|
||||
case "query":
|
||||
extractor = jwtFromQuery(parts[1])
|
||||
case "param":
|
||||
extractor = jwtFromParam(parts[1])
|
||||
case "cookie":
|
||||
extractor = jwtFromCookie(parts[1])
|
||||
case "form":
|
||||
extractor = jwtFromForm(parts[1])
|
||||
// Split sources
|
||||
sources := strings.Split(config.TokenLookup, ",")
|
||||
var extractors []jwtExtractor
|
||||
for _, source := range sources {
|
||||
parts := strings.Split(source, ":")
|
||||
|
||||
switch parts[0] {
|
||||
case "query":
|
||||
extractors = append(extractors, jwtFromQuery(parts[1]))
|
||||
case "param":
|
||||
extractors = append(extractors, jwtFromParam(parts[1]))
|
||||
case "cookie":
|
||||
extractors = append(extractors, jwtFromCookie(parts[1]))
|
||||
case "form":
|
||||
extractors = append(extractors, jwtFromForm(parts[1]))
|
||||
case "header":
|
||||
extractors = append(extractors, jwtFromHeader(parts[1], config.AuthScheme))
|
||||
}
|
||||
}
|
||||
|
||||
return func(next echo.HandlerFunc) echo.HandlerFunc {
|
||||
@@ -181,8 +189,17 @@ func JWTWithConfig(config JWTConfig) echo.MiddlewareFunc {
|
||||
if config.BeforeFunc != nil {
|
||||
config.BeforeFunc(c)
|
||||
}
|
||||
|
||||
auth, err := extractor(c)
|
||||
var auth string
|
||||
var err error
|
||||
for _, extractor := range extractors {
|
||||
// Extract token from extractor, if it's not fail break the loop and
|
||||
// set auth
|
||||
auth, err = extractor(c)
|
||||
if err == nil {
|
||||
break
|
||||
}
|
||||
}
|
||||
// If none of extractor has a token, handle error
|
||||
if err != nil {
|
||||
if config.ErrorHandler != nil {
|
||||
return config.ErrorHandler(err)
|
||||
@@ -193,14 +210,15 @@ func JWTWithConfig(config JWTConfig) echo.MiddlewareFunc {
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
token := new(jwt.Token)
|
||||
// Issue #647, #656
|
||||
if _, ok := config.Claims.(jwt.MapClaims); ok {
|
||||
token, err = jwt.Parse(auth, config.keyFunc)
|
||||
token, err = jwt.Parse(auth, config.KeyFunc)
|
||||
} else {
|
||||
t := reflect.ValueOf(config.Claims).Type().Elem()
|
||||
claims := reflect.New(t).Interface().(jwt.Claims)
|
||||
token, err = jwt.ParseWithClaims(auth, claims, config.keyFunc)
|
||||
token, err = jwt.ParseWithClaims(auth, claims, config.KeyFunc)
|
||||
}
|
||||
if err == nil && token.Valid {
|
||||
// Store user information from token into context.
|
||||
@@ -225,6 +243,24 @@ func JWTWithConfig(config JWTConfig) echo.MiddlewareFunc {
|
||||
}
|
||||
}
|
||||
|
||||
// defaultKeyFunc returns a signing key of the given token.
|
||||
func (config *JWTConfig) defaultKeyFunc(t *jwt.Token) (interface{}, error) {
|
||||
// Check the signing method
|
||||
if t.Method.Alg() != config.SigningMethod {
|
||||
return nil, fmt.Errorf("unexpected jwt signing method=%v", t.Header["alg"])
|
||||
}
|
||||
if len(config.SigningKeys) > 0 {
|
||||
if kid, ok := t.Header["kid"].(string); ok {
|
||||
if key, ok := config.SigningKeys[kid]; ok {
|
||||
return key, nil
|
||||
}
|
||||
}
|
||||
return nil, fmt.Errorf("unexpected jwt key id=%v", t.Header["kid"])
|
||||
}
|
||||
|
||||
return config.SigningKey, nil
|
||||
}
|
||||
|
||||
// jwtFromHeader returns a `jwtExtractor` that extracts token from the request header.
|
||||
func jwtFromHeader(header string, authScheme string) jwtExtractor {
|
||||
return func(c echo.Context) (string, error) {
|
||||
|
||||
13
vendor/github.com/labstack/echo/v4/middleware/key_auth.go
generated
vendored
@@ -30,12 +30,19 @@ type (
|
||||
// Validator is a function to validate key.
|
||||
// Required.
|
||||
Validator KeyAuthValidator
|
||||
|
||||
// ErrorHandler defines a function which is executed for an invalid key.
|
||||
// It may be used to define a custom error.
|
||||
ErrorHandler KeyAuthErrorHandler
|
||||
}
|
||||
|
||||
// KeyAuthValidator defines a function to validate KeyAuth credentials.
|
||||
KeyAuthValidator func(string, echo.Context) (bool, error)
|
||||
|
||||
keyExtractor func(echo.Context) (string, error)
|
||||
|
||||
// KeyAuthErrorHandler defines a function which is executed for an invalid key.
|
||||
KeyAuthErrorHandler func(error, echo.Context) error
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -95,10 +102,16 @@ func KeyAuthWithConfig(config KeyAuthConfig) echo.MiddlewareFunc {
|
||||
// Extract and verify key
|
||||
key, err := extractor(c)
|
||||
if err != nil {
|
||||
if config.ErrorHandler != nil {
|
||||
return config.ErrorHandler(err, c)
|
||||
}
|
||||
return echo.NewHTTPError(http.StatusBadRequest, err.Error())
|
||||
}
|
||||
valid, err := config.Validator(key, c)
|
||||
if err != nil {
|
||||
if config.ErrorHandler != nil {
|
||||
return config.ErrorHandler(err, c)
|
||||
}
|
||||
return &echo.HTTPError{
|
||||
Code: http.StatusUnauthorized,
|
||||
Message: "invalid key",
|
||||
|
||||
50
vendor/github.com/labstack/echo/v4/middleware/middleware.go
generated
vendored
@@ -2,7 +2,6 @@ package middleware
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"net/url"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
@@ -49,30 +48,39 @@ func rewriteRulesRegex(rewrite map[string]string) map[*regexp.Regexp]string {
|
||||
return rulesRegex
|
||||
}
|
||||
|
||||
func rewritePath(rewriteRegex map[*regexp.Regexp]string, req *http.Request) {
|
||||
for k, v := range rewriteRegex {
|
||||
rawPath := req.URL.RawPath
|
||||
if rawPath != "" {
|
||||
// RawPath is only set when there has been escaping done. In that case Path must be deduced from rewritten RawPath
|
||||
// because encoded Path could match rules that RawPath did not
|
||||
if replacer := captureTokens(k, rawPath); replacer != nil {
|
||||
rawPath = replacer.Replace(v)
|
||||
func rewriteURL(rewriteRegex map[*regexp.Regexp]string, req *http.Request) error {
|
||||
if len(rewriteRegex) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
req.URL.RawPath = rawPath
|
||||
req.URL.Path, _ = url.PathUnescape(rawPath)
|
||||
|
||||
return // rewrite only once
|
||||
}
|
||||
|
||||
continue
|
||||
// Depending how HTTP request is sent RequestURI could contain Scheme://Host/path or be just /path.
|
||||
// We only want to use path part for rewriting and therefore trim prefix if it exists
|
||||
rawURI := req.RequestURI
|
||||
if rawURI != "" && rawURI[0] != '/' {
|
||||
prefix := ""
|
||||
if req.URL.Scheme != "" {
|
||||
prefix = req.URL.Scheme + "://"
|
||||
}
|
||||
|
||||
if replacer := captureTokens(k, req.URL.Path); replacer != nil {
|
||||
req.URL.Path = replacer.Replace(v)
|
||||
|
||||
return // rewrite only once
|
||||
if req.URL.Host != "" {
|
||||
prefix += req.URL.Host // host or host:port
|
||||
}
|
||||
if prefix != "" {
|
||||
rawURI = strings.TrimPrefix(rawURI, prefix)
|
||||
}
|
||||
}
|
||||
|
||||
for k, v := range rewriteRegex {
|
||||
if replacer := captureTokens(k, rawURI); replacer != nil {
|
||||
url, err := req.URL.Parse(replacer.Replace(v))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
req.URL = url
|
||||
|
||||
return nil // rewrite only once
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// DefaultSkipper returns false which processes the middleware.
|
||||
|
||||
42
vendor/github.com/labstack/echo/v4/middleware/proxy.go
generated
vendored
@@ -1,13 +1,16 @@
|
||||
package middleware
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io"
|
||||
"math/rand"
|
||||
"net"
|
||||
"net/http"
|
||||
"net/http/httputil"
|
||||
"net/url"
|
||||
"regexp"
|
||||
"strings"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
@@ -231,8 +234,9 @@ func ProxyWithConfig(config ProxyConfig) echo.MiddlewareFunc {
|
||||
tgt := config.Balancer.Next(c)
|
||||
c.Set(config.ContextKey, tgt)
|
||||
|
||||
// Set rewrite path and raw path
|
||||
rewritePath(config.RegexRewrite, req)
|
||||
if err := rewriteURL(config.RegexRewrite, req); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Fix header
|
||||
// Basically it's not good practice to unconditionally pass incoming x-real-ip header to upstream.
|
||||
@@ -263,3 +267,37 @@ func ProxyWithConfig(config ProxyConfig) echo.MiddlewareFunc {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// StatusCodeContextCanceled is a custom HTTP status code for situations
|
||||
// where a client unexpectedly closed the connection to the server.
|
||||
// As there is no standard error code for "client closed connection", but
|
||||
// various well-known HTTP clients and server implement this HTTP code we use
|
||||
// 499 too instead of the more problematic 5xx, which does not allow to detect this situation
|
||||
const StatusCodeContextCanceled = 499
|
||||
|
||||
func proxyHTTP(tgt *ProxyTarget, c echo.Context, config ProxyConfig) http.Handler {
|
||||
proxy := httputil.NewSingleHostReverseProxy(tgt.URL)
|
||||
proxy.ErrorHandler = func(resp http.ResponseWriter, req *http.Request, err error) {
|
||||
desc := tgt.URL.String()
|
||||
if tgt.Name != "" {
|
||||
desc = fmt.Sprintf("%s(%s)", tgt.Name, tgt.URL.String())
|
||||
}
|
||||
// If the client canceled the request (usually by closing the connection), we can report a
|
||||
// client error (4xx) instead of a server error (5xx) to correctly identify the situation.
|
||||
// The Go standard library (at of late 2020) wraps the exported, standard
|
||||
// context.Canceled error with unexported garbage value requiring a substring check, see
|
||||
// https://github.com/golang/go/blob/6965b01ea248cabb70c3749fd218b36089a21efb/src/net/net.go#L416-L430
|
||||
if err == context.Canceled || strings.Contains(err.Error(), "operation was canceled") {
|
||||
httpError := echo.NewHTTPError(StatusCodeContextCanceled, fmt.Sprintf("client closed connection: %v", err))
|
||||
httpError.Internal = err
|
||||
c.Set("_error", httpError)
|
||||
} else {
|
||||
httpError := echo.NewHTTPError(http.StatusBadGateway, fmt.Sprintf("remote %s unreachable, could not forward: %v", desc, err))
|
||||
httpError.Internal = err
|
||||
c.Set("_error", httpError)
|
||||
}
|
||||
}
|
||||
proxy.Transport = config.Transport
|
||||
proxy.ModifyResponse = config.ModifyResponse
|
||||
return proxy
|
||||
}
|
||||
|
||||
47
vendor/github.com/labstack/echo/v4/middleware/proxy_1_11.go
generated
vendored
@@ -1,47 +0,0 @@
|
||||
// +build go1.11
|
||||
|
||||
package middleware
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"net/http/httputil"
|
||||
"strings"
|
||||
|
||||
"github.com/labstack/echo/v4"
|
||||
)
|
||||
|
||||
// StatusCodeContextCanceled is a custom HTTP status code for situations
|
||||
// where a client unexpectedly closed the connection to the server.
|
||||
// As there is no standard error code for "client closed connection", but
|
||||
// various well-known HTTP clients and server implement this HTTP code we use
|
||||
// 499 too instead of the more problematic 5xx, which does not allow to detect this situation
|
||||
const StatusCodeContextCanceled = 499
|
||||
|
||||
func proxyHTTP(tgt *ProxyTarget, c echo.Context, config ProxyConfig) http.Handler {
|
||||
proxy := httputil.NewSingleHostReverseProxy(tgt.URL)
|
||||
proxy.ErrorHandler = func(resp http.ResponseWriter, req *http.Request, err error) {
|
||||
desc := tgt.URL.String()
|
||||
if tgt.Name != "" {
|
||||
desc = fmt.Sprintf("%s(%s)", tgt.Name, tgt.URL.String())
|
||||
}
|
||||
// If the client canceled the request (usually by closing the connection), we can report a
|
||||
// client error (4xx) instead of a server error (5xx) to correctly identify the situation.
|
||||
// The Go standard library (at of late 2020) wraps the exported, standard
|
||||
// context.Canceled error with unexported garbage value requiring a substring check, see
|
||||
// https://github.com/golang/go/blob/6965b01ea248cabb70c3749fd218b36089a21efb/src/net/net.go#L416-L430
|
||||
if err == context.Canceled || strings.Contains(err.Error(), "operation was canceled") {
|
||||
httpError := echo.NewHTTPError(StatusCodeContextCanceled, fmt.Sprintf("client closed connection: %v", err))
|
||||
httpError.Internal = err
|
||||
c.Set("_error", httpError)
|
||||
} else {
|
||||
httpError := echo.NewHTTPError(http.StatusBadGateway, fmt.Sprintf("remote %s unreachable, could not forward: %v", desc, err))
|
||||
httpError.Internal = err
|
||||
c.Set("_error", httpError)
|
||||
}
|
||||
}
|
||||
proxy.Transport = config.Transport
|
||||
proxy.ModifyResponse = config.ModifyResponse
|
||||
return proxy
|
||||
}
|
||||
14
vendor/github.com/labstack/echo/v4/middleware/proxy_1_11_n.go
generated
vendored
@@ -1,14 +0,0 @@
|
||||
// +build !go1.11
|
||||
|
||||
package middleware
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"net/http/httputil"
|
||||
|
||||
"github.com/labstack/echo/v4"
|
||||
)
|
||||
|
||||
func proxyHTTP(t *ProxyTarget, c echo.Context, config ProxyConfig) http.Handler {
|
||||
return httputil.NewSingleHostReverseProxy(t.URL)
|
||||
}
|
||||
45
vendor/github.com/labstack/echo/v4/middleware/redirect.go
generated
vendored
@@ -2,6 +2,7 @@ package middleware
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"github.com/labstack/echo/v4"
|
||||
)
|
||||
@@ -40,11 +41,11 @@ func HTTPSRedirect() echo.MiddlewareFunc {
|
||||
// HTTPSRedirectWithConfig returns an HTTPSRedirect middleware with config.
|
||||
// See `HTTPSRedirect()`.
|
||||
func HTTPSRedirectWithConfig(config RedirectConfig) echo.MiddlewareFunc {
|
||||
return redirect(config, func(scheme, host, uri string) (ok bool, url string) {
|
||||
if ok = scheme != "https"; ok {
|
||||
url = "https://" + host + uri
|
||||
return redirect(config, func(scheme, host, uri string) (bool, string) {
|
||||
if scheme != "https" {
|
||||
return true, "https://" + host + uri
|
||||
}
|
||||
return
|
||||
return false, ""
|
||||
})
|
||||
}
|
||||
|
||||
@@ -59,11 +60,11 @@ func HTTPSWWWRedirect() echo.MiddlewareFunc {
|
||||
// HTTPSWWWRedirectWithConfig returns an HTTPSRedirect middleware with config.
|
||||
// See `HTTPSWWWRedirect()`.
|
||||
func HTTPSWWWRedirectWithConfig(config RedirectConfig) echo.MiddlewareFunc {
|
||||
return redirect(config, func(scheme, host, uri string) (ok bool, url string) {
|
||||
if ok = scheme != "https" && host[:4] != www; ok {
|
||||
url = "https://www." + host + uri
|
||||
return redirect(config, func(scheme, host, uri string) (bool, string) {
|
||||
if scheme != "https" && !strings.HasPrefix(host, www) {
|
||||
return true, "https://www." + host + uri
|
||||
}
|
||||
return
|
||||
return false, ""
|
||||
})
|
||||
}
|
||||
|
||||
@@ -79,13 +80,11 @@ func HTTPSNonWWWRedirect() echo.MiddlewareFunc {
|
||||
// See `HTTPSNonWWWRedirect()`.
|
||||
func HTTPSNonWWWRedirectWithConfig(config RedirectConfig) echo.MiddlewareFunc {
|
||||
return redirect(config, func(scheme, host, uri string) (ok bool, url string) {
|
||||
if ok = scheme != "https"; ok {
|
||||
if host[:4] == www {
|
||||
host = host[4:]
|
||||
}
|
||||
url = "https://" + host + uri
|
||||
if scheme != "https" {
|
||||
host = strings.TrimPrefix(host, www)
|
||||
return true, "https://" + host + uri
|
||||
}
|
||||
return
|
||||
return false, ""
|
||||
})
|
||||
}
|
||||
|
||||
@@ -100,11 +99,11 @@ func WWWRedirect() echo.MiddlewareFunc {
|
||||
// WWWRedirectWithConfig returns an HTTPSRedirect middleware with config.
|
||||
// See `WWWRedirect()`.
|
||||
func WWWRedirectWithConfig(config RedirectConfig) echo.MiddlewareFunc {
|
||||
return redirect(config, func(scheme, host, uri string) (ok bool, url string) {
|
||||
if ok = host[:4] != www; ok {
|
||||
url = scheme + "://www." + host + uri
|
||||
return redirect(config, func(scheme, host, uri string) (bool, string) {
|
||||
if !strings.HasPrefix(host, www) {
|
||||
return true, scheme + "://www." + host + uri
|
||||
}
|
||||
return
|
||||
return false, ""
|
||||
})
|
||||
}
|
||||
|
||||
@@ -119,17 +118,17 @@ func NonWWWRedirect() echo.MiddlewareFunc {
|
||||
// NonWWWRedirectWithConfig returns an HTTPSRedirect middleware with config.
|
||||
// See `NonWWWRedirect()`.
|
||||
func NonWWWRedirectWithConfig(config RedirectConfig) echo.MiddlewareFunc {
|
||||
return redirect(config, func(scheme, host, uri string) (ok bool, url string) {
|
||||
if ok = host[:4] == www; ok {
|
||||
url = scheme + "://" + host[4:] + uri
|
||||
return redirect(config, func(scheme, host, uri string) (bool, string) {
|
||||
if strings.HasPrefix(host, www) {
|
||||
return true, scheme + "://" + host[4:] + uri
|
||||
}
|
||||
return
|
||||
return false, ""
|
||||
})
|
||||
}
|
||||
|
||||
func redirect(config RedirectConfig, cb redirectLogic) echo.MiddlewareFunc {
|
||||
if config.Skipper == nil {
|
||||
config.Skipper = DefaultTrailingSlashConfig.Skipper
|
||||
config.Skipper = DefaultRedirectConfig.Skipper
|
||||
}
|
||||
if config.Code == 0 {
|
||||
config.Code = DefaultRedirectConfig.Code
|
||||
|
||||
6
vendor/github.com/labstack/echo/v4/middleware/rewrite.go
generated
vendored
@@ -72,9 +72,9 @@ func RewriteWithConfig(config RewriteConfig) echo.MiddlewareFunc {
|
||||
return next(c)
|
||||
}
|
||||
|
||||
req := c.Request()
|
||||
// Set rewrite path and raw path
|
||||
rewritePath(config.RegexRules, req)
|
||||
if err := rewriteURL(config.RegexRules, c.Request()); err != nil {
|
||||
return err
|
||||
}
|
||||
return next(c)
|
||||
}
|
||||
}
|
||||
|
||||
80
vendor/github.com/labstack/echo/v4/middleware/static.go
generated
vendored
@@ -42,6 +42,10 @@ type (
|
||||
// the filesystem path is not doubled
|
||||
// Optional. Default value false.
|
||||
IgnoreBase bool `yaml:"ignoreBase"`
|
||||
|
||||
// Filesystem provides access to the static content.
|
||||
// Optional. Defaults to http.Dir(config.Root)
|
||||
Filesystem http.FileSystem `yaml:"-"`
|
||||
}
|
||||
)
|
||||
|
||||
@@ -146,6 +150,10 @@ func StaticWithConfig(config StaticConfig) echo.MiddlewareFunc {
|
||||
if config.Index == "" {
|
||||
config.Index = DefaultStaticConfig.Index
|
||||
}
|
||||
if config.Filesystem == nil {
|
||||
config.Filesystem = http.Dir(config.Root)
|
||||
config.Root = "."
|
||||
}
|
||||
|
||||
// Index template
|
||||
t, err := template.New("index").Parse(html)
|
||||
@@ -178,49 +186,73 @@ func StaticWithConfig(config StaticConfig) echo.MiddlewareFunc {
|
||||
}
|
||||
}
|
||||
|
||||
fi, err := os.Stat(name)
|
||||
file, err := openFile(config.Filesystem, name)
|
||||
if err != nil {
|
||||
if os.IsNotExist(err) {
|
||||
if err = next(c); err != nil {
|
||||
if he, ok := err.(*echo.HTTPError); ok {
|
||||
if config.HTML5 && he.Code == http.StatusNotFound {
|
||||
return c.File(filepath.Join(config.Root, config.Index))
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
if !os.IsNotExist(err) {
|
||||
return err
|
||||
}
|
||||
|
||||
if err = next(c); err == nil {
|
||||
return err
|
||||
}
|
||||
|
||||
he, ok := err.(*echo.HTTPError)
|
||||
if !(ok && config.HTML5 && he.Code == http.StatusNotFound) {
|
||||
return err
|
||||
}
|
||||
|
||||
file, err = openFile(config.Filesystem, filepath.Join(config.Root, config.Index))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if fi.IsDir() {
|
||||
index := filepath.Join(name, config.Index)
|
||||
fi, err = os.Stat(index)
|
||||
defer file.Close()
|
||||
|
||||
info, err := file.Stat()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if info.IsDir() {
|
||||
index, err := openFile(config.Filesystem, filepath.Join(name, config.Index))
|
||||
if err != nil {
|
||||
if config.Browse {
|
||||
return listDir(t, name, c.Response())
|
||||
return listDir(t, name, file, c.Response())
|
||||
}
|
||||
|
||||
if os.IsNotExist(err) {
|
||||
return next(c)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
return c.File(index)
|
||||
defer index.Close()
|
||||
|
||||
info, err = index.Stat()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return serveFile(c, index, info)
|
||||
}
|
||||
|
||||
return c.File(name)
|
||||
return serveFile(c, file, info)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func listDir(t *template.Template, name string, res *echo.Response) (err error) {
|
||||
file, err := os.Open(name)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
files, err := file.Readdir(-1)
|
||||
func openFile(fs http.FileSystem, name string) (http.File, error) {
|
||||
pathWithSlashes := filepath.ToSlash(name)
|
||||
return fs.Open(pathWithSlashes)
|
||||
}
|
||||
|
||||
func serveFile(c echo.Context, file http.File, info os.FileInfo) error {
|
||||
http.ServeContent(c.Response(), c.Request(), info.Name(), info.ModTime(), file)
|
||||
return nil
|
||||
}
|
||||
|
||||
func listDir(t *template.Template, name string, dir http.File, res *echo.Response) (err error) {
|
||||
files, err := dir.Readdir(-1)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
20
vendor/github.com/labstack/echo/v4/middleware/timeout.go
generated
vendored
@@ -1,5 +1,3 @@
|
||||
// +build go1.13
|
||||
|
||||
package middleware
|
||||
|
||||
import (
|
||||
@@ -42,8 +40,8 @@ var (
|
||||
}
|
||||
)
|
||||
|
||||
// Timeout returns a middleware which recovers from panics anywhere in the chain
|
||||
// and handles the control to the centralized HTTPErrorHandler.
|
||||
// Timeout returns a middleware which returns error (503 Service Unavailable error) to client immediately when handler
|
||||
// call runs for longer than its time limit. NB: timeout does not stop handler execution.
|
||||
func Timeout() echo.MiddlewareFunc {
|
||||
return TimeoutWithConfig(DefaultTimeoutConfig)
|
||||
}
|
||||
@@ -94,6 +92,15 @@ func (t echoHandlerFuncWrapper) ServeHTTP(rw http.ResponseWriter, r *http.Reques
|
||||
originalWriter := t.ctx.Response().Writer
|
||||
t.ctx.Response().Writer = rw
|
||||
|
||||
// in case of panic we restore original writer and call panic again
|
||||
// so it could be handled with global middleware Recover()
|
||||
defer func() {
|
||||
if err := recover(); err != nil {
|
||||
t.ctx.Response().Writer = originalWriter
|
||||
panic(err)
|
||||
}
|
||||
}()
|
||||
|
||||
err := t.handler(t.ctx)
|
||||
if ctxErr := r.Context().Err(); ctxErr == context.DeadlineExceeded {
|
||||
if err != nil && t.errHandler != nil {
|
||||
@@ -106,6 +113,11 @@ func (t echoHandlerFuncWrapper) ServeHTTP(rw http.ResponseWriter, r *http.Reques
|
||||
// so on timeout writer stays what http.TimeoutHandler uses and prevents writing headers/body
|
||||
t.ctx.Response().Writer = originalWriter
|
||||
if err != nil {
|
||||
// call global error handler to write error to the client. This is needed or `http.TimeoutHandler` will send status code by itself
|
||||
// and after that our tries to write status code will not work anymore
|
||||
t.ctx.Error(err)
|
||||
// we pass error from handler to middlewares up in handler chain to act on it if needed. But this means that
|
||||
// global error handler is probably be called twice as `t.ctx.Error` already does that.
|
||||
t.errChan <- err
|
||||
}
|
||||
}
|
||||
|
||||
113
vendor/github.com/labstack/echo/v4/router.go
generated
vendored
@@ -23,6 +23,10 @@ type (
|
||||
methodHandler *methodHandler
|
||||
paramChild *node
|
||||
anyChild *node
|
||||
// isLeaf indicates that node does not have child routes
|
||||
isLeaf bool
|
||||
// isHandler indicates that node has at least one handler registered to it
|
||||
isHandler bool
|
||||
}
|
||||
kind uint8
|
||||
children []*node
|
||||
@@ -50,6 +54,20 @@ const (
|
||||
anyLabel = byte('*')
|
||||
)
|
||||
|
||||
func (m *methodHandler) isHandler() bool {
|
||||
return m.connect != nil ||
|
||||
m.delete != nil ||
|
||||
m.get != nil ||
|
||||
m.head != nil ||
|
||||
m.options != nil ||
|
||||
m.patch != nil ||
|
||||
m.post != nil ||
|
||||
m.propfind != nil ||
|
||||
m.put != nil ||
|
||||
m.trace != nil ||
|
||||
m.report != nil
|
||||
}
|
||||
|
||||
// NewRouter returns a new Router instance.
|
||||
func NewRouter(e *Echo) *Router {
|
||||
return &Router{
|
||||
@@ -73,6 +91,11 @@ func (r *Router) Add(method, path string, h HandlerFunc) {
|
||||
pnames := []string{} // Param names
|
||||
ppath := path // Pristine path
|
||||
|
||||
if h == nil && r.echo.Logger != nil {
|
||||
// FIXME: in future we should return error
|
||||
r.echo.Logger.Errorf("Adding route without handler function: %v:%v", method, path)
|
||||
}
|
||||
|
||||
for i, lcpIndex := 0, len(path); i < lcpIndex; i++ {
|
||||
if path[i] == ':' {
|
||||
j := i + 1
|
||||
@@ -86,6 +109,7 @@ func (r *Router) Add(method, path string, h HandlerFunc) {
|
||||
i, lcpIndex = j, len(path)
|
||||
|
||||
if i == lcpIndex {
|
||||
// path node is last fragment of route path. ie. `/users/:id`
|
||||
r.insert(method, path[:i], h, paramKind, ppath, pnames)
|
||||
} else {
|
||||
r.insert(method, path[:i], nil, paramKind, "", nil)
|
||||
@@ -136,6 +160,7 @@ func (r *Router) insert(method, path string, h HandlerFunc, t kind, ppath string
|
||||
currentNode.ppath = ppath
|
||||
currentNode.pnames = pnames
|
||||
}
|
||||
currentNode.isLeaf = currentNode.staticChildren == nil && currentNode.paramChild == nil && currentNode.anyChild == nil
|
||||
} else if lcpLen < prefixLen {
|
||||
// Split node
|
||||
n := newNode(
|
||||
@@ -149,7 +174,6 @@ func (r *Router) insert(method, path string, h HandlerFunc, t kind, ppath string
|
||||
currentNode.paramChild,
|
||||
currentNode.anyChild,
|
||||
)
|
||||
|
||||
// Update parent path for all children to new node
|
||||
for _, child := range currentNode.staticChildren {
|
||||
child.parent = n
|
||||
@@ -171,6 +195,8 @@ func (r *Router) insert(method, path string, h HandlerFunc, t kind, ppath string
|
||||
currentNode.pnames = nil
|
||||
currentNode.paramChild = nil
|
||||
currentNode.anyChild = nil
|
||||
currentNode.isLeaf = false
|
||||
currentNode.isHandler = false
|
||||
|
||||
// Only Static children could reach here
|
||||
currentNode.addStaticChild(n)
|
||||
@@ -188,6 +214,7 @@ func (r *Router) insert(method, path string, h HandlerFunc, t kind, ppath string
|
||||
// Only Static children could reach here
|
||||
currentNode.addStaticChild(n)
|
||||
}
|
||||
currentNode.isLeaf = currentNode.staticChildren == nil && currentNode.paramChild == nil && currentNode.anyChild == nil
|
||||
} else if lcpLen < searchLen {
|
||||
search = search[lcpLen:]
|
||||
c := currentNode.findChildWithLabel(search[0])
|
||||
@@ -207,6 +234,7 @@ func (r *Router) insert(method, path string, h HandlerFunc, t kind, ppath string
|
||||
case anyKind:
|
||||
currentNode.anyChild = n
|
||||
}
|
||||
currentNode.isLeaf = currentNode.staticChildren == nil && currentNode.paramChild == nil && currentNode.anyChild == nil
|
||||
} else {
|
||||
// Node already exists
|
||||
if h != nil {
|
||||
@@ -233,6 +261,8 @@ func newNode(t kind, pre string, p *node, sc children, mh *methodHandler, ppath
|
||||
methodHandler: mh,
|
||||
paramChild: paramChildren,
|
||||
anyChild: anyChildren,
|
||||
isLeaf: sc == nil && paramChildren == nil && anyChildren == nil,
|
||||
isHandler: mh.isHandler(),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -289,6 +319,12 @@ func (n *node) addHandler(method string, h HandlerFunc) {
|
||||
case REPORT:
|
||||
n.methodHandler.report = h
|
||||
}
|
||||
|
||||
if h != nil {
|
||||
n.isHandler = true
|
||||
} else {
|
||||
n.isHandler = n.methodHandler.isHandler()
|
||||
}
|
||||
}
|
||||
|
||||
func (n *node) findHandler(method string) HandlerFunc {
|
||||
@@ -343,6 +379,8 @@ func (r *Router) Find(method, path string, c Context) {
|
||||
currentNode := r.tree // Current node as root
|
||||
|
||||
var (
|
||||
previousBestMatchNode *node
|
||||
matchedHandler HandlerFunc
|
||||
// search stores the remaining path to check for match. By each iteration we move from start of path to end of the path
|
||||
// and search value gets shorter and shorter.
|
||||
search = path
|
||||
@@ -362,10 +400,11 @@ func (r *Router) Find(method, path string, c Context) {
|
||||
valid = currentNode != nil
|
||||
|
||||
// Next node type by priority
|
||||
// NOTE: With the current implementation we never backtrack from an `any` route, so `previous.kind` is
|
||||
// always `static` or `any`
|
||||
// If this is changed then for any route next kind would be `static` and this statement should be changed
|
||||
nextNodeKind = previous.kind + 1
|
||||
if previous.kind == anyKind {
|
||||
nextNodeKind = staticKind
|
||||
} else {
|
||||
nextNodeKind = previous.kind + 1
|
||||
}
|
||||
|
||||
if fromKind == staticKind {
|
||||
// when backtracking is done from static kind block we did not change search so nothing to restore
|
||||
@@ -380,6 +419,7 @@ func (r *Router) Find(method, path string, c Context) {
|
||||
// for param/any node.prefix value is always `:` so we can not deduce searchIndex from that and must use pValue
|
||||
// for that index as it would also contain part of path we cut off before moving into node we are backtracking from
|
||||
searchIndex -= len(paramValues[paramIndex])
|
||||
paramValues[paramIndex] = ""
|
||||
}
|
||||
search = path[searchIndex:]
|
||||
return
|
||||
@@ -421,7 +461,7 @@ func (r *Router) Find(method, path string, c Context) {
|
||||
// goto Any
|
||||
} else {
|
||||
// Not found (this should never be possible for static node we are looking currently)
|
||||
return
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
@@ -429,9 +469,17 @@ func (r *Router) Find(method, path string, c Context) {
|
||||
search = search[lcpLen:]
|
||||
searchIndex = searchIndex + lcpLen
|
||||
|
||||
// Finish routing if no remaining search and we are on an leaf node
|
||||
if search == "" && currentNode.ppath != "" {
|
||||
break
|
||||
// Finish routing if no remaining search and we are on a node with handler and matching method type
|
||||
if search == "" && currentNode.isHandler {
|
||||
// check if current node has handler registered for http method we are looking for. we store currentNode as
|
||||
// best matching in case we do no find no more routes matching this path+method
|
||||
if previousBestMatchNode == nil {
|
||||
previousBestMatchNode = currentNode
|
||||
}
|
||||
if h := currentNode.findHandler(method); h != nil {
|
||||
matchedHandler = h
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// Static node
|
||||
@@ -446,10 +494,16 @@ func (r *Router) Find(method, path string, c Context) {
|
||||
// Param node
|
||||
if child := currentNode.paramChild; search != "" && child != nil {
|
||||
currentNode = child
|
||||
// FIXME: when param node does not have any children then param node should act similarly to any node - consider all remaining search as match
|
||||
i, l := 0, len(search)
|
||||
for ; i < l && search[i] != '/'; i++ {
|
||||
i := 0
|
||||
l := len(search)
|
||||
if currentNode.isLeaf {
|
||||
// when param node does not have any children then param node should act similarly to any node - consider all remaining search as match
|
||||
i = l
|
||||
} else {
|
||||
for ; i < l && search[i] != '/'; i++ {
|
||||
}
|
||||
}
|
||||
|
||||
paramValues[paramIndex] = search[:i]
|
||||
paramIndex++
|
||||
search = search[i:]
|
||||
@@ -463,29 +517,50 @@ func (r *Router) Find(method, path string, c Context) {
|
||||
// If any node is found, use remaining path for paramValues
|
||||
currentNode = child
|
||||
paramValues[len(currentNode.pnames)-1] = search
|
||||
break
|
||||
// update indexes/search in case we need to backtrack when no handler match is found
|
||||
paramIndex++
|
||||
searchIndex += +len(search)
|
||||
search = ""
|
||||
|
||||
// check if current node has handler registered for http method we are looking for. we store currentNode as
|
||||
// best matching in case we do no find no more routes matching this path+method
|
||||
if previousBestMatchNode == nil {
|
||||
previousBestMatchNode = currentNode
|
||||
}
|
||||
if h := currentNode.findHandler(method); h != nil {
|
||||
matchedHandler = h
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// Let's backtrack to the first possible alternative node of the decision path
|
||||
nk, ok := backtrackToNextNodeKind(anyKind)
|
||||
if !ok {
|
||||
return // No other possibilities on the decision path
|
||||
break // No other possibilities on the decision path
|
||||
} else if nk == paramKind {
|
||||
goto Param
|
||||
} else if nk == anyKind {
|
||||
goto Any
|
||||
} else {
|
||||
// Not found
|
||||
return
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
ctx.handler = currentNode.findHandler(method)
|
||||
if currentNode == nil && previousBestMatchNode == nil {
|
||||
return // nothing matched at all
|
||||
}
|
||||
|
||||
if matchedHandler != nil {
|
||||
ctx.handler = matchedHandler
|
||||
} else {
|
||||
// use previous match as basis. although we have no matching handler we have path match.
|
||||
// so we can send http.StatusMethodNotAllowed (405) instead of http.StatusNotFound (404)
|
||||
currentNode = previousBestMatchNode
|
||||
ctx.handler = currentNode.checkMethodNotAllowed()
|
||||
}
|
||||
ctx.path = currentNode.ppath
|
||||
ctx.pnames = currentNode.pnames
|
||||
|
||||
if ctx.handler == nil {
|
||||
ctx.handler = currentNode.checkMethodNotAllowed()
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
5
vendor/github.com/slack-go/slack/README.md
generated
vendored
@@ -1,5 +1,6 @@
|
||||
Slack API in Go [](https://godoc.org/github.com/slack-go/slack) [](https://travis-ci.org/slack-go/slack)
|
||||
Slack API in Go [](https://pkg.go.dev/github.com/slack-go/slack)
|
||||
===============
|
||||
|
||||
This is the original Slack library for Go created by Norberto Lopes, transferred to a Github organization.
|
||||
|
||||
[](https://gitter.im/go-slack/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||
@@ -14,7 +15,7 @@ a fully managed way.
|
||||
There is currently no major version released.
|
||||
Therefore, minor version releases may include backward incompatible changes.
|
||||
|
||||
See [CHANGELOG.md](https://github.com/slack-go/slack/blob/master/CHANGELOG.md) for more information about the changes.
|
||||
See [CHANGELOG.md](https://github.com/slack-go/slack/blob/master/CHANGELOG.md) or [Releases](https://github.com/slack-go/slack/releases) for more information about the changes.
|
||||
|
||||
## Installing
|
||||
|
||||
|
||||
3
vendor/github.com/slack-go/slack/apps.go
generated
vendored
@@ -45,14 +45,13 @@ func (api *Client) ListEventAuthorizationsContext(ctx context.Context, eventCont
|
||||
|
||||
func (api *Client) UninstallApp(clientID, clientSecret string) error {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"client_id": {clientID},
|
||||
"client_secret": {clientSecret},
|
||||
}
|
||||
|
||||
response := SlackResponse{}
|
||||
|
||||
err := api.getMethod(context.Background(), "apps.uninstall", values, &response)
|
||||
err := api.getMethod(context.Background(), "apps.uninstall", api.token, values, &response)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
4
vendor/github.com/slack-go/slack/attachments.go
generated
vendored
@@ -17,7 +17,7 @@ type AttachmentAction struct {
|
||||
Name string `json:"name"` // Required.
|
||||
Text string `json:"text"` // Required.
|
||||
Style string `json:"style,omitempty"` // Optional. Allowed values: "default", "primary", "danger".
|
||||
Type actionType `json:"type"` // Required. Must be set to "button" or "select".
|
||||
Type ActionType `json:"type"` // Required. Must be set to "button" or "select".
|
||||
Value string `json:"value,omitempty"` // Optional.
|
||||
DataSource string `json:"data_source,omitempty"` // Optional.
|
||||
MinQueryLength int `json:"min_query_length,omitempty"` // Optional. Default value is 1.
|
||||
@@ -29,7 +29,7 @@ type AttachmentAction struct {
|
||||
}
|
||||
|
||||
// actionType returns the type of the action
|
||||
func (a AttachmentAction) actionType() actionType {
|
||||
func (a AttachmentAction) actionType() ActionType {
|
||||
return a.Type
|
||||
}
|
||||
|
||||
|
||||
4
vendor/github.com/slack-go/slack/block.go
generated
vendored
@@ -35,7 +35,7 @@ type Blocks struct {
|
||||
type BlockAction struct {
|
||||
ActionID string `json:"action_id"`
|
||||
BlockID string `json:"block_id"`
|
||||
Type actionType `json:"type"`
|
||||
Type ActionType `json:"type"`
|
||||
Text TextBlockObject `json:"text"`
|
||||
Value string `json:"value"`
|
||||
ActionTs string `json:"action_ts"`
|
||||
@@ -58,7 +58,7 @@ type BlockAction struct {
|
||||
}
|
||||
|
||||
// actionType returns the type of the action
|
||||
func (b BlockAction) actionType() actionType {
|
||||
func (b BlockAction) actionType() ActionType {
|
||||
return b.Type
|
||||
}
|
||||
|
||||
|
||||
2
vendor/github.com/slack-go/slack/block_conv.go
generated
vendored
@@ -181,6 +181,8 @@ func (b *BlockElements) UnmarshalJSON(data []byte) error {
|
||||
blockElement = &OverflowBlockElement{}
|
||||
case "datepicker":
|
||||
blockElement = &DatePickerBlockElement{}
|
||||
case "timepicker":
|
||||
blockElement = &TimePickerBlockElement{}
|
||||
case "plain_text_input":
|
||||
blockElement = &PlainTextInputBlockElement{}
|
||||
case "checkboxes":
|
||||
|
||||
678
vendor/github.com/slack-go/slack/channels.go
generated
vendored
@@ -3,8 +3,6 @@ package slack
|
||||
import (
|
||||
"context"
|
||||
"net/url"
|
||||
"strconv"
|
||||
"time"
|
||||
)
|
||||
|
||||
type channelResponseFull struct {
|
||||
@@ -19,12 +17,6 @@ type channelResponseFull struct {
|
||||
}
|
||||
|
||||
// Channel contains information about the channel
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
type Channel struct {
|
||||
GroupConversation
|
||||
IsChannel bool `json:"is_channel"`
|
||||
@@ -42,673 +34,3 @@ func (api *Client) channelRequest(ctx context.Context, path string, values url.V
|
||||
|
||||
return response, response.Err()
|
||||
}
|
||||
|
||||
// GetChannelsOption option provided when getting channels.
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
type GetChannelsOption func(*ChannelPagination) error
|
||||
|
||||
// GetChannelsOptionExcludeMembers excludes the members collection from each channel.
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func GetChannelsOptionExcludeMembers() GetChannelsOption {
|
||||
return func(p *ChannelPagination) error {
|
||||
p.excludeMembers = true
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// GetChannelsOptionExcludeArchived excludes archived channels from results.
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func GetChannelsOptionExcludeArchived() GetChannelsOption {
|
||||
return func(p *ChannelPagination) error {
|
||||
p.excludeArchived = true
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// ArchiveChannel archives the given channel
|
||||
// see https://api.slack.com/methods/channels.archive
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) ArchiveChannel(channelID string) error {
|
||||
return api.ArchiveChannelContext(context.Background(), channelID)
|
||||
}
|
||||
|
||||
// ArchiveChannelContext archives the given channel with a custom context
|
||||
// see https://api.slack.com/methods/channels.archive
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) ArchiveChannelContext(ctx context.Context, channelID string) (err error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"channel": {channelID},
|
||||
}
|
||||
|
||||
_, err = api.channelRequest(ctx, "channels.archive", values)
|
||||
return err
|
||||
}
|
||||
|
||||
// UnarchiveChannel unarchives the given channel
|
||||
// see https://api.slack.com/methods/channels.unarchive
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) UnarchiveChannel(channelID string) error {
|
||||
return api.UnarchiveChannelContext(context.Background(), channelID)
|
||||
}
|
||||
|
||||
// UnarchiveChannelContext unarchives the given channel with a custom context
|
||||
// see https://api.slack.com/methods/channels.unarchive
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) UnarchiveChannelContext(ctx context.Context, channelID string) (err error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"channel": {channelID},
|
||||
}
|
||||
|
||||
_, err = api.channelRequest(ctx, "channels.unarchive", values)
|
||||
return err
|
||||
}
|
||||
|
||||
// CreateChannel creates a channel with the given name and returns a *Channel
|
||||
// see https://api.slack.com/methods/channels.create
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) CreateChannel(channelName string) (*Channel, error) {
|
||||
return api.CreateChannelContext(context.Background(), channelName)
|
||||
}
|
||||
|
||||
// CreateChannelContext creates a channel with the given name and returns a *Channel with a custom context
|
||||
// see https://api.slack.com/methods/channels.create
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) CreateChannelContext(ctx context.Context, channelName string) (*Channel, error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"name": {channelName},
|
||||
}
|
||||
|
||||
response, err := api.channelRequest(ctx, "channels.create", values)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &response.Channel, nil
|
||||
}
|
||||
|
||||
// GetChannelHistory retrieves the channel history
|
||||
// see https://api.slack.com/methods/channels.history
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) GetChannelHistory(channelID string, params HistoryParameters) (*History, error) {
|
||||
return api.GetChannelHistoryContext(context.Background(), channelID, params)
|
||||
}
|
||||
|
||||
// GetChannelHistoryContext retrieves the channel history with a custom context
|
||||
// see https://api.slack.com/methods/channels.history
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) GetChannelHistoryContext(ctx context.Context, channelID string, params HistoryParameters) (*History, error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"channel": {channelID},
|
||||
}
|
||||
if params.Latest != DEFAULT_HISTORY_LATEST {
|
||||
values.Add("latest", params.Latest)
|
||||
}
|
||||
if params.Oldest != DEFAULT_HISTORY_OLDEST {
|
||||
values.Add("oldest", params.Oldest)
|
||||
}
|
||||
if params.Count != DEFAULT_HISTORY_COUNT {
|
||||
values.Add("count", strconv.Itoa(params.Count))
|
||||
}
|
||||
if params.Inclusive != DEFAULT_HISTORY_INCLUSIVE {
|
||||
if params.Inclusive {
|
||||
values.Add("inclusive", "1")
|
||||
} else {
|
||||
values.Add("inclusive", "0")
|
||||
}
|
||||
}
|
||||
|
||||
if params.Unreads != DEFAULT_HISTORY_UNREADS {
|
||||
if params.Unreads {
|
||||
values.Add("unreads", "1")
|
||||
} else {
|
||||
values.Add("unreads", "0")
|
||||
}
|
||||
}
|
||||
|
||||
response, err := api.channelRequest(ctx, "channels.history", values)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &response.History, nil
|
||||
}
|
||||
|
||||
// GetChannelInfo retrieves the given channel
|
||||
// see https://api.slack.com/methods/channels.info
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) GetChannelInfo(channelID string) (*Channel, error) {
|
||||
return api.GetChannelInfoContext(context.Background(), channelID)
|
||||
}
|
||||
|
||||
// GetChannelInfoContext retrieves the given channel with a custom context
|
||||
// see https://api.slack.com/methods/channels.info
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) GetChannelInfoContext(ctx context.Context, channelID string) (*Channel, error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"channel": {channelID},
|
||||
"include_locale": {strconv.FormatBool(true)},
|
||||
}
|
||||
|
||||
response, err := api.channelRequest(ctx, "channels.info", values)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &response.Channel, nil
|
||||
}
|
||||
|
||||
// InviteUserToChannel invites a user to a given channel and returns a *Channel
|
||||
// see https://api.slack.com/methods/channels.invite
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) InviteUserToChannel(channelID, user string) (*Channel, error) {
|
||||
return api.InviteUserToChannelContext(context.Background(), channelID, user)
|
||||
}
|
||||
|
||||
// InviteUserToChannelContext invites a user to a given channel and returns a *Channel with a custom context
|
||||
// see https://api.slack.com/methods/channels.invite
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) InviteUserToChannelContext(ctx context.Context, channelID, user string) (*Channel, error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"channel": {channelID},
|
||||
"user": {user},
|
||||
}
|
||||
|
||||
response, err := api.channelRequest(ctx, "channels.invite", values)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &response.Channel, nil
|
||||
}
|
||||
|
||||
// JoinChannel joins the currently authenticated user to a channel
|
||||
// see https://api.slack.com/methods/channels.join
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) JoinChannel(channelName string) (*Channel, error) {
|
||||
return api.JoinChannelContext(context.Background(), channelName)
|
||||
}
|
||||
|
||||
// JoinChannelContext joins the currently authenticated user to a channel with a custom context
|
||||
// see https://api.slack.com/methods/channels.join
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) JoinChannelContext(ctx context.Context, channelName string) (*Channel, error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"name": {channelName},
|
||||
}
|
||||
|
||||
response, err := api.channelRequest(ctx, "channels.join", values)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &response.Channel, nil
|
||||
}
|
||||
|
||||
// LeaveChannel makes the authenticated user leave the given channel
|
||||
// see https://api.slack.com/methods/channels.leave
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) LeaveChannel(channelID string) (bool, error) {
|
||||
return api.LeaveChannelContext(context.Background(), channelID)
|
||||
}
|
||||
|
||||
// LeaveChannelContext makes the authenticated user leave the given channel with a custom context
|
||||
// see https://api.slack.com/methods/channels.leave
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) LeaveChannelContext(ctx context.Context, channelID string) (bool, error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"channel": {channelID},
|
||||
}
|
||||
|
||||
response, err := api.channelRequest(ctx, "channels.leave", values)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
return response.NotInChannel, nil
|
||||
}
|
||||
|
||||
// KickUserFromChannel kicks a user from a given channel
|
||||
// see https://api.slack.com/methods/channels.kick
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) KickUserFromChannel(channelID, user string) error {
|
||||
return api.KickUserFromChannelContext(context.Background(), channelID, user)
|
||||
}
|
||||
|
||||
// KickUserFromChannelContext kicks a user from a given channel with a custom context
|
||||
// see https://api.slack.com/methods/channels.kick
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) KickUserFromChannelContext(ctx context.Context, channelID, user string) (err error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"channel": {channelID},
|
||||
"user": {user},
|
||||
}
|
||||
|
||||
_, err = api.channelRequest(ctx, "channels.kick", values)
|
||||
return err
|
||||
}
|
||||
|
||||
func newChannelPagination(c *Client, options ...GetChannelsOption) (cp ChannelPagination) {
|
||||
cp = ChannelPagination{
|
||||
c: c,
|
||||
limit: 200, // per slack api documentation.
|
||||
}
|
||||
|
||||
for _, opt := range options {
|
||||
opt(&cp)
|
||||
}
|
||||
|
||||
return cp
|
||||
}
|
||||
|
||||
// ChannelPagination allows for paginating over the channels
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
type ChannelPagination struct {
|
||||
Channels []Channel
|
||||
limit int
|
||||
excludeArchived bool
|
||||
excludeMembers bool
|
||||
previousResp *ResponseMetadata
|
||||
c *Client
|
||||
}
|
||||
|
||||
// Done checks if the pagination has completed
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (ChannelPagination) Done(err error) bool {
|
||||
return err == errPaginationComplete
|
||||
}
|
||||
|
||||
// Failure checks if pagination failed.
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (t ChannelPagination) Failure(err error) error {
|
||||
if t.Done(err) {
|
||||
return nil
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (t ChannelPagination) Next(ctx context.Context) (_ ChannelPagination, err error) {
|
||||
var (
|
||||
resp *channelResponseFull
|
||||
)
|
||||
|
||||
if t.c == nil || (t.previousResp != nil && t.previousResp.Cursor == "") {
|
||||
return t, errPaginationComplete
|
||||
}
|
||||
|
||||
t.previousResp = t.previousResp.initialize()
|
||||
|
||||
values := url.Values{
|
||||
"limit": {strconv.Itoa(t.limit)},
|
||||
"exclude_archived": {strconv.FormatBool(t.excludeArchived)},
|
||||
"exclude_members": {strconv.FormatBool(t.excludeMembers)},
|
||||
"token": {t.c.token},
|
||||
"cursor": {t.previousResp.Cursor},
|
||||
}
|
||||
|
||||
if resp, err = t.c.channelRequest(ctx, "channels.list", values); err != nil {
|
||||
return t, err
|
||||
}
|
||||
|
||||
t.c.Debugf("GetChannelsContext: got %d channels; metadata %v", len(resp.Channels), resp.Metadata)
|
||||
t.Channels = resp.Channels
|
||||
t.previousResp = &resp.Metadata
|
||||
|
||||
return t, nil
|
||||
}
|
||||
|
||||
// GetChannelsPaginated fetches channels in a paginated fashion, see GetChannelsContext for usage.
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) GetChannelsPaginated(options ...GetChannelsOption) ChannelPagination {
|
||||
return newChannelPagination(api, options...)
|
||||
}
|
||||
|
||||
// GetChannels retrieves all the channels
|
||||
// see https://api.slack.com/methods/channels.list
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) GetChannels(excludeArchived bool, options ...GetChannelsOption) ([]Channel, error) {
|
||||
return api.GetChannelsContext(context.Background(), excludeArchived, options...)
|
||||
}
|
||||
|
||||
// GetChannelsContext retrieves all the channels with a custom context
|
||||
// see https://api.slack.com/methods/channels.list
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) GetChannelsContext(ctx context.Context, excludeArchived bool, options ...GetChannelsOption) (results []Channel, err error) {
|
||||
if excludeArchived {
|
||||
options = append(options, GetChannelsOptionExcludeArchived())
|
||||
}
|
||||
|
||||
p := api.GetChannelsPaginated(options...)
|
||||
for err == nil {
|
||||
p, err = p.Next(ctx)
|
||||
if err == nil {
|
||||
results = append(results, p.Channels...)
|
||||
} else if rateLimitedError, ok := err.(*RateLimitedError); ok {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
err = ctx.Err()
|
||||
case <-time.After(rateLimitedError.RetryAfter):
|
||||
err = nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return results, p.Failure(err)
|
||||
}
|
||||
|
||||
// SetChannelReadMark sets the read mark of a given channel to a specific point
|
||||
// Clients should try to avoid making this call too often. When needing to mark a read position, a client should set a
|
||||
// timer before making the call. In this way, any further updates needed during the timeout will not generate extra calls
|
||||
// (just one per channel). This is useful for when reading scroll-back history, or following a busy live channel. A
|
||||
// timeout of 5 seconds is a good starting point. Be sure to flush these calls on shutdown/logout.
|
||||
// see https://api.slack.com/methods/channels.mark
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) SetChannelReadMark(channelID, ts string) error {
|
||||
return api.SetChannelReadMarkContext(context.Background(), channelID, ts)
|
||||
}
|
||||
|
||||
// SetChannelReadMarkContext sets the read mark of a given channel to a specific point with a custom context
|
||||
// For more details see SetChannelReadMark documentation
|
||||
// see https://api.slack.com/methods/channels.mark
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) SetChannelReadMarkContext(ctx context.Context, channelID, ts string) (err error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"channel": {channelID},
|
||||
"ts": {ts},
|
||||
}
|
||||
|
||||
_, err = api.channelRequest(ctx, "channels.mark", values)
|
||||
return err
|
||||
}
|
||||
|
||||
// RenameChannel renames a given channel
|
||||
// see https://api.slack.com/methods/channels.rename
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) RenameChannel(channelID, name string) (*Channel, error) {
|
||||
return api.RenameChannelContext(context.Background(), channelID, name)
|
||||
}
|
||||
|
||||
// RenameChannelContext renames a given channel with a custom context
|
||||
// see https://api.slack.com/methods/channels.rename
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) RenameChannelContext(ctx context.Context, channelID, name string) (*Channel, error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"channel": {channelID},
|
||||
"name": {name},
|
||||
}
|
||||
|
||||
// XXX: the created entry in this call returns a string instead of a number
|
||||
// so I may have to do some workaround to solve it.
|
||||
response, err := api.channelRequest(ctx, "channels.rename", values)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &response.Channel, nil
|
||||
}
|
||||
|
||||
// SetChannelPurpose sets the channel purpose and returns the purpose that was successfully set
|
||||
// see https://api.slack.com/methods/channels.setPurpose
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) SetChannelPurpose(channelID, purpose string) (string, error) {
|
||||
return api.SetChannelPurposeContext(context.Background(), channelID, purpose)
|
||||
}
|
||||
|
||||
// SetChannelPurposeContext sets the channel purpose and returns the purpose that was successfully set with a custom context
|
||||
// see https://api.slack.com/methods/channels.setPurpose
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) SetChannelPurposeContext(ctx context.Context, channelID, purpose string) (string, error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"channel": {channelID},
|
||||
"purpose": {purpose},
|
||||
}
|
||||
|
||||
response, err := api.channelRequest(ctx, "channels.setPurpose", values)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return response.Purpose, nil
|
||||
}
|
||||
|
||||
// SetChannelTopic sets the channel topic and returns the topic that was successfully set
|
||||
// see https://api.slack.com/methods/channels.setTopic
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) SetChannelTopic(channelID, topic string) (string, error) {
|
||||
return api.SetChannelTopicContext(context.Background(), channelID, topic)
|
||||
}
|
||||
|
||||
// SetChannelTopicContext sets the channel topic and returns the topic that was successfully set with a custom context
|
||||
// see https://api.slack.com/methods/channels.setTopic
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) SetChannelTopicContext(ctx context.Context, channelID, topic string) (string, error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"channel": {channelID},
|
||||
"topic": {topic},
|
||||
}
|
||||
|
||||
response, err := api.channelRequest(ctx, "channels.setTopic", values)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return response.Topic, nil
|
||||
}
|
||||
|
||||
// GetChannelReplies gets an entire thread (a message plus all the messages in reply to it).
|
||||
// see https://api.slack.com/methods/channels.replies
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) GetChannelReplies(channelID, thread_ts string) ([]Message, error) {
|
||||
return api.GetChannelRepliesContext(context.Background(), channelID, thread_ts)
|
||||
}
|
||||
|
||||
// GetChannelRepliesContext gets an entire thread (a message plus all the messages in reply to it) with a custom context
|
||||
// see https://api.slack.com/methods/channels.replies
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) GetChannelRepliesContext(ctx context.Context, channelID, thread_ts string) ([]Message, error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"channel": {channelID},
|
||||
"thread_ts": {thread_ts},
|
||||
}
|
||||
response, err := api.channelRequest(ctx, "channels.replies", values)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return response.History.Messages, nil
|
||||
}
|
||||
|
||||
3
vendor/github.com/slack-go/slack/chat.go
generated
vendored
@@ -744,7 +744,6 @@ func (api *Client) GetPermalink(params *PermalinkParameters) (string, error) {
|
||||
// GetPermalinkContext returns the permalink for a message using a custom context.
|
||||
func (api *Client) GetPermalinkContext(ctx context.Context, params *PermalinkParameters) (string, error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"channel": {params.Channel},
|
||||
"message_ts": {params.Ts},
|
||||
}
|
||||
@@ -754,7 +753,7 @@ func (api *Client) GetPermalinkContext(ctx context.Context, params *PermalinkPar
|
||||
Permalink string `json:"permalink"`
|
||||
SlackResponse
|
||||
}{}
|
||||
err := api.getMethod(ctx, "chat.getPermalink", values, &response)
|
||||
err := api.getMethod(ctx, "chat.getPermalink", api.token, values, &response)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
6
vendor/github.com/slack-go/slack/conversation.go
generated
vendored
@@ -455,7 +455,7 @@ func (api *Client) GetConversationRepliesContext(ctx context.Context, params *Ge
|
||||
|
||||
type GetConversationsParameters struct {
|
||||
Cursor string
|
||||
ExcludeArchived string
|
||||
ExcludeArchived bool
|
||||
Limit int
|
||||
Types []string
|
||||
}
|
||||
@@ -479,8 +479,8 @@ func (api *Client) GetConversationsContext(ctx context.Context, params *GetConve
|
||||
if params.Types != nil {
|
||||
values.Add("types", strings.Join(params.Types, ","))
|
||||
}
|
||||
if params.ExcludeArchived == "true" {
|
||||
values.Add("exclude_archived", "true")
|
||||
if params.ExcludeArchived {
|
||||
values.Add("exclude_archived", strconv.FormatBool(params.ExcludeArchived))
|
||||
}
|
||||
|
||||
response := struct {
|
||||
|
||||
9
vendor/github.com/slack-go/slack/files.go
generated
vendored
@@ -295,9 +295,7 @@ func (api *Client) UploadFileContext(ctx context.Context, params FileUploadParam
|
||||
return nil, err
|
||||
}
|
||||
response := &fileResponseFull{}
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
}
|
||||
values := url.Values{}
|
||||
if params.Filetype != "" {
|
||||
values.Add("filetype", params.Filetype)
|
||||
}
|
||||
@@ -318,14 +316,15 @@ func (api *Client) UploadFileContext(ctx context.Context, params FileUploadParam
|
||||
}
|
||||
if params.Content != "" {
|
||||
values.Add("content", params.Content)
|
||||
values.Add("token", api.token)
|
||||
err = api.postMethod(ctx, "files.upload", values, response)
|
||||
} else if params.File != "" {
|
||||
err = postLocalWithMultipartResponse(ctx, api.httpclient, api.endpoint+"files.upload", params.File, "file", values, response, api)
|
||||
err = postLocalWithMultipartResponse(ctx, api.httpclient, api.endpoint+"files.upload", params.File, "file", api.token, values, response, api)
|
||||
} else if params.Reader != nil {
|
||||
if params.Filename == "" {
|
||||
return nil, fmt.Errorf("files.upload: FileUploadParameters.Filename is mandatory when using FileUploadParameters.Reader")
|
||||
}
|
||||
err = postWithMultipartResponse(ctx, api.httpclient, api.endpoint+"files.upload", params.Filename, "file", values, params.Reader, response, api)
|
||||
err = postWithMultipartResponse(ctx, api.httpclient, api.endpoint+"files.upload", params.Filename, "file", api.token, values, params.Reader, response, api)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
|
||||
2
vendor/github.com/slack-go/slack/go.mod
generated
vendored
@@ -9,4 +9,4 @@ require (
|
||||
github.com/stretchr/testify v1.2.2
|
||||
)
|
||||
|
||||
go 1.13
|
||||
go 1.16
|
||||
|
||||
567
vendor/github.com/slack-go/slack/groups.go
generated
vendored
@@ -1,574 +1,7 @@
|
||||
package slack
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/url"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
// Group contains all the information for a group
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
type Group struct {
|
||||
GroupConversation
|
||||
IsGroup bool `json:"is_group"`
|
||||
}
|
||||
|
||||
type groupResponseFull struct {
|
||||
Group Group `json:"group"`
|
||||
Groups []Group `json:"groups"`
|
||||
Purpose string `json:"purpose"`
|
||||
Topic string `json:"topic"`
|
||||
NotInGroup bool `json:"not_in_group"`
|
||||
NoOp bool `json:"no_op"`
|
||||
AlreadyClosed bool `json:"already_closed"`
|
||||
AlreadyOpen bool `json:"already_open"`
|
||||
AlreadyInGroup bool `json:"already_in_group"`
|
||||
Channel Channel `json:"channel"`
|
||||
History
|
||||
SlackResponse
|
||||
}
|
||||
|
||||
func (api *Client) groupRequest(ctx context.Context, path string, values url.Values) (*groupResponseFull, error) {
|
||||
response := &groupResponseFull{}
|
||||
err := api.postMethod(ctx, path, values, response)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return response, response.Err()
|
||||
}
|
||||
|
||||
// ArchiveGroup archives a private group
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) ArchiveGroup(group string) error {
|
||||
return api.ArchiveGroupContext(context.Background(), group)
|
||||
}
|
||||
|
||||
// ArchiveGroupContext archives a private group
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) ArchiveGroupContext(ctx context.Context, group string) error {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"channel": {group},
|
||||
}
|
||||
|
||||
_, err := api.groupRequest(ctx, "groups.archive", values)
|
||||
return err
|
||||
}
|
||||
|
||||
// UnarchiveGroup unarchives a private group
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) UnarchiveGroup(group string) error {
|
||||
return api.UnarchiveGroupContext(context.Background(), group)
|
||||
}
|
||||
|
||||
// UnarchiveGroupContext unarchives a private group
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) UnarchiveGroupContext(ctx context.Context, group string) error {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"channel": {group},
|
||||
}
|
||||
|
||||
_, err := api.groupRequest(ctx, "groups.unarchive", values)
|
||||
return err
|
||||
}
|
||||
|
||||
// CreateGroup creates a private group
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) CreateGroup(group string) (*Group, error) {
|
||||
return api.CreateGroupContext(context.Background(), group)
|
||||
}
|
||||
|
||||
// CreateGroupContext creates a private group
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) CreateGroupContext(ctx context.Context, group string) (*Group, error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"name": {group},
|
||||
}
|
||||
|
||||
response, err := api.groupRequest(ctx, "groups.create", values)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &response.Group, nil
|
||||
}
|
||||
|
||||
// CreateChildGroup creates a new private group archiving the old one
|
||||
// This method takes an existing private group and performs the following steps:
|
||||
// 1. Renames the existing group (from "example" to "example-archived").
|
||||
// 2. Archives the existing group.
|
||||
// 3. Creates a new group with the name of the existing group.
|
||||
// 4. Adds all members of the existing group to the new group.
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) CreateChildGroup(group string) (*Group, error) {
|
||||
return api.CreateChildGroupContext(context.Background(), group)
|
||||
}
|
||||
|
||||
// CreateChildGroupContext creates a new private group archiving the old one with a custom context
|
||||
// For more information see CreateChildGroup
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) CreateChildGroupContext(ctx context.Context, group string) (*Group, error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"channel": {group},
|
||||
}
|
||||
|
||||
response, err := api.groupRequest(ctx, "groups.createChild", values)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &response.Group, nil
|
||||
}
|
||||
|
||||
// GetGroupHistory fetches all the history for a private group
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) GetGroupHistory(group string, params HistoryParameters) (*History, error) {
|
||||
return api.GetGroupHistoryContext(context.Background(), group, params)
|
||||
}
|
||||
|
||||
// GetGroupHistoryContext fetches all the history for a private group with a custom context
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) GetGroupHistoryContext(ctx context.Context, group string, params HistoryParameters) (*History, error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"channel": {group},
|
||||
}
|
||||
if params.Latest != DEFAULT_HISTORY_LATEST {
|
||||
values.Add("latest", params.Latest)
|
||||
}
|
||||
if params.Oldest != DEFAULT_HISTORY_OLDEST {
|
||||
values.Add("oldest", params.Oldest)
|
||||
}
|
||||
if params.Count != DEFAULT_HISTORY_COUNT {
|
||||
values.Add("count", strconv.Itoa(params.Count))
|
||||
}
|
||||
if params.Inclusive != DEFAULT_HISTORY_INCLUSIVE {
|
||||
if params.Inclusive {
|
||||
values.Add("inclusive", "1")
|
||||
} else {
|
||||
values.Add("inclusive", "0")
|
||||
}
|
||||
}
|
||||
if params.Unreads != DEFAULT_HISTORY_UNREADS {
|
||||
if params.Unreads {
|
||||
values.Add("unreads", "1")
|
||||
} else {
|
||||
values.Add("unreads", "0")
|
||||
}
|
||||
}
|
||||
|
||||
response, err := api.groupRequest(ctx, "groups.history", values)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &response.History, nil
|
||||
}
|
||||
|
||||
// InviteUserToGroup invites a specific user to a private group
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) InviteUserToGroup(group, user string) (*Group, bool, error) {
|
||||
return api.InviteUserToGroupContext(context.Background(), group, user)
|
||||
}
|
||||
|
||||
// InviteUserToGroupContext invites a specific user to a private group with a custom context
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) InviteUserToGroupContext(ctx context.Context, group, user string) (*Group, bool, error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"channel": {group},
|
||||
"user": {user},
|
||||
}
|
||||
|
||||
response, err := api.groupRequest(ctx, "groups.invite", values)
|
||||
if err != nil {
|
||||
return nil, false, err
|
||||
}
|
||||
return &response.Group, response.AlreadyInGroup, nil
|
||||
}
|
||||
|
||||
// LeaveGroup makes authenticated user leave the group
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) LeaveGroup(group string) error {
|
||||
return api.LeaveGroupContext(context.Background(), group)
|
||||
}
|
||||
|
||||
// LeaveGroupContext makes authenticated user leave the group with a custom context
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) LeaveGroupContext(ctx context.Context, group string) (err error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"channel": {group},
|
||||
}
|
||||
|
||||
_, err = api.groupRequest(ctx, "groups.leave", values)
|
||||
return err
|
||||
}
|
||||
|
||||
// KickUserFromGroup kicks a user from a group
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) KickUserFromGroup(group, user string) error {
|
||||
return api.KickUserFromGroupContext(context.Background(), group, user)
|
||||
}
|
||||
|
||||
// KickUserFromGroupContext kicks a user from a group with a custom context
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) KickUserFromGroupContext(ctx context.Context, group, user string) (err error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"channel": {group},
|
||||
"user": {user},
|
||||
}
|
||||
|
||||
_, err = api.groupRequest(ctx, "groups.kick", values)
|
||||
return err
|
||||
}
|
||||
|
||||
// GetGroups retrieves all groups
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) GetGroups(excludeArchived bool) ([]Group, error) {
|
||||
return api.GetGroupsContext(context.Background(), excludeArchived)
|
||||
}
|
||||
|
||||
// GetGroupsContext retrieves all groups with a custom context
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) GetGroupsContext(ctx context.Context, excludeArchived bool) ([]Group, error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
}
|
||||
if excludeArchived {
|
||||
values.Add("exclude_archived", "1")
|
||||
}
|
||||
|
||||
response, err := api.groupRequest(ctx, "groups.list", values)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return response.Groups, nil
|
||||
}
|
||||
|
||||
// GetGroupInfo retrieves the given group
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) GetGroupInfo(group string) (*Group, error) {
|
||||
return api.GetGroupInfoContext(context.Background(), group)
|
||||
}
|
||||
|
||||
// GetGroupInfoContext retrieves the given group with a custom context
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) GetGroupInfoContext(ctx context.Context, group string) (*Group, error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"channel": {group},
|
||||
"include_locale": {strconv.FormatBool(true)},
|
||||
}
|
||||
|
||||
response, err := api.groupRequest(ctx, "groups.info", values)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &response.Group, nil
|
||||
}
|
||||
|
||||
// SetGroupReadMark sets the read mark on a private group
|
||||
// Clients should try to avoid making this call too often. When needing to mark a read position, a client should set a
|
||||
// timer before making the call. In this way, any further updates needed during the timeout will not generate extra
|
||||
// calls (just one per channel). This is useful for when reading scroll-back history, or following a busy live
|
||||
// channel. A timeout of 5 seconds is a good starting point. Be sure to flush these calls on shutdown/logout.
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) SetGroupReadMark(group, ts string) error {
|
||||
return api.SetGroupReadMarkContext(context.Background(), group, ts)
|
||||
}
|
||||
|
||||
// SetGroupReadMarkContext sets the read mark on a private group with a custom context
|
||||
// For more details see SetGroupReadMark
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) SetGroupReadMarkContext(ctx context.Context, group, ts string) (err error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"channel": {group},
|
||||
"ts": {ts},
|
||||
}
|
||||
|
||||
_, err = api.groupRequest(ctx, "groups.mark", values)
|
||||
return err
|
||||
}
|
||||
|
||||
// OpenGroup opens a private group
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) OpenGroup(group string) (bool, bool, error) {
|
||||
return api.OpenGroupContext(context.Background(), group)
|
||||
}
|
||||
|
||||
// OpenGroupContext opens a private group with a custom context
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) OpenGroupContext(ctx context.Context, group string) (bool, bool, error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"channel": {group},
|
||||
}
|
||||
|
||||
response, err := api.groupRequest(ctx, "groups.open", values)
|
||||
if err != nil {
|
||||
return false, false, err
|
||||
}
|
||||
return response.NoOp, response.AlreadyOpen, nil
|
||||
}
|
||||
|
||||
// RenameGroup renames a group
|
||||
// XXX: They return a channel, not a group. What is this crap? :(
|
||||
// Inconsistent api it seems.
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) RenameGroup(group, name string) (*Channel, error) {
|
||||
return api.RenameGroupContext(context.Background(), group, name)
|
||||
}
|
||||
|
||||
// RenameGroupContext renames a group with a custom context
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) RenameGroupContext(ctx context.Context, group, name string) (*Channel, error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"channel": {group},
|
||||
"name": {name},
|
||||
}
|
||||
|
||||
// XXX: the created entry in this call returns a string instead of a number
|
||||
// so I may have to do some workaround to solve it.
|
||||
response, err := api.groupRequest(ctx, "groups.rename", values)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &response.Channel, nil
|
||||
}
|
||||
|
||||
// SetGroupPurpose sets the group purpose
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) SetGroupPurpose(group, purpose string) (string, error) {
|
||||
return api.SetGroupPurposeContext(context.Background(), group, purpose)
|
||||
}
|
||||
|
||||
// SetGroupPurposeContext sets the group purpose with a custom context
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) SetGroupPurposeContext(ctx context.Context, group, purpose string) (string, error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"channel": {group},
|
||||
"purpose": {purpose},
|
||||
}
|
||||
|
||||
response, err := api.groupRequest(ctx, "groups.setPurpose", values)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return response.Purpose, nil
|
||||
}
|
||||
|
||||
// SetGroupTopic sets the group topic
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) SetGroupTopic(group, topic string) (string, error) {
|
||||
return api.SetGroupTopicContext(context.Background(), group, topic)
|
||||
}
|
||||
|
||||
// SetGroupTopicContext sets the group topic with a custom context
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) SetGroupTopicContext(ctx context.Context, group, topic string) (string, error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"channel": {group},
|
||||
"topic": {topic},
|
||||
}
|
||||
|
||||
response, err := api.groupRequest(ctx, "groups.setTopic", values)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return response.Topic, nil
|
||||
}
|
||||
|
||||
// GetGroupReplies gets an entire thread (a message plus all the messages in reply to it).
|
||||
// see https://api.slack.com/methods/groups.replies
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) GetGroupReplies(channelID, thread_ts string) ([]Message, error) {
|
||||
return api.GetGroupRepliesContext(context.Background(), channelID, thread_ts)
|
||||
}
|
||||
|
||||
// GetGroupRepliesContext gets an entire thread (a message plus all the messages in reply to it) with a custom context
|
||||
// see https://api.slack.com/methods/groups.replies
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) GetGroupRepliesContext(ctx context.Context, channelID, thread_ts string) ([]Message, error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"channel": {channelID},
|
||||
"thread_ts": {thread_ts},
|
||||
}
|
||||
response, err := api.groupRequest(ctx, "groups.replies", values)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return response.History.Messages, nil
|
||||
}
|
||||
|
||||
199
vendor/github.com/slack-go/slack/im.go
generated
vendored
@@ -1,11 +1,5 @@
|
||||
package slack
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/url"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
type imChannel struct {
|
||||
ID string `json:"id"`
|
||||
}
|
||||
@@ -21,200 +15,7 @@ type imResponseFull struct {
|
||||
}
|
||||
|
||||
// IM contains information related to the Direct Message channel
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
type IM struct {
|
||||
Conversation
|
||||
IsUserDeleted bool `json:"is_user_deleted"`
|
||||
}
|
||||
|
||||
func (api *Client) imRequest(ctx context.Context, path string, values url.Values) (*imResponseFull, error) {
|
||||
response := &imResponseFull{}
|
||||
err := api.postMethod(ctx, path, values, response)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return response, response.Err()
|
||||
}
|
||||
|
||||
// CloseIMChannel closes the direct message channel
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) CloseIMChannel(channel string) (bool, bool, error) {
|
||||
return api.CloseIMChannelContext(context.Background(), channel)
|
||||
}
|
||||
|
||||
// CloseIMChannelContext closes the direct message channel with a custom context
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) CloseIMChannelContext(ctx context.Context, channel string) (bool, bool, error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"channel": {channel},
|
||||
}
|
||||
|
||||
response, err := api.imRequest(ctx, "im.close", values)
|
||||
if err != nil {
|
||||
return false, false, err
|
||||
}
|
||||
return response.NoOp, response.AlreadyClosed, nil
|
||||
}
|
||||
|
||||
// OpenIMChannel opens a direct message channel to the user provided as argument
|
||||
// Returns some status and the channel ID
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) OpenIMChannel(user string) (bool, bool, string, error) {
|
||||
return api.OpenIMChannelContext(context.Background(), user)
|
||||
}
|
||||
|
||||
// OpenIMChannelContext opens a direct message channel to the user provided as argument with a custom context
|
||||
// Returns some status and the channel ID
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) OpenIMChannelContext(ctx context.Context, user string) (bool, bool, string, error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"user": {user},
|
||||
}
|
||||
|
||||
response, err := api.imRequest(ctx, "im.open", values)
|
||||
if err != nil {
|
||||
return false, false, "", err
|
||||
}
|
||||
return response.NoOp, response.AlreadyOpen, response.Channel.ID, nil
|
||||
}
|
||||
|
||||
// MarkIMChannel sets the read mark of a direct message channel to a specific point
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) MarkIMChannel(channel, ts string) (err error) {
|
||||
return api.MarkIMChannelContext(context.Background(), channel, ts)
|
||||
}
|
||||
|
||||
// MarkIMChannelContext sets the read mark of a direct message channel to a specific point with a custom context
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) MarkIMChannelContext(ctx context.Context, channel, ts string) error {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"channel": {channel},
|
||||
"ts": {ts},
|
||||
}
|
||||
|
||||
_, err := api.imRequest(ctx, "im.mark", values)
|
||||
return err
|
||||
}
|
||||
|
||||
// GetIMHistory retrieves the direct message channel history
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) GetIMHistory(channel string, params HistoryParameters) (*History, error) {
|
||||
return api.GetIMHistoryContext(context.Background(), channel, params)
|
||||
}
|
||||
|
||||
// GetIMHistoryContext retrieves the direct message channel history with a custom context
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) GetIMHistoryContext(ctx context.Context, channel string, params HistoryParameters) (*History, error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
"channel": {channel},
|
||||
}
|
||||
if params.Latest != DEFAULT_HISTORY_LATEST {
|
||||
values.Add("latest", params.Latest)
|
||||
}
|
||||
if params.Oldest != DEFAULT_HISTORY_OLDEST {
|
||||
values.Add("oldest", params.Oldest)
|
||||
}
|
||||
if params.Count != DEFAULT_HISTORY_COUNT {
|
||||
values.Add("count", strconv.Itoa(params.Count))
|
||||
}
|
||||
if params.Inclusive != DEFAULT_HISTORY_INCLUSIVE {
|
||||
if params.Inclusive {
|
||||
values.Add("inclusive", "1")
|
||||
} else {
|
||||
values.Add("inclusive", "0")
|
||||
}
|
||||
}
|
||||
if params.Unreads != DEFAULT_HISTORY_UNREADS {
|
||||
if params.Unreads {
|
||||
values.Add("unreads", "1")
|
||||
} else {
|
||||
values.Add("unreads", "0")
|
||||
}
|
||||
}
|
||||
|
||||
response, err := api.imRequest(ctx, "im.history", values)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &response.History, nil
|
||||
}
|
||||
|
||||
// GetIMChannels returns the list of direct message channels
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) GetIMChannels() ([]IM, error) {
|
||||
return api.GetIMChannelsContext(context.Background())
|
||||
}
|
||||
|
||||
// GetIMChannelsContext returns the list of direct message channels with a custom context
|
||||
//
|
||||
// Deprecated: channels.*, groups.* im.* and mpim.* methods will be deprecated in the next version.
|
||||
// In Slack, these API are no longer available for newly Apps created after June 10th, 2020.
|
||||
// Also, existing applications will not be able to use these APIs after February 24th, 2021.
|
||||
//
|
||||
// See also: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
|
||||
func (api *Client) GetIMChannelsContext(ctx context.Context) ([]IM, error) {
|
||||
values := url.Values{
|
||||
"token": {api.token},
|
||||
}
|
||||
|
||||
response, err := api.imRequest(ctx, "im.list", values)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return response.IMs, nil
|
||||
}
|
||||
|
||||
3
vendor/github.com/slack-go/slack/info.go
generated
vendored
@@ -321,10 +321,9 @@ type UserPrefs struct {
|
||||
}
|
||||
|
||||
func (api *Client) GetUserPrefs() (*UserPrefsCarrier, error) {
|
||||
values := url.Values{"token": {api.token}}
|
||||
response := UserPrefsCarrier{}
|
||||
|
||||
err := api.getMethod(context.Background(), "users.prefs.get", values, &response)
|
||||
err := api.getMethod(context.Background(), "users.prefs.get", api.token, url.Values{}, &response)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
4
vendor/github.com/slack-go/slack/interactions.go
generated
vendored
@@ -9,11 +9,11 @@ import (
|
||||
type InteractionType string
|
||||
|
||||
// ActionType type represents the type of action (attachment, block, etc.)
|
||||
type actionType string
|
||||
type ActionType string
|
||||
|
||||
// action is an interface that should be implemented by all callback action types
|
||||
type action interface {
|
||||
actionType() actionType
|
||||
actionType() ActionType
|
||||
}
|
||||
|
||||
// Types of interactions that can be received.
|
||||
|
||||
11
vendor/github.com/slack-go/slack/misc.go
generated
vendored
@@ -135,7 +135,7 @@ func parseResponseBody(body io.ReadCloser, intf interface{}, d Debug) error {
|
||||
return json.Unmarshal(response, intf)
|
||||
}
|
||||
|
||||
func postLocalWithMultipartResponse(ctx context.Context, client httpClient, method, fpath, fieldname string, values url.Values, intf interface{}, d Debug) error {
|
||||
func postLocalWithMultipartResponse(ctx context.Context, client httpClient, method, fpath, fieldname, token string, values url.Values, intf interface{}, d Debug) error {
|
||||
fullpath, err := filepath.Abs(fpath)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -146,10 +146,10 @@ func postLocalWithMultipartResponse(ctx context.Context, client httpClient, meth
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
return postWithMultipartResponse(ctx, client, method, filepath.Base(fpath), fieldname, values, file, intf, d)
|
||||
return postWithMultipartResponse(ctx, client, method, filepath.Base(fpath), fieldname, token, values, file, intf, d)
|
||||
}
|
||||
|
||||
func postWithMultipartResponse(ctx context.Context, client httpClient, path, name, fieldname string, values url.Values, r io.Reader, intf interface{}, d Debug) error {
|
||||
func postWithMultipartResponse(ctx context.Context, client httpClient, path, name, fieldname, token string, values url.Values, r io.Reader, intf interface{}, d Debug) error {
|
||||
pipeReader, pipeWriter := io.Pipe()
|
||||
wr := multipart.NewWriter(pipeWriter)
|
||||
errc := make(chan error)
|
||||
@@ -175,6 +175,7 @@ func postWithMultipartResponse(ctx context.Context, client httpClient, path, nam
|
||||
return err
|
||||
}
|
||||
req.Header.Add("Content-Type", wr.FormDataContentType())
|
||||
req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token))
|
||||
req = req.WithContext(ctx)
|
||||
resp, err := client.Do(req)
|
||||
|
||||
@@ -236,12 +237,14 @@ func postForm(ctx context.Context, client httpClient, endpoint string, values ur
|
||||
return doPost(ctx, client, req, newJSONParser(intf), d)
|
||||
}
|
||||
|
||||
func getResource(ctx context.Context, client httpClient, endpoint string, values url.Values, intf interface{}, d Debug) error {
|
||||
func getResource(ctx context.Context, client httpClient, endpoint, token string, values url.Values, intf interface{}, d Debug) error {
|
||||
req, err := http.NewRequest("GET", endpoint, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||
req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token))
|
||||
|
||||
req.URL.RawQuery = values.Encode()
|
||||
|
||||
return doPost(ctx, client, req, newJSONParser(intf), d)
|
||||
|
||||
4
vendor/github.com/slack-go/slack/slack.go
generated
vendored
@@ -157,6 +157,6 @@ func (api *Client) postMethod(ctx context.Context, path string, values url.Value
|
||||
}
|
||||
|
||||
// get a slack web method.
|
||||
func (api *Client) getMethod(ctx context.Context, path string, values url.Values, intf interface{}) error {
|
||||
return getResource(ctx, api.httpclient, api.endpoint+path, values, intf, api)
|
||||
func (api *Client) getMethod(ctx context.Context, path string, token string, values url.Values, intf interface{}) error {
|
||||
return getResource(ctx, api.httpclient, api.endpoint+path, token, values, intf, api)
|
||||
}
|
||||
|
||||
23
vendor/github.com/slack-go/slack/users.go
generated
vendored
@@ -482,7 +482,7 @@ func (api *Client) SetUserPhotoContext(ctx context.Context, image string, params
|
||||
values.Add("crop_w", strconv.Itoa(params.CropW))
|
||||
}
|
||||
|
||||
err = postLocalWithMultipartResponse(ctx, api.httpclient, api.endpoint+"users.setPhoto", image, "image", values, response, api)
|
||||
err = postLocalWithMultipartResponse(ctx, api.httpclient, api.endpoint+"users.setPhoto", image, "image", api.token, values, response, api)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -632,9 +632,15 @@ func (api *Client) UnsetUserCustomStatusContext(ctx context.Context) error {
|
||||
return api.SetUserCustomStatusContext(ctx, "", "", 0)
|
||||
}
|
||||
|
||||
// GetUserProfileParameters are the parameters required to get user profile
|
||||
type GetUserProfileParameters struct {
|
||||
UserID string
|
||||
IncludeLabels bool
|
||||
}
|
||||
|
||||
// GetUserProfile retrieves a user's profile information.
|
||||
func (api *Client) GetUserProfile(userID string, includeLabels bool) (*UserProfile, error) {
|
||||
return api.GetUserProfileContext(context.Background(), userID, includeLabels)
|
||||
func (api *Client) GetUserProfile(params *GetUserProfileParameters) (*UserProfile, error) {
|
||||
return api.GetUserProfileContext(context.Background(), params)
|
||||
}
|
||||
|
||||
type getUserProfileResponse struct {
|
||||
@@ -643,13 +649,14 @@ type getUserProfileResponse struct {
|
||||
}
|
||||
|
||||
// GetUserProfileContext retrieves a user's profile information with a context.
|
||||
func (api *Client) GetUserProfileContext(ctx context.Context, userID string, includeLabels bool) (*UserProfile, error) {
|
||||
func (api *Client) GetUserProfileContext(ctx context.Context, params *GetUserProfileParameters) (*UserProfile, error) {
|
||||
values := url.Values{"token": {api.token}}
|
||||
if includeLabels {
|
||||
values.Add("include_labels", "true")
|
||||
|
||||
if params.UserID != "" {
|
||||
values.Add("user", params.UserID)
|
||||
}
|
||||
if userID != "" {
|
||||
values.Add("user", userID)
|
||||
if params.IncludeLabels {
|
||||
values.Add("include_labels", "true")
|
||||
}
|
||||
resp := &getUserProfileResponse{}
|
||||
|
||||
|
||||
10
vendor/github.com/slack-go/slack/views.go
generated
vendored
@@ -38,8 +38,16 @@ type View struct {
|
||||
BotID string `json:"bot_id"`
|
||||
}
|
||||
|
||||
type ViewSubmissionCallbackResponseURL struct {
|
||||
BlockID string `json:"block_id"`
|
||||
ActionID string `json:"action_id"`
|
||||
ChannelID string `json:"channel_id"`
|
||||
ResponseURL string `json:"response_url"`
|
||||
}
|
||||
|
||||
type ViewSubmissionCallback struct {
|
||||
Hash string `json:"hash"`
|
||||
Hash string `json:"hash"`
|
||||
ResponseURLs []ViewSubmissionCallbackResponseURL `json:"response_urls,omitempty"`
|
||||
}
|
||||
|
||||
type ViewClosedCallback struct {
|
||||
|
||||
4
vendor/golang.org/x/crypto/acme/acme.go
generated
vendored
@@ -363,6 +363,10 @@ func AcceptTOS(tosURL string) bool { return true }
|
||||
// Also see Error's Instance field for when a CA requires already registered accounts to agree
|
||||
// to an updated Terms of Service.
|
||||
func (c *Client) Register(ctx context.Context, acct *Account, prompt func(tosURL string) bool) (*Account, error) {
|
||||
if c.Key == nil {
|
||||
return nil, errors.New("acme: client.Key must be set to Register")
|
||||
}
|
||||
|
||||
dir, err := c.Discover(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
||||
8
vendor/golang.org/x/crypto/acme/autocert/autocert.go
generated
vendored
@@ -1133,11 +1133,11 @@ func (s *certState) tlscert() (*tls.Certificate, error) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
// certRequest generates a CSR for the given common name cn and optional SANs.
|
||||
func certRequest(key crypto.Signer, cn string, ext []pkix.Extension, san ...string) ([]byte, error) {
|
||||
// certRequest generates a CSR for the given common name.
|
||||
func certRequest(key crypto.Signer, name string, ext []pkix.Extension) ([]byte, error) {
|
||||
req := &x509.CertificateRequest{
|
||||
Subject: pkix.Name{CommonName: cn},
|
||||
DNSNames: san,
|
||||
Subject: pkix.Name{CommonName: name},
|
||||
DNSNames: []string{name},
|
||||
ExtraExtensions: ext,
|
||||
}
|
||||
return x509.CreateCertificateRequest(rand.Reader, req, key)
|
||||
|
||||
54
vendor/golang.org/x/crypto/acme/jws.go
generated
vendored
@@ -7,6 +7,7 @@ package acme
|
||||
import (
|
||||
"crypto"
|
||||
"crypto/ecdsa"
|
||||
"crypto/hmac"
|
||||
"crypto/rand"
|
||||
"crypto/rsa"
|
||||
"crypto/sha256"
|
||||
@@ -14,6 +15,7 @@ import (
|
||||
"encoding/asn1"
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"math/big"
|
||||
)
|
||||
@@ -31,6 +33,14 @@ const noKeyID = keyID("")
|
||||
// See https://tools.ietf.org/html/rfc8555#section-6.3 for more details.
|
||||
const noPayload = ""
|
||||
|
||||
// jsonWebSignature can be easily serialized into a JWS following
|
||||
// https://tools.ietf.org/html/rfc7515#section-3.2.
|
||||
type jsonWebSignature struct {
|
||||
Protected string `json:"protected"`
|
||||
Payload string `json:"payload"`
|
||||
Sig string `json:"signature"`
|
||||
}
|
||||
|
||||
// jwsEncodeJSON signs claimset using provided key and a nonce.
|
||||
// The result is serialized in JSON format containing either kid or jwk
|
||||
// fields based on the provided keyID value.
|
||||
@@ -71,12 +81,7 @@ func jwsEncodeJSON(claimset interface{}, key crypto.Signer, kid keyID, nonce, ur
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
enc := struct {
|
||||
Protected string `json:"protected"`
|
||||
Payload string `json:"payload"`
|
||||
Sig string `json:"signature"`
|
||||
}{
|
||||
enc := jsonWebSignature{
|
||||
Protected: phead,
|
||||
Payload: payload,
|
||||
Sig: base64.RawURLEncoding.EncodeToString(sig),
|
||||
@@ -84,6 +89,43 @@ func jwsEncodeJSON(claimset interface{}, key crypto.Signer, kid keyID, nonce, ur
|
||||
return json.Marshal(&enc)
|
||||
}
|
||||
|
||||
// jwsWithMAC creates and signs a JWS using the given key and the HS256
|
||||
// algorithm. kid and url are included in the protected header. rawPayload
|
||||
// should not be base64-URL-encoded.
|
||||
func jwsWithMAC(key []byte, kid, url string, rawPayload []byte) (*jsonWebSignature, error) {
|
||||
if len(key) == 0 {
|
||||
return nil, errors.New("acme: cannot sign JWS with an empty MAC key")
|
||||
}
|
||||
header := struct {
|
||||
Algorithm string `json:"alg"`
|
||||
KID string `json:"kid"`
|
||||
URL string `json:"url,omitempty"`
|
||||
}{
|
||||
// Only HMAC-SHA256 is supported.
|
||||
Algorithm: "HS256",
|
||||
KID: kid,
|
||||
URL: url,
|
||||
}
|
||||
rawProtected, err := json.Marshal(header)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
protected := base64.RawURLEncoding.EncodeToString(rawProtected)
|
||||
payload := base64.RawURLEncoding.EncodeToString(rawPayload)
|
||||
|
||||
h := hmac.New(sha256.New, key)
|
||||
if _, err := h.Write([]byte(protected + "." + payload)); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
mac := h.Sum(nil)
|
||||
|
||||
return &jsonWebSignature{
|
||||
Protected: protected,
|
||||
Payload: payload,
|
||||
Sig: base64.RawURLEncoding.EncodeToString(mac),
|
||||
}, nil
|
||||
}
|
||||
|
||||
// jwkEncode encodes public part of an RSA or ECDSA key into a JWK.
|
||||
// The result is also suitable for creating a JWK thumbprint.
|
||||
// https://tools.ietf.org/html/rfc7517
|
||||
|
||||
30
vendor/golang.org/x/crypto/acme/rfc8555.go
generated
vendored
@@ -37,22 +37,32 @@ func (c *Client) DeactivateReg(ctx context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// registerRFC is quivalent to c.Register but for CAs implementing RFC 8555.
|
||||
// registerRFC is equivalent to c.Register but for CAs implementing RFC 8555.
|
||||
// It expects c.Discover to have already been called.
|
||||
// TODO: Implement externalAccountBinding.
|
||||
func (c *Client) registerRFC(ctx context.Context, acct *Account, prompt func(tosURL string) bool) (*Account, error) {
|
||||
c.cacheMu.Lock() // guard c.kid access
|
||||
defer c.cacheMu.Unlock()
|
||||
|
||||
req := struct {
|
||||
TermsAgreed bool `json:"termsOfServiceAgreed,omitempty"`
|
||||
Contact []string `json:"contact,omitempty"`
|
||||
TermsAgreed bool `json:"termsOfServiceAgreed,omitempty"`
|
||||
Contact []string `json:"contact,omitempty"`
|
||||
ExternalAccountBinding *jsonWebSignature `json:"externalAccountBinding,omitempty"`
|
||||
}{
|
||||
Contact: acct.Contact,
|
||||
}
|
||||
if c.dir.Terms != "" {
|
||||
req.TermsAgreed = prompt(c.dir.Terms)
|
||||
}
|
||||
|
||||
// set 'externalAccountBinding' field if requested
|
||||
if acct.ExternalAccountBinding != nil {
|
||||
eabJWS, err := c.encodeExternalAccountBinding(acct.ExternalAccountBinding)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("acme: failed to encode external account binding: %v", err)
|
||||
}
|
||||
req.ExternalAccountBinding = eabJWS
|
||||
}
|
||||
|
||||
res, err := c.post(ctx, c.Key, c.dir.RegURL, req, wantStatus(
|
||||
http.StatusOK, // account with this key already registered
|
||||
http.StatusCreated, // new account created
|
||||
@@ -75,7 +85,17 @@ func (c *Client) registerRFC(ctx context.Context, acct *Account, prompt func(tos
|
||||
return a, nil
|
||||
}
|
||||
|
||||
// updateGegRFC is equivalent to c.UpdateReg but for CAs implementing RFC 8555.
|
||||
// encodeExternalAccountBinding will encode an external account binding stanza
|
||||
// as described in https://tools.ietf.org/html/rfc8555#section-7.3.4.
|
||||
func (c *Client) encodeExternalAccountBinding(eab *ExternalAccountBinding) (*jsonWebSignature, error) {
|
||||
jwk, err := jwkEncode(c.Key.Public())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return jwsWithMAC(eab.Key, eab.KID, c.dir.RegURL, []byte(jwk))
|
||||
}
|
||||
|
||||
// updateRegRFC is equivalent to c.UpdateReg but for CAs implementing RFC 8555.
|
||||
// It expects c.Discover to have already been called.
|
||||
func (c *Client) updateRegRFC(ctx context.Context, a *Account) (*Account, error) {
|
||||
url := string(c.accountKID(ctx))
|
||||
|
||||
22
vendor/golang.org/x/crypto/acme/types.go
generated
vendored
@@ -199,6 +199,28 @@ type Account struct {
|
||||
//
|
||||
// It is non-RFC 8555 compliant and is obsoleted by OrdersURL.
|
||||
Certificates string
|
||||
|
||||
// ExternalAccountBinding represents an arbitrary binding to an account of
|
||||
// the CA which the ACME server is tied to.
|
||||
// See https://tools.ietf.org/html/rfc8555#section-7.3.4 for more details.
|
||||
ExternalAccountBinding *ExternalAccountBinding
|
||||
}
|
||||
|
||||
// ExternalAccountBinding contains the data needed to form a request with
|
||||
// an external account binding.
|
||||
// See https://tools.ietf.org/html/rfc8555#section-7.3.4 for more details.
|
||||
type ExternalAccountBinding struct {
|
||||
// KID is the Key ID of the symmetric MAC key that the CA provides to
|
||||
// identify an external account from ACME.
|
||||
KID string
|
||||
|
||||
// Key is the bytes of the symmetric key that the CA provides to identify
|
||||
// the account. Key must correspond to the KID.
|
||||
Key []byte
|
||||
}
|
||||
|
||||
func (e *ExternalAccountBinding) String() string {
|
||||
return fmt.Sprintf("&{KID: %q, Key: redacted}", e.KID)
|
||||
}
|
||||
|
||||
// Directory is ACME server discovery data.
|
||||
|
||||
1
vendor/golang.org/x/crypto/acme/version_go112.go
generated
vendored
@@ -2,6 +2,7 @@
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
//go:build go1.12
|
||||
// +build go1.12
|
||||
|
||||
package acme
|
||||
|
||||
3
vendor/golang.org/x/crypto/chacha20/chacha_arm64.go
generated
vendored
@@ -2,7 +2,8 @@
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// +build go1.11,!gccgo,!purego
|
||||
//go:build go1.11 && gc && !purego
|
||||
// +build go1.11,gc,!purego
|
||||
|
||||
package chacha20
|
||||
|
||||
|
||||
2
vendor/golang.org/x/crypto/chacha20/chacha_arm64.s
generated
vendored
@@ -2,7 +2,7 @@
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// +build go1.11,!gccgo,!purego
|
||||
// +build go1.11,gc,!purego
|
||||
|
||||
#include "textflag.h"
|
||||
|
||||
|
||||
3
vendor/golang.org/x/crypto/chacha20/chacha_noasm.go
generated
vendored
@@ -2,7 +2,8 @@
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// +build !arm64,!s390x,!ppc64le arm64,!go1.11 gccgo purego
|
||||
//go:build (!arm64 && !s390x && !ppc64le) || (arm64 && !go1.11) || !gc || purego
|
||||
// +build !arm64,!s390x,!ppc64le arm64,!go1.11 !gc purego
|
||||
|
||||
package chacha20
|
||||
|
||||
|
||||