Version: v1.31.9 Latest Latest

This package is not in the latest version of its module.

Go to latest
Published: Sep 8, 2021 License: MIT Imports: 38 Imported by: 0



this package provides core functinality to yagpdb, important security stuff here

this package provides core functinality to yagpdb, important security stuff here



View Source
const CoreServerConfDBSchema = `` /* 237-byte string literal not displayed */
View Source
const ServicesRedisKey = "yag_services"


View Source
var (
	ErrNotFound    = errors.New("Not found")
	CacheKeyPrefix = "cache_"

	Cache *ccache.Cache
View Source
var (
	VERSION = "unknown"

	GORM *gorm.DB
	PQ   *sql.DB
	SQLX *sqlx.DB

	RedisPool *radix.Pool
	CacheSet  = cacheset.NewManager(time.Hour)

	BotSession     *discordgo.Session
	BotUser        *discordgo.User
	BotApplication *discordgo.Application

	RedisPoolSize = 0

	Testing = os.Getenv("YAGPDB_TESTING") != ""

	CurrentRunCounter int64

	NodeID string
View Source
var (
	ConfClientID     = config.RegisterOption("yagpdb.clientid", "Client ID of the discord application", nil)
	ConfClientSecret = config.RegisterOption("yagpdb.clientsecret", "Client Secret of the discord application", nil)
	ConfBotToken     = config.RegisterOption("yagpdb.bottoken", "Token of the bot user", nil)
	ConfHost         = config.RegisterOption("", "Host without the protocol, example:, used by the webserver", nil)
	ConfEmail        = config.RegisterOption("", "Email used when fetching lets encrypt certificate", "")

	ConfPQHost     = config.RegisterOption("yagpdb.pqhost", "Postgres host", "localhost")
	ConfPQUsername = config.RegisterOption("yagpdb.pqusername", "Postgres user", "postgres")
	ConfPQPassword = config.RegisterOption("yagpdb.pqpassword", "Postgres passoword", "")
	ConfPQDB       = config.RegisterOption("yagpdb.pqdb", "Postgres database", "yagpdb")

	ConfMaxCCR            = config.RegisterOption("yagpdb.max_ccr", "Maximum number of concurrent outgoing requests to discord", 25)
	ConfDisableKeepalives = config.RegisterOption("yagpdb.disable_keepalives", "Disables keepalive connections for outgoing requests to discord, this shouldn't be needed but i had networking issues once so i had to", false)

	ConfTotalShards             = config.RegisterOption("yagpdb.sharding.total_shards", "Total number shards", 0)
	ConfActiveShards            = config.RegisterOption("yagpdb.sharding.active_shards", "Shards active on this hoste, ex: '1-10,25'", "")
	ConfLargeBotShardingEnabled = config.RegisterOption("yagpdb.large_bot_sharding", "Set to enable large bot sharding (for 200k+ guilds)", false)
	ConfBucketsPerNode          = config.RegisterOption("yagpdb.shard.buckets_per_node", "Number of buckets per node", 8)
	ConfShardBucketSize         = config.RegisterOption("yagpdb.shard.shard_bucket_size", "Shards per bucket", 2)

	BotOwners []int64
View Source
var (
	PluginCategoryCore       = &PluginCategory{Name: "Core", Order: 0}
	PluginCategoryModeration = &PluginCategory{Name: "Moderation", Order: 10}
	PluginCategoryMisc       = &PluginCategory{Name: "Misc", Order: 20}
	PluginCategoryFeeds      = &PluginCategory{Name: "Feeds", Order: 30}
View Source
var Adjectives = []string{}/* 1345 elements not displayed */
View Source
var AllowedMentionsParseUsers = discordgo.AllowedMentions{
	Parse: []discordgo.AllowedMentionType{discordgo.AllowedMentionTypeUsers},
View Source
var CoreServerConfigCache = rcache.NewInt(coreServerConfigCacheFetcher, time.Minute)
View Source
var DiscordInviteSource = &InviteSource{
	Name:  "Discord",
	Regex: regexp.MustCompile(`(?i)(discord\.gg|discordapp\.com\/invite|discord\.com\/invite)(?:\/#)?\/([a-zA-Z0-9-]+)`),
View Source
var (
	ErrMaxLockAttemptsExceeded = errors.New("Max lock attempts exceeded")
View Source
var LinkRegex = regexp.MustCompile(`(http(s)?:\/\/)?(www\.)?[-a-zA-Z0-9@:%_\+~#=]{1,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)`)
View Source
var Nouns = []string{}/* 111 elements not displayed */
View Source
var (
	Plugins []Plugin
View Source
var RedisAddr = loadRedisAddr()
View Source
var ServicePoller = &servicePoller{}
View Source
var ServiceTracker = newServiceTracker()

ServiceTracker keeps track of the various components of yagpdb in a central location for ease of access

View Source
var StringPerms = map[int64]string{
	discordgo.PermissionReadMessages:       "Read Messages",
	discordgo.PermissionSendMessages:       "Send Messages",
	discordgo.PermissionSendTTSMessages:    "Send TTS Messages",
	discordgo.PermissionManageMessages:     "Manage Messages",
	discordgo.PermissionEmbedLinks:         "Embed Links",
	discordgo.PermissionAttachFiles:        "Attach Files",
	discordgo.PermissionReadMessageHistory: "Read Message History",
	discordgo.PermissionMentionEveryone:    "Mention Everyone",
	discordgo.PermissionVoiceConnect:       "Voice Connect",
	discordgo.PermissionVoiceSpeak:         "Voice Speak",
	discordgo.PermissionVoiceMuteMembers:   "Voice Mute Members",
	discordgo.PermissionVoiceDeafenMembers: "Voice Deafen Members",
	discordgo.PermissionVoiceMoveMembers:   "Voice Move Members",
	discordgo.PermissionVoiceUseVAD:        "Voice Use VAD",

	discordgo.PermissionCreateInstantInvite: "Create Instant Invite",
	discordgo.PermissionKickMembers:         "Kick Members",
	discordgo.PermissionBanMembers:          "Ban Members",
	discordgo.PermissionManageRoles:         "Manage Roles",
	discordgo.PermissionManageChannels:      "Manage Channels",
	discordgo.PermissionManageServer:        "Manage Server",
	discordgo.PermissionManageWebhooks:      "Manage Webhooks",
View Source
var ThirdpartyDiscordSites = []*InviteSource{
	&InviteSource{Name: "", Regex: regexp.MustCompile(`(?i)discord\.me\/.+`)},
	&InviteSource{Name: "", Regex: regexp.MustCompile(`(?i)invite\.gg\/.+`)},
	&InviteSource{Name: "", Regex: regexp.MustCompile(`(?i)discord\.io\/.+`)},
	&InviteSource{Name: "", Regex: regexp.MustCompile(`(?i)discord\.li\/.+`)},
	&InviteSource{Name: "", Regex: regexp.MustCompile(`(?i)disboard\.org\/server\/join\/.+`)},
	&InviteSource{Name: "", Regex: regexp.MustCompile(`(?i)discordy\.com\/server\.php`)},


func AddCPLogEntry

func AddCPLogEntry(user *discordgo.User, guild int64, args ...interface{})

func AddCPLogEntryLegacy added in v1.24.18

func AddCPLogEntryLegacy(user *discordgo.User, guild int64, args ...interface{})

func AddLogHook added in v1.17.3

func AddLogHook(hook logrus.Hook)

func AddRole

func AddRole(member *discordgo.Member, role int64, guildID int64) error

func AddRoleDS added in v1.4.1

func AddRoleDS(ms *dstate.MemberState, role int64) error

func BlockingLockRedisKey

func BlockingLockRedisKey(key string, maxTryDuration time.Duration, maxLockDur int) error

BlockingLockRedisKey blocks until it suceeded to lock the key

func BotIsOnGuild added in v1.14.0

func BotIsOnGuild(guildID int64) (bool, error)

func ChannelOrThreadParentID added in v1.31.9

func ChannelOrThreadParentID(cs *dstate.ChannelState) int64

ChannelOrThreadParentID returns either cs.ID for channels or cs.ParentID for threads

func ContainsInt64Slice

func ContainsInt64Slice(slice []int64, search int64) bool

func ContainsInt64SliceOneOf added in v1.13.0

func ContainsInt64SliceOneOf(slice []int64, search []int64) bool

ContainsInt64SliceOneOf returns true if slice contains one of search

func ContainsIntSlice added in v1.11.0

func ContainsIntSlice(slice []int, search int) bool

func ContainsStringSlice

func ContainsStringSlice(strs []string, search string) bool

func ContainsStringSliceFold

func ContainsStringSliceFold(strs []string, search string) bool

func ContextCoreConf added in v1.17.0

func ContextCoreConf(ctx context.Context) *models.CoreConfig

func CoreConfigSave added in v1.17.0

func CoreConfigSave(ctx context.Context, m *models.CoreConfig) error

func CoreInit added in v1.20.17

func CoreInit(loadConfig bool) error

CoreInit initializes the essential parts

func CutStringShort

func CutStringShort(s string, l int) string

CutStringShort stops a strinng at "l"-3 if it's longer than "l" and adds "..."

func DelayedMessageDelete

func DelayedMessageDelete(session *discordgo.Session, delay time.Duration, cID, mID int64)

DelayedMessageDelete Deletes a message after delay

func DiscordError

func DiscordError(err error) (code int, msg string)

DiscordError extracts the errorcode discord sent us

func DiscordGatewayLogger added in v1.22.2

func DiscordGatewayLogger(shardID int, connectionID int, msgL int, msgf string, args ...interface{})

func ErrPQIsUniqueViolation added in v1.10.0

func ErrPQIsUniqueViolation(err error) bool

func ErrWithCaller

func ErrWithCaller(err error) error

func FallbackEmbed

func FallbackEmbed(embed *discordgo.MessageEmbed) string

func GenLocalIncrID added in v1.14.0

func GenLocalIncrID(guildID int64, key string) (int64, error)

GenLocalIncrID creates a new or incremements a existing local id incrememter used to have per guild id's

GenLocalIncrID is deprecated and GenLocalIncrIDPQ should be used instead

func GenLocalIncrIDPQ added in v1.20.14

func GenLocalIncrIDPQ(tx *sql.Tx, guildID int64, key string) (int64, error)

GenLocalIncrIDPQ creates a new or incremements a existing local id incrememter used to have per guild id's

GenLocalIncrIDPQ differs from GenLocalIncrID in that it uses postgres instead of redis

func GetActiveNodes added in v1.15.3

func GetActiveNodes() ([]string, error)

func GetBotToken added in v1.19.0

func GetBotToken() string

func GetCacheData

func GetCacheData(key string) (data []byte, err error)

Items in the cache expire after 1 min

func GetCacheDataJson

func GetCacheDataJson(key string, dest interface{}) error

func GetCoreServerConfCached added in v1.17.0

func GetCoreServerConfCached(guildID int64) *models.CoreConfig

func GetFixedPrefixLogger added in v1.17.3

func GetFixedPrefixLogger(prefix string) *logrus.Entry

func GetJoinedServerCount added in v1.11.2

func GetJoinedServerCount() (int64, error)

func GetPluginLogger added in v1.17.3

func GetPluginLogger(plugin Plugin) *logrus.Entry

func GetRedisJson

func GetRedisJson(key string, out interface{}) error

GetRedisJson executes a get redis command and unmarshals the value into out

func HumanizeDuration

func HumanizeDuration(precision DurationFormatPrecision, in time.Duration) string

func HumanizePermissions added in v1.6.0

func HumanizePermissions(perms int64) (res []string)

func HumanizeTime

func HumanizeTime(precision DurationFormatPrecision, in time.Time) string

func Init

func Init() error

Init initializes the rest of the bot

func InitSchemas added in v1.19.7

func InitSchemas(name string, schemas ...string)

func InitTest

func InitTest()

func InitTestRedis added in v1.24.9

func InitTestRedis() error

InitTestRedis sets common.RedisPool to a redis pool for unit testing

func IsDiscordErr

func IsDiscordErr(err error, codes bool

IsDiscordErr returns true if this was a discord error and one of the codes matches

func IsNumber added in v1.17.0

func IsNumber(v interface{}) bool

func IsOwner added in v1.20.6

func IsOwner(userID int64) bool

func IsRoleAbove added in v1.30.0

func IsRoleAbove(a, b *discordgo.Role) bool

IsRoleAbove returns wether role a is above b, checking positions first, and if they're the same (both being 1, new roles always have 1 as position) then it checjs by lower id

func KeyGuild

func KeyGuild(guildID int64) string

func KeyGuildChannels

func KeyGuildChannels(guildID int64) string

func LoadConfig

func LoadConfig() (err error)

func LogIgnoreError added in v1.11.0

func LogIgnoreError(err error, msg string, data logrus.Fields)

func LogLongCallTime added in v1.24.18

func LogLongCallTime(treshold time.Duration, isErr bool, logMsg string, extraData logrus.Fields, f func())

func MultipleCmds added in v1.18.3

func MultipleCmds(cmds ...radix.CmdAction) error

func MustParseInt

func MustParseInt(s string) int64

func ParseDuration added in v1.20.17

func ParseDuration(str string) (time.Duration, error)

Parses a time string like 1day3h

func RandomAdjective

func RandomAdjective() string

func RandomNoun added in v1.22.4

func RandomNoun() string

func RegisterDBSchemas added in v1.24.18

func RegisterDBSchemas(name string, schemas ...string)

func RegisterPlugin

func RegisterPlugin(plugin Plugin)

RegisterPlugin registers a plugin, should be called when the bot is starting up

func RemoveRole

func RemoveRole(member *discordgo.Member, role int64, guildID int64) error

func RemoveRoleDS added in v1.4.1

func RemoveRoleDS(ms *dstate.MemberState, role int64) error

func ReplaceServerInvites added in v1.8.1

func ReplaceServerInvites(msg string, guildID int64, replacement string) string

func RunCommonRunPlugins added in v1.20.17

func RunCommonRunPlugins()

RunCommonRunPlugins runs plugins that implement PluginWithCommonRun

func SendOwnerAlert added in v1.20.0

func SendOwnerAlert(msgf string, args ...interface{})

func SendTempMessage

func SendTempMessage(session *discordgo.Session, duration time.Duration, cID int64, msg string)

SendTempMessage sends a message that gets deleted after duration

func SetCacheData

func SetCacheData(key string, expire int, data []byte) error

Stores an entry in the cache and sets it to expire after expire

func SetCacheDataJson

func SetCacheDataJson(key string, expire int, data interface{}) error

Helper methods

func SetCacheDataJsonSimple

func SetCacheDataJsonSimple(key string, data interface{}) error

func SetCacheDataSimple

func SetCacheDataSimple(key string, data []byte) error

Stores an entry in the cache and sets it to expire after a minute

func SetLogFormatter added in v1.17.3

func SetLogFormatter(formatter logrus.Formatter)

func SetLoggingLevel added in v1.19.6

func SetLoggingLevel(level logrus.Level)

func SetRedisJson

func SetRedisJson(key string, value interface{}) error

SetRedisJson marshals the value and runs a set redis command for key

func SetShutdownFunc added in v1.20.17

func SetShutdownFunc(f func())

func Shutdown added in v1.20.17

func Shutdown()

func SplitSendMessage added in v1.26.0

func SplitSendMessage(channelID int64, contents string, allowedMentions discordgo.AllowedMentions) ([]*discordgo.Message, error)

func SqlTX added in v1.19.0

func SqlTX(f func(tx *sql.Tx) error) error

helper for creating transactions

func TableExists added in v1.20.17

func TableExists(table string) (b bool, err error)

func TryLockRedisKey

func TryLockRedisKey(key string, maxDur int) (bool, error)

Locks the lock and if succeded sets it to expire after maxdur So that if someting went wrong its not locked forever

func UnlockRedisKey

func UnlockRedisKey(key string)


type BotServiceDetails added in v1.20.17

type BotServiceDetails struct {
	RunningShards    []int  `json:"running_shards"`
	TotalShards      int    `json:"total_shards"`
	NodeID           string `json:"node_id"`
	OrchestratorMode bool   `json:"orchestrator_mode"`

BotServiceDetails is bot service specific details

type CPLogEntryLegacy added in v1.24.18

type CPLogEntryLegacy struct {
	Timestamp int64  `json:"ts"`
	Action    string `json:"action"`

	TimestampString string `json:"-"`

func GetCPLogEntriesLegacy added in v1.24.18

func GetCPLogEntriesLegacy(guild int64) ([]*CPLogEntryLegacy, error)

type ContextHook

type ContextHook struct{}

func (ContextHook) Fire

func (hook ContextHook) Fire(entry *logrus.Entry) error

func (ContextHook) Levels

func (hook ContextHook) Levels() []logrus.Level

type ContextKey

type ContextKey int
const (
	ContextKeyRedis ContextKey = iota

type DBSchema added in v1.24.18

type DBSchema struct {
	Name    string
	Schemas []string

type DiscordChannels added in v1.30.0

type DiscordChannels []*discordgo.Channel

Channels are a collection of Channels

func (DiscordChannels) Len added in v1.30.0

func (r DiscordChannels) Len() int

func (DiscordChannels) Less added in v1.30.0

func (r DiscordChannels) Less(i, j int) bool

func (DiscordChannels) Swap added in v1.30.0

func (r DiscordChannels) Swap(i, j int)

type DiscordRoles added in v1.30.0

type DiscordRoles []*discordgo.Role

func (DiscordRoles) Len added in v1.30.0

func (r DiscordRoles) Len() int

func (DiscordRoles) Less added in v1.30.0

func (r DiscordRoles) Less(i, j int) bool

func (DiscordRoles) Swap added in v1.30.0

func (r DiscordRoles) Swap(i, j int)

type DurationFormatPrecision

type DurationFormatPrecision int
const (
	DurationPrecisionSeconds DurationFormatPrecision = iota

func (DurationFormatPrecision) FromSeconds

func (d DurationFormatPrecision) FromSeconds(in int64) int64

func (DurationFormatPrecision) String

func (d DurationFormatPrecision) String() string

type GORMLogger added in v1.4.7

type GORMLogger struct {

func (*GORMLogger) Print added in v1.4.7

func (g *GORMLogger) Print(v ...interface{})

type GuildWithConnected added in v1.17.0

type GuildWithConnected struct {
	Connected bool

func GetGuildsWithConnected added in v1.17.0

func GetGuildsWithConnected(in []*discordgo.UserGuild) ([]*GuildWithConnected, error)

GetGuildsWithConnected Returns a wrapped guild with connected set

type InviteSource added in v1.12.0

type InviteSource struct {
	Name  string
	Regex *regexp.Regexp

func ContainsInvite added in v1.12.0

func ContainsInvite(s string, checkDiscordSource, checkThirdPartySources bool) *InviteSource

type LoggedExecutedCommand

type LoggedExecutedCommand struct {

	UserID    string
	ChannelID string
	GuildID   string

	// Name of command that was triggered
	Command string
	// Raw command with arguments passed
	RawCommand string
	// If command returned any error this will be no-empty
	Error string

	TimeStamp    time.Time
	ResponseTime int64

func (LoggedExecutedCommand) TableName

func (l LoggedExecutedCommand) TableName() string

type LoggingTransport added in v1.4.1

type LoggingTransport struct {
	Inner http.RoundTripper

func (*LoggingTransport) RoundTrip added in v1.4.1

func (t *LoggingTransport) RoundTrip(request *http.Request) (*http.Response, error)

type Plugin

type Plugin interface {
	PluginInfo() *PluginInfo

Plugin represents a plugin, all plugins needs to implement this at a bare minimum

type PluginCategory added in v1.17.0

type PluginCategory struct {
	Name  string
	Order int

type PluginInfo added in v1.17.0

type PluginInfo struct {
	Name     string // Human readable name of the plugin
	SysName  string // snake_case version of the name in lower case
	Category *PluginCategory

PluginInfo represents basic plugin information

type PluginWithCommonRun added in v1.20.17

type PluginWithCommonRun interface {

PluginWithCommonRun is for plugins that include a function that's always run, no matter if its the webserver frontend, bot or whatever

type STDLogProxy

type STDLogProxy struct{}

func (*STDLogProxy) Write

func (p *STDLogProxy) Write(b []byte) (n int, err error)

type Service added in v1.20.17

type Service struct {
	Type    ServiceType `json:"type"`
	Name    string      `json:"name"`
	Details string      `json:"details"`

	BotDetails *BotServiceDetails `json:"bot_details"`
	// contains filtered or unexported fields

Service represents a service or component of yagpdb

type ServiceHost added in v1.20.17

type ServiceHost struct {
	InternalAPIAddress string `json:"internal_api_address"`
	Host               string `json:"host"`
	PID                int    `json:"pid"`
	Version            string `json:"version"`

	Services []*Service `json:"services"`

ServiceHost represents a process that holds oen or more bot components

type ServiceType added in v1.20.17

type ServiceType string

ServiceType represents the type of the component

const (
	ServiceTypeBot           ServiceType = "bot"
	ServiceTypeFrontend      ServiceType = "frontend"
	ServiceTypeBGWorker      ServiceType = "bgworker"
	ServiceTypeConfigService ServiceType = "configservice"
	ServiceTypeFeed          ServiceType = "feed"
	ServiceTypeOrchestator   ServiceType = "orchestrator"

type SmallModel

type SmallModel struct {
	ID        uint `gorm:"primary_key"`
	CreatedAt time.Time
	UpdatedAt time.Time


Path Synopsis
Package pqkeydb is a simple key-value database on top of postgres
Package pqkeydb is a simple key-value database on top of postgres

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL