dashboard-v2/utils/premiumutils.go
2019-10-20 14:11:54 +01:00

104 lines
2.3 KiB
Go

package utils
import (
"encoding/json"
"fmt"
"github.com/TicketsBot/GoPanel/config"
"github.com/TicketsBot/GoPanel/database/table"
"github.com/TicketsBot/GoPanel/utils/discord/endpoints/guild"
"github.com/TicketsBot/GoPanel/utils/discord/objects"
"github.com/gin-gonic/contrib/sessions"
"github.com/robfig/go-cache"
"io/ioutil"
"net/http"
"strconv"
"time"
)
type ProxyResponse struct {
Premium bool
Tier int
}
var premiumCache = cache.New(10 * time.Minute, 10 * time.Minute)
func IsPremiumGuild(store sessions.Session, guildIdRaw string, ch chan bool) {
if premium, ok := premiumCache.Get(guildIdRaw); ok {
ch<-premium.(bool)
return
}
guildId, err := strconv.ParseInt(guildIdRaw, 10, 64); if err != nil {
ch<-false
return
}
// First lookup by premium key, then votes, then patreon
keyLookup := make(chan bool)
go table.IsPremium(guildId, keyLookup)
if <-keyLookup {
if err := premiumCache.Add(guildIdRaw, true, 10 * time.Minute); err != nil {
fmt.Println(err.Error())
}
ch<-true
} else {
// Get guild object
var g objects.Guild
endpoint := guild.GetGuild(int(guildId))
go endpoint.Request(store, nil, nil, &g)
// Lookup votes
ownerId, err := strconv.ParseInt(g.OwnerId, 10, 64); if err != nil {
fmt.Println(err.Error())
ch <- false
return
}
hasVoted := make(chan bool)
table.HasVoted(ownerId, hasVoted)
if <-hasVoted {
ch <- true
if err := premiumCache.Add(guildIdRaw, true, 10 * time.Minute); err != nil {
fmt.Println(err.Error())
}
return
}
// Lookup Patreon
client := &http.Client{
Timeout: time.Second * 3,
}
url := fmt.Sprintf("%s/ispremium?key=%s&id=%s", config.Conf.Bot.PremiumLookupProxyUrl, config.Conf.Bot.PremiumLookupProxyKey, g.OwnerId)
req, err := http.NewRequest("GET", url, nil)
res, err := client.Do(req); if err != nil {
fmt.Println(err.Error())
ch<-false
return
}
defer res.Body.Close()
content, err := ioutil.ReadAll(res.Body); if err != nil {
fmt.Println(err.Error())
ch<-false
return
}
var proxyResponse ProxyResponse
if err = json.Unmarshal(content, &proxyResponse); err != nil {
fmt.Println(err.Error())
ch<-false
return
}
if err := premiumCache.Add(guildIdRaw, proxyResponse.Premium, 10 * time.Minute); err != nil {
fmt.Println(err.Error())
}
ch <-proxyResponse.Premium
}
}