mi-v1/cmd/mi/main.go

178 lines
3.8 KiB
Go

package main
import (
"context"
"encoding/json"
"flag"
"fmt"
"net/http"
"os"
"os/signal"
"time"
"github.com/facebookarchive/flagenv"
_ "github.com/joho/godotenv/autoload"
"golang.org/x/net/trace"
r "gopkg.in/rethinkdb/rethinkdb-go.v6"
"within.website/ln"
"within.website/ln/ex"
"within.website/mi/rethink"
"within.website/mi/switchcounter"
"within.website/x/web/useragent"
)
var (
/*
// 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")
*/
// RethinkDB
rethinkDBURL = flag.String("rethinkdb-url", "rethinkdb2://admin@127.0.0.1:28015/mi", "RethinkDB URL")
// Port
port = flag.String("port", "5000", "HTTP port")
domain = flag.String("domain", "mi.within.website", "domain this is being served on")
// meta
noPush = flag.Bool("no-push", false, "if set, don't push content")
// switchcounter
switchFile = flag.String("switch-file", "", "if set, import switches from CSV")
)
func main() {
flagenv.Parse()
flag.Parse()
ln.AddFilter(ex.NewGoTraceLogger())
http.DefaultTransport = useragent.Transport("mi-posse", "https://"+*domain+"/.within/botinfo", http.DefaultTransport)
ctx := context.Background()
session, err := rethink.GetSession(*rethinkDBURL)
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)
}
mux := http.NewServeMux()
pm, err := MakeMiddleware(*pasetoPublicKey, *pasetoPrivateKey, mux)
if err != nil {
ln.FatalErr(ctx, err)
}
mux.Handle("/static/", http.FileServer(http.Dir(".")))
mux.HandleFunc("/", func(rw http.ResponseWriter, req *http.Request) {
http.ServeFile(rw, req, "./static/index.html")
})
tok, err := pm.CreateToken(
[][2]string{
{"from", "main"},
},
time.Now().AddDate(2, 0, 0),
)
if err != nil {
ln.FatalErr(ctx, err)
}
fmt.Printf("token: %s\n", tok)
mi := &Mi{
session: session,
mastodonClient: mastodonClient,
twitterClient: twitterClient,
redditBot: redditBot,
mux: mux,
}
mi.RegisterRoutes()
sc := switchcounter.New(session, mux)
mux.HandleFunc("/debug/requests", func(rw http.ResponseWriter, req *http.Request) {
trace.Render(rw, req, true)
})
mux.HandleFunc("/debug/events", func(rw http.ResponseWriter, req *http.Request) {
trace.RenderEvents(rw, req, true)
})
mux.HandleFunc("/.within/tokeninfo", func(rw http.ResponseWriter, req *http.Request) {
tokenData := req.Context().Value(tokenKey)
json.NewEncoder(rw).Encode(tokenData)
})
if *switchFile != "" {
fin, err := os.Open(*switchFile)
if err != nil {
ln.FatalErr(ctx, err)
}
switches, err := sc.ImportCSV(fin)
if err != nil {
ln.FatalErr(ctx, err)
}
if len(switches) == 0 {
panic("what")
}
err = r.Table("switches").Insert(switches).Exec(session)
if err != nil {
ln.FatalErr(ctx, err)
}
return
}
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)
if !*noPush {
mi.RegisterPusher(mi.PushDiscordWebhook)
mi.RegisterPusher(mi.PushReddit)
mi.RegisterPusher(mi.PushMastodon)
mi.RegisterPusher(mi.PushTwitter)
go mi.StreamMastodonToTwitter(ctx)
go mi.BlogPOSSE(ctx)
}
h := &http.Server{
Addr: ":" + *port,
Handler: GoTraceMiddleware{
next: ex.HTTPLog(pm),
},
}
go func() { ln.FatalErr(ctx, h.ListenAndServe()) }()
<-ctx.Done()
ln.Log(ctx, ln.Info("cleaning up"))
time.Sleep(500 * time.Millisecond)
}