grim/peacock

Parents 3e444a686381
Children 94a9a8ebb14c
basic patreon support with initial endpoint for getting the supporters
--- a/.hgignore Sat May 26 18:05:34 2018 -0500
+++ b/.hgignore Sun May 27 19:25:23 2018 -0500
@@ -1,3 +1,4 @@
syntax: glob
peacock
+local-dev
--- a/config/config.go Sat May 26 18:05:34 2018 -0500
+++ b/config/config.go Sun May 27 19:25:23 2018 -0500
@@ -9,6 +9,8 @@
Hostname string `envconfig:"HOSTNAME"`
Port int32 `envconfig:"PORT"`
StaticFilesPath string `envconfig:"STATIC_FILES_PATH" default:"static"`
+
+ PatreonAccessToken string `envconfig:"PATREON_ACCESS_TOKEN" required:"true"`
}
var (
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/db/db.go Sun May 27 19:25:23 2018 -0500
@@ -0,0 +1,25 @@
+package db
+
+import (
+ "github.com/jinzhu/gorm"
+ _ "github.com/jinzhu/gorm/dialects/sqlite"
+)
+
+var (
+ db *gorm.DB
+)
+
+func Get() *gorm.DB {
+ if db != nil {
+ return db
+ }
+
+ db, err := gorm.Open("sqlite3", "file::memory:?mode=memory&cache=shared")
+ if err != nil {
+ panic(err)
+ }
+
+ db.AutoMigrate(&Supporter{})
+
+ return db
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/db/supporter.go Sun May 27 19:25:23 2018 -0500
@@ -0,0 +1,14 @@
+package db
+
+import (
+ "github.com/jinzhu/gorm"
+)
+
+type Supporter struct {
+ gorm.Model `json:"-"`
+
+ Name string
+ Avatar string
+ Title string
+ Service string
+}
--- a/main.go Sat May 26 18:05:34 2018 -0500
+++ b/main.go Sun May 27 19:25:23 2018 -0500
@@ -5,14 +5,67 @@
"os"
"os/signal"
"runtime/debug"
+ "sync"
"syscall"
"github.com/aphistic/gomol"
+ "github.com/jinzhu/gorm"
+ "bitbucket.org/rw_grim/peacock/config"
+ "bitbucket.org/rw_grim/peacock/db"
"bitbucket.org/rw_grim/peacock/logging"
+ "bitbucket.org/rw_grim/peacock/patreon"
"bitbucket.org/rw_grim/peacock/server"
+ "bitbucket.org/rw_grim/peacock/service"
)
+func setupServices(db *gorm.DB) error {
+ cfg := config.Get()
+
+ services := map[string]service.Service{
+ "patreon": &patreon.Patreon{},
+ }
+
+ serviceRes := make(chan error)
+ setupRes := make(chan error)
+ wg := sync.WaitGroup{}
+
+ // results processor
+ go func(serviceRes, setupRes chan error) {
+ var serviceErr error
+
+ for err := range serviceRes {
+ if err != nil {
+ gomol.Warnf("error: %s", err)
+ if serviceErr == nil {
+ serviceErr = err
+ }
+ }
+ }
+
+ setupRes <- serviceErr
+ close(setupRes)
+ }(serviceRes, setupRes)
+
+ // initialize all the services at once
+ for name, service := range services {
+ wg.Add(1)
+ go func(res chan error) {
+ defer wg.Done()
+ gomol.Infof("initializing service %s", name)
+ res <- service.Initialize(db, cfg)
+ }(serviceRes)
+ }
+
+ // wait for the initializers to finish
+ wg.Wait()
+
+ // close the overall initialization result channel
+ close(serviceRes)
+
+ return <-setupRes
+}
+
func gomain() int {
err := logging.Start()
if err != nil {
@@ -21,6 +74,17 @@
}
defer logging.Stop()
+ // setup the database
+ db := db.Get()
+ defer db.Close()
+
+ // setup our services
+ err = setupServices(db)
+ if err != nil {
+ fmt.Printf("error: %s\n", err)
+ return 1
+ }
+
// setup a signal channel
signalChan := make(chan os.Signal, 1)
signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/patreon/patreon.go Sun May 27 19:25:23 2018 -0500
@@ -0,0 +1,75 @@
+package patreon
+
+import (
+ "net/http"
+
+ "bitbucket.org/rw_grim/paytreon"
+ "github.com/aphistic/gomol"
+ "github.com/jinzhu/gorm"
+
+ "bitbucket.org/rw_grim/peacock/config"
+ pdb "bitbucket.org/rw_grim/peacock/db"
+)
+
+type Patreon struct {
+ client *paytreon.Client
+}
+
+func (p *Patreon) Initialize(db *gorm.DB, cfg config.Config) error {
+ p.client = paytreon.NewClientWithStaticToken(cfg.PatreonAccessToken)
+
+ user, err := p.client.CurrentUser()
+ if err != nil {
+ return err
+ }
+ gomol.Infof("connected to patreon as %s", user.FullName)
+
+ campaings, err := p.client.Campaigns()
+ if err != nil {
+ return err
+ }
+
+ for _, campaign := range campaings {
+ pledges, err := p.client.Pledges(campaign)
+ if err != nil {
+ return err
+ }
+
+ for _, pledge := range pledges {
+ p.addPledge(db, pledge)
+ }
+ }
+
+ return nil
+}
+
+func (p *Patreon) Routes() http.Handler {
+ return nil
+}
+
+func (p *Patreon) addPledge(db *gorm.DB, pledge *paytreon.Pledge) error {
+ s := pdb.Supporter{
+ Name: pledge.Patron.FullName,
+ Avatar: pledge.Patron.ThumbURL,
+ Title: pledge.Reward.Title,
+ Service: "patreon",
+ }
+
+ errors := db.Create(&s).GetErrors()
+ if len(errors) > 0 {
+ var first error
+
+ for _, err := range errors {
+ gomol.Warnf("error: %s", err)
+ if first == nil {
+ first = err
+ }
+ }
+
+ return first
+ }
+
+ gomol.Infof("Added %s %s %s", s.Service, s.Title, s.Name)
+
+ return nil
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/api.go Sun May 27 19:25:23 2018 -0500
@@ -0,0 +1,20 @@
+package server
+
+import (
+ "encoding/json"
+ "net/http"
+
+ "github.com/aphistic/gomol"
+
+ "bitbucket.org/rw_grim/peacock/db"
+)
+
+func supportersHandler(w http.ResponseWriter, r *http.Request) {
+ sql := db.Get()
+
+ users := []db.Supporter{}
+ sql.Find(&users)
+ gomol.Infof("users: %#v", users)
+
+ json.NewEncoder(w).Encode(users)
+}
--- a/server/server.go Sat May 26 18:05:34 2018 -0500
+++ b/server/server.go Sun May 27 19:25:23 2018 -0500
@@ -36,6 +36,8 @@
func setupRoutes(cfg config.Config) http.Handler {
router := http.NewServeMux()
+ router.HandleFunc("/api/supporters", supportersHandler)
+
static := http.FileServer(http.Dir(cfg.StaticFilesPath))
router.Handle("/", static)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/service/service.go Sun May 27 19:25:23 2018 -0500
@@ -0,0 +1,14 @@
+package service
+
+import (
+ "net/http"
+
+ "github.com/jinzhu/gorm"
+
+ "bitbucket.org/rw_grim/peacock/config"
+)
+
+type Service interface {
+ Initialize(*gorm.DB, config.Config) error
+ Routes() http.Handler
+}