Documentation ¶
Index ¶
- Constants
- Variables
- func BotCachedGetCommandsWithMessageTriggers(gs *dstate.GuildState, ctx context.Context) ([]*models.CustomCommand, error)
- func CalcNextRunTime(cc *models.CustomCommand, now time.Time) time.Time
- func CheckGuildDBLimit(gs *dstate.GuildState) (bool, error)
- func CheckIntervalLimits(ctx context.Context, guildID int64, cmdID int64, templateData web.TemplateData) (ok bool, err 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(cmd *models.CustomCommand, member *dstate.MemberState, cs *dstate.ChannelState, ...) error
- func ExecuteCustomCommandFromReaction(cc *models.CustomCommand, ms *dstate.MemberState, cs *dstate.ChannelState, ...) error
- func FindCommands(ccs []*models.CustomCommand, data *dcmd.Data) (foundCCS []*models.CustomCommand, provided bool)
- func HandleCommands(w http.ResponseWriter, r *http.Request) (web.TemplateData, error)
- func HandleDeleteCommand(w http.ResponseWriter, r *http.Request) (web.TemplateData, error)
- func HandleDeleteGroup(w http.ResponseWriter, r *http.Request) (web.TemplateData, error)
- func HandleGetCommandsGroup(w http.ResponseWriter, r *http.Request) (web.TemplateData, error)
- func HandleMessageCreate(evt *eventsystem.EventData)
- func HandleNewCommand(w http.ResponseWriter, r *http.Request) (web.TemplateData, error)
- func HandleNewGroup(w http.ResponseWriter, r *http.Request) (web.TemplateData, error)
- func HandleUpdateCommand(w http.ResponseWriter, r *http.Request) (web.TemplateData, error)
- func HandleUpdateGroup(w http.ResponseWriter, r *http.Request) (web.TemplateData, error)
- func KeyCommands(guildID int64) string
- func MaxCommandsForContext(ctx context.Context) int
- func RegisterPlugin()
- func ServeGroupSelected(r *http.Request, templateData web.TemplateData, groupID int64, guildID int64) (web.TemplateData, error)
- func StringCommands(ccs []*models.CustomCommand) string
- func UpdateCommandNextRunTime(cc *models.CustomCommand, updateLastRun bool) error
- type CCExecKey
- type CacheKey
- type CommandTriggerType
- type CustomCommand
- type CustomCommandSlice
- type DelayedRunCCData
- type DelayedRunLimitKey
- type GroupForm
- type LightDBEntry
- type NextRunScheduledEvent
- type ParsedArgs
- type Plugin
- type TriggeredCC
Constants ¶
const ( CCMessageExecLimitNormal = 3 CCMessageExecLimitPremium = 5 )
const ( ReactionModeBoth = 0 ReactionModeAddOnly = 1 ReactionModeRemoveOnly = 2 )
const ( MaxCommands = 100 MaxCommandsPremium = 250 MaxUserMessages = 20 MaxGroups = 50 )
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;
`, `
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 BotCachedGetCommandsWithMessageTriggers ¶ added in v1.14.0
func BotCachedGetCommandsWithMessageTriggers(gs *dstate.GuildState, ctx context.Context) ([]*models.CustomCommand, error)
func CalcNextRunTime ¶ added in v1.14.0
func CheckGuildDBLimit ¶ added in v1.17.0
func CheckGuildDBLimit(gs *dstate.GuildState) (bool, error)
returns true if were above db limit for the specified guild
func CheckIntervalLimits ¶ added in v1.14.0
func CheckIntervalLimits(ctx context.Context, guildID int64, cmdID int64, templateData web.TemplateData) (ok bool, err error)
allow for max 5 triggers with intervals of less than 10 minutes
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 ¶ added in v1.20.0
func CheckMatchReaction(cmd *models.CustomCommand, reaction *discordgo.MessageReaction, add bool) (match bool)
func CmdRunsForUser ¶ added in v1.14.0
func CmdRunsForUser(cc *models.CustomCommand, ms *dstate.MemberState) bool
func CmdRunsInChannel ¶ added in v1.14.0
func CmdRunsInChannel(cc *models.CustomCommand, channel int64) bool
func DelNextRunEvent ¶ added in v1.14.0
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 ExecuteCustomCommandFromMessage ¶ added in v1.14.0
func ExecuteCustomCommandFromMessage(cmd *models.CustomCommand, member *dstate.MemberState, cs *dstate.ChannelState, cmdArgs []string, stripped string, m *discordgo.Message) error
func ExecuteCustomCommandFromReaction ¶ added in v1.20.0
func ExecuteCustomCommandFromReaction(cc *models.CustomCommand, 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 HandleCommands ¶
func HandleCommands(w http.ResponseWriter, r *http.Request) (web.TemplateData, error)
func HandleDeleteCommand ¶
func HandleDeleteCommand(w http.ResponseWriter, r *http.Request) (web.TemplateData, error)
func HandleDeleteGroup ¶ added in v1.14.0
func HandleDeleteGroup(w http.ResponseWriter, r *http.Request) (web.TemplateData, error)
func HandleGetCommandsGroup ¶ added in v1.14.0
func HandleGetCommandsGroup(w http.ResponseWriter, r *http.Request) (web.TemplateData, error)
func HandleMessageCreate ¶
func HandleMessageCreate(evt *eventsystem.EventData)
func HandleNewCommand ¶
func HandleNewCommand(w http.ResponseWriter, r *http.Request) (web.TemplateData, error)
func HandleNewGroup ¶ added in v1.14.0
func HandleNewGroup(w http.ResponseWriter, r *http.Request) (web.TemplateData, error)
func HandleUpdateCommand ¶
func HandleUpdateCommand(w http.ResponseWriter, r *http.Request) (web.TemplateData, error)
func HandleUpdateGroup ¶ added in v1.14.0
func HandleUpdateGroup(w http.ResponseWriter, r *http.Request) (web.TemplateData, error)
func KeyCommands ¶
func MaxCommandsForContext ¶ added in v1.6.0
func RegisterPlugin ¶
func RegisterPlugin()
func ServeGroupSelected ¶ added in v1.14.0
func ServeGroupSelected(r *http.Request, templateData web.TemplateData, groupID int64, guildID int64) (web.TemplateData, error)
func StringCommands ¶
func StringCommands(ccs []*models.CustomCommand) string
func UpdateCommandNextRunTime ¶ added in v1.14.0
func UpdateCommandNextRunTime(cc *models.CustomCommand, updateLastRun bool) error
TODO: Run this all in a transaction?
Types ¶
type CommandTriggerType ¶
type CommandTriggerType int
const ( CommandTriggerCommand CommandTriggerType = 0 CommandTriggerStartsWith CommandTriggerType = 1 CommandTriggerContains CommandTriggerType = 2 CommandTriggerRegex CommandTriggerType = 3 CommandTriggerExact CommandTriggerType = 4 CommandTriggerReaction CommandTriggerType = 6 CommandTriggerInterval CommandTriggerType = 5 )
func TriggerTypeFromForm ¶
func TriggerTypeFromForm(str string) CommandTriggerType
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 }
func LegacyGetCommands ¶ added in v1.14.0
func LegacyGetCommands(guild int64) ([]*CustomCommand, int64, error)
func (*CustomCommand) Migrate ¶ added in v0.29.1
func (cc *CustomCommand) Migrate() *CustomCommand
Migrate modifies a CustomCommand to remove legacy fields.
func (*CustomCommand) ToDBModel ¶ added in v1.14.0
func (cc *CustomCommand) ToDBModel() *models.CustomCommand
func (*CustomCommand) Validate ¶ added in v1.14.0
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 ¶ added in v1.16.0
type DelayedRunLimitKey ¶ added in v1.16.0
type LightDBEntry ¶ added in v1.17.0
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 ¶ added in v1.17.0
func ToLightDBEntry(m *models.TemplatesUserDatabase) (*LightDBEntry, error)
type NextRunScheduledEvent ¶ added in v1.14.0
type NextRunScheduledEvent struct {
CmdID int64 `json:"cmd_id"`
}
type ParsedArgs ¶ added in v1.12.0
type ParsedArgs struct {
// contains filtered or unexported fields
}
func (*ParsedArgs) Get ¶ added in v1.12.0
func (pa *ParsedArgs) Get(index int) interface{}
func (*ParsedArgs) IsSet ¶ added in v1.12.0
func (pa *ParsedArgs) IsSet(index int) interface{}
type Plugin ¶
type Plugin struct{}
func (*Plugin) AddCommands ¶ added in v1.4.1
func (p *Plugin) AddCommands()
func (*Plugin) LoadServerHomeWidget ¶ added in v1.17.0
func (p *Plugin) LoadServerHomeWidget(w http.ResponseWriter, r *http.Request) (web.TemplateData, error)
func (*Plugin) PluginInfo ¶ added in v1.17.0
func (p *Plugin) PluginInfo() *common.PluginInfo
type TriggeredCC ¶ added in v1.20.0
type TriggeredCC struct { CC *models.CustomCommand Stripped string Args []string }