aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristine Dodrill <me@christine.website>2017-05-06 11:33:24 -0700
committerChristine Dodrill <me@christine.website>2017-05-06 11:33:24 -0700
commit091aedde46be11d03f0b558c28862e3f6a7391ef (patch)
tree0e91c2fee9c72fea800f48ad4704e16e3dad1965
parent49b5bfd6e071cccbdbbca5d331198134ba3b5d59 (diff)
downloadx-091aedde46be11d03f0b558c28862e3f6a7391ef.tar.xz
x-091aedde46be11d03f0b558c28862e3f6a7391ef.zip
relay reddit posts to telegram
-rw-r--r--tg/meirl/main.go74
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
}