state

package
v0.1.2 Latest Latest
Warning

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

Go to latest
Published: Feb 11, 2020 License: Apache-2.0 Imports: 8 Imported by: 21

Documentation

Overview

Package state provides interfaces for a local or remote state, as well as abstractions around the REST API and Gateway events.

Index

Constants

This section is empty.

Variables

View Source
var (
	MaxFetchMembers uint = 1000
	MaxFetchGuilds  uint = 100
)
View Source
var ErrStoreNotFound = errors.New("item not found in store")

ErrStoreNotFound is an error that a store can use to return when something isn't in the storage. There is no strict restrictions on what uses this (the default one does, though), so be advised.

Functions

This section is empty.

Types

type DefaultStore

type DefaultStore struct {
	*DefaultStoreOptions
	// contains filtered or unexported fields
}

func NewDefaultStore

func NewDefaultStore(opts *DefaultStoreOptions) *DefaultStore

func (*DefaultStore) Channel

func (s *DefaultStore) Channel(id discord.Snowflake) (*discord.Channel, error)

func (*DefaultStore) ChannelRemove

func (s *DefaultStore) ChannelRemove(channel *discord.Channel) error

func (*DefaultStore) ChannelSet

func (s *DefaultStore) ChannelSet(channel *discord.Channel) error

func (*DefaultStore) Channels

func (s *DefaultStore) Channels(
	guildID discord.Snowflake) ([]discord.Channel, error)

func (*DefaultStore) Emoji

func (s *DefaultStore) Emoji(
	guildID, emojiID discord.Snowflake) (*discord.Emoji, error)

func (*DefaultStore) EmojiSet

func (s *DefaultStore) EmojiSet(
	guildID discord.Snowflake, emojis []discord.Emoji) error

func (*DefaultStore) Emojis

func (s *DefaultStore) Emojis(
	guildID discord.Snowflake) ([]discord.Emoji, error)

func (*DefaultStore) Guild

func (s *DefaultStore) Guild(id discord.Snowflake) (*discord.Guild, error)

func (*DefaultStore) GuildRemove

func (s *DefaultStore) GuildRemove(id discord.Snowflake) error

func (*DefaultStore) GuildSet

func (s *DefaultStore) GuildSet(guild *discord.Guild) error

func (*DefaultStore) Guilds

func (s *DefaultStore) Guilds() ([]discord.Guild, error)

func (*DefaultStore) MaxMessages added in v0.0.3

func (s *DefaultStore) MaxMessages() int

func (*DefaultStore) Me added in v0.1.2

func (s *DefaultStore) Me() (*discord.User, error)

func (*DefaultStore) Member

func (s *DefaultStore) Member(
	guildID, userID discord.Snowflake) (*discord.Member, error)

func (*DefaultStore) MemberRemove

func (s *DefaultStore) MemberRemove(guildID, userID discord.Snowflake) error

func (*DefaultStore) MemberSet

func (s *DefaultStore) MemberSet(
	guildID discord.Snowflake, member *discord.Member) error

func (*DefaultStore) Members

func (s *DefaultStore) Members(
	guildID discord.Snowflake) ([]discord.Member, error)

func (*DefaultStore) Message

func (s *DefaultStore) Message(
	channelID, messageID discord.Snowflake) (*discord.Message, error)

func (*DefaultStore) MessageRemove

func (s *DefaultStore) MessageRemove(
	channelID, messageID discord.Snowflake) error

func (*DefaultStore) MessageSet

func (s *DefaultStore) MessageSet(message *discord.Message) error

func (*DefaultStore) Messages

func (s *DefaultStore) Messages(
	channelID discord.Snowflake) ([]discord.Message, error)

func (*DefaultStore) MyselfSet added in v0.1.2

func (s *DefaultStore) MyselfSet(me *discord.User) error

func (*DefaultStore) Presence

func (s *DefaultStore) Presence(
	guildID, userID discord.Snowflake) (*discord.Presence, error)

func (*DefaultStore) PresenceRemove

func (s *DefaultStore) PresenceRemove(guildID, userID discord.Snowflake) error

func (*DefaultStore) PresenceSet

func (s *DefaultStore) PresenceSet(
	guildID discord.Snowflake, presence *discord.Presence) error

func (*DefaultStore) Presences

func (s *DefaultStore) Presences(
	guildID discord.Snowflake) ([]discord.Presence, error)

func (*DefaultStore) PrivateChannels

func (s *DefaultStore) PrivateChannels() ([]discord.Channel, error)

func (*DefaultStore) Reset

func (s *DefaultStore) Reset() error

func (*DefaultStore) Role

func (s *DefaultStore) Role(
	guildID, roleID discord.Snowflake) (*discord.Role, error)

func (*DefaultStore) RoleRemove

func (s *DefaultStore) RoleRemove(guildID, roleID discord.Snowflake) error

func (*DefaultStore) RoleSet

func (s *DefaultStore) RoleSet(
	guildID discord.Snowflake, role *discord.Role) error

func (*DefaultStore) Roles

func (s *DefaultStore) Roles(
	guildID discord.Snowflake) ([]discord.Role, error)

type DefaultStoreOptions

type DefaultStoreOptions struct {
	MaxMessages uint // default 50
}

type State

type State struct {
	*session.Session
	Store

	// Ready is not updated by the state.
	Ready gateway.ReadyEvent

	// StateLog logs all errors that come from the state cache. This includes
	// not found errors. Defaults to a no-op, as state errors aren't that
	// important.
	StateLog func(error)

	// PreHandler is the manual hook that is executed before the State handler
	// is. This should only be used for low-level operations.
	// It's recommended to set Synchronous to true if you mutate the events.
	PreHandler *handler.Handler // default nil
	// contains filtered or unexported fields
}

func New

func New(token string) (*State, error)

func NewFromSession

func NewFromSession(s *session.Session, store Store) (*State, error)

func NewWithStore

func NewWithStore(token string, store Store) (*State, error)

func (*State) AuthorColor added in v0.0.7

func (s *State) AuthorColor(message discord.Message) discord.Color

func (*State) AuthorDisplayName added in v0.0.7

func (s *State) AuthorDisplayName(message discord.Message) string

func (*State) Channel

func (s *State) Channel(id discord.Snowflake) (*discord.Channel, error)

func (*State) Channels

func (s *State) Channels(guildID discord.Snowflake) ([]discord.Channel, error)

func (*State) Emoji

func (s *State) Emoji(
	guildID, emojiID discord.Snowflake) (*discord.Emoji, error)

func (*State) Emojis

func (s *State) Emojis(guildID discord.Snowflake) ([]discord.Emoji, error)

func (*State) Guild

func (s *State) Guild(id discord.Snowflake) (*discord.Guild, error)

func (*State) Guilds

func (s *State) Guilds() ([]discord.Guild, error)

Guilds will only fill a maximum of 100 guilds from the API.

func (*State) Me added in v0.1.2

func (s *State) Me() (*discord.User, error)

func (*State) Member

func (s *State) Member(
	guildID, userID discord.Snowflake) (*discord.Member, error)

func (*State) MemberColor added in v0.0.7

func (s *State) MemberColor(guildID, userID discord.Snowflake) discord.Color

func (*State) MemberDisplayName added in v0.0.7

func (s *State) MemberDisplayName(
	guildID, userID discord.Snowflake) (string, error)

func (*State) Members

func (s *State) Members(guildID discord.Snowflake) ([]discord.Member, error)

func (*State) Message

func (s *State) Message(
	channelID, messageID discord.Snowflake) (*discord.Message, error)

func (*State) Messages

func (s *State) Messages(channelID discord.Snowflake) ([]discord.Message, error)

Messages fetches maximum 100 messages from the API, if it has to. There is no limit if it's from the State storage.

func (*State) Permissions

func (s *State) Permissions(
	channelID, userID discord.Snowflake) (discord.Permissions, error)

func (*State) Presence

func (s *State) Presence(
	guildID, userID discord.Snowflake) (*discord.Presence, error)

func (*State) Presences

func (s *State) Presences(
	guildID discord.Snowflake) ([]discord.Presence, error)

func (*State) Role

func (s *State) Role(
	guildID, roleID discord.Snowflake) (*discord.Role, error)

func (*State) Roles

func (s *State) Roles(guildID discord.Snowflake) ([]discord.Role, error)

func (*State) Unhook

func (s *State) Unhook()

Unhook removes all state handlers from the session handlers.

type Store

type Store interface {
	StoreGetter
	StoreModifier
}

Store is the state storage. It should handle mutex itself, and it should only concern itself with the local state.

type StoreGetter

type StoreGetter interface {
	Me() (*discord.User, error)

	Channel(id discord.Snowflake) (*discord.Channel, error)
	Channels(guildID discord.Snowflake) ([]discord.Channel, error)
	PrivateChannels() ([]discord.Channel, error)

	Emoji(guildID, emojiID discord.Snowflake) (*discord.Emoji, error)
	Emojis(guildID discord.Snowflake) ([]discord.Emoji, error)

	Guild(id discord.Snowflake) (*discord.Guild, error)
	Guilds() ([]discord.Guild, error)

	Member(guildID, userID discord.Snowflake) (*discord.Member, error)
	Members(guildID discord.Snowflake) ([]discord.Member, error)

	Message(channelID, messageID discord.Snowflake) (*discord.Message, error)
	Messages(channelID discord.Snowflake) ([]discord.Message, error)
	MaxMessages() int // used to know if the state is filled or not.

	// These don't get fetched from the API, it's Gateway only.
	Presence(guildID, userID discord.Snowflake) (*discord.Presence, error)
	Presences(guildID discord.Snowflake) ([]discord.Presence, error)

	Role(guildID, roleID discord.Snowflake) (*discord.Role, error)
	Roles(guildID discord.Snowflake) ([]discord.Role, error)
}

All methods in StoreGetter will be wrapped by the State. If the State can't find anything in the storage, it will call the API itself and automatically add what's missing into the storage.

Methods that return with a slice should pay attention to race conditions that would mutate the underlying slice (and as a result the returned slice as well). The best way to avoid this is to copy the whole slice, like DefaultStore does.

type StoreModifier

type StoreModifier interface {
	MyselfSet(me *discord.User) error

	// ChannelSet should switch on Type to know if it's a private channel or
	// not.
	ChannelSet(*discord.Channel) error
	ChannelRemove(*discord.Channel) error

	EmojiSet(guildID discord.Snowflake, emojis []discord.Emoji) error

	GuildSet(*discord.Guild) error
	GuildRemove(id discord.Snowflake) error

	MemberSet(guildID discord.Snowflake, member *discord.Member) error
	MemberRemove(guildID, userID discord.Snowflake) error

	MessageSet(*discord.Message) error
	MessageRemove(channelID, messageID discord.Snowflake) error

	PresenceSet(guildID discord.Snowflake, presence *discord.Presence) error
	PresenceRemove(guildID, userID discord.Snowflake) error

	RoleSet(guildID discord.Snowflake, role *discord.Role) error
	RoleRemove(guildID, roleID discord.Snowflake) error

	// This should reset all the state to zero/null.
	Reset() error
}

Jump to

Keyboard shortcuts

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