Documentation
¶
Index ¶
- Constants
- func AwaitingReplyToPath(awaitingReplyTo string) string
- func AwaitingReplyToQuery(awaitingReplyTo string) string
- func GetJSONVar(chat BotChatData, key string, into any) error
- func NewChatID(botID, botChatID string) string
- func SetJSONVar(chat BotChatData, key string, value any) error
- type AppUserAdapter
- type AppUserData
- type BotBaseData
- func (e *BotBaseData) EnsureTimestamps(now time.Time)
- func (e *BotBaseData) GetAppUserID() string
- func (e *BotBaseData) IsAccessGranted() bool
- func (e *BotBaseData) SetAccessGranted(value bool) bool
- func (e *BotBaseData) SetAppUserID(s string)
- func (e *BotBaseData) SetUpdatedTime(v time.Time)
- func (e *BotBaseData) Validate() error
- type BotChatData
- type ChatBaseData
- func (e *ChatBaseData) AddClientLanguage(languageCode string) (changed bool)
- func (e *ChatBaseData) AddWizardParam(key, value string)
- func (e *ChatBaseData) Base() *ChatBaseData
- func (v *ChatBaseData) DelVar(key string)
- func (e *ChatBaseData) GetAwaitingReplyTo() string
- func (e *ChatBaseData) GetPreferredLanguage() string
- func (v *ChatBaseData) GetVar(key string) string
- func (e *ChatBaseData) GetWizardParam(key string) string
- func (v *ChatBaseData) HasChangedVars() bool
- func (e *ChatBaseData) IsAwaitingReplyTo(code string) bool
- func (e *ChatBaseData) IsChanged() bool
- func (e *ChatBaseData) IsGroupChat() bool
- func (e *ChatBaseData) PopStepsFromAwaitingReplyUpToSpecificParent(step string)
- func (e *ChatBaseData) PushStepToAwaitingReplyTo(step string)
- func (e *ChatBaseData) SetAwaitingReplyTo(value string)
- func (e *ChatBaseData) SetBotUserID(id interface{})
- func (e *ChatBaseData) SetDtLastInteraction(v time.Time)
- func (e *ChatBaseData) SetDtUpdateToNow()
- func (e *ChatBaseData) SetIsGroupChat(v bool)
- func (e *ChatBaseData) SetPreferredLanguage(value string)
- func (v *ChatBaseData) SetVar(key, value string)
- func (e *ChatBaseData) Validate() error
- type ChatKey
- type PlatformUserBaseDbo
- type PlatformUserData
- type PreferredLocaleHolder
- type UserNamesHolder
- type WithAccessGrantedFlag
- type WithBotIDs
- type WithBotUserIDs
- type WithRequiredBotIDs
Constants ¶
const ( // AwaitingReplyToPathSeparator separates parts of the command state AwaitingReplyToPathSeparator = "/" // AwaitingReplyToPath2QuerySeparator separates path and query parts of state AwaitingReplyToPath2QuerySeparator = "?" // AwaitingReplyToParamsSeparator separates params of command state AwaitingReplyToParamsSeparator = "&" )
Variables ¶
This section is empty.
Functions ¶
func AwaitingReplyToPath ¶
AwaitingReplyToPath returns just path part of command state
func AwaitingReplyToQuery ¶
AwaitingReplyToQuery returns just query part of command state
func GetJSONVar ¶ added in v0.11.0
func GetJSONVar(chat BotChatData, key string, into any) error
GetJSONVar retrieves the JSON string stored under key and unmarshals it into into. Returns nil without touching into when the key is absent or empty. Callers must pass a non-nil pointer as into, just like json.Unmarshal.
func SetJSONVar ¶ added in v0.11.0
func SetJSONVar(chat BotChatData, key string, value any) error
SetJSONVar marshals value to JSON and stores it under key using SetVar. Returns an error if marshalling fails.
Types ¶
type AppUserAdapter ¶ added in v0.4.0
type AppUserAdapter interface {
// SetBotUserID associates bot user ID with an app user record
SetBotUserID(platform, botID, botUserID string)
// UserNamesHolder is an interface to set and get user's names.
UserNamesHolder
// PreferredLocaleHolder is an interface to set and get preferred locale
PreferredLocaleHolder
}
type AppUserData ¶ added in v0.0.5
type AppUserData interface {
// BotsFwAdapter returns to bots framework an adapter to app user data record.
// Using an adapter ensures there is no clashes between bots framework interfaces and app user struct.
BotsFwAdapter() AppUserAdapter
}
AppUserData is a record where information about app user is stored. Bots can use it to store information about a user like names, preferred locale.
type BotBaseData ¶
type BotBaseData struct {
//user.OwnedByUserWithID
AppUserID string `json:"appUserID" firestore:"appUserID"` // intentionally indexed & do NOT omitempty (so we can find records with empty AppUserID)
DtCreated time.Time `json:"dtCreated" datastore:"dtCreated" firestore:"dtCreated"`
DtUpdated time.Time `json:"dtUpdated" datastore:"dtUpdated" firestore:"dtUpdated"`
// AccessGranted indicates if access to the bot has been granted
AccessGranted bool `json:"isAccessGranted" dalgo:"isAccessGranted" datastore:"isAccessGranted" firestore:"isAccessGranted"`
}
BotBaseData holds properties common to all bot entities
func (*BotBaseData) EnsureTimestamps ¶ added in v0.13.0
func (e *BotBaseData) EnsureTimestamps(now time.Time)
EnsureTimestamps stamps the record for persistence using a caller-supplied clock. It is the seam a botsfwstore.StateStore implementation must call before inserting or updating a PlatformUserData or BotChatData record, so that Validate never rejects it for missing DtCreated/DtUpdated.
On the first call for a record (DtCreated still zero) it sets both DtCreated and DtUpdated to now. On every later call it only refreshes DtUpdated, so an update can never rewrite the original creation time. The two fields are always set from the same now on any given call, so DtUpdated can never end up before DtCreated as long as callers pass a non-decreasing clock across calls for the same record (e.g. time.Now, or a fixed/advancing clock in tests).
Callers supply now explicitly rather than this method calling time.Now() itself, so a store implementation's clock stays injectable/overridable in tests instead of being hardcoded.
func (*BotBaseData) GetAppUserID ¶ added in v0.0.5
func (e *BotBaseData) GetAppUserID() string
GetAppUserID returns app user ID
func (*BotBaseData) IsAccessGranted ¶
func (e *BotBaseData) IsAccessGranted() bool
IsAccessGranted indicates if access to the bot has been granted
func (*BotBaseData) SetAccessGranted ¶
func (e *BotBaseData) SetAccessGranted(value bool) bool
SetAccessGranted mark that access has been granted
func (*BotBaseData) SetAppUserID ¶ added in v0.0.5
func (e *BotBaseData) SetAppUserID(s string)
SetAppUserID sets app user ID
func (*BotBaseData) SetUpdatedTime ¶ added in v0.0.5
func (e *BotBaseData) SetUpdatedTime(v time.Time)
SetUpdatedTime sets updated time
func (*BotBaseData) Validate ¶ added in v0.0.5
func (e *BotBaseData) Validate() error
Validate returns error if data is invalid
type BotChatData ¶ added in v0.1.0
type BotChatData interface {
// Base returns a base struct that should be included in all structs that implement BotChatData.
Base() *ChatBaseData // TODO: Document why this is needed or remove
// IsChanged returns true if data has been changed
IsChanged() bool
// GetAppUserID returns app user ID
GetAppUserID() (appUserID string)
// SetAppUserID sets app user ID
SetAppUserID(appUserID string)
// AddClientLanguage adds client language
AddClientLanguage(languageCode string) (changed bool)
// SetBotUserID sets bot user ID
SetBotUserID(id interface{})
// SetIsGroupChat marks current chat as a group chat
SetIsGroupChat(bool)
// IsAccessGranted returns true if access is granted
IsAccessGranted() bool
// IsGroupChat returns true if current chat is a group chat
IsGroupChat() bool
// SetAccessGranted sets access granted flag
SetAccessGranted(value bool) bool
// GetPreferredLanguage returns preferred language for the chat
GetPreferredLanguage() string
// SetPreferredLanguage sets preferred language for the chat
SetPreferredLanguage(value string)
// SetUpdatedTime sets updated time
SetUpdatedTime(time.Time) // github.com/strongo/user.UpdatedTimeSetter
// SetDtLastInteraction sets last interaction time
SetDtLastInteraction(time time.Time)
// GetAwaitingReplyTo returns path of the step that is awaiting reply to
GetAwaitingReplyTo() string
// SetAwaitingReplyTo sets path of the step that is awaiting reply to
SetAwaitingReplyTo(path string)
// IsAwaitingReplyTo returns true if awaiting reply to specific step
IsAwaitingReplyTo(code string) bool
// AddWizardParam adds a parameter to wizard with a given key & value
AddWizardParam(key, value string)
// GetWizardParam returns a parameter from wizard for a given key
GetWizardParam(key string) string
// PopStepsFromAwaitingReplyUpToSpecificParent pops steps from awaiting reply up to specific parent
PopStepsFromAwaitingReplyUpToSpecificParent(code string)
// PushStepToAwaitingReplyTo pushes step to awaiting reply to
PushStepToAwaitingReplyTo(code string)
SetVar(key string, value string)
GetVar(key string) string
DelVar(key string)
HasChangedVars() bool
}
BotChatData provides data about bot chat
type ChatBaseData ¶ added in v0.0.5
type ChatBaseData struct {
// BotUserIDs keeps ids of bot users who are members of a group chat or a single user ID if it's a chat with bot
BotUserIDs []string `firestore:"botUserIDs,omitempty"`
BotBaseData
// IsGroup indicates if bot is added/used in a group chat
IsGroup bool `firestore:"isGroup,omitempty"`
Type string `firestore:"type,omitempty"` // TODO: document what is it & why needed or remove
// Title stores a title of a chat if bot platforms supports named chats
Title string `firestore:"title,omitempty"`
// AnalyticsClientIDs stores IDs of analytics clients. For example {"GA": "1234567890.1234567890"}
AnalyticsClientIDs map[string]string `firestore:"analyticsClientIDs,omitempty"`
// DtLastInteraction must be set through SetDtLastInteraction() as it also increments InteractionsCount
DtLastInteraction time.Time `firestore:"dtLastInteraction"`
// InteractionsCount is a number of interactions with a bot in this chat
InteractionsCount int `firestore:"interactionsCount,omitempty"`
// DtForbidden is a time when bot was forbidden to interact with a chat
DtForbidden time.Time `firestore:"dtForbidden,omitempty"`
// DtForbiddenLast needs documentation on intended usage. TODO: Consider removing
DtForbiddenLast time.Time `dalgo:",omitempty" datastore:",omitempty" firestore:",omitempty"`
// contains filtered or unexported fields
}
ChatBaseData hold common properties for bot chat entities not specific to any platform
func (*ChatBaseData) AddClientLanguage ¶ added in v0.0.5
AddClientLanguage adds client UI language
func (*ChatBaseData) AddWizardParam ¶ added in v0.0.5
func (e *ChatBaseData) AddWizardParam(key, value string)
AddWizardParam adds context param to state
func (*ChatBaseData) Base ¶ added in v0.0.5
func (e *ChatBaseData) Base() *ChatBaseData
func (*ChatBaseData) DelVar ¶ added in v0.10.0
func (v *ChatBaseData) DelVar(key string)
DelVar deletes a chat variable
func (*ChatBaseData) GetAwaitingReplyTo ¶ added in v0.0.5
func (e *ChatBaseData) GetAwaitingReplyTo() string
GetAwaitingReplyTo returns current state
func (*ChatBaseData) GetPreferredLanguage ¶ added in v0.0.5
func (e *ChatBaseData) GetPreferredLanguage() string
GetPreferredLanguage returns preferred language
func (*ChatBaseData) GetWizardParam ¶ added in v0.0.5
GetWizardParam returns state param value
func (*ChatBaseData) HasChangedVars ¶ added in v0.10.0
func (v *ChatBaseData) HasChangedVars() bool
HasChangedVars returns true if vars have been changed
func (*ChatBaseData) IsAwaitingReplyTo ¶ added in v0.0.5
IsAwaitingReplyTo returns true if bot us awaiting reply to a specific command
func (*ChatBaseData) IsChanged ¶ added in v0.0.5
func (e *ChatBaseData) IsChanged() bool
IsChanged indicates that chat data has been changed and record needs to be saved
func (*ChatBaseData) IsGroupChat ¶ added in v0.0.5
func (e *ChatBaseData) IsGroupChat() bool
IsGroupChat indicates if it is a group chat
func (*ChatBaseData) PopStepsFromAwaitingReplyUpToSpecificParent ¶ added in v0.0.5
func (e *ChatBaseData) PopStepsFromAwaitingReplyUpToSpecificParent(step string)
PopStepsFromAwaitingReplyUpToSpecificParent go back in state
func (*ChatBaseData) PushStepToAwaitingReplyTo ¶ added in v0.0.5
func (e *ChatBaseData) PushStepToAwaitingReplyTo(step string)
PushStepToAwaitingReplyTo go down in state
func (*ChatBaseData) SetAwaitingReplyTo ¶ added in v0.0.5
func (e *ChatBaseData) SetAwaitingReplyTo(value string)
SetAwaitingReplyTo sets current state
func (*ChatBaseData) SetBotUserID ¶ added in v0.0.5
func (e *ChatBaseData) SetBotUserID(id interface{})
SetBotUserID sets bot user ID
func (*ChatBaseData) SetDtLastInteraction ¶ added in v0.0.5
func (e *ChatBaseData) SetDtLastInteraction(v time.Time)
SetDtLastInteraction sets date time of last interaction
func (*ChatBaseData) SetDtUpdateToNow ¶ added in v0.0.5
func (e *ChatBaseData) SetDtUpdateToNow()
SetDtUpdateToNow mark entity updated with now
func (*ChatBaseData) SetIsGroupChat ¶ added in v0.0.5
func (e *ChatBaseData) SetIsGroupChat(v bool)
SetIsGroupChat marks chat as a group one
func (*ChatBaseData) SetPreferredLanguage ¶ added in v0.0.5
func (e *ChatBaseData) SetPreferredLanguage(value string)
SetPreferredLanguage sets preferred language
func (*ChatBaseData) SetVar ¶ added in v0.10.0
func (v *ChatBaseData) SetVar(key, value string)
SetVar sets a chat variable
func (*ChatBaseData) Validate ¶ added in v0.0.5
func (e *ChatBaseData) Validate() error
type ChatKey ¶ added in v0.0.5
type ChatKey struct {
// BotID an id of a bot that owns this chat
BotID string
// ChatID is an id of a chat as was provided by a bot platform. Might be an integer converted to a string.
// It's different from ChatInstanceID of Telegram - TODO: document what is the difference an why ChatInstanceID is needed.
ChatID string
}
ChatKey is a key for a chat that consists of bot ID and chat ID.
func NewChatKey ¶ added in v0.0.5
NewChatKey creates a new chat key
type PlatformUserBaseDbo ¶ added in v0.7.0
type PlatformUserBaseDbo struct {
BotBaseData
WithRequiredBotIDs
// FirstName is the first name of a user
FirstName string `json:"firstName,omitempty" dalgo:"firstName,omitempty,noindex" firestore:"firstName,omitempty"`
// LastName is the last name of a user
LastName string `json:"lastName,omitempty" dalgo:"lastName,omitempty,noindex" firestore:"lastName,omitempty"`
// UserName is login ID of a user
UserName string `json:"userName,omitempty" dalgo:"userName,omitempty,noindex" firestore:"userName,omitempty"`
}
PlatformUserBaseDbo hold common properties for bot user entities
func (*PlatformUserBaseDbo) BaseData ¶ added in v0.7.0
func (v *PlatformUserBaseDbo) BaseData() *PlatformUserBaseDbo
BaseData returns base data of a user that should be included in all structs that implement PlatformUserData
func (*PlatformUserBaseDbo) Validate ¶ added in v0.9.0
func (v *PlatformUserBaseDbo) Validate() error
type PlatformUserData ¶ added in v0.7.0
type PlatformUserData interface {
// BaseData returns base data that should be implemented by all bot user structs
BaseData() *PlatformUserBaseDbo
// GetAppUserID returns app user ID if available
GetAppUserID() string
// SetAppUserID sets app user ID to associate bot user record with app user
SetAppUserID(appUserID string)
WithAccessGrantedFlag
// SetUpdatedTime sets last updated time // TODO: document intended usage
SetUpdatedTime(time.Time) //to satisfy github.com/strongo/app/user.UpdatedTimeSetter
}
PlatformUserData interface provides information about bot user This should be implemented by bot user record struct.
type PreferredLocaleHolder ¶ added in v0.3.0
type UserNamesHolder ¶ added in v0.3.0
type WithAccessGrantedFlag ¶
type WithBotIDs ¶ added in v0.9.0
type WithBotIDs struct {
BotIDs []string `json:"botIDs,omitempty" dalgo:"botIDs,omitempty,noindex" firestore:"botIDs,omitempty"`
}
func (WithBotIDs) Validate ¶ added in v0.9.0
func (v WithBotIDs) Validate() error
type WithBotUserIDs ¶ added in v0.1.1
type WithBotUserIDs struct {
BotUserIDs []string `json:"botUserIDs,omitempty" firestore:"botUserIDs,omitempty" dalgo:"botUserIDs,omitempty"`
}
func (*WithBotUserIDs) SetBotUserID ¶ added in v0.1.1
func (v *WithBotUserIDs) SetBotUserID(platform, bot, userID string)
func (*WithBotUserIDs) Validate ¶ added in v0.9.0
func (v *WithBotUserIDs) Validate() error
type WithRequiredBotIDs ¶ added in v0.9.0
type WithRequiredBotIDs WithBotIDs
func (*WithRequiredBotIDs) EnsureBotID ¶ added in v0.14.0
func (v *WithRequiredBotIDs) EnsureBotID(botID string)
EnsureBotID appends botID to BotIDs unless it is already present. It is the self-heal seam a botsfwstore.StateStore implementation must call before inserting or updating a PlatformUserBaseDbo record - mirroring BotBaseData.EnsureTimestamps - so that Validate never rejects a record for missing BotIDs.
Nothing else populates BotIDs: platform adapters (e.g. bots-fw-telegram's SetBotUserFields) only ever set platform-specific fields such as FirstName/LastName, and a record written before this field existed, or by an application flow that pre-provisions a platform user, has none at all. Calling EnsureBotID on every write means such a record repairs itself instead of failing WithRequiredBotIDs.Validate forever.
It never removes or duplicates an existing id, so calling it again for the same bot is a no-op, and calling it for a different bot appends alongside whatever is already there - the same platform-user record can be shared by more than one bot. An empty botID is a no-op rather than a panic: this is a self-heal seam meant to run unconditionally on every write, not a strict setter a caller must get right.
func (WithRequiredBotIDs) Validate ¶ added in v0.9.0
func (v WithRequiredBotIDs) Validate() error