Documentation ¶
Overview ¶
this package provides core functinality to yagpdb, important security stuff here
this package provides core functinality to yagpdb, important security stuff here
Index ¶
- Constants
- Variables
- func AddCPLogEntry(user *discordgo.User, guild int64, args ...interface{})
- func AddCPLogEntryLegacy(user *discordgo.User, guild int64, args ...interface{})
- func AddLogHook(hook logrus.Hook)
- func AddRole(member *discordgo.Member, role int64, guildID int64) error
- func AddRoleDS(ms *dstate.MemberState, role int64) error
- func BlockingLockRedisKey(key string, maxTryDuration time.Duration, maxLockDur int) error
- func BotIsOnGuild(guildID int64) (bool, error)
- func ChannelOrThreadParentID(cs *dstate.ChannelState) int64
- func ContainsInt64Slice(slice []int64, search int64) bool
- func ContainsInt64SliceOneOf(slice []int64, search []int64) bool
- func ContainsIntSlice(slice []int, search int) bool
- func ContainsStringSlice(strs []string, search string) bool
- func ContainsStringSliceFold(strs []string, search string) bool
- func ContextCoreConf(ctx context.Context) *models.CoreConfig
- func CoreConfigSave(ctx context.Context, m *models.CoreConfig) error
- func CoreInit(loadConfig bool) error
- func CutStringShort(s string, l int) string
- func DelayedMessageDelete(session *discordgo.Session, delay time.Duration, cID, mID int64)
- func DiscordError(err error) (code int, msg string)
- func DiscordGatewayLogger(shardID int, connectionID int, msgL int, msgf string, args ...interface{})
- func ErrPQIsUniqueViolation(err error) bool
- func ErrWithCaller(err error) error
- func FallbackEmbed(embed *discordgo.MessageEmbed) string
- func GenLocalIncrID(guildID int64, key string) (int64, error)
- func GenLocalIncrIDPQ(tx *sql.Tx, guildID int64, key string) (int64, error)
- func GetActiveNodes() ([]string, error)
- func GetBotToken() string
- func GetCacheData(key string) (data []byte, err error)
- func GetCacheDataJson(key string, dest interface{}) error
- func GetCoreServerConfCached(guildID int64) *models.CoreConfig
- func GetFixedPrefixLogger(prefix string) *logrus.Entry
- func GetJoinedServerCount() (int64, error)
- func GetPluginLogger(plugin Plugin) *logrus.Entry
- func GetRedisJson(key string, out interface{}) error
- func HumanizeDuration(precision DurationFormatPrecision, in time.Duration) string
- func HumanizePermissions(perms int64) (res []string)
- func HumanizeTime(precision DurationFormatPrecision, in time.Time) string
- func Init() error
- func InitSchemas(name string, schemas ...string)
- func InitTest()
- func InitTestRedis() error
- func IsDiscordErr(err error, codes ...int) bool
- func IsNumber(v interface{}) bool
- func IsOwner(userID int64) bool
- func IsRoleAbove(a, b *discordgo.Role) bool
- func KeyGuild(guildID int64) string
- func KeyGuildChannels(guildID int64) string
- func LoadConfig() (err error)
- func LogIgnoreError(err error, msg string, data logrus.Fields)
- func LogLongCallTime(treshold time.Duration, isErr bool, logMsg string, extraData logrus.Fields, ...)
- func MultipleCmds(cmds ...radix.CmdAction) error
- func MustParseInt(s string) int64
- func ParseDuration(str string) (time.Duration, error)
- func RandomAdjective() string
- func RandomNoun() string
- func RegisterDBSchemas(name string, schemas ...string)
- func RegisterPlugin(plugin Plugin)
- func RemoveRole(member *discordgo.Member, role int64, guildID int64) error
- func RemoveRoleDS(ms *dstate.MemberState, role int64) error
- func ReplaceServerInvites(msg string, guildID int64, replacement string) string
- func RunCommonRunPlugins()
- func SendOwnerAlert(msgf string, args ...interface{})
- func SendTempMessage(session *discordgo.Session, duration time.Duration, cID int64, msg string)
- func SetCacheData(key string, expire int, data []byte) error
- func SetCacheDataJson(key string, expire int, data interface{}) error
- func SetCacheDataJsonSimple(key string, data interface{}) error
- func SetCacheDataSimple(key string, data []byte) error
- func SetLogFormatter(formatter logrus.Formatter)
- func SetLoggingLevel(level logrus.Level)
- func SetRedisJson(key string, value interface{}) error
- func SetShutdownFunc(f func())
- func Shutdown()
- func SplitSendMessage(channelID int64, contents string, allowedMentions discordgo.AllowedMentions) ([]*discordgo.Message, error)
- func SqlTX(f func(tx *sql.Tx) error) error
- func TableExists(table string) (b bool, err error)
- func TryLockRedisKey(key string, maxDur int) (bool, error)
- func UnlockRedisKey(key string)
- type BotServiceDetails
- type CPLogEntryLegacy
- type ContextHook
- type ContextKey
- type DBSchema
- type DiscordChannels
- type DiscordRoles
- type DurationFormatPrecision
- type GORMLogger
- type GuildWithConnected
- type InviteSource
- type LoggedExecutedCommand
- type LoggingTransport
- type Plugin
- type PluginCategory
- type PluginInfo
- type PluginWithCommonRun
- type STDLogProxy
- type Service
- type ServiceHost
- type ServiceType
- type SmallModel
Constants ¶
const CoreServerConfDBSchema = `` /* 237-byte string literal not displayed */
const ServicesRedisKey = "yag_services"
Variables ¶
var ( ErrNotFound = errors.New("Not found") CacheKeyPrefix = "cache_" Cache *ccache.Cache )
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 )
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("yagpdb.host", "Host without the protocol, example: example.com, used by the webserver", nil) ConfEmail = config.RegisterOption("yagpdb.email", "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 )
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} )
var Adjectives = []string{}/* 1345 elements not displayed */
var AllInviteSources = append([]*InviteSource{DiscordInviteSource}, ThirdpartyDiscordSites...)
var AllowedMentionsParseUsers = discordgo.AllowedMentions{
Parse: []discordgo.AllowedMentionType{discordgo.AllowedMentionTypeUsers},
}
var CoreServerConfigCache = rcache.NewInt(coreServerConfigCacheFetcher, time.Minute)
var DiscordInviteSource = &InviteSource{ Name: "Discord", Regex: regexp.MustCompile(`(?i)(discord\.gg|discordapp\.com\/invite|discord\.com\/invite)(?:\/#)?\/([a-zA-Z0-9-]+)`), }
var (
ErrMaxLockAttemptsExceeded = errors.New("Max lock attempts exceeded")
)
var LinkRegex = regexp.MustCompile(`(http(s)?:\/\/)?(www\.)?[-a-zA-Z0-9@:%_\+~#=]{1,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)`)
var Nouns = []string{}/* 111 elements not displayed */
var (
Plugins []Plugin
)
var RedisAddr = loadRedisAddr()
var ServicePoller = &servicePoller{}
var ServiceTracker = newServiceTracker()
ServiceTracker keeps track of the various components of yagpdb in a central location for ease of access
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",
}
var ThirdpartyDiscordSites = []*InviteSource{ &InviteSource{Name: "discord.me", Regex: regexp.MustCompile(`(?i)discord\.me\/.+`)}, &InviteSource{Name: "invite.gg", Regex: regexp.MustCompile(`(?i)invite\.gg\/.+`)}, &InviteSource{Name: "discord.io", Regex: regexp.MustCompile(`(?i)discord\.io\/.+`)}, &InviteSource{Name: "discord.li", Regex: regexp.MustCompile(`(?i)discord\.li\/.+`)}, &InviteSource{Name: "disboard.org", Regex: regexp.MustCompile(`(?i)disboard\.org\/server\/join\/.+`)}, &InviteSource{Name: "discordy.com", Regex: regexp.MustCompile(`(?i)discordy\.com\/server\.php`)}, }
Functions ¶
func AddCPLogEntry ¶
func AddCPLogEntry(user *discordgo.User, guild int64, args ...interface{})
func AddCPLogEntryLegacy ¶
func AddCPLogEntryLegacy(user *discordgo.User, guild int64, args ...interface{})
func AddLogHook ¶
func BlockingLockRedisKey ¶
BlockingLockRedisKey blocks until it suceeded to lock the key
func BotIsOnGuild ¶
func ChannelOrThreadParentID ¶ added in v1.27.0
func ChannelOrThreadParentID(cs *dstate.ChannelState) int64
ChannelOrThreadParentID returns either cs.ID for channels or cs.ParentID for threads
func ContainsInt64Slice ¶
func ContainsInt64SliceOneOf ¶
ContainsInt64SliceOneOf returns true if slice contains one of search
func ContainsIntSlice ¶
func ContainsStringSlice ¶
func ContainsStringSliceFold ¶
func ContextCoreConf ¶
func ContextCoreConf(ctx context.Context) *models.CoreConfig
func CoreConfigSave ¶
func CoreConfigSave(ctx context.Context, m *models.CoreConfig) error
func CutStringShort ¶
CutStringShort stops a strinng at "l"-3 if it's longer than "l" and adds "..."
func DelayedMessageDelete ¶
DelayedMessageDelete Deletes a message after delay
func DiscordError ¶
DiscordError extracts the errorcode discord sent us
func DiscordGatewayLogger ¶
func ErrPQIsUniqueViolation ¶
func ErrWithCaller ¶
func FallbackEmbed ¶
func FallbackEmbed(embed *discordgo.MessageEmbed) string
func GenLocalIncrID ¶
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 ¶
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 ¶
func GetBotToken ¶
func GetBotToken() string
func GetCacheData ¶
Items in the cache expire after 1 min
func GetCacheDataJson ¶
func GetCoreServerConfCached ¶
func GetCoreServerConfCached(guildID int64) *models.CoreConfig
func GetFixedPrefixLogger ¶
func GetJoinedServerCount ¶
func GetPluginLogger ¶
func GetRedisJson ¶
GetRedisJson executes a get redis command and unmarshals the value into out
func HumanizeDuration ¶
func HumanizeDuration(precision DurationFormatPrecision, in time.Duration) string
func HumanizePermissions ¶
func HumanizeTime ¶
func HumanizeTime(precision DurationFormatPrecision, in time.Time) string
func InitSchemas ¶
func InitTestRedis ¶
func InitTestRedis() error
InitTestRedis sets common.RedisPool to a redis pool for unit testing
func IsDiscordErr ¶
IsDiscordErr returns true if this was a discord error and one of the codes matches
func IsRoleAbove ¶ added in v1.27.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 KeyGuildChannels ¶
func LoadConfig ¶
func LoadConfig() (err error)
func LogLongCallTime ¶
func MultipleCmds ¶
func MultipleCmds(cmds ...radix.CmdAction) error
func MustParseInt ¶
func ParseDuration ¶
Parses a time string like 1day3h
func RandomAdjective ¶
func RandomAdjective() string
func RandomNoun ¶
func RandomNoun() string
func RegisterDBSchemas ¶
func RegisterPlugin ¶
func RegisterPlugin(plugin Plugin)
RegisterPlugin registers a plugin, should be called when the bot is starting up
func RemoveRole ¶
func RemoveRoleDS ¶
func ReplaceServerInvites ¶
func RunCommonRunPlugins ¶
func RunCommonRunPlugins()
RunCommonRunPlugins runs plugins that implement PluginWithCommonRun
func SendOwnerAlert ¶
func SendOwnerAlert(msgf string, args ...interface{})
func SendTempMessage ¶
SendTempMessage sends a message that gets deleted after duration
func SetCacheData ¶
Stores an entry in the cache and sets it to expire after expire
func SetCacheDataJson ¶
Helper methods
func SetCacheDataJsonSimple ¶
func SetCacheDataSimple ¶
Stores an entry in the cache and sets it to expire after a minute
func SetLogFormatter ¶
func SetLoggingLevel ¶
func SetRedisJson ¶
SetRedisJson marshals the value and runs a set redis command for key
func SetShutdownFunc ¶
func SetShutdownFunc(f func())
func SplitSendMessage ¶ added in v1.25.0
func TableExists ¶
func TryLockRedisKey ¶
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)
Types ¶
type BotServiceDetails ¶
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 ¶
type CPLogEntryLegacy struct { Timestamp int64 `json:"ts"` Action string `json:"action"` TimestampString string `json:"-"` }
func GetCPLogEntriesLegacy ¶
func GetCPLogEntriesLegacy(guild int64) ([]*CPLogEntryLegacy, error)
type ContextHook ¶
type ContextHook struct{}
func (ContextHook) Levels ¶
func (hook ContextHook) Levels() []logrus.Level
type ContextKey ¶
type ContextKey int
const ( ContextKeyRedis ContextKey = iota ContextKeyDiscordSession ContextKeyYagToken ContextKeyTemplateData ContextKeyUser ContextKeyCurrentGuild ContextKeyGuildRoles ContextKeyParsedForm ContextKeyFormOk ContextKeyBotMember ContextKeyBotPermissions ContextKeyHighestBotRole ContextKeyLogger ContextKeyIsPartial ContextKeyUserMember ContextKeyCoreConfig ContextKeyMemberPermissions ContextKeyIsAdmin ContextKeyIsReadOnly )
type DiscordChannels ¶ added in v1.27.0
type DiscordChannels []*discordgo.Channel
Channels are a collection of Channels
func (DiscordChannels) Len ¶ added in v1.27.0
func (r DiscordChannels) Len() int
func (DiscordChannels) Less ¶ added in v1.27.0
func (r DiscordChannels) Less(i, j int) bool
func (DiscordChannels) Swap ¶ added in v1.27.0
func (r DiscordChannels) Swap(i, j int)
type DiscordRoles ¶ added in v1.27.0
type DiscordRoles []*discordgo.Role
func (DiscordRoles) Len ¶ added in v1.27.0
func (r DiscordRoles) Len() int
func (DiscordRoles) Less ¶ added in v1.27.0
func (r DiscordRoles) Less(i, j int) bool
func (DiscordRoles) Swap ¶ added in v1.27.0
func (r DiscordRoles) Swap(i, j int)
type DurationFormatPrecision ¶
type DurationFormatPrecision int
const ( DurationPrecisionSeconds DurationFormatPrecision = iota DurationPrecisionMinutes DurationPrecisionHours DurationPrecisionDays DurationPrecisionWeeks DurationPrecisionYears )
func (DurationFormatPrecision) FromSeconds ¶
func (d DurationFormatPrecision) FromSeconds(in int64) int64
func (DurationFormatPrecision) String ¶
func (d DurationFormatPrecision) String() string
type GORMLogger ¶
type GORMLogger struct { }
func (*GORMLogger) Print ¶
func (g *GORMLogger) Print(v ...interface{})
type GuildWithConnected ¶
type GuildWithConnected struct { *discordgo.UserGuild Connected bool }
func GetGuildsWithConnected ¶
func GetGuildsWithConnected(in []*discordgo.UserGuild) ([]*GuildWithConnected, error)
GetGuildsWithConnected Returns a wrapped guild with connected set
type InviteSource ¶
func ContainsInvite ¶
func ContainsInvite(s string, checkDiscordSource, checkThirdPartySources bool) *InviteSource
type LoggedExecutedCommand ¶
type LoggedExecutedCommand struct { SmallModel 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 ¶
type LoggingTransport struct {
Inner http.RoundTripper
}
type Plugin ¶
type Plugin interface {
PluginInfo() *PluginInfo
}
Plugin represents a plugin, all plugins needs to implement this at a bare minimum
type PluginCategory ¶
type PluginInfo ¶
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 ¶
type PluginWithCommonRun interface {
CommonRun()
}
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{}
type Service ¶
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 ¶
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 ¶
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" )
Source Files ¶
Directories ¶
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 |