aboutsummaryrefslogtreecommitdiff
path: root/cmd/sapientwindex/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/sapientwindex/main.go')
-rw-r--r--cmd/sapientwindex/main.go146
1 files changed, 40 insertions, 106 deletions
diff --git a/cmd/sapientwindex/main.go b/cmd/sapientwindex/main.go
index dc825ba..3be5150 100644
--- a/cmd/sapientwindex/main.go
+++ b/cmd/sapientwindex/main.go
@@ -1,60 +1,41 @@
package main
import (
- "bytes"
- "embed"
"flag"
"fmt"
"log"
"log/slog"
- "strings"
- "text/template"
+ "net/http"
"time"
"github.com/Marcel-ICMC/graw"
"github.com/Marcel-ICMC/graw/reddit"
"within.website/x/internal"
+ "within.website/x/web/discordwebhook"
)
var (
- redditUsername = flag.String("reddit-username", "", "reddit username")
- redditPassword = flag.String("reddit-password", "", "reddit password")
- redditAppID = flag.String("reddit-app-id", "", "reddit app id")
- redditAppSecret = flag.String("reddit-app-secret", "", "reddit app secret")
- subreddit = flag.String("subreddit", "shadowh511", "subreddit to post to")
- scanDuration = flag.Duration("scan-duration", 30*time.Second, "how long to scan for")
-
- //go:embed prompts/*.txt
- prompts embed.FS
+ discordWebhookURL = flag.String("discord-webhook-url", "", "discord webhook url")
+ redditUserAgent = flag.String("reddit-user-agent", "graw:windex:0.0.1 by /u/shadowh511", "reddit user agent")
+ subreddit = flag.String("subreddit", "tulpas", "subreddit to post to")
+ scanDuration = flag.Duration("scan-duration", 30*time.Second, "scan frequency")
)
func main() {
internal.HandleStartup()
- slog.Info("starting up", "username", *redditUsername, "subreddit", *subreddit, "scan_duration", (*scanDuration).String())
+ slog.Info("starting up", "subreddit", *subreddit, "scan_duration", (*scanDuration).String())
- cfg := reddit.BotConfig{
- Agent: "graw:sapientwindex:0.0.1 by /u/shadowh511",
- App: reddit.App{
- ID: *redditAppID,
- Secret: *redditAppSecret,
- Username: *redditUsername,
- Password: *redditPassword,
- },
- }
-
- bot, err := reddit.NewBot(cfg)
+ handle, err := reddit.NewScript(*redditUserAgent, *scanDuration)
if err != nil {
log.Fatal(err)
}
+ announce := &announcer{}
- handle, err := reddit.NewScript(cfg.Agent, *scanDuration)
- if err != nil {
- log.Fatal(err)
+ scriptCfg := graw.Config{
+ Subreddits: []string{*subreddit},
+ Logger: slog.NewLogLogger(slog.Default().Handler(), slog.LevelInfo),
}
- announce := &announcer{bot: bot}
-
- scriptCfg := graw.Config{Subreddits: []string{*subreddit, "shadowh511"}}
stop, wait, err := graw.Scan(announce, handle, scriptCfg)
if err != nil {
@@ -66,98 +47,51 @@ func main() {
wait()
}
-type announcer struct {
- bot reddit.Bot
-}
+type announcer struct{}
-func makePrompt(kind, title, body string) (string, error) {
- data, err := prompts.ReadFile("prompts/" + kind + ".txt")
- if err != nil {
- return "", fmt.Errorf("read prompt: %w", err)
+func addMemeArrow(str string) string {
+ var result string
+ for _, char := range str {
+ if char == '\n' {
+ result += string(char) + "> "
+ } else {
+ result += string(char)
+ }
}
-
- tmpl, err := template.New("prompt").Parse(string(data))
- if err != nil {
- return "", fmt.Errorf("parse prompts: %w", err)
- }
-
- var prompt bytes.Buffer
- err = tmpl.Execute(&prompt, struct {
- Title string
- Body string
- }{
- Title: title,
- Body: body,
- })
- if err != nil {
- return "", fmt.Errorf("execute template: %w", err)
- }
-
- return prompt.String(), nil
+ return result
}
-func (a *announcer) Post(post *reddit.Post) error {
- if post.LinkFlairText == "Personal" {
- return nil
- }
-
- slog.Info("got post", "title", post.Title, "body", post.SelfText)
-
- prompt, err := makePrompt("moderation", post.Title, post.SelfText)
- if err != nil {
- slog.Error("make prompt", "err", err)
- return nil
+func (a announcer) Post(post *reddit.Post) error {
+ if len(post.SelfText) > 1000 {
+ post.SelfText = post.SelfText[:1000] + " [truncated]"
}
- opts := &LLAMAOpts{
- Temperature: 0.8,
- TopK: 40,
- TopP: 0.9,
- Stream: false,
- Prompt: prompt,
- RepeatPenalty: 1.15,
- RepeatLastN: 512,
- Mirostat: 2,
- NPredict: 2048,
- }
-
- resp, err := Predict(opts)
- if err != nil {
- slog.Error("predict", "err", err)
- return nil
- }
-
- if !strings.HasPrefix(strings.ToUpper(strings.TrimSpace(resp.Content)), "YES") {
- slog.Info("not a question, skipping", "title", post.Title, "body", post.SelfText, "response", resp.Content)
- return nil
+ wh := discordwebhook.Webhook{
+ Username: post.Author,
+ Content: fmt.Sprintf("## %s\n> %s\n<https://reddit.com%s>", post.Title, addMemeArrow(post.SelfText), post.Permalink),
+ AvatarURL: fmt.Sprintf("https://cdn.xeiaso.net/avatar/%s", internal.Hash(post.Author, *redditUserAgent)),
+ AllowedMentions: map[string][]string{
+ "parse": {},
+ },
}
- prompt, err = makePrompt("helper", post.Title, post.SelfText)
- if err != nil {
- slog.Error("make prompt", "err", err)
- return nil
+ if !post.IsSelf {
+ wh.Content = fmt.Sprintf("## %s\n%s\n\n<https://reddit.com%s>", post.Title, post.URL, post.Permalink)
}
- opts.Prompt = prompt
+ slog.Debug("got post", "title", post.Title)
- resp, err = Predict(opts)
+ req := discordwebhook.Send(*discordWebhookURL, wh)
+ resp, err := http.DefaultClient.Do(req)
if err != nil {
- slog.Error("predict", "err", err)
+ slog.Error("discord webhook error", "err", err)
return nil
}
- body := massageAnswer(resp.Content)
-
- if err := a.bot.Reply(post.Name, body); err != nil {
- slog.Error("reply", "err", err)
+ if err := discordwebhook.Validate(resp); err != nil {
+ slog.Error("discord webhook error", "err", err)
return nil
}
return nil
}
-
-func massageAnswer(answer string) string {
- answer = strings.TrimSpace(answer)
- answer = strings.TrimPrefix(answer, "ANSWER: ")
- return answer
-}