Documentation ¶
Index ¶
- Constants
- Variables
- func BotCachedGetCommandsWithMessageTriggers(guildID int64, ctx context.Context) ([]*models.CustomCommand, error)
- func CalcNextRunTime(cc *models.CustomCommand, now time.Time) time.Time
- func CheckGuildDBLimit(gs *dstate.GuildSet) (bool, error)
- func CheckLimits(in ...string) bool
- func CheckMatch(globalPrefix string, cmd *models.CustomCommand, msg string) (match bool, stripped string, args []string)
- func CheckMatchReaction(cmd *models.CustomCommand, reaction *discordgo.MessageReaction, add bool) (match bool)
- func CmdRunsForUser(cc *models.CustomCommand, ms *dstate.MemberState) bool
- func CmdRunsInChannel(cc *models.CustomCommand, channel int64) bool
- func DelNextRunEvent(guildID int64, cmdID int64) error
- func ExecuteCustomCommand(cmd *models.CustomCommand, tmplCtx *templates.Context) error
- func ExecuteCustomCommandFromMessage(gs *dstate.GuildSet, cmd *models.CustomCommand, member *dstate.MemberState, ...) error
- func ExecuteCustomCommandFromReaction(cc *models.CustomCommand, gs *dstate.GuildSet, ms *dstate.MemberState, ...) error
- func FindCommands(ccs []*models.CustomCommand, data *dcmd.Data) (foundCCS []*models.CustomCommand, provided bool)
- func HandleMessageCreate(evt *eventsystem.EventData)
- func KeyCommands(guildID int64) string
- func MaxCommandsForContext(ctx context.Context) int
- func RegisterPlugin()
- func StringCommands(ccs []*models.CustomCommand, gMap map[int64]string) string
- func UpdateCommandNextRunTime(cc *models.CustomCommand, updateLastRun bool, clearOld bool) error
- type CCExecKey
- type CommandTriggerType
- type CustomCommand
- type CustomCommandSlice
- type DelayedRunCCData
- type DelayedRunLimitKey
- type GroupForm
- type LightDBEntry
- type NextRunScheduledEvent
- type ParsedArgs
- type Plugin
- func (p *Plugin) AddCommands()
- func (p *Plugin) AllFeatureFlags() []string
- func (p *Plugin) BotInit()
- func (p *Plugin) InitWeb()
- func (p *Plugin) LoadServerHomeWidget(w http.ResponseWriter, r *http.Request) (web.TemplateData, error)
- func (p *Plugin) PluginInfo() *common.PluginInfo
- func (p *Plugin) UpdateFeatureFlags(guildID int64) ([]string, error)
- type TriggeredCC
Constants ¶
const ( CCMessageExecLimitNormal = 3 CCMessageExecLimitPremium = 5 )
const ( ReactionModeBoth = 0 ReactionModeAddOnly = 1 ReactionModeRemoveOnly = 2 )
const ( MaxCommands = 100 MaxCommandsPremium = 250 MaxUserMessages = 20 MaxGroups = 50 )
const RunCmdCooldownSeconds = 5
Variables ¶
var ( CCExecLock = keylock.NewKeyLock() DelayedCCRunLimit = multiratelimit.NewMultiRatelimiter(0.1, 10) )
var ( AllTriggerTypes = []CommandTriggerType{ CommandTriggerCommand, CommandTriggerStartsWith, CommandTriggerContains, CommandTriggerRegex, CommandTriggerExact, CommandTriggerInterval, CommandTriggerReaction, } )
var DBSchemas = []string{`
CREATE TABLE IF NOT EXISTS custom_command_groups (
id BIGSERIAL PRIMARY KEY,
guild_id BIGINT NOT NULL,
name TEXT NOT NULL,
ignore_roles BIGINT[],
ignore_channels BIGINT[],
whitelist_roles BIGINT[],
whitelist_channels BIGINT[]
);
`, `
CREATE TABLE IF NOT EXISTS custom_commands (
local_id BIGINT NOT NULL,
guild_id BIGINT NOT NULL,
group_id BIGINT references custom_command_groups(id) ON DELETE SET NULL,
trigger_type INT NOT NULL,
text_trigger TEXT NOT NULL,
text_trigger_case_sensitive BOOL NOT NULL,
time_trigger_interval INT NOT NULL,
time_trigger_excluding_days SMALLINT[] NOT NULL,
time_trigger_excluding_hours SMALLINT[] NOT NULL,
last_run TIMESTAMP WITH TIME ZONE,
next_run TIMESTAMP WITH TIME ZONE,
responses TEXT[] NOT NULL,
channels BIGINT[],
channels_whitelist_mode BOOL NOT NULL,
roles BIGINT[],
roles_whitelist_mode BOOL NOT NULL,
PRIMARY KEY(guild_id, local_id)
);
`, `
CREATE INDEX IF NOT EXISTS custom_commands_guild_idx ON custom_commands(guild_id);
`, `
CREATE INDEX IF NOT EXISTS custom_commands_next_run_idx ON custom_commands(next_run);
`, `
ALTER TABLE custom_commands ADD COLUMN IF NOT EXISTS context_channel BIGINT NOT NULL DEFAULT 0;
`, `
ALTER TABLE custom_commands ADD COLUMN IF NOT EXISTS reaction_trigger_mode SMALLINT NOT NULL DEFAULT 0;
`, `
ALTER TABLE custom_commands ADD COLUMN IF NOT EXISTS last_error TEXT NOT NULL DEFAULT '';
`, `
ALTER TABLE custom_commands ADD COLUMN IF NOT EXISTS last_error_time TIMESTAMP WITH TIME ZONE;
`, `
ALTER TABLE custom_commands ADD COLUMN IF NOT EXISTS run_count INT NOT NULL DEFAULT 0;
`, `
ALTER TABLE custom_commands ADD COLUMN IF NOT EXISTS show_errors BOOLEAN NOT NULL DEFAULT true;
`, `
ALTER TABLE custom_commands ADD COLUMN IF NOT EXISTS disabled BOOLEAN NOT NULL DEFAULT false;
`, `
CREATE TABLE IF NOT EXISTS templates_user_database (
id BIGSERIAL PRIMARY KEY,
created_at TIMESTAMP WITH TIME ZONE NOT NULL,
updated_at TIMESTAMP WITH TIME ZONE NOT NULL,
expires_at TIMESTAMP WITH TIME ZONE,
guild_id BIGINT NOT NULL,
user_id BIGINT NOT NULL,
key TEXT NOT NULL,
value_num DOUBLE PRECISION NOT NULL,
value_raw BYTEA NOT NULL,
UNIQUE(guild_id, user_id, key)
);
`, `
CREATE INDEX IF NOT EXISTS templates_user_database_combined_idx ON templates_user_database (guild_id, user_id, key, value_num);
`, `
CREATE INDEX IF NOT EXISTS templates_user_database_expires_idx ON templates_user_database (expires_at);
`}
var (
RegexCache = *ccache.New(ccache.Configure())
)
Functions ¶
func CalcNextRunTime ¶
CalcNextRunTime calculates the next run time for a custom command using the last ran time
func CheckGuildDBLimit ¶
returns true if were above db limit for the specified guild
func CheckLimits ¶
func CheckMatch ¶
func CheckMatch(globalPrefix string, cmd *models.CustomCommand, msg string) (match bool, stripped string, args []string)
CheckMatch returns true if the given cmd matches, as well as the arguments following the command trigger (arg 0 being the message up to, and including, the trigger).
func CheckMatchReaction ¶
func CheckMatchReaction(cmd *models.CustomCommand, reaction *discordgo.MessageReaction, add bool) (match bool)
func CmdRunsForUser ¶
func CmdRunsForUser(cc *models.CustomCommand, ms *dstate.MemberState) bool
func CmdRunsInChannel ¶
func CmdRunsInChannel(cc *models.CustomCommand, channel int64) bool
func DelNextRunEvent ¶
func ExecuteCustomCommand ¶
func ExecuteCustomCommand(cmd *models.CustomCommand, tmplCtx *templates.Context) error
func ExecuteCustomCommand(cmd *models.CustomCommand, cmdArgs []string, stripped string, s *discordgo.Session, m *discordgo.MessageCreate) (resp string, tmplCtx *templates.Context, err error) {
func ExecuteCustomCommandFromReaction ¶
func ExecuteCustomCommandFromReaction(cc *models.CustomCommand, gs *dstate.GuildSet, ms *dstate.MemberState, cs *dstate.ChannelState, reaction *discordgo.MessageReaction, added bool, message *discordgo.Message) error
func FindCommands ¶
func FindCommands(ccs []*models.CustomCommand, data *dcmd.Data) (foundCCS []*models.CustomCommand, provided bool)
func HandleMessageCreate ¶
func HandleMessageCreate(evt *eventsystem.EventData)
func KeyCommands ¶
func MaxCommandsForContext ¶
func RegisterPlugin ¶
func RegisterPlugin()
func StringCommands ¶
func StringCommands(ccs []*models.CustomCommand, gMap map[int64]string) string
func UpdateCommandNextRunTime ¶
func UpdateCommandNextRunTime(cc *models.CustomCommand, updateLastRun bool, clearOld bool) error
TODO: Run this all in a transaction?
Types ¶
type CommandTriggerType ¶
type CommandTriggerType int
const ( CommandTriggerNone CommandTriggerType = 10 CommandTriggerCommand CommandTriggerType = 0 CommandTriggerStartsWith CommandTriggerType = 1 CommandTriggerContains CommandTriggerType = 2 CommandTriggerRegex CommandTriggerType = 3 CommandTriggerExact CommandTriggerType = 4 CommandTriggerReaction CommandTriggerType = 6 CommandTriggerInterval CommandTriggerType = 5 )
func (CommandTriggerType) String ¶
func (t CommandTriggerType) String() string
type CustomCommand ¶
type CustomCommand struct { TriggerType CommandTriggerType `json:"trigger_type"` TriggerTypeForm string `json:"-" schema:"type"` Trigger string `json:"trigger" schema:"trigger" valid:",0,1000"` // TODO: Retire the legacy Response field. Response string `json:"response,omitempty" schema:"response" valid:"template,10000"` Responses []string `json:"responses" schema:"responses" valid:"template,10000"` CaseSensitive bool `json:"case_sensitive" schema:"case_sensitive"` ID int64 `json:"id"` ContextChannel int64 `schema:"context_channel" valid:"channel,true"` TimeTriggerInterval int `schema:"time_trigger_interval"` TimeTriggerExcludingDays []int64 `schema:"time_trigger_excluding_days"` TimeTriggerExcludingHours []int64 `schema:"time_trigger_excluding_hours"` ReactionTriggerMode int `schema:"reaction_trigger_mode"` // If set, then the following channels are required, otherwise they are ignored RequireChannels bool `json:"require_channels" schema:"require_channels"` Channels []int64 `json:"channels" schema:"channels"` // If set, then one of the following channels are required, otherwise they are ignored RequireRoles bool `json:"require_roles" schema:"require_roles"` Roles []int64 `json:"roles" schema:"roles"` GroupID int64 ShowErrors bool `schema:"show_errors"` }
func LegacyGetCommands ¶
func LegacyGetCommands(guild int64) ([]*CustomCommand, int64, error)
func (*CustomCommand) Migrate ¶
func (cc *CustomCommand) Migrate() *CustomCommand
Migrate modifies a CustomCommand to remove legacy fields.
func (*CustomCommand) ToDBModel ¶
func (cc *CustomCommand) ToDBModel() *models.CustomCommand
func (*CustomCommand) Validate ¶
func (cc *CustomCommand) Validate(tmpl web.TemplateData) (ok bool)
type CustomCommandSlice ¶
type CustomCommandSlice []*CustomCommand
func (CustomCommandSlice) Len ¶
func (c CustomCommandSlice) Len() int
Len is the number of elements in the collection.
func (CustomCommandSlice) Less ¶
func (c CustomCommandSlice) Less(i, j int) bool
Less reports whether the element with index i should sort before the element with index j.
func (CustomCommandSlice) Swap ¶
func (c CustomCommandSlice) Swap(i, j int)
Swap swaps the elements with indexes i and j.
type DelayedRunCCData ¶
type DelayedRunLimitKey ¶
type GroupForm ¶
type GroupForm struct { ID int64 Name string `valid:",100"` WhitelistChannels []int64 `valid:"channel,true"` BlacklistChannels []int64 `valid:"channel,true"` WhitelistRoles []int64 `valid:"role,true"` BlacklistRoles []int64 `valid:"role,true"` }
GroupForm is the form bindings used when creating or updating groups
type LightDBEntry ¶
type LightDBEntry struct { ID int64 GuildID int64 UserID int64 CreatedAt time.Time UpdatedAt time.Time Key string Value interface{} User discordgo.User ExpiresAt time.Time }
func ToLightDBEntry ¶
func ToLightDBEntry(m *models.TemplatesUserDatabase) (*LightDBEntry, error)
type NextRunScheduledEvent ¶
type NextRunScheduledEvent struct {
CmdID int64 `json:"cmd_id"`
}
type ParsedArgs ¶
type ParsedArgs struct {
// contains filtered or unexported fields
}
func (*ParsedArgs) Get ¶
func (pa *ParsedArgs) Get(index int) interface{}
func (*ParsedArgs) IsSet ¶
func (pa *ParsedArgs) IsSet(index int) interface{}
type Plugin ¶
type Plugin struct{}
func (*Plugin) AddCommands ¶
func (p *Plugin) AddCommands()
func (*Plugin) AllFeatureFlags ¶
func (*Plugin) LoadServerHomeWidget ¶
func (p *Plugin) LoadServerHomeWidget(w http.ResponseWriter, r *http.Request) (web.TemplateData, error)
func (*Plugin) PluginInfo ¶
func (p *Plugin) PluginInfo() *common.PluginInfo
type TriggeredCC ¶
type TriggeredCC struct { CC *models.CustomCommand Stripped string Args []string }