mi-v1/cmd/mi/main.go

131 lines
3.4 KiB
Go

package main
import (
"context"
"flag"
"net/url"
"os"
"os/signal"
"time"
"github.com/facebookarchive/flagenv"
_ "github.com/joho/godotenv/autoload"
r "gopkg.in/rethinkdb/rethinkdb-go.v6"
"within.website/ln"
)
var (
// Twitter
twitterAPIKey = flag.String("twitter-api-key", "", "Twitter API key")
twitterAPISecret = flag.String("twitter-api-secret", "", "Twitter API secret")
twitterConsumerToken = flag.String("twitter-consumer-token", "", "Twitter consumer Token")
twitterConsumerSecret = flag.String("twitter-consumer-secret", "", "Twitter consumer Secret")
// Mastodon
mastodonInstance = flag.String("mastodon-instance", "", "Mastodon instance to connect to")
mastodonAppID = flag.String("mastodon-app-id", "", "Mastodon app ID")
mastodonAppSecret = flag.String("mastodon-app-secret", "", "Mastodon app secret")
mastodonToken = flag.String("mastodon-token", "", "Mastodon API token")
mastodonAccount = flag.String("mastodon-account", "", "Mastodon account")
/*
// Gitea
giteaInstance = flag.String("gitea-instance", "", "Gitea instance to use")
giteaAPIToken = flag.String("gitea-api-token", "", "Gitea API token")
// Github
githubToken = flag.String("github-token", "", "Github API token")
*/
// Reddit
redditAppID = flag.String("reddit-app-id", "", "Reddit app ID")
redditAppSecret = flag.String("reddit-app-secret", "", "Reddit app Secret")
redditUsername = flag.String("reddit-username", "", "Reddit username")
redditPassword = flag.String("reddit-password", "", "Reddit password")
// RethinkDB
rethinkDBURL = flag.String("rethinkdb-url", "rethinkdb2://admin@127.0.0.1:28015/mi", "RethinkDB URL")
// Patreon
patreonClientID = flag.String("patreon-client-id", "", "Patreon client ID")
patreonClientSecret = flag.String("patreon-client-secret", "", "Patreon client secret")
patreonAccessToken = flag.String("patreon-access-token", "", "Patreon access token")
patreonRefreshToken = flag.String("patreon-refresh-token", "", "Patreon refresh token")
// Blog
blogURL = flag.String("blog-url", "https://christine.website/blog.json", "JSONFeed to monitor for new posts")
// Port
port = flag.String("port", "5000", "HTTP port")
)
func main() {
flagenv.Parse()
flag.Parse()
ctx := context.Background()
ctx = ln.WithF(ctx, ln.F{
"mastodon_instance": *mastodonInstance,
})
r.SetTags("rethinkdb", "json")
u, err := url.Parse(*rethinkDBURL)
if err != nil {
ln.FatalErr(ctx, err)
}
pw, _ := u.User.Password()
db := u.Path[1:]
session, err := r.Connect(r.ConnectOpts{
Address: u.Host,
Database: db,
Username: u.User.Username(),
Password: pw,
})
if err != nil {
ln.FatalErr(ctx, err)
}
mastodonClient, err := makeMastodon()
if err != nil {
ln.FatalErr(ctx, err)
}
redditBot, err := makeReddit()
if err != nil {
ln.FatalErr(ctx, err)
}
twitterClient, err := makeTwitter()
if err != nil {
ln.FatalErr(ctx, err)
}
mi := &Mi{
session: session,
mastodonClient: mastodonClient,
twitterClient: twitterClient,
redditBot: redditBot,
}
ctx, cancel := context.WithCancel(ctx)
go func(cf func()) {
var signalChan chan os.Signal
signalChan = make(chan os.Signal, 1)
signal.Notify(signalChan, os.Interrupt)
<-signalChan
cf()
}(cancel)
go mi.StreamMastodon(ctx)
go mi.StreamReddit(ctx)
go mi.StreamMastodonToTwitter(ctx)
<-ctx.Done()
ln.Log(ctx, ln.Info("cleaning up"))
time.Sleep(500 * time.Millisecond)
}