2021-01-24 20:42:40 +00:00

151 lines
3.1 KiB
Go

package api
import (
"context"
"fmt"
"github.com/TicketsBot/GoPanel/database"
"github.com/TicketsBot/GoPanel/rpc/cache"
"github.com/TicketsBot/GoPanel/utils"
"github.com/TicketsBot/common/permission"
syncutils "github.com/TicketsBot/common/utils"
"github.com/gin-gonic/gin"
"github.com/rxdn/gdl/objects/guild"
"github.com/rxdn/gdl/rest/request"
"golang.org/x/sync/errgroup"
"strings"
)
type wrappedGuild struct {
Id uint64 `json:"id,string"`
Name string `json:"name"`
Icon string `json:"icon"`
}
func GetGuilds(ctx *gin.Context) {
userId := ctx.Keys["userid"].(uint64)
guilds, err := database.Client.UserGuilds.Get(userId)
if err != nil {
ctx.JSON(500, gin.H{
"success": false,
"error": err.Error(),
})
return
}
wg := syncutils.NewChannelWaitGroup()
wg.Add(len(guilds))
group, _ := errgroup.WithContext(context.Background())
ch := make(chan wrappedGuild)
for _, g := range guilds {
g := g
group.Go(func() error {
defer wg.Done()
// verify bot is in guild
_, ok := cache.Instance.GetGuild(g.GuildId, false)
if !ok {
return nil
}
fakeGuild := guild.Guild{
Id: g.GuildId,
Owner: g.Owner,
Permissions: uint64(g.UserPermissions),
}
if g.Owner {
fakeGuild.OwnerId = userId
}
permLevel, err := utils.GetPermissionLevel(g.GuildId, userId)
if err != nil {
// If a Discord error occurs, just skip the server
if _, ok := err.(request.RestError); !ok {
return err
}
}
if permLevel >= permission.Support {
wrapped := wrappedGuild{
Id: g.GuildId,
Name: g.Name,
Icon: g.Icon,
}
ch <- wrapped
}
return nil
})
}
adminGuilds := make([]wrappedGuild, 0)
group.Go(func() error {
adminGuilds := make([]wrappedGuild, 0)
loop:
for {
select {
case <-wg.Wait():
break loop
case guild := <-ch:
// Sort by name
var index int
for i, el := range adminGuilds {
fmt.Printf("%s %s %v\n", guild.Name, el.Name, guild.Name < el.Name)
if strings.ToLower(guild.Name) < strings.ToLower(el.Name) {
index = i
} else {
break
}
}
if index >= len(adminGuilds) {
adminGuilds = append(adminGuilds, guild)
} else {
adminGuilds = append(adminGuilds, wrappedGuild{}) // create extra capacity with zero value
copy(adminGuilds[index+1:], adminGuilds[index:])
adminGuilds[index] = guild
}
}
}
return nil
})
// not possible anyway but eh
if err := group.Wait(); err != nil {
ctx.JSON(500, gin.H{
"success": false,
"error": err.Error(),
})
return
}
ctx.JSON(200, adminGuilds)
}
/*func getAdminGuilds(userId uint64) ([]uint64, error) {
var guilds []uint64
// get guilds owned by user
query := `SELECT "guild_id" FROM guilds WHERE "data"->'owner_id' = '$1';`
rows, err := cache.Instance.Query(context.Background(), query, userId)
if err != nil {
return nil, err
}
for rows.Next() {
var guildId uint64
if err := rows.Scan(&guildId); err != nil {
return nil, err
}
guilds = append(guilds, guildId)
}
database.Client.Permissions.GetSupport()
}*/