Skip to content

Commit

Permalink
discord: blocks DM channel after sending error
Browse files Browse the repository at this point in the history
  • Loading branch information
Seklfreak committed Oct 12, 2019
1 parent cc38912 commit 95077a9
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 12 deletions.
24 changes: 19 additions & 5 deletions discord/dm.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package discord

import (
"errors"
"fmt"
"time"

"github.com/getsentry/raven-go"
Expand All @@ -14,17 +13,20 @@ var (
dmChannelExpiryError = time.Hour * 1
)

func dmChannelKey(session *Session, userID string) string {
return "cacophony:discord:dm-channel:" + session.BotID + ":" + userID
}

func DMChannel(
redisClient *redis.Client,
session *Session,
userID string,
) (string, error) {

if redisClient == nil {
return "", errors.New("sending DMs requires redis")
}

key := "cacophony:discord:dm-channel:" + session.BotID + ":" + userID
key := dmChannelKey(session, userID)

res, err := redisClient.Get(key).Result()
if err != nil && err != redis.Nil {
Expand All @@ -39,18 +41,30 @@ func DMChannel(

channel, err := session.Client.UserChannelCreate(userID)
if err != nil {
fmt.Printf("setting %s to empty\n", key) // TODO: remove me
if err := redisClient.Set(key, "", dmChannelExpiryError).Err(); err != nil && raven.DefaultClient != nil {
raven.CaptureError(err, map[string]string{"key": key})
}

return "", err
}

fmt.Printf("setting %s to %s\n", key, channel.ID) // TODO: remove me
if err := redisClient.Set(key, channel.ID, dmChannelExpirySuccessful).Err(); err != nil && raven.DefaultClient != nil {
raven.CaptureError(err, map[string]string{"key": key})
}

return channel.ID, nil
}

func BlockDMChannel(redisClient *redis.Client, session *Session, userID string) error {
if redisClient == nil {
return errors.New("requires redis")
}

key := dmChannelKey(session, userID)

if err := redisClient.Set(key, "", dmChannelExpiryError).Err(); err != nil && raven.DefaultClient != nil {
raven.CaptureError(err, map[string]string{"key": key})
}

return nil
}
21 changes: 14 additions & 7 deletions events/event_discord.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package events

import (
builtinErrors "errors"

"github.com/bwmarrin/discordgo"
"github.com/pkg/errors"
"gitlab.com/Cacophony/go-kit/discord"
Expand Down Expand Up @@ -55,12 +57,7 @@ func (e *Event) Send(channelID, message string, values ...interface{}) ([]*disco
}

func (e *Event) SendDM(userID, message string, values ...interface{}) ([]*discordgo.Message, error) {
channelID, err := discord.DMChannel(e.Redis(), e.Discord(), userID)
if err != nil {
return nil, err
}

return e.Send(channelID, message, values...)
return e.SendComplexDM(userID, &discordgo.MessageSend{Content: message}, values...)
}

// SendComplex sends a message to the given channel, translates it if possible
Expand All @@ -81,7 +78,17 @@ func (e *Event) SendComplexDM(userID string, message *discordgo.MessageSend, val
return nil, err
}

return e.SendComplex(channelID, message, values...)
messages, err := e.SendComplex(channelID, message, values...)
if err != nil {
var discordError *discordgo.RESTError
if builtinErrors.As(err, &discordError) &&
discordError.Message != nil &&
discordError.Message.Code == discordgo.ErrCodeCannotSendMessagesToThisUser {
discord.BlockDMChannel(e.Redis(), e.Discord(), userID)
}
}

return messages, err
}

// Typing starts typing in the event channel
Expand Down

0 comments on commit 95077a9

Please sign in to comment.