grim/peacock
Clone
Summary
Browse
Changes
Graph
Update everything for the new repository path
draft
default
tip
2020-04-27, Gary Kramlich
670cd383e87b
Update everything for the new repository path
package
main
import
(
"fmt"
"os"
"os/signal"
"runtime/debug"
"sync"
"syscall"
"github.com/aphistic/gomol"
"github.com/jinzhu/gorm"
"keep.imfreedom.org/grim/peacock/config"
"keep.imfreedom.org/grim/peacock/db"
"keep.imfreedom.org/grim/peacock/logging"
"keep.imfreedom.org/grim/peacock/patreon"
"keep.imfreedom.org/grim/peacock/server"
"keep.imfreedom.org/grim/peacock/service"
"keep.imfreedom.org/grim/peacock/twitch"
)
func
setupServices
(
db
*
gorm
.
DB
)
error
{
cfg
:=
config
.
Get
()
services
:=
map
[
string
]
service
.
Service
{
"patreon"
:
&
patreon
.
Patreon
{},
"twitch"
:
&
twitch
.
Twitch
{},
}
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
,
srv
:=
range
services
{
wg
.
Add
(
1
)
go
func
(
name
string
,
srv
service
.
Service
,
res
chan
error
)
{
defer
wg
.
Done
()
gomol
.
Infof
(
"initializing service %s"
,
name
)
res
<-
srv
.
Initialize
(
db
,
cfg
)
}(
name
,
srv
,
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
{
fmt
.
Printf
(
"error: %s\n"
,
err
)
return
1
}
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
)
// setup the error channel
errChan
:=
make
(
chan
error
,
10
)
// run the api
go
func
()
{
srv
:=
server
.
New
(
errChan
)
defer
srv
.
Stop
()
srv
.
Start
()
}()
for
{
select
{
case
err
:=
<-
errChan
:
if
err
!=
nil
{
gomol
.
Fatalf
(
"error: %s"
,
err
)
return
1
}
case
s
:=
<-
signalChan
:
gomol
.
Warnf
(
"Captured %v. Exiting..."
,
s
)
return
0
}
}
}
func
main
()
{
exitCode
:=
0
defer
func
()
{
if
r
:=
recover
();
r
!=
nil
{
fmt
.
Printf
(
"panic: %s\n%s\n"
,
r
,
debug
.
Stack
())
}
os
.
Exit
(
exitCode
)
}()
exitCode
=
gomain
()
}