Documentation ¶
Overview ¶
this package provides core functionality to yagpdb, important security stuff here
this package provides core functionality to yagpdb, important security stuff here
this package provides core functionality 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 Base64DecodeToString(str string) (string, error)
- func BlockingLockRedisKey(key string, maxTryDuration time.Duration, maxLockDur int) error
- func BoolToPointer(b bool) *bool
- 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 FormatList(list []string, conjunction string) 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 ParseCodeblock(input string) string
- func ParseDuration(str string) (time.Duration, error)
- func RandomAdjective() string
- func RandomNoun() string
- func RandomVerb() 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 GuildWithConnected
- type InviteSource
- type LoggingTransport
- type Plugin
- type PluginCategory
- type PluginInfo
- type PluginWithCommonRun
- type STDLogProxy
- type Service
- type ServiceHost
- type ServiceType
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" 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) ConfHttpProxy = config.RegisterOption("yagpdb.http.proxy", "Proxy Url", "") 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{}/* 4910 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 DomainFinderRegex = regexp.MustCompile(`(?i)(?:[a-z\d](?:[a-z\d-]{0,61}[a-z\d])?\.)+[a-z\d][a-z\d-]{0,61}[a-z\d]`)
var (
ErrMaxLockAttemptsExceeded = errors.New("Max lock attempts exceeded")
)
var ExecutedCommandDBSchemas = []string{`
CREATE TABLE IF NOT EXISTS executed_commands (
id SERIAL PRIMARY KEY,
created_at TIMESTAMP WITH TIME ZONE NOT NULL,
updated_at TIMESTAMP WITH TIME ZONE NOT NULL,
user_id TEXT NOT NULL, -- text not bigint for legacy compatibility
channel_id TEXT NOT NULL,
guild_id TEXT,
command TEXT NOT NULL,
raw_command TEXT NOT NULL,
error TEXT,
time_stamp TIMESTAMP WITH TIME ZONE NOT NULL,
response_time BIGINT NOT NULL
);
`, `
-- Preexisting tables created prior to sqlboiler are missing non-null constraints,
-- so add them retraoctively.
ALTER TABLE executed_commands ALTER COLUMN created_at SET NOT NULL;
`, `
ALTER TABLE executed_commands ALTER COLUMN updated_at SET NOT NULL;
`, `
ALTER TABLE executed_commands ALTER COLUMN user_id SET NOT NULL;
`, `
ALTER TABLE executed_commands ALTER COLUMN channel_id SET NOT NULL;
`, `
ALTER TABLE executed_commands ALTER COLUMN command SET NOT NULL;
`, `
ALTER TABLE executed_commands ALTER COLUMN raw_command SET NOT NULL;
`, `
ALTER TABLE executed_commands ALTER COLUMN time_stamp SET NOT NULL;
`, `
ALTER TABLE executed_commands ALTER COLUMN response_time SET NOT NULL;
`}
var ForwardSlashReplacer = strings.NewReplacer("\\", "")
var LinkRegex = regexp.MustCompile(`(?i)([a-z\d]+://)([\w\W_-]+(?:(?:\.[\w\W_-]+)+))([\w\W.,@?^=%&:/~+#-]*[\w\W@?^=%&/~+#-])`)
var Nouns = []string{}/* 2444 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.PermissionViewChannel: "View Channel", 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.PermissionManageGuild: "Manage Guild", discordgo.PermissionManageWebhooks: "Manage Webhooks", discordgo.PermissionModerateMembers: "Moderate Members / Timeout Members", }
var ThirdpartyDiscordSites = []*InviteSource{ {Name: "discord.me", Regex: regexp.MustCompile(`(?i)discord\.me\/+.+`)}, {Name: "invite.gg", Regex: regexp.MustCompile(`(?i)invite\.gg\/+.+`)}, {Name: "discord.io", Regex: regexp.MustCompile(`(?i)discord\.io\/+.+`)}, {Name: "discord.li", Regex: regexp.MustCompile(`(?i)discord\.li\/+.+`)}, {Name: "disboard.org", Regex: regexp.MustCompile(`(?i)disboard\.org\/+server\/+join\/+.+`)}, {Name: "discordy.com", Regex: regexp.MustCompile(`(?i)discordy\.com\/+server\+.php`)}, }
var UGCHtmlPolicy = bluemonday.NewPolicy().AllowElements("h1", "h2", "h3", "h4", "h5", "h6", "p", "ol", "ul", "li", "dl", "dd", "dt", "blockquote", "table", "thead", "th", "tr", "td", "tbody", "del", "i", "b")
var Verbs = []string{}/* 6056 elements not displayed */
Functions ¶
func AddCPLogEntry ¶
func AddCPLogEntryLegacy ¶
func AddLogHook ¶
func Base64DecodeToString ¶ added in v2.33.0
func BlockingLockRedisKey ¶
BlockingLockRedisKey blocks until it suceeded to lock the key
func BoolToPointer ¶ added in v2.15.2
func BotIsOnGuild ¶
func ChannelOrThreadParentID ¶
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 FormatList ¶ added in v2.2.0
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 ¶
IsRoleAbove returns whether 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 checks by lower id
func KeyGuildChannels ¶
func LoadConfig ¶
func LoadConfig() (err error)
func LogLongCallTime ¶
func MultipleCmds ¶
func MultipleCmds(cmds ...radix.CmdAction) error
func MustParseInt ¶
func ParseCodeblock ¶ added in v2.25.0
parseCodeblock returns the content wrapped in a Discord markdown block. If no (valid) codeblock was found, the given input is returned back.
func ParseDuration ¶
Parses a time string like 1day3h
func RandomAdjective ¶
func RandomAdjective() string
func RandomNoun ¶
func RandomNoun() string
func RandomVerb ¶ added in v2.2.0
func RandomVerb() string
func RegisterDBSchemas ¶
func RegisterPlugin ¶
func RegisterPlugin(plugin Plugin)
RegisterPlugin registers a plugin, should be called when the bot is starting up
func RemoveRoleDS ¶
func RemoveRoleDS(ms *dstate.MemberState, role int64) error
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 ¶
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 ¶
Channels are a collection of Channels
func (DiscordChannels) Len ¶
func (r DiscordChannels) Len() int
func (DiscordChannels) Less ¶
func (r DiscordChannels) Less(i, j int) bool
func (DiscordChannels) Swap ¶
func (r DiscordChannels) Swap(i, j int)
type DiscordRoles ¶
func (DiscordRoles) Len ¶
func (r DiscordRoles) Len() int
func (DiscordRoles) Less ¶
func (r DiscordRoles) Less(i, j int) bool
func (DiscordRoles) Swap ¶
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 GuildWithConnected ¶
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 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 ¶
- adjectives.go
- cache.go
- common.go
- config.go
- contextkeys.go
- coreserverconf.go
- cplogs_legacy.go
- dutil.go
- ensure64bit.go
- executedcommandschema.go
- goutil.go
- invites.go
- local_incr_ids.go
- loghooks.go
- nouns.go
- parseduration.go
- plugins.go
- redislock.go
- redisutils.go
- schemamigration.go
- service.go
- util.go
- verbs.go
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 |