Compare commits
2 Commits
6fba490392
...
cd36eb44eb
Author | SHA1 | Date |
---|---|---|
Asaf Gartner | cd36eb44eb | |
Asaf Gartner | 444f43a195 |
|
@ -27,6 +27,11 @@ import (
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var autostoreChannels = []string{
|
||||||
|
config.Config.Discord.ShowcaseChannelID,
|
||||||
|
// TODO(asaf): Add jam channel
|
||||||
|
}
|
||||||
|
|
||||||
func HandleIncomingMessage(ctx context.Context, dbConn db.ConnOrTx, msg *Message, createSnippets bool) error {
|
func HandleIncomingMessage(ctx context.Context, dbConn db.ConnOrTx, msg *Message, createSnippets bool) error {
|
||||||
deleted := false
|
deleted := false
|
||||||
var err error
|
var err error
|
||||||
|
@ -65,17 +70,7 @@ func CleanUpShowcase(ctx context.Context, dbConn db.ConnOrTx, msg *Message) (boo
|
||||||
return deleted, nil
|
return deleted, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
hasGoodContent := true
|
if !messageShouldBeStored(msg) {
|
||||||
if msg.OriginalHasFields("content") && !messageHasLinks(msg.Content) {
|
|
||||||
hasGoodContent = false
|
|
||||||
}
|
|
||||||
|
|
||||||
hasGoodAttachments := true
|
|
||||||
if msg.OriginalHasFields("attachments") && len(msg.Attachments) == 0 {
|
|
||||||
hasGoodAttachments = false
|
|
||||||
}
|
|
||||||
|
|
||||||
if !hasGoodContent && !hasGoodAttachments {
|
|
||||||
err := DeleteMessage(ctx, msg.ChannelID, msg.ID)
|
err := DeleteMessage(ctx, msg.ChannelID, msg.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return deleted, oops.New(err, "failed to delete message")
|
return deleted, oops.New(err, "failed to delete message")
|
||||||
|
@ -91,7 +86,7 @@ func CleanUpShowcase(ctx context.Context, dbConn db.ConnOrTx, msg *Message) (boo
|
||||||
err = SendMessages(ctx, dbConn, MessageToSend{
|
err = SendMessages(ctx, dbConn, MessageToSend{
|
||||||
ChannelID: channel.ID,
|
ChannelID: channel.ID,
|
||||||
Req: CreateMessageRequest{
|
Req: CreateMessageRequest{
|
||||||
Content: "Posts in #project-showcase are required to have either an image/video or a link. Discuss showcase content in #projects.",
|
Content: "Posts in #project-showcase are required to have either an image/video or a link, or start with `!til`. Discuss showcase content in #projects.",
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -238,7 +233,7 @@ func ShareToMatrix(ctx context.Context, msg *Message) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func MaybeInternMessage(ctx context.Context, dbConn db.ConnOrTx, msg *Message) error {
|
func MaybeInternMessage(ctx context.Context, dbConn db.ConnOrTx, msg *Message) error {
|
||||||
if msg.ChannelID == config.Config.Discord.ShowcaseChannelID {
|
if messageShouldBeStored(msg) {
|
||||||
err := InternMessage(ctx, dbConn, msg)
|
err := InternMessage(ctx, dbConn, msg)
|
||||||
if errors.Is(err, errNotEnoughInfo) {
|
if errors.Is(err, errNotEnoughInfo) {
|
||||||
logging.ExtractLogger(ctx).Warn().
|
logging.ExtractLogger(ctx).Warn().
|
||||||
|
@ -341,7 +336,7 @@ func FetchInternedMessage(ctx context.Context, dbConn db.ConnOrTx, msgId string)
|
||||||
// 1. Saves/updates content
|
// 1. Saves/updates content
|
||||||
// 2. Saves/updates snippet
|
// 2. Saves/updates snippet
|
||||||
// 3. Deletes content/snippet
|
// 3. Deletes content/snippet
|
||||||
func HandleInternedMessage(ctx context.Context, dbConn db.ConnOrTx, msg *Message, deleted bool, createSnippet bool) error {
|
func HandleInternedMessage(ctx context.Context, dbConn db.ConnOrTx, msg *Message, removeInternedMessage bool, createSnippet bool) error {
|
||||||
tx, err := dbConn.Begin(ctx)
|
tx, err := dbConn.Begin(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return oops.New(err, "failed to start transaction")
|
return oops.New(err, "failed to start transaction")
|
||||||
|
@ -352,7 +347,11 @@ func HandleInternedMessage(ctx context.Context, dbConn db.ConnOrTx, msg *Message
|
||||||
if err != nil && !errors.Is(err, db.NotFound) {
|
if err != nil && !errors.Is(err, db.NotFound) {
|
||||||
return err
|
return err
|
||||||
} else if err == nil {
|
} else if err == nil {
|
||||||
if !deleted {
|
if !removeInternedMessage {
|
||||||
|
removeInternedMessage = !messageShouldBeStored(msg)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !removeInternedMessage {
|
||||||
err = SaveMessageContents(ctx, tx, interned, msg)
|
err = SaveMessageContents(ctx, tx, interned, msg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -785,7 +784,7 @@ func HandleSnippetForInternedMessage(ctx context.Context, dbConn db.ConnOrTx, in
|
||||||
|
|
||||||
if interned.MessageContent == nil {
|
if interned.MessageContent == nil {
|
||||||
// NOTE(asaf): Can't have a snippet without content
|
// NOTE(asaf): Can't have a snippet without content
|
||||||
// NOTE(asaf): Messages that only have an attachment also have blank content
|
// NOTE(asaf): Messages that only have an attachment also have a content struct with an empty content string
|
||||||
// TODO(asaf): Do we need to delete existing snippets in this case??? Not entirely sure how to trigger this through discord
|
// TODO(asaf): Do we need to delete existing snippets in this case??? Not entirely sure how to trigger this through discord
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -835,43 +834,42 @@ func HandleSnippetForInternedMessage(ctx context.Context, dbConn db.ConnOrTx, in
|
||||||
if shouldCreate {
|
if shouldCreate {
|
||||||
// Get an asset ID or URL to make a snippet from
|
// Get an asset ID or URL to make a snippet from
|
||||||
assetId, url, err := getSnippetAssetOrUrl(ctx, tx, &interned.Message)
|
assetId, url, err := getSnippetAssetOrUrl(ctx, tx, &interned.Message)
|
||||||
if assetId != nil || url != nil {
|
|
||||||
contentMarkdown := interned.MessageContent.LastContent
|
|
||||||
contentHTML := parsing.ParseMarkdown(contentMarkdown, parsing.DiscordMarkdown)
|
|
||||||
|
|
||||||
_, err = tx.Exec(ctx,
|
contentMarkdown := interned.MessageContent.LastContent
|
||||||
`
|
contentHTML := parsing.ParseMarkdown(contentMarkdown, parsing.DiscordMarkdown)
|
||||||
INSERT INTO snippet (url, "when", description, _description_html, asset_id, discord_message_id, owner_id)
|
|
||||||
VALUES ($1, $2, $3, $4, $5, $6, $7)
|
|
||||||
`,
|
|
||||||
url,
|
|
||||||
interned.Message.SentAt,
|
|
||||||
contentMarkdown,
|
|
||||||
contentHTML,
|
|
||||||
assetId,
|
|
||||||
interned.Message.ID,
|
|
||||||
interned.HMNUser.ID,
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
return oops.New(err, "failed to create snippet from attachment")
|
|
||||||
}
|
|
||||||
|
|
||||||
existingSnippet, err = FetchSnippetForMessage(ctx, tx, interned.Message.ID)
|
_, err = tx.Exec(ctx,
|
||||||
if err != nil {
|
`
|
||||||
return oops.New(err, "failed to fetch newly-created snippet")
|
INSERT INTO snippet (url, "when", description, _description_html, asset_id, discord_message_id, owner_id)
|
||||||
}
|
VALUES ($1, $2, $3, $4, $5, $6, $7)
|
||||||
|
`,
|
||||||
|
url,
|
||||||
|
interned.Message.SentAt,
|
||||||
|
contentMarkdown,
|
||||||
|
contentHTML,
|
||||||
|
assetId,
|
||||||
|
interned.Message.ID,
|
||||||
|
interned.HMNUser.ID,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return oops.New(err, "failed to create snippet from attachment")
|
||||||
|
}
|
||||||
|
|
||||||
_, err = tx.Exec(ctx,
|
existingSnippet, err = FetchSnippetForMessage(ctx, tx, interned.Message.ID)
|
||||||
`
|
if err != nil {
|
||||||
UPDATE discord_message
|
return oops.New(err, "failed to fetch newly-created snippet")
|
||||||
SET snippet_created = TRUE
|
}
|
||||||
WHERE id = $1
|
|
||||||
`,
|
_, err = tx.Exec(ctx,
|
||||||
interned.Message.ID,
|
`
|
||||||
)
|
UPDATE discord_message
|
||||||
if err != nil {
|
SET snippet_created = TRUE
|
||||||
return oops.New(err, "failed to mark message as having snippet")
|
WHERE id = $1
|
||||||
}
|
`,
|
||||||
|
interned.Message.ID,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return oops.New(err, "failed to mark message as having snippet")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1013,3 +1011,36 @@ func messageHasLinks(content string) bool {
|
||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func messageShouldBeStored(msg *Message) bool {
|
||||||
|
if msg == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if strings.HasPrefix(strings.ToLower(strings.TrimSpace(msg.Content)), "!til") {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
autostore := false
|
||||||
|
for _, cid := range autostoreChannels {
|
||||||
|
if msg.ChannelID == cid {
|
||||||
|
autostore = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if autostore {
|
||||||
|
hasGoodContent := true
|
||||||
|
if msg.OriginalHasFields("content") && !messageHasLinks(msg.Content) {
|
||||||
|
hasGoodContent = false
|
||||||
|
}
|
||||||
|
|
||||||
|
hasGoodAttachments := true
|
||||||
|
if msg.OriginalHasFields("attachments") && len(msg.Attachments) == 0 {
|
||||||
|
hasGoodAttachments = false
|
||||||
|
}
|
||||||
|
|
||||||
|
return hasGoodContent || hasGoodAttachments
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue