customcommands

package
v1.20.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 28, 2019 License: MIT Imports: 42 Imported by: 0

Documentation

Index

Constants

View Source
const (
	CCMessageExecLimitNormal  = 3
	CCMessageExecLimitPremium = 5
)
View Source
const (
	ReactionModeBoth       = 0
	ReactionModeAddOnly    = 1
	ReactionModeRemoveOnly = 2
)
View Source
const (
	MaxCommands        = 100
	MaxCommandsPremium = 250
	MaxUserMessages    = 20
	MaxGroups          = 50
)

Variables

View Source
var (
	CCExecLock        = keylock.NewKeyLock()
	DelayedCCRunLimit = multiratelimit.NewMultiRatelimiter(0.1, 10)
)
View Source
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);
`}
View Source
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 CalcNextRunTime(cc *models.CustomCommand, now time.Time) time.Time

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 CheckLimits(in ...string) bool

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 DelNextRunEvent(guildID int64, cmdID int64) error

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 KeyCommands(guildID int64) string

func MaxCommandsForContext added in v1.6.0

func MaxCommandsForContext(ctx context.Context) int

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 CCExecKey added in v1.16.0

type CCExecKey struct {
	GuildID int64
	CCID    int64
}

type CacheKey added in v1.14.0

type CacheKey int
const (
	CacheKeyCommands CacheKey = iota
	CacheKeyReactionCommands

	CacheKeyDBLimits
)

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 DelayedRunCCData struct {
	ChannelID int64  `json:"channel_id"`
	CmdID     int64  `json:"cmd_id"`
	UserData  []byte `json:"data"`

	Message *discordgo.Message
	Member  *dstate.MemberState

	UserKey interface{} `json:"user_key"`
}

type DelayedRunLimitKey added in v1.16.0

type DelayedRunLimitKey struct {
	GuildID   int64
	ChannelID int64
}

type GroupForm added in v1.14.0

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"`
}

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) BotInit added in v1.4.1

func (p *Plugin) BotInit()

func (*Plugin) InitWeb

func (p *Plugin) InitWeb()

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
}

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL