diff options
Diffstat (limited to 'cmd/sapientwindex/main.go')
| -rw-r--r-- | cmd/sapientwindex/main.go | 146 |
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 -} |
