Documentation ¶
Overview ¶
this package provides core functinality to yagpdb, important security stuff here
this package provides core functinality to yagpdb, important security stuff here
Code duplicated directly from commands/util.go
Index ¶
- Constants
- Variables
- func AddCPLogEntry(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 ConnectDatadog()
- 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() 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 EscapeEveryoneHere(s string, escapeEveryone, escapeHere bool) string
- func EscapeMentionsFromOutsideSource(s string) string
- func EscapeSpecialMentions(in string) string
- func EscapeSpecialMentionsConditional(s string, allowEveryone, allowHere bool, allowRoles []int64) string
- 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 GetGuild(guildID int64) (guild *discordgo.Guild, err error)
- func GetGuildChannels(guildID int64) (channels []*discordgo.Channel, err error)
- 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 IsDiscordErr(err error, codes ...int) bool
- func IsNumber(v interface{}) bool
- func IsOwner(userID int64) 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 MultipleCmds(cmds ...radix.CmdAction) error
- func MustParseInt(s string) int64
- func ParseDuration(str string) (time.Duration, error)
- func RandomAdjective() string
- func RandomNoun() 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 RetrySendMessage(channel int64, msg interface{}, maxTries int) error
- func RunCommonRunPlugins()
- func SendEmbedWithFallback(s *discordgo.Session, channelID int64, embed *discordgo.MessageEmbed) (*discordgo.Message, error)
- 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 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 CPLogEntry
- type ContextHook
- type ContextKey
- 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 RedisPool *basicredispool.Pool BotSession *discordgo.Session BotUser *discordgo.User RedisPoolSize = 0 Statsd *statsd.Client 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") ConfRedis = config.RegisterOption("yagpdb.redis", "Redis address", "localhost:6379") 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) ConfDogStatsdAddress = config.RegisterOption("yagpdb.dogstatsdaddress", "dogstatsd address", "") 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 CoreServerConfigCache = rcache.NewInt(coreServerConfigCacheFetcher, time.Minute)
var DiscordInviteSource = &InviteSource{ Name: "Discord", Regex: regexp.MustCompile(`(?i)(discord\.gg|discordapp\.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 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[int]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 AddLogHook ¶ added in v1.17.3
func BlockingLockRedisKey ¶
BlockingLockRedisKey blocks until it suceeded to lock the key
func BotIsOnGuild ¶ added in v1.14.0
func ConnectDatadog ¶ added in v1.4.1
func ConnectDatadog()
func ContainsInt64Slice ¶
func ContainsInt64SliceOneOf ¶ added in v1.13.0
ContainsInt64SliceOneOf returns true if slice contains one of search
func ContainsIntSlice ¶ added in v1.11.0
func ContainsStringSlice ¶
func ContainsStringSliceFold ¶
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 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 ¶ added in v1.22.2
func ErrPQIsUniqueViolation ¶ added in v1.10.0
func ErrWithCaller ¶
func EscapeEveryoneHere ¶ added in v1.4.10
EscapeEveryoneHere Escapes an everyone mention, adding a zero width space between the '@' and rest
func EscapeMentionsFromOutsideSource ¶ added in v1.22.1
EscapeMentionsFromOutsideSource adds a zws after all @'s this is to prevent someone abusing discords filtering of certain unicode characters and creating mentions in various ways
func EscapeSpecialMentions ¶
EscapeSpecialMentions Escapes an everyone mention, adding a zero width space between the '@' and rest
func EscapeSpecialMentionsConditional ¶
func EscapeSpecialMentionsConditional(s string, allowEveryone, allowHere bool, allowRoles []int64) string
EscapeSpecialMentionsConditional Escapes an everyone mention, adding a zero width space between the '@' and rest
func FallbackEmbed ¶
func FallbackEmbed(embed *discordgo.MessageEmbed) string
func GenLocalIncrID ¶ added in v1.14.0
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
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 GetBotToken ¶ added in v1.19.0
func GetBotToken() string
func GetCacheData ¶
Items in the cache expire after 1 min
func GetCacheDataJson ¶
func GetCoreServerConfCached ¶ added in v1.17.0
func GetCoreServerConfCached(guildID int64) *models.CoreConfig
func GetFixedPrefixLogger ¶ added in v1.17.3
func GetGuildChannels ¶
GetGuildChannels returns the guilds channels either from cache or api
func GetJoinedServerCount ¶ added in v1.11.2
func GetPluginLogger ¶ added in v1.17.3
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 ¶ added in v1.6.0
func HumanizeTime ¶
func HumanizeTime(precision DurationFormatPrecision, in time.Time) string
func InitSchemas ¶ added in v1.19.7
func IsDiscordErr ¶
IsDiscordErr returns true if this was a discord error and one of the codes matches
func KeyGuildChannels ¶
func LoadConfig ¶
func LoadConfig() (err error)
func LogIgnoreError ¶ added in v1.11.0
func MultipleCmds ¶ added in v1.18.3
func MultipleCmds(cmds ...radix.CmdAction) error
func MustParseInt ¶
func ParseDuration ¶ added in v1.20.17
Parses a time string like 1day3h
func RandomAdjective ¶
func RandomAdjective() string
func RandomNoun ¶ added in v1.22.4
func RandomNoun() string
func RegisterPlugin ¶
func RegisterPlugin(plugin Plugin)
RegisterPlugin registers a plugin, should be called when the bot is starting up
func RemoveRoleDS ¶ added in v1.4.1
func RemoveRoleDS(ms *dstate.MemberState, role int64) error
func ReplaceServerInvites ¶ added in v1.8.1
func RetrySendMessage ¶
func RunCommonRunPlugins ¶ added in v1.20.17
func RunCommonRunPlugins()
RunCommonRunPlugins runs plugins that implement PluginWithCommonRun
func SendEmbedWithFallback ¶
func SendOwnerAlert ¶ added in v1.20.0
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 ¶ added in v1.17.3
func SetLoggingLevel ¶ added in v1.19.6
func SetRedisJson ¶
SetRedisJson marshals the value and runs a set redis command for key
func SetShutdownFunc ¶ added in v1.20.17
func SetShutdownFunc(f func())
func TableExists ¶ added in v1.20.17
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 ¶ 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 CPLogEntry ¶
type CPLogEntry struct { Timestamp int64 `json:"ts"` Action string `json:"action"` TimestampString string `json:"-"` }
func GetCPLogEntries ¶
func GetCPLogEntries(guild int64) ([]*CPLogEntry, 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 ContextKeyTemplateData ContextKeyUser ContextKeyCurrentGuild ContextKeyGuildRoles ContextKeyParsedForm ContextKeyFormOk ContextKeyBotMember ContextKeyBotPermissions ContextKeyHighestBotRole ContextKeyLogger ContextKeyIsPartial ContextKeyUserMember ContextKeyCoreConfig ContextKeyMemberPermissions ContextKeyIsAdmin )
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 ¶ 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
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
func ContainsInvite ¶ added in v1.12.0
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 ¶ added in v1.4.1
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 ¶ added in v1.17.0
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 {
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 ¶ 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" 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 |