dashboard-v2/botcontext/botcontext.go

265 lines
7.0 KiB
Go

package botcontext
import (
"context"
"errors"
"github.com/TicketsBot/GoPanel/config"
dbclient "github.com/TicketsBot/GoPanel/database"
"github.com/TicketsBot/GoPanel/redis"
cacheclient "github.com/TicketsBot/GoPanel/rpc/cache"
"github.com/TicketsBot/common/permission"
"github.com/TicketsBot/common/restcache"
"github.com/TicketsBot/database"
cache "github.com/rxdn/gdl/cache"
"github.com/rxdn/gdl/objects/channel"
"github.com/rxdn/gdl/objects/guild"
"github.com/rxdn/gdl/objects/guild/emoji"
"github.com/rxdn/gdl/objects/interaction"
"github.com/rxdn/gdl/objects/member"
"github.com/rxdn/gdl/objects/user"
"github.com/rxdn/gdl/rest"
"github.com/rxdn/gdl/rest/ratelimit"
)
type BotContext struct {
BotId uint64
Token string
RateLimiter *ratelimit.Ratelimiter
RestCache restcache.RestCache
}
func (c *BotContext) Db() *database.Database {
return dbclient.Client
}
func (c *BotContext) Cache() permission.PermissionCache {
return permission.NewRedisCache(redis.Client.Client)
}
func (c *BotContext) IsBotAdmin(userId uint64) bool {
for _, id := range config.Conf.Admins {
if id == userId {
return true
}
}
return false
}
func (c *BotContext) GetGuild(ctx context.Context, guildId uint64) (guild.Guild, error) {
g, err := cacheclient.Instance.GetGuild(ctx, guildId)
switch {
case err == nil:
return g, nil
case errors.Is(err, cache.ErrNotFound):
g, err := rest.GetGuild(ctx, c.Token, c.RateLimiter, guildId)
if err == nil {
if err := cacheclient.Instance.StoreGuild(ctx, g); err != nil {
return guild.Guild{}, err
}
}
return g, err
default:
return guild.Guild{}, err
}
}
func (c *BotContext) GetGuildOwner(guildId uint64) (uint64, error) {
cachedOwner, err := cacheclient.Instance.GetGuildOwner(context.Background(), guildId)
switch {
case err == nil:
return cachedOwner, nil
case errors.Is(err, cache.ErrNotFound):
guild, err := c.GetGuild(context.Background(), guildId)
if err != nil {
return 0, err
}
if err := cacheclient.Instance.StoreGuild(context.Background(), guild); err != nil {
return 0, err
}
return guild.OwnerId, nil
default:
return 0, err
}
}
func (c *BotContext) GetGuildMember(ctx context.Context, guildId, userId uint64) (member.Member, error) {
m, err := cacheclient.Instance.GetMember(ctx, guildId, userId)
switch {
case err == nil:
return m, nil
case errors.Is(err, cache.ErrNotFound):
m, err := rest.GetGuildMember(ctx, c.Token, c.RateLimiter, guildId, userId)
if err != nil {
return member.Member{}, nil
}
if err := cacheclient.Instance.StoreMember(ctx, m, guildId); err != nil {
return member.Member{}, err
}
return m, nil
default:
return member.Member{}, err
}
}
func (c *BotContext) RemoveGuildMemberRole(ctx context.Context, guildId, userId, roleId uint64) error {
return rest.RemoveGuildMemberRole(ctx, c.Token, c.RateLimiter, guildId, userId, roleId)
}
func (c *BotContext) CreateGuildRole(ctx context.Context, guildId uint64, data rest.GuildRoleData) (guild.Role, error) {
return rest.CreateGuildRole(ctx, c.Token, c.RateLimiter, guildId, data)
}
func (c *BotContext) DeleteGuildRole(ctx context.Context, guildId, roleId uint64) error {
return rest.DeleteGuildRole(ctx, c.Token, c.RateLimiter, guildId, roleId)
}
func (c *BotContext) GetUser(ctx context.Context, userId uint64) (user.User, error) {
u, err := cacheclient.Instance.GetUser(ctx, userId)
switch {
case err == nil:
return u, nil
case errors.Is(err, cache.ErrNotFound):
u, err := rest.GetUser(ctx, c.Token, c.RateLimiter, userId)
if err != nil {
return user.User{}, err
}
if err := cacheclient.Instance.StoreUser(ctx, u); err != nil {
return user.User{}, err
}
return u, nil
default:
return user.User{}, err
}
}
func (c *BotContext) GetGuildRoles(ctx context.Context, guildId uint64) ([]guild.Role, error) {
return c.RestCache.GetGuildRoles(guildId)
}
func (c *BotContext) GetGuildChannels(ctx context.Context, guildId uint64) ([]channel.Channel, error) {
cachedChannels, err := cacheclient.Instance.GetGuildChannels(ctx, guildId)
if err != nil {
return nil, err
}
if len(cachedChannels) > 0 {
return cachedChannels, nil
} else {
// If guild is cached but not any channels, likely that it does truly have 0 channels,
// so don't fetch from REST.
_, err := cacheclient.Instance.GetGuild(ctx, guildId)
switch {
case err == nil:
return []channel.Channel{}, nil
case errors.Is(err, cache.ErrNotFound):
// If guild isn't cached, fetch from REST
channels, err := rest.GetGuildChannels(ctx, c.Token, c.RateLimiter, guildId)
if err != nil {
return nil, err
}
if err := cacheclient.Instance.StoreChannels(ctx, channels); err != nil {
return nil, err
}
return channels, nil
default:
return nil, err
}
}
}
func (c *BotContext) GetGuildEmoji(ctx context.Context, guildId, emojiId uint64) (emoji.Emoji, error) {
e, err := cacheclient.Instance.GetEmoji(ctx, guildId)
switch {
case err == nil:
return e, nil
case errors.Is(err, cache.ErrNotFound):
e, err := rest.GetGuildEmoji(ctx, c.Token, c.RateLimiter, guildId, emojiId)
if err != nil {
return emoji.Emoji{}, err
}
if err := cacheclient.Instance.StoreEmoji(ctx, e, guildId); err != nil {
return emoji.Emoji{}, err
}
return e, nil
default:
return emoji.Emoji{}, err
}
}
func (c *BotContext) GetGuildEmojis(ctx context.Context, guildId uint64) ([]emoji.Emoji, error) {
emojis, err := cacheclient.Instance.GetGuildEmojis(ctx, guildId)
if err != nil {
return nil, err
}
if len(emojis) == 0 {
emojis, err := rest.ListGuildEmojis(ctx, c.Token, c.RateLimiter, guildId)
if err != nil {
return nil, err
}
if err := cacheclient.Instance.StoreEmojis(ctx, emojis, guildId); err != nil {
return nil, err
}
return emojis, err
}
return emojis, nil
}
func (c *BotContext) SearchMembers(ctx context.Context, guildId uint64, query string) ([]member.Member, error) {
data := rest.SearchGuildMembersData{
Query: query,
Limit: 100,
}
members, err := rest.SearchGuildMembers(ctx, c.Token, c.RateLimiter, guildId, data)
if err != nil {
return nil, err
}
if err := cacheclient.Instance.StoreMembers(ctx, members, guildId); err != nil {
return nil, err
}
return members, nil
}
func (c *BotContext) ListMembers(ctx context.Context, guildId uint64) ([]member.Member, error) {
data := rest.ListGuildMembersData{
Limit: 100,
}
members, err := rest.ListGuildMembers(ctx, c.Token, c.RateLimiter, guildId, data)
if err != nil {
return nil, err
}
if err := cacheclient.Instance.StoreMembers(ctx, members, guildId); err != nil {
return nil, err
}
return members, nil
}
func (c *BotContext) CreateGuildCommand(ctx context.Context, guildId uint64, data rest.CreateCommandData) (interaction.ApplicationCommand, error) {
return rest.CreateGuildCommand(ctx, c.Token, c.RateLimiter, c.BotId, guildId, data)
}
func (c *BotContext) DeleteGuildCommand(ctx context.Context, guildId, commandId uint64) error {
return rest.DeleteGuildCommand(ctx, c.Token, c.RateLimiter, c.BotId, guildId, commandId)
}