Deleting a message on the watched channel now deletes the posts it
produced. Making that possible reshapes how a message reaches an output:
- OutputInterface takes an output.Post and returns an output.Ref, the
identifier the platform gave the new post (tweet ID for X, URI and
CID for bluesky). It also gained Delete(Ref).
- The discord package no longer forwards raw MessageCreate values but
a discord.Event carrying the kind of change, so the MessageDelete
handler can use the same channel. Deleted messages arrive without an
author, so only the channel ID can be filtered on.
- The new store package remembers Discord message ID -> per output Ref.
Set POST_STORE to a path to keep that mapping across restarts;
without it the mapping is memory only and a restart makes older
messages undeletable. It holds the most recent 1000 messages.
main.go grows a distributor type to hold the outputs and the store
rather than threading them through the event loop.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
30 lines
515 B
Go
30 lines
515 B
Go
package output
|
|
|
|
import (
|
|
"fmt"
|
|
)
|
|
|
|
type stdoutput struct {
|
|
}
|
|
|
|
func StdOutput() *stdoutput {
|
|
return &stdoutput{}
|
|
}
|
|
|
|
func (so *stdoutput) Write(post Post) (Ref, error) {
|
|
fmt.Println(post.Text)
|
|
for _, img := range post.Images {
|
|
fmt.Printf("[image: %s (%s, %d bytes)]\n", img.Filename, img.ContentType, len(img.Data))
|
|
}
|
|
return Ref{ID: post.Text}, nil
|
|
}
|
|
|
|
func (so *stdoutput) Delete(ref Ref) error {
|
|
fmt.Printf("[deleted: %s]\n", ref.ID)
|
|
return nil
|
|
}
|
|
|
|
func (so *stdoutput) GetName() string {
|
|
return "stdout"
|
|
}
|