4
0
mirror of https://github.com/cwinfo/matterbridge.git synced 2025-06-26 07:29:24 +00:00

Update discordgo fork (#1303)

This commit is contained in:
Wim
2020-11-22 19:21:34 +01:00
committed by GitHub
parent 7b3eaf3ccf
commit aa274e5ab7
12 changed files with 241 additions and 49 deletions

View File

@ -4,6 +4,7 @@ go:
- 1.12.x
- 1.13.x
- 1.14.x
- 1.15.x
env:
- GO111MODULE=on
install:

View File

@ -112,6 +112,8 @@ var (
EndpointChannelMessagesBulkDelete = func(cID string) string { return EndpointChannel(cID) + "/messages/bulk-delete" }
EndpointChannelMessagesPins = func(cID string) string { return EndpointChannel(cID) + "/pins" }
EndpointChannelMessagePin = func(cID, mID string) string { return EndpointChannel(cID) + "/pins/" + mID }
EndpointChannelMessageCrosspost = func(cID, mID string) string { return EndpointChannel(cID) + "/messages/" + mID + "/crosspost" }
EndpointChannelFollow = func(cID string) string { return EndpointChannel(cID) + "/followers" }
EndpointGroupIcon = func(cID, hash string) string { return EndpointCDNChannelIcons + cID + "/" + hash + ".png" }
@ -139,8 +141,8 @@ var (
EndpointIntegrationsJoin = func(iID string) string { return EndpointAPI + "integrations/" + iID + "/join" }
EndpointEmoji = func(eID string) string { return EndpointAPI + "emojis/" + eID + ".png" }
EndpointEmojiAnimated = func(eID string) string { return EndpointAPI + "emojis/" + eID + ".gif" }
EndpointEmoji = func(eID string) string { return EndpointCDN + "emojis/" + eID + ".png" }
EndpointEmojiAnimated = func(eID string) string { return EndpointCDN + "emojis/" + eID + ".gif" }
EndpointOauth2 = EndpointAPI + "oauth2/"
EndpointApplications = EndpointOauth2 + "applications"

View File

@ -252,6 +252,8 @@ type VoiceServerUpdate struct {
// VoiceStateUpdate is the data for a VoiceStateUpdate event.
type VoiceStateUpdate struct {
*VoiceState
// BeforeUpdate will be nil if the VoiceState was not previously cached in the state cache.
BeforeUpdate *VoiceState `json:"-"`
}
// MessageDeleteBulk is the data for a MessageDeleteBulk event

View File

@ -150,6 +150,7 @@ type MessageSend struct {
TTS bool `json:"tts"`
Files []*File `json:"-"`
AllowedMentions *MessageAllowedMentions `json:"allowed_mentions,omitempty"`
Reference *MessageReference `json:"message_reference,omitempty"`
// TODO: Remove this when compatibility is not required.
File *File `json:"-"`
@ -371,6 +372,15 @@ type MessageReference struct {
GuildID string `json:"guild_id"`
}
// Reference returns MessageReference of given message
func (m *Message) Reference() *MessageReference {
return &MessageReference{
GuildID: m.GuildID,
ChannelID: m.ChannelID,
MessageID: m.ID,
}
}
// ContentWithMentionsReplaced will replace all @<id> mentions with the
// username of the mention.
func (m *Message) ContentWithMentionsReplaced() (content string) {

View File

@ -502,14 +502,12 @@ func (s *Session) UserChannelPermissions(userID, channelID string) (apermissions
}
}
return memberPermissions(guild, channel, member), nil
return memberPermissions(guild, channel, userID, member.Roles), nil
}
// Calculates the permissions for a member.
// https://support.discord.com/hc/en-us/articles/206141927-How-is-the-permission-hierarchy-structured-
func memberPermissions(guild *Guild, channel *Channel, member *Member) (apermissions int) {
userID := member.User.ID
func memberPermissions(guild *Guild, channel *Channel, userID string, roles []string) (apermissions int) {
if userID == guild.OwnerID {
apermissions = PermissionAll
return
@ -523,7 +521,7 @@ func memberPermissions(guild *Guild, channel *Channel, member *Member) (apermiss
}
for _, role := range guild.Roles {
for _, roleID := range member.Roles {
for _, roleID := range roles {
if role.ID == roleID {
apermissions |= role.Permissions
break
@ -549,7 +547,7 @@ func memberPermissions(guild *Guild, channel *Channel, member *Member) (apermiss
// Member overwrites can override role overrides, so do two passes
for _, overwrite := range channel.PermissionOverwrites {
for _, roleID := range member.Roles {
for _, roleID := range roles {
if overwrite.Type == "role" && roleID == overwrite.ID {
denies |= overwrite.Deny
allows |= overwrite.Allow
@ -834,10 +832,6 @@ func (s *Session) GuildMemberEdit(guildID, userID string, roles []string) (err e
}{roles}
_, err = s.RequestWithBucketID("PATCH", EndpointGuildMember(guildID, userID), data, EndpointGuildMember(guildID, ""))
if err != nil {
return
}
return
}
@ -848,16 +842,11 @@ func (s *Session) GuildMemberEdit(guildID, userID string, roles []string) (err e
// NOTE : I am not entirely set on the name of this function and it may change
// prior to the final 1.0.0 release of Discordgo
func (s *Session) GuildMemberMove(guildID string, userID string, channelID *string) (err error) {
data := struct {
ChannelID *string `json:"channel_id"`
}{channelID}
_, err = s.RequestWithBucketID("PATCH", EndpointGuildMember(guildID, userID), data, EndpointGuildMember(guildID, ""))
if err != nil {
return
}
return
}
@ -865,6 +854,7 @@ func (s *Session) GuildMemberMove(guildID string, userID string, channelID *stri
// guildID : The ID of a guild
// userID : The ID of a user
// userID : The ID of a user or "@me" which is a shortcut of the current user ID
// nickname : The nickname of the member, "" will reset their nickname
func (s *Session) GuildMemberNickname(guildID, userID, nickname string) (err error) {
data := struct {
@ -879,6 +869,32 @@ func (s *Session) GuildMemberNickname(guildID, userID, nickname string) (err err
return
}
// GuildMemberMute server mutes a guild member
// guildID : The ID of a Guild.
// userID : The ID of a User.
// mute : boolean value for if the user should be muted
func (s *Session) GuildMemberMute(guildID string, userID string, mute bool) (err error) {
data := struct {
Mute bool `json:"mute"`
}{mute}
_, err = s.RequestWithBucketID("PATCH", EndpointGuildMember(guildID, userID), data, EndpointGuildMember(guildID, ""))
return
}
// GuildMemberDeafen server deafens a guild member
// guildID : The ID of a Guild.
// userID : The ID of a User.
// deaf : boolean value for if the user should be deafened
func (s *Session) GuildMemberDeafen(guildID string, userID string, deaf bool) (err error) {
data := struct {
Deaf bool `json:"deaf"`
}{deaf}
_, err = s.RequestWithBucketID("PATCH", EndpointGuildMember(guildID, userID), data, EndpointGuildMember(guildID, ""))
return
}
// GuildMemberRoleAdd adds the specified role to a given member
// guildID : The ID of a Guild.
// userID : The ID of a User.
@ -1613,6 +1629,17 @@ func (s *Session) ChannelMessageSendEmbed(channelID string, embed *MessageEmbed)
})
}
// ChannelMessageSendReply sends a message to the given channel with reference data.
// channelID : The ID of a Channel.
// content : The message to send.
// reference : The message reference to send.
func (s *Session) ChannelMessageSendReply(channelID string, content string, reference *MessageReference) (*Message, error) {
return s.ChannelMessageSendComplex(channelID, &MessageSend{
Content: content,
Reference: reference,
})
}
// ChannelMessageEdit edits an existing message, replacing it entirely with
// the given content.
// channelID : The ID of a Channel
@ -1790,6 +1817,43 @@ func (s *Session) ChannelPermissionDelete(channelID, targetID string) (err error
return
}
// ChannelMessageCrosspost cross posts a message in a news channel to followers
// of the channel
// channelID : The ID of a Channel
// messageID : The ID of a Message
func (s *Session) ChannelMessageCrosspost(channelID, messageID string) (st *Message, err error) {
endpoint := EndpointChannelMessageCrosspost(channelID, messageID)
body, err := s.RequestWithBucketID("POST", endpoint, nil, endpoint)
if err != nil {
return
}
err = unmarshal(body, &st)
return
}
// ChannelNewsFollow follows a news channel in the targetID
// channelID : The ID of a News Channel
// targetID : The ID of a Channel where the News Channel should post to
func (s *Session) ChannelNewsFollow(channelID, targetID string) (st *ChannelFollow, err error) {
endpoint := EndpointChannelFollow(channelID)
data := struct {
WebhookChannelID string `json:"webhook_channel_id"`
}{targetID}
body, err := s.RequestWithBucketID("POST", endpoint, data, endpoint)
if err != nil {
return
}
err = unmarshal(body, &st)
return
}
// ------------------------------------------------------------------------------------------------
// Functions specific to Discord Invites
// ------------------------------------------------------------------------------------------------

View File

@ -25,6 +25,11 @@ var ErrNilState = errors.New("state not instantiated, please use discordgo.New()
// requested is not found
var ErrStateNotFound = errors.New("state cache not found")
// ErrMessageIncompletePermissions is returned when the message
// requested for permissions does not contain enough data to
// generate the permissions.
var ErrMessageIncompletePermissions = errors.New("message incomplete, unable to determine permissions")
// A State contains the current known state.
// As discord sends this in a READY blob, it seems reasonable to simply
// use that struct as the data store.
@ -727,6 +732,26 @@ func (s *State) voiceStateUpdate(update *VoiceStateUpdate) error {
return nil
}
// VoiceState gets a VoiceState by guild and user ID.
func (s *State) VoiceState(guildID, userID string) (*VoiceState, error) {
if s == nil {
return nil, ErrNilState
}
guild, err := s.Guild(guildID)
if err != nil {
return nil, err
}
for _, state := range guild.VoiceStates {
if state.UserID == userID {
return state, nil
}
}
return nil, ErrStateNotFound
}
// Message gets a message by channel and message ID.
func (s *State) Message(channelID, messageID string) (*Message, error) {
if s == nil {
@ -916,6 +941,13 @@ func (s *State) OnInterface(se *Session, i interface{}) (err error) {
}
case *VoiceStateUpdate:
if s.TrackVoice {
var old *VoiceState
old, err = s.VoiceState(t.GuildID, t.UserID)
if err == nil {
oldCopy := *old
t.BeforeUpdate = &oldCopy
}
err = s.voiceStateUpdate(t)
}
case *PresenceUpdate:
@ -980,17 +1012,36 @@ func (s *State) UserChannelPermissions(userID, channelID string) (apermissions i
return
}
if userID == guild.OwnerID {
apermissions = PermissionAll
return
}
member, err := s.Member(guild.ID, userID)
if err != nil {
return
}
return memberPermissions(guild, channel, member), nil
return memberPermissions(guild, channel, userID, member.Roles), nil
}
// MessagePermissions returns the permissions of the author of the message
// in the channel in which it was sent.
func (s *State) MessagePermissions(message *Message) (apermissions int, err error) {
if s == nil {
return 0, ErrNilState
}
if message.Author == nil || message.Member == nil {
return 0, ErrMessageIncompletePermissions
}
channel, err := s.Channel(message.ChannelID)
if err != nil {
return
}
guild, err := s.Guild(channel.GuildID)
if err != nil {
return
}
return memberPermissions(guild, channel, message.Author.ID, message.Member.Roles), nil
}
// UserColor returns the color of a user in a channel.
@ -1018,11 +1069,39 @@ func (s *State) UserColor(userID, channelID string) int {
return 0
}
return firstRoleColorColor(guild, member.Roles)
}
// MessageColor returns the color of the author's name as displayed
// in the client associated with this message.
func (s *State) MessageColor(message *Message) int {
if s == nil {
return 0
}
if message.Member == nil || message.Member.Roles == nil {
return 0
}
channel, err := s.Channel(message.ChannelID)
if err != nil {
return 0
}
guild, err := s.Guild(channel.GuildID)
if err != nil {
return 0
}
return firstRoleColorColor(guild, message.Member.Roles)
}
func firstRoleColorColor(guild *Guild, memberRoles []string) int {
roles := Roles(guild.Roles)
sort.Sort(roles)
for _, role := range roles {
for _, roleID := range member.Roles {
for _, roleID := range memberRoles {
if role.ID == roleID {
if role.Color != 0 {
return role.Color
@ -1031,5 +1110,11 @@ func (s *State) UserColor(userID, channelID string) int {
}
}
for _, role := range roles {
if role.ID == guild.ID {
return role.Color
}
}
return 0
}

View File

@ -316,6 +316,12 @@ type ChannelEdit struct {
RateLimitPerUser int `json:"rate_limit_per_user,omitempty"`
}
// A ChannelFollow holds data returned after following a news channel
type ChannelFollow struct {
ChannelID string `json:"channel_id"`
WebhookID string `json:"webhook_id"`
}
// A PermissionOverwrite holds permission overwrite data for a Channel
type PermissionOverwrite struct {
ID string `json:"id"`
@ -614,6 +620,7 @@ type GuildParams struct {
Icon string `json:"icon,omitempty"`
OwnerID string `json:"owner_id,omitempty"`
Splash string `json:"splash,omitempty"`
Banner string `json:"banner,omitempty"`
}
// A Role stores information about Discord guild member roles.
@ -1057,6 +1064,9 @@ type Webhook struct {
Name string `json:"name"`
Avatar string `json:"avatar"`
Token string `json:"token"`
// ApplicationID is the bot/OAuth2 application that created this webhook
ApplicationID string `json:"application_id,omitempty"`
}
// WebhookType is the type of Webhook (see WebhookType* consts) in the Webhook struct

View File

@ -2,6 +2,27 @@ package discordgo
import "strings"
// UserFlags is the flags of "user" (see UserFlags* consts)
// https://discord.com/developers/docs/resources/user#user-object-user-flags
type UserFlags int
// Valid UserFlags values
const (
UserFlagDiscordEmployee UserFlags = 1 << 0
UserFlagDiscordPartner = 1 << 1
UserFlagHypeSquadEvents = 1 << 2
UserFlagBugHunterLevel1 = 1 << 3
UserFlagHouseBravery = 1 << 6
UserFlagHouseBrilliance = 1 << 7
UserFlagHouseBalance = 1 << 8
UserFlagEarlySupporter = 1 << 9
UserFlagTeamUser = 1 << 10
UserFlagSystem = 1 << 12
UserFlagBugHunterLevel2 = 1 << 14
UserFlagVerifiedBot = 1 << 16
UserFlagVerifiedBotDeveloper = 1 << 17
)
// A User stores all data for an individual Discord user.
type User struct {
// The ID of the user.
@ -36,6 +57,22 @@ type User struct {
// Whether the user is a bot.
Bot bool `json:"bot"`
// The public flags on a user's account.
// This is a combination of bit masks; the presence of a certain flag can
// be checked by performing a bitwise AND between this int and the flag.
PublicFlags UserFlags `json:"public_flags"`
// The type of Nitro subscription on a user's account.
// Only available when the request is authorized via a Bearer token.
PremiumType int `json:"premium_type"`
// Whether the user is an Official Discord System user (part of the urgent message system).
System bool `json:"system"`
// The flags on a user's account.
// Only available when the request is authorized via a Bearer token.
Flags int `json:"flags"`
}
// String returns a unique identifier of the form username#discriminator

View File

@ -139,6 +139,7 @@ func (v *VoiceConnection) ChangeChannel(channelID string, mute, deaf bool) (err
func (v *VoiceConnection) Disconnect() (err error) {
// Send a OP4 with a nil channel to disconnect
v.Lock()
if v.sessionID != "" {
data := voiceChannelJoinOp{4, voiceChannelJoinData{&v.GuildID, nil, true, true}}
v.session.wsMutex.Lock()
@ -146,6 +147,7 @@ func (v *VoiceConnection) Disconnect() (err error) {
v.session.wsMutex.Unlock()
v.sessionID = ""
}
v.Unlock()
// Close websocket and udp connections
v.Close()

2
vendor/modules.txt vendored
View File

@ -130,7 +130,7 @@ github.com/matrix-org/gomatrix
github.com/matterbridge/Rocket.Chat.Go.SDK/models
github.com/matterbridge/Rocket.Chat.Go.SDK/realtime
github.com/matterbridge/Rocket.Chat.Go.SDK/rest
# github.com/matterbridge/discordgo v0.22.0
# github.com/matterbridge/discordgo v0.22.1
## explicit
github.com/matterbridge/discordgo
# github.com/matterbridge/emoji v2.1.1-0.20191117213217-af507f6b02db+incompatible