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) }