diff options
| author | Christine Dodrill <me@christine.website> | 2017-05-06 11:33:24 -0700 |
|---|---|---|
| committer | Christine Dodrill <me@christine.website> | 2017-05-06 11:33:24 -0700 |
| commit | 091aedde46be11d03f0b558c28862e3f6a7391ef (patch) | |
| tree | 0e91c2fee9c72fea800f48ad4704e16e3dad1965 | |
| parent | 49b5bfd6e071cccbdbbca5d331198134ba3b5d59 (diff) | |
| download | x-091aedde46be11d03f0b558c28862e3f6a7391ef.tar.xz x-091aedde46be11d03f0b558c28862e3f6a7391ef.zip | |
relay reddit posts to telegram
| -rw-r--r-- | tg/meirl/main.go | 74 |
1 files changed, 56 insertions, 18 deletions
diff --git a/tg/meirl/main.go b/tg/meirl/main.go index d070b66..b2a2146 100644 --- a/tg/meirl/main.go +++ b/tg/meirl/main.go @@ -1,20 +1,30 @@ package main import ( + "fmt" "log" + "os" + "runtime" + "time" "github.com/Xe/ln" "github.com/caarlos0/env" _ "github.com/joho/godotenv/autoload" + "github.com/turnage/graw" + "github.com/turnage/graw/reddit" "gopkg.in/telegram-bot-api.v4" ) +const appid = "github.com/Xe/x/tg/meirl" +const version = "0.1-dev" + type config struct { - RedditUsername string `env:"REDDIT_USERNAME,required"` - RedditPassword string `env:"REDDIT_PASSWORD.required"` + RedditBotAdmin string `env:"REDDIT_ADMIN_USERNAME,required"` + Subreddits []string `env:"SUBREDDITS,required"` - TelegramToken string `env:"TELEGRAM_TOKEN,required"` - TelegramAdmin string `env:"TELEGRAM_ADMIN,required"` + TelegramToken string `env:"TELEGRAM_TOKEN,required"` + TelegramAdmin string `env:"TELEGRAM_ADMIN,required"` + TelegramChannelID int64 `env:"TELEGRAM_CHANNEL_ID,required"` } func main() { @@ -24,30 +34,58 @@ func main() { ln.Fatal(ln.F{"err": err, "action": "env.Parse"}) } - bot, err := tgbotapi.NewBotAPI(cfg.TelegramToken) + tg, err := tgbotapi.NewBotAPI(cfg.TelegramToken) if err != nil { ln.Fatal(ln.F{"err": err, "action": "tgbotapi.NewBotAPI"}) } - bot.Debug = true + ln.Log(ln.F{"action": "telegram_active", "username": tg.Self.UserName}) - ln.Log(ln.F{"action": "telegram_active", "username": bot.Self.UserName}) + userAgent := fmt.Sprintf( + "%s on %s %s:%s:%s (by /u/%s)", + runtime.Version(), runtime.GOOS, runtime.GOARCH, + appid, version, cfg.RedditBotAdmin, + ) - u := tgbotapi.NewUpdate(0) - u.Timeout = 60 + rd, err := reddit.NewScript(userAgent, 5*time.Second) + if err != nil { + ln.Fatal(ln.F{"err": err, "user_agent": userAgent}) + } + _ = rd - updates, err := bot.GetUpdatesChan(u) + ln.Log(ln.F{"action": "reddit_connected", "user_agent": userAgent}) - for update := range updates { - if update.Message == nil { - continue - } + a := &announcer{ + cfg: &cfg, + tg: tg, + } - log.Printf("[%s] %s", update.Message.From.UserName, update.Message.Text) + stop, wait, err := graw.Scan(a, rd, graw.Config{Subreddits: cfg.Subreddits, Logger: log.New(os.Stderr, "", log.LstdFlags)}) + if err != nil { + ln.Fatal(ln.F{"err": err, "action": "graw.Scan", "subreddits": cfg.Subreddits}) + } + defer stop() - msg := tgbotapi.NewMessage(update.Message.Chat.ID, update.Message.Text) - msg.ReplyToMessageID = update.Message.MessageID + // This time, let's block so the bot will announce (ideally) forever. + if err := wait(); err != nil { + ln.Fatal(ln.F{"err": err, "action": "reddit_wait"}) + } +} + +type announcer struct { + cfg *config + tg *tgbotapi.BotAPI +} - bot.Send(msg) +func (a *announcer) Post(post *reddit.Post) error { + msg := tgbotapi.NewMessage(a.cfg.TelegramChannelID, fmt.Sprintf("me irl\n%s\n(https://reddit.com%s by /u/%s)", post.URL, post.Permalink, post.Author)) + _, err := a.tg.Send(msg) + if err != nil { + ln.Error(err, ln.F{"err": err, "action": "telegram_post"}) + return err } + + ln.Log(ln.F{"action": "new_post", "url": post.URL, "permalink": post.Permalink, "redditor": post.Author}) + + return nil } |
