botsfw

package
v0.25.2 Latest Latest
Warning

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

Go to latest
Published: Mar 2, 2024 License: Apache-2.0 Imports: 19 Imported by: 37

Documentation

Index

Constants

View Source
const (
	// MessageTextBotDidNotUnderstandTheCommand is an i18n constant
	MessageTextBotDidNotUnderstandTheCommand = "MessageTextBotDidNotUnderstandTheCommand"

	// MessageTextOopsSomethingWentWrong is an i18n constant
	MessageTextOopsSomethingWentWrong = "MessageTextOopsSomethingWentWrong"
)
View Source
const (
	// BotAPISendMessageOverHTTPS indicates message should be sent over HTTPS
	BotAPISendMessageOverHTTPS = BotAPISendMessageChannel("https")

	// BotAPISendMessageOverResponse indicates message should be sent in HTTP response
	BotAPISendMessageOverResponse = BotAPISendMessageChannel("response")
)
View Source
const DefaultTitle = "" //

DefaultTitle key

View Source
const NoMessageToSend = "<NO_MESSAGE_TO_SEND>"

NoMessageToSend returned explicitly if we don't want to reply to user intput

View Source
const ShortTitle = "short_title"

ShortTitle key

Variables

View Source
var EnvLocal = "local" // TODO: Consider adding this to init interface of setting config values
View Source
var EnvProduction = "production" // TODO: Consider adding this to init interface of setting config values
View Source
var (
	// ErrEntityNotFound is returned if entity not found in storage
	ErrEntityNotFound = errors.New("bots-framework: no such entity")
)
View Source
var ErrNoCommandsMatched = errors.New("no commands matched")
View Source
var ErrNotImplemented = errors.New("not implemented")

ErrNotImplemented if some feature is not implemented yet

View Source
var IgnoreCommand = Command{
	Code: "bots.IgnoreCommand",
	Action: func(_ WebhookContext) (m MessageFromBot, err error) {
		return
	},
	CallbackAction: func(_ WebhookContext, _ *url.URL) (m MessageFromBot, err error) {
		return
	},
}

IgnoreCommand is a command that does nothing

View Source
var WebhookInputTypeNames = map[WebhookInputType]string{

	WebhookInputUnknown:             "unknown",
	WebhookInputNotImplemented:      "not implemented",
	WebhookInputReferral:            "Referral",
	WebhookInputText:                "Text",
	WebhookInputContact:             "Contact",
	WebhookInputPostback:            "Postback",
	WebhookInputDelivery:            "Delivery",
	WebhookInputAttachment:          "Attachment",
	WebhookInputInlineQuery:         "InlineQuery",
	WebhookInputCallbackQuery:       "CallbackQuery",
	WebhookInputChosenInlineResult:  "ChosenInlineResult",
	WebhookInputSubscribed:          "Subscribed",
	WebhookInputUnsubscribed:        "Unsubscribed",
	WebhookInputConversationStarted: "ConversationStarted",
	WebhookInputNewChatMembers:      "NewChatMembers",
}

WebhookInputTypeNames names for input type

Functions

func CommandTextNoTrans

func CommandTextNoTrans(title, icon string) string

CommandTextNoTrans returns a title for a command (pre-translated)

func InitBotsFrameworkLogger added in v0.12.0

func InitBotsFrameworkLogger(logger Logger)

func NotFoundHandler

func NotFoundHandler(w http.ResponseWriter, _ *http.Request)

NotFoundHandler returns HTTP status code 404

func PingHandler

func PingHandler(w http.ResponseWriter, r *http.Request)

PingHandler returns 'Pong' back to user

func SetAccessGranted

func SetAccessGranted(whc WebhookContext, value bool) (err error)

SetAccessGranted marks current context as authenticated

func SetLogger added in v0.16.1

func SetLogger(l Logger)

Types

type AppUserGetter added in v0.18.0

type AppUserGetter = func(
	ctx context.Context,
	tx dal.ReadSession,
	botID string,
	appUserID string,
) (
	appUser record.DataWithID[string, botsfwmodels.AppUserData],
	err error,
)

type Attachment

type Attachment interface {
	AttachmentType() AttachmentType
}

Attachment to a bot message

type AttachmentType

type AttachmentType int

AttachmentType to a bot message

const (
	// AttachmentTypeNone says there is no attachment
	AttachmentTypeNone AttachmentType = iota

	// AttachmentTypeAudio is for audio attachments
	AttachmentTypeAudio

	// AttachmentTypeFile is for file attachments
	AttachmentTypeFile

	// AttachmentTypeImage is for image attachments
	AttachmentTypeImage

	// AttachmentTypeVideo is for video attachments
	AttachmentTypeVideo
)

type BotAPISendMessageChannel

type BotAPISendMessageChannel string

BotAPISendMessageChannel specifies messenger channel

type BotAPIUser

type BotAPIUser interface {
	// FirstName returns user's first name
	FirstName() string

	// LastName returns user's last name
	LastName() string
}

BotAPIUser provides info about current bot user

type BotAppContext

type BotAppContext interface {
	AppUserCollectionName() string

	i18n.TranslationContext

	NewBotAppUserEntity() botsfwmodels.AppUserData
	GetBotChatEntityFactory(platform string) func() botsfwmodels.BotChatData
}

BotAppContext is a context for bot app

type BotContext

type BotContext struct {
	BotHost     BotHost     // describes current bot app host environment
	BotSettings BotSettings // keeps parameters of a bot that are static and are not changed in runtime
}

BotContext describes a bot on a specific platform

func NewBotContext

func NewBotContext(host BotHost, settings BotSettings) *BotContext

NewBotContext creates current bot host & settings

type BotHost

type BotHost interface {

	// Context returns a context.Context for a request. We need this as some platforms (as Google App Engine Standard)
	// require usage of a context with a specific wrapper
	Context(r *http.Request) context.Context

	// GetHTTPClient returns HTTP client for current host
	// We need this as some platforms (as Google App Engine Standard) require setting http client in a specific way.
	GetHTTPClient(c context.Context) *http.Client
}

BotHost describes current bot app host environment

type BotInputProvider

type BotInputProvider interface {
	// Input returns a webhook input from a specific bot interface (Telegram, FB Messenger, Viber, etc.)
	Input() WebhookInput
}

BotInputProvider provides an input from a specific bot interface (Telegram, FB Messenger, Viber, etc.)

type BotMessage

type BotMessage interface {
	BotMessageType() BotMessageType
}

BotMessage is an output message from bot to user

type BotMessageType

type BotMessageType int

BotMessageType defines type of an output message from bot to user

const (
	// BotMessageTypeUndefined unknown type
	BotMessageTypeUndefined BotMessageType = iota
	// BotMessageTypeCallbackAnswer sends callback answer
	BotMessageTypeCallbackAnswer
	// BotMessageTypeInlineResults sends inline results
	BotMessageTypeInlineResults
	// BotMessageTypeText sends text reply
	BotMessageTypeText
	// BotMessageTypeEditMessage edit previously sent message
	BotMessageTypeEditMessage
	// BotMessageTypeLeaveChat commands messenger to kick off bot from a botChat
	BotMessageTypeLeaveChat
	// BotMessageTypeExportChatInviteLink sends invite link
	BotMessageTypeExportChatInviteLink
)

type BotPlatform

type BotPlatform interface {

	// ID returns bot platform ID like 'telegram', 'fbmessenger', 'viber', etc.
	ID() string

	// Version returns a version of a bot platform adapter. It is used for debugging purposes.
	Version() string
}

BotPlatform describes current bot platform

type BotProfile added in v0.18.0

type BotProfile interface {
	ID() string
	Router() *WebhooksRouter
	DefaultLocale() i18n.Locale
	SupportedLocales() []i18n.Locale
	NewBotChatData() botsfwmodels.BotChatData
	NewBotUserData() botsfwmodels.BotUserData
	NewAppUserData() botsfwmodels.AppUserData // TODO: Can we get rit of it and instead use GetAppUserByID/CreateAppUser?
}

func NewBotProfile added in v0.18.0

func NewBotProfile(
	id string,
	router *WebhooksRouter,
	newBotChatData func() botsfwmodels.BotChatData,
	newBotUserData func() botsfwmodels.BotUserData,
	newAppUserData func() botsfwmodels.AppUserData,
	getAppUserByID AppUserGetter,
	defaultLocale i18n.Locale,
	supportedLocales []i18n.Locale,
) BotProfile

type BotRecordsFieldsSetter added in v0.16.0

type BotRecordsFieldsSetter interface {

	// Platform returns platform name, e.g. 'telegram', 'fbmessenger', etc.
	// This method is for debug pruposes and to indicate that different platforms may have different fields
	// Though '*' can be used for a generic setter that works for all platforms
	// If both '*' and platform specific setters are defined, the generic setter will be used first.
	Platform() string

	// SetAppUserFields sets fields of app user record
	SetAppUserFields(appUser botsfwmodels.AppUserData, sender WebhookSender) error

	// SetBotUserFields sets fields of bot user record
	SetBotUserFields(botUser botsfwmodels.BotUserData, sender WebhookSender, botID, botUserID, appUserID string) error

	// SetBotChatFields sets fields of bot botChat record
	// TODO: document isAccessGranted parameter
	SetBotChatFields(botChat botsfwmodels.BotChatData, chat WebhookChat, botID, botUserID, appUserID string, isAccessGranted bool) error
}

type BotSettings

type BotSettings struct {

	// Platform is a platform that bot is running on
	// E.g.: Telegram, Viber, Facebook Messenger, WhatsApp, etc.
	Platform Platform

	// Env is an environment where bot is running
	// E.g.: Production/Live, Local/Dev, Staging, etc.
	Env string

	// Profile is a bot profile that defines bot's behavior
	// It includes commands router and some other settings
	// More in BotProfile documentation.
	Profile BotProfile

	// Code is a human-readable ID of a bot.
	// When displayed it is usually prefixed with @.
	// For example:
	//   - @listus_bot for https://t.me/listus_bot
	Code string

	// ID is a bot-platform ID of a bot. For example, it could be a GUID.
	// Not all platforms use it. For example Telegram doesn't use it.
	ID string

	// Token is used to authenticate bot with a platform when it is not responding to a webhook
	// but calling platform APIs directly.
	Token string

	// PaymentToken is used to process payments on bot platform
	PaymentToken string

	// PaymentTestToken is used to process test payments on bot platform
	PaymentTestToken string

	// VerifyToken is used by Facebook Messenger - TODO: Document how it is used and add a link to Facebook docs
	VerifyToken string

	// GAToken is Google Analytics token - TODO: Refactor tu support multiple or move out
	GAToken string

	// Locale is a default locale for a bot.
	// While a bot profile can support multiple locales a bot can be dedicated to a specific country/language
	Locale i18n.Locale

	// GetDatabase returns connection to a database assigned to a bot.
	// You can use same database for multiple bots
	// but if you need you can use different databases for different bots.
	// It's up to bots creator how to map bots to a database.
	// In most cases a single DB is used for all bots.
	GetDatabase DbGetter
	// contains filtered or unexported fields
}

BotSettings keeps parameters of a bot that are static and are not changed in runtime

func NewBotSettings

func NewBotSettings(
	platform Platform,
	environment string,
	profile BotProfile,
	code, id, token, gaToken string,
	locale i18n.Locale,
	getDatabase DbGetter,
	getAppUser AppUserGetter,
) BotSettings

NewBotSettings configures bot application

func (BotSettings) GetAppUserByID added in v0.18.0

func (v BotSettings) GetAppUserByID(ctx context.Context, tx dal.ReadSession, appUserID string) (appUser record.DataWithID[string, botsfwmodels.AppUserData], err error)

type BotState

type BotState interface {
	IsNewerThen(chatEntity botsfwmodels.BotChatData) bool
}

BotState provides state of the bot (TODO: document how is used)

type BotUserCreator added in v0.18.0

type BotUserCreator func(c context.Context, botID string, apiUser WebhookActor) (botsfwmodels.BotUserData, error)

type CallbackAction

type CallbackAction func(whc WebhookContext, callbackUrl *url.URL) (m MessageFromBot, err error)

CallbackAction defines a callback action bot can perform in response to a callback command

type ChatIntID

type ChatIntID int64

ChatIntID returns botChat ID as unique integer

func (ChatIntID) ChatUID

func (chatUID ChatIntID) ChatUID() string

ChatUID returns botChat ID as unique string

type ChatUID

type ChatUID interface {
	ChatUID() string
}

ChatUID returns botChat ID as unique string

type Command

type Command struct {
	InputTypes     []WebhookInputType // Instant match if != WebhookInputUnknown && == whc.InputTypes()
	Icon           string
	Replies        []Command
	Code           string
	Title          string
	Titles         map[string]string
	ExactMatch     string
	Commands       []string
	Matcher        CommandMatcher
	Action         CommandAction
	CallbackAction CallbackAction
}

Command defines command metadata and action

func NewCallbackCommand

func NewCallbackCommand(code string, action CallbackAction) Command

NewCallbackCommand create a definition of a callback command

func NewInlineQueryCommand

func NewInlineQueryCommand(code string, action CommandAction) Command

func (Command) DefaultTitle

func (c Command) DefaultTitle(whc WebhookContext) string

DefaultTitle returns a default title for a command in current Locale

func (Command) String

func (c Command) String() string

func (Command) TitleByKey

func (c Command) TitleByKey(key string, whc WebhookContext) string

TitleByKey returns a short/long title for a command in current Locale

type CommandAction

type CommandAction func(whc WebhookContext) (m MessageFromBot, err error)

CommandAction defines an action bot can perform in response to a command

type CommandMatcher

type CommandMatcher func(Command, WebhookContext) bool

CommandMatcher returns true if action is matched to user input

type CreateWebhookContextArgs added in v0.18.0

type CreateWebhookContextArgs struct {
	HttpRequest  *http.Request // TODO: Can we get rid of it? Needed for botHost.GetHTTPClient()
	AppContext   BotAppContext
	BotContext   BotContext
	WebhookInput WebhookInput
	Tx           dal.ReadwriteTransaction
	//BotCoreStores botsfwdal.DataAccess
	GaMeasurement GaQueuer
}

func NewCreateWebhookContextArgs added in v0.18.0

func NewCreateWebhookContextArgs(
	httpRequest *http.Request,
	appContext BotAppContext,
	botContext BotContext,
	webhookInput WebhookInput,
	tx dal.ReadwriteTransaction,

	gaMeasurement GaQueuer,
) CreateWebhookContextArgs

type DbGetter added in v0.18.0

type DbGetter = func(ctx context.Context) (db dal.DB, err error)

type EntryInput

type EntryInput struct {
	Entry WebhookEntry
	Input WebhookInput
}

EntryInput provides information on parsed input from bot API request

func (*EntryInput) MarshalJSON

func (j *EntryInput) MarshalJSON() ([]byte, error)

MarshalJSON marshal bytes to json - template

func (*EntryInput) MarshalJSONBuf

func (j *EntryInput) MarshalJSONBuf(buf fflib.EncodingBuffer) error

MarshalJSONBuf marshal buff to json - template

func (*EntryInput) UnmarshalJSON

func (j *EntryInput) UnmarshalJSON(input []byte) error

UnmarshalJSON umarshall json - template of ffjson

func (*EntryInput) UnmarshalJSONFFLexer

func (j *EntryInput) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error

UnmarshalJSONFFLexer fast json unmarshall - template ffjson

type EntryInputs

type EntryInputs struct {
	Entry  WebhookEntry
	Inputs []WebhookInput
}

EntryInputs provides information on parsed inputs from bot API request

func (*EntryInputs) MarshalJSON

func (j *EntryInputs) MarshalJSON() ([]byte, error)

MarshalJSON marshal bytes to json - template

func (*EntryInputs) MarshalJSONBuf

func (j *EntryInputs) MarshalJSONBuf(buf fflib.EncodingBuffer) error

MarshalJSONBuf marshal buff to json - template

func (*EntryInputs) UnmarshalJSON

func (j *EntryInputs) UnmarshalJSON(input []byte) error

UnmarshalJSON umarshall json - template of ffjson

func (*EntryInputs) UnmarshalJSONFFLexer

func (j *EntryInputs) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error

UnmarshalJSONFFLexer fast json unmarshall - template ffjson

type ErrAuthFailed

type ErrAuthFailed string

ErrAuthFailed raised if authentication failed

func (ErrAuthFailed) Error

func (e ErrAuthFailed) Error() string

type ExecutionContext added in v0.25.0

type ExecutionContext interface {
	Context() context.Context
}

ExecutionContext TODO: either specify clear purpose and added value or remove

type GaContext

type GaContext interface {
	GaQueuer
	// Flush() error
	GaCommon() gamp.Common
	GaEvent(category, action string) *gamp.Event
	GaEventWithLabel(category, action, label string) *gamp.Event
}

GaContext provides context to Google Analytics - TODO: we should have an abstraction for analytics

type GaQueuer

type GaQueuer interface {
	Queue(message gamp.Message) error
}

GaQueuer queues messages for sending to Google Analytics

type HttpRouter added in v0.11.0

type HttpRouter interface {
	Handle(method string, path string, handle http.HandlerFunc)
}

type InputMessage

type InputMessage interface {
	Text() string
}

InputMessage represents single input message

type Logger added in v0.11.0

type Logger interface {
	Infof(c context.Context, format string, args ...interface{})
	Errorf(c context.Context, format string, args ...interface{})
	Debugf(c context.Context, format string, args ...interface{})
	Warningf(c context.Context, format string, args ...interface{})
	Criticalf(c context.Context, format string, args ...interface{})
}

func Log added in v0.18.0

func Log() Logger

type MessageFormat

type MessageFormat int

MessageFormat specify formatting of a text message to BOT (e.g. Text, HTML, MarkDown)

const (
	// MessageFormatText is for text messages
	MessageFormatText MessageFormat = iota
	// MessageFormatHTML is for HTML messages
	MessageFormatHTML
	// MessageFormatMarkdown is for markdown messages
	MessageFormatMarkdown
)

type MessageFromBot

type MessageFromBot struct {
	ToChat             ChatUID    `json:",omitempty"`
	TextMessageFromBot            // This is a shortcut to MessageFromBot{}.BotMessage = TextMessageFromBot{text: "abc"}
	BotMessage         BotMessage `json:",omitempty"`
}

MessageFromBot keeps all the details of answer from bot to user

func (*MessageFromBot) MarshalJSON

func (j *MessageFromBot) MarshalJSON() ([]byte, error)

MarshalJSON marshal bytes to json - template

func (*MessageFromBot) MarshalJSONBuf

func (j *MessageFromBot) MarshalJSONBuf(buf fflib.EncodingBuffer) error

MarshalJSONBuf marshal buff to json - template

func (*MessageFromBot) UnmarshalJSON

func (j *MessageFromBot) UnmarshalJSON(input []byte) error

UnmarshalJSON umarshall json - template of ffjson

func (*MessageFromBot) UnmarshalJSONFFLexer

func (j *MessageFromBot) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error

UnmarshalJSONFFLexer fast json unmarshall - template ffjson

type MessageUID

type MessageUID interface {
	UID() string
}

MessageUID is unique message ID as string

type MessengerResponse

type MessengerResponse interface {
}

MessengerResponse represents response from a messenger

type OnMessageSentResponse

type OnMessageSentResponse struct {
	StatusCode      int
	TelegramMessage MessengerResponse // TODO: change to some interface
}

OnMessageSentResponse represents response on message sent event

type Platform added in v0.9.12

type Platform string
const (
	PlatformTelegram          Platform = "telegram"
	PlatformViber             Platform = "viber"
	PlatformFacebookMessenger Platform = "fbm"
	PlatformWhatsApp          Platform = "whatsapp"
)

type SettingsBy

type SettingsBy struct {

	// ByCode keeps settings by bot code - it is a human-readable ID of a bot
	ByCode map[string]*BotSettings

	// ByID keeps settings by bot ID - it is a machine-readable ID of a bot.
	ByID map[string]*BotSettings
}

SettingsBy keeps settings per different keys (ID, code, API token, Locale) TODO: Decide if it should have map[string]*BotSettings instead of map[string]BotSettings

func NewBotSettingsBy

func NewBotSettingsBy(bots ...BotSettings) (settingsBy SettingsBy)

NewBotSettingsBy create settings per different keys (ID, code, API token, Locale)

type SettingsProvider

type SettingsProvider func(c context.Context) SettingsBy

SettingsProvider returns settings per different keys (ID, code, API token, Locale)

type TextMessageFromBot

type TextMessageFromBot struct {
	Text                  string              `json:",omitempty"`
	Format                MessageFormat       `json:",omitempty"`
	DisableWebPagePreview bool                `json:",omitempty"`
	DisableNotification   bool                `json:",omitempty"`
	Keyboard              botsgocore.Keyboard `json:",omitempty"`
	IsEdit                bool                `json:",omitempty"`
	EditMessageUID        MessageUID          `json:",omitempty"`
}

TextMessageFromBot is a text output message from bot to user

func (TextMessageFromBot) BotMessageType

func (m TextMessageFromBot) BotMessageType() BotMessageType

BotMessageType returns if we want to send a new message or edit existing one

func (*TextMessageFromBot) MarshalJSON

func (j *TextMessageFromBot) MarshalJSON() ([]byte, error)

MarshalJSON marshal bytes to json - template

func (*TextMessageFromBot) MarshalJSONBuf

func (j *TextMessageFromBot) MarshalJSONBuf(buf fflib.EncodingBuffer) error

MarshalJSONBuf marshal buff to json - template

func (*TextMessageFromBot) UnmarshalJSON

func (j *TextMessageFromBot) UnmarshalJSON(input []byte) error

UnmarshalJSON umarshall json - template of ffjson

func (*TextMessageFromBot) UnmarshalJSONFFLexer

func (j *TextMessageFromBot) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error

UnmarshalJSONFFLexer fast json unmarshall - template ffjson

type TranslatorProvider

type TranslatorProvider func(c context.Context) i18n.Translator

TranslatorProvider translates texts

type TypeCommands

type TypeCommands struct {
	// contains filtered or unexported fields
}

TypeCommands container for commands

type WebhookActor

type WebhookActor interface {
	Platform() string // TODO: Consider removing this?
	GetID() interface{}
	IsBotUser() bool
	GetFirstName() string
	GetLastName() string
	GetUserName() string
	GetLanguage() string
}

WebhookActor represents sender

type WebhookAttachment

type WebhookAttachment interface {
	Type() string       // Enum(image, video, audio) for Facebook
	PayloadUrl() string // 'payload.url' for Facebook
}

WebhookAttachment represents attachment to a message

type WebhookAudioMessage

type WebhookAudioMessage interface {
	WebhookMessage
}

WebhookAudioMessage represents single audio message

type WebhookCallbackQuery

type WebhookCallbackQuery interface {
	GetID() string
	GetInlineMessageID() string // Telegram only?
	GetFrom() WebhookSender
	GetMessage() WebhookMessage
	GetData() string
	Chat() WebhookChat
}

WebhookCallbackQuery represents a single callback query message

type WebhookChat

type WebhookChat interface {
	GetID() string
	GetType() string
	IsGroupChat() bool
}

WebhookChat represents botChat of a messenger

type WebhookChosenInlineResult

type WebhookChosenInlineResult interface {
	GetResultID() string
	GetInlineMessageID() string // Telegram only?
	GetFrom() WebhookSender
	GetQuery() string
}

WebhookChosenInlineResult represents a single report message on chosen inline result

type WebhookContactMessage

type WebhookContactMessage interface {
	PhoneNumber() string
	FirstName() string
	LastName() string
	UserID() interface{}
}

WebhookContactMessage represents single contact message

type WebhookContext

type WebhookContext interface {
	//dal.TransactionCoordinator
	Environment() string
	BotInputProvider
	BotPlatform() BotPlatform

	Request() *http.Request

	// Context return context
	Context() context.Context

	// SetContext sets context
	SetContext(c context.Context)

	ExecutionContext() ExecutionContext
	BotAppContext() BotAppContext
	BotContext() BotContext

	MustBotChatID() string

	// GetBotCode returns bot code. This is a shortcut to BotSettings().Code
	GetBotCode() string

	// GetBotToken returns bot token. This is a shortcut to BotSettings().Token
	// TODO: Deprecate & remove - use BotSettings().Token instead
	GetBotToken() string

	// GetBotSettings returns bot settings
	GetBotSettings() BotSettings

	// DB is a reference to database used to store data of current bot
	DB() dal.DB

	// Tx is a reference to database transaction used to get/save data of current bot
	Tx() dal.ReadwriteTransaction

	// ChatData returns data of current bot chat without ID/Key
	ChatData() botsfwmodels.BotChatData // Formerly ChatEntity()

	// BotUser returns record of current bot user
	BotUser() (botUser record.DataWithID[string, botsfwmodels.BotUserData], err error)

	// IsInGroup indicates if message was received in a group botChat
	IsInGroup() bool // TODO: We might need to return an error as well (for Telegram chat instance). Document why need or does not need.

	// CommandText TODO: needs to be documented
	CommandText(title, icon string) string

	// SetLocale sets Locale for current session
	SetLocale(code5 string) error

	NewMessage(text string) MessageFromBot
	NewMessageByCode(messageCode string, a ...interface{}) MessageFromBot
	NewEditMessage(text string, format MessageFormat) (MessageFromBot, error)

	UpdateLastProcessed(chatEntity botsfwmodels.BotChatData) error

	AppUserID() string

	AppUserData() (botsfwmodels.AppUserData, error)

	BotState

	// SaveBotChat takes context as we might want to add timeout or cancellation or something else.
	SaveBotChat(ctx context.Context) error

	// RecordsFieldsSetter returns a helper that sets fields of bot related records
	RecordsFieldsSetter() BotRecordsFieldsSetter

	WebhookInput // TODO: Should be removed!!!
	i18n.SingleLocaleTranslator

	Responder() WebhookResponder

	GA() GaContext // TODO: We should have an abstraction for analytics
}

WebhookContext provides context for current request from user to bot

type WebhookContextBase

type WebhookContextBase struct {
	// contains filtered or unexported fields
}

WebhookContextBase provides base implementation of WebhookContext interface TODO: Document purpose of a dedicated base struct (e.g. example of usage by developers)

func NewWebhookContextBase

func NewWebhookContextBase(
	args CreateWebhookContextArgs,
	botPlatform BotPlatform,
	recordsFieldsSetter BotRecordsFieldsSetter,
	isInGroup func() bool,
	getLocaleAndChatID func(c context.Context) (locale, chatID string, err error),
) (*WebhookContextBase, error)

NewWebhookContextBase creates base bot context

func (*WebhookContextBase) AppUserEntity

func (whcb *WebhookContextBase) AppUserEntity() botsfwmodels.AppUserData

AppUserEntity current app user entity from data storage

func (*WebhookContextBase) AppUserID added in v0.13.0

func (whcb *WebhookContextBase) AppUserID() (appUserID string)

AppUserID return current app user ID as a string. AppUserIntID() is deprecated.

func (*WebhookContextBase) BotAppContext

func (whcb *WebhookContextBase) BotAppContext() BotAppContext

BotAppContext returns bot app context

func (*WebhookContextBase) BotChatID

func (whcb *WebhookContextBase) BotChatID() (botChatID string, err error)

BotChatID returns bot botChat ID

func (*WebhookContextBase) BotContext

func (whcb *WebhookContextBase) BotContext() BotContext

func (*WebhookContextBase) BotPlatform

func (whcb *WebhookContextBase) BotPlatform() BotPlatform

BotPlatform indicates on which bot platform we process message

func (*WebhookContextBase) BotUser added in v0.21.0

func (whcb *WebhookContextBase) BotUser() (botUser record.DataWithID[string, botsfwmodels.BotUserData], err error)

func (*WebhookContextBase) Chat

func (whcb *WebhookContextBase) Chat() WebhookChat

Chat returns webhook botChat

func (*WebhookContextBase) ChatData added in v0.16.2

func (whcb *WebhookContextBase) ChatData() botsfwmodels.BotChatData

ChatData returns app entity for the context (loaded from DB)

func (*WebhookContextBase) CommandText

func (whcb *WebhookContextBase) CommandText(title, icon string) string

CommandText returns a title for a command

func (*WebhookContextBase) Context

func (whcb *WebhookContextBase) Context() context.Context

Context for current request

func (*WebhookContextBase) DB added in v0.18.0

func (whcb *WebhookContextBase) DB() dal.DB

func (*WebhookContextBase) Environment

func (whcb *WebhookContextBase) Environment() string

Environment defines current environment (PROD, DEV, LOCAL, etc)

func (*WebhookContextBase) ExecutionContext

func (whcb *WebhookContextBase) ExecutionContext() ExecutionContext

ExecutionContext returns an execution context for strongo app

func (*WebhookContextBase) GA

func (whcb *WebhookContextBase) GA() GaContext

GA provides interface to Google Analytics

func (*WebhookContextBase) GetAppUser

func (whcb *WebhookContextBase) GetAppUser() (botsfwmodels.AppUserData, error)

GetAppUser loads information about current app user from persistent storage

func (*WebhookContextBase) GetBotCode

func (whcb *WebhookContextBase) GetBotCode() string

GetBotCode returns current bot code

func (*WebhookContextBase) GetBotSettings

func (whcb *WebhookContextBase) GetBotSettings() BotSettings

GetBotSettings settings of the current bot

func (*WebhookContextBase) GetBotToken

func (whcb *WebhookContextBase) GetBotToken() string

GetBotToken returns current bot API token

func (*WebhookContextBase) GetBotUserID added in v0.16.2

func (whcb *WebhookContextBase) GetBotUserID() string

func (*WebhookContextBase) GetRecipient

func (whcb *WebhookContextBase) GetRecipient() WebhookRecipient

GetRecipient returns receiver of the message

func (*WebhookContextBase) GetSender

func (whcb *WebhookContextBase) GetSender() WebhookSender

GetSender returns sender of the message

func (*WebhookContextBase) GetTime

func (whcb *WebhookContextBase) GetTime() time.Time

GetTime returns time of the message

func (*WebhookContextBase) HasChatData added in v0.16.2

func (whcb *WebhookContextBase) HasChatData() bool

HasChatData return true if messages is within botChat

func (*WebhookContextBase) Input

func (whcb *WebhookContextBase) Input() WebhookInput

Input returns webhook input

func (*WebhookContextBase) InputType

func (whcb *WebhookContextBase) InputType() WebhookInputType

InputType returns input type

func (*WebhookContextBase) IsInGroup

func (whcb *WebhookContextBase) IsInGroup() bool

IsInGroup signals if the bot request is send within group botChat

func (*WebhookContextBase) IsInTransaction

func (whcb *WebhookContextBase) IsInTransaction(context.Context) bool

IsInTransaction detects if request is within a transaction

func (*WebhookContextBase) Locale

func (whcb *WebhookContextBase) Locale() i18n.Locale

Locale indicates current language

func (*WebhookContextBase) LogRequest

func (whcb *WebhookContextBase) LogRequest()

LogRequest logs request data to logging system

func (*WebhookContextBase) MessageText

func (whcb *WebhookContextBase) MessageText() string

MessageText returns text of received message

func (*WebhookContextBase) MustBotChatID

func (whcb *WebhookContextBase) MustBotChatID() (chatID string)

MustBotChatID returns bot botChat ID and panic if missing it

func (*WebhookContextBase) NewMessage

func (whcb *WebhookContextBase) NewMessage(text string) (m MessageFromBot)

NewMessage creates new message from bot

func (*WebhookContextBase) NewMessageByCode

func (whcb *WebhookContextBase) NewMessageByCode(messageCode string, a ...interface{}) (m MessageFromBot)

NewMessageByCode creates new translated message by i18n code

func (*WebhookContextBase) NonTransactionalContext

func (whcb *WebhookContextBase) NonTransactionalContext(context.Context) context.Context

NonTransactionalContext creates a non transaction context for operations that needs to be executed outside of transaction.

func (*WebhookContextBase) RecordsFieldsSetter added in v0.16.2

func (whcb *WebhookContextBase) RecordsFieldsSetter() BotRecordsFieldsSetter

func (*WebhookContextBase) Request

func (whcb *WebhookContextBase) Request() *http.Request

Request returns reference to current HTTP request

func (*WebhookContextBase) SaveBotChat added in v0.18.0

func (whcb *WebhookContextBase) SaveBotChat(ctx context.Context) error

func (*WebhookContextBase) SaveBotUser added in v0.18.0

func (whcb *WebhookContextBase) SaveBotUser(ctx context.Context) error

func (*WebhookContextBase) SetChatID

func (whcb *WebhookContextBase) SetChatID(chatID string)

SetChatID sets botChat ID - TODO: Should it be private?

func (*WebhookContextBase) SetContext

func (whcb *WebhookContextBase) SetContext(c context.Context)

SetContext sets current context // TODO: explain why we need this as probably should be in constructor?

func (*WebhookContextBase) SetLocale

func (whcb *WebhookContextBase) SetLocale(code5 string) error

SetLocale sets current language

func (WebhookContextBase) Translate

func (t WebhookContextBase) Translate(key string, args ...interface{}) string

Translate translates string

func (WebhookContextBase) TranslateNoWarning

func (t WebhookContextBase) TranslateNoWarning(key string, args ...interface{}) string

TranslateNoWarning translates string without warnings

func (*WebhookContextBase) Tx added in v0.18.0

Tx returns a transaction that is used to read/write botChat & bot user data

type WebhookConversationStarted

type WebhookConversationStarted interface {
	ConversationStartedMessage() interface{}
}

WebhookConversationStarted represents a single message about new conversation

type WebhookDelivery

type WebhookDelivery interface {
	Payload() string
}

WebhookDelivery represents a single delivery report message

type WebhookDriver

type WebhookDriver interface {
	RegisterWebhookHandlers(httpRouter HttpRouter, pathPrefix string, webhookHandlers ...WebhookHandler)
	HandleWebhook(w http.ResponseWriter, r *http.Request, webhookHandler WebhookHandler)
}

WebhookDriver is doing initial request & final response processing. That includes logging, creating input messages in a general format, sending response.

type WebhookEntry

type WebhookEntry interface {
	GetID() interface{}
	GetTime() time.Time
}

WebhookEntry represents a single message from a messenger user

type WebhookHandler

type WebhookHandler interface {

	// RegisterHttpHandlers registers HTTP handlers for bot API
	RegisterHttpHandlers(driver WebhookDriver, botHost BotHost, router HttpRouter, pathPrefix string)

	// HandleWebhookRequest handles incoming webhook request
	HandleWebhookRequest(w http.ResponseWriter, r *http.Request)

	// GetBotContextAndInputs returns bot context and inputs for current request
	// It returns multiple inputs as some platforms (like Facebook Messenger)
	// may send multiple message in one request
	GetBotContextAndInputs(c context.Context, r *http.Request) (botContext *BotContext, entriesWithInputs []EntryInputs, err error)

	// CreateWebhookContext creates WebhookContext for current webhook request
	CreateWebhookContext(args CreateWebhookContextArgs) (WebhookContext, error)

	GetResponder(w http.ResponseWriter, whc WebhookContext) WebhookResponder
	HandleUnmatched(whc WebhookContext) (m MessageFromBot)
}

WebhookHandler handles requests from a specific bot API This is implemented by different botsfw packages, e.g. https://github.com/bots-go-framework/bots-fw-telegram TODO: Simplify interface by decomposing it into smaller interfaces? Probably next method could/should be decoupled: CreateBotCoreStores()

type WebhookHandlerBase added in v0.16.0

type WebhookHandlerBase struct {
	WebhookDriver
	BotHost
	BotPlatform
	RecordsMaker        botsfwmodels.BotRecordsMaker
	RecordsFieldsSetter BotRecordsFieldsSetter
	TranslatorProvider  TranslatorProvider
}

WebhookHandlerBase provides base implementation for a bot handler

func (*WebhookHandlerBase) MarshalJSON added in v0.16.0

func (j *WebhookHandlerBase) MarshalJSON() ([]byte, error)

MarshalJSON marshal bytes to json - template

func (*WebhookHandlerBase) MarshalJSONBuf added in v0.16.0

func (j *WebhookHandlerBase) MarshalJSONBuf(buf fflib.EncodingBuffer) error

MarshalJSONBuf marshal buff to json - template

func (*WebhookHandlerBase) Register added in v0.16.0

func (bh *WebhookHandlerBase) Register(d WebhookDriver, h BotHost)

Register driver

func (*WebhookHandlerBase) UnmarshalJSON added in v0.16.0

func (j *WebhookHandlerBase) UnmarshalJSON(input []byte) error

UnmarshalJSON umarshall json - template of ffjson

func (*WebhookHandlerBase) UnmarshalJSONFFLexer added in v0.16.0

func (j *WebhookHandlerBase) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error

UnmarshalJSONFFLexer fast json unmarshall - template ffjson

type WebhookInlineQuery

type WebhookInlineQuery interface {
	GetID() interface{}
	GetInlineQueryID() string
	GetFrom() WebhookSender
	GetQuery() string
	GetOffset() string
}

WebhookInlineQuery represents a single inline message

type WebhookInlineQueryContext

type WebhookInlineQueryContext interface {
}

WebhookInlineQueryContext provides context for inline query (TODO: check & document)

type WebhookInput

type WebhookInput interface {
	GetSender() WebhookSender
	GetRecipient() WebhookRecipient
	GetTime() time.Time
	InputType() WebhookInputType
	BotChatID() (string, error)
	Chat() WebhookChat
	LogRequest()
}

WebhookInput represent a single message '/entry/messaging' for Facebook Messenger

type WebhookInputType

type WebhookInputType int

WebhookInputType is enum of input type

const (
	// WebhookInputUnknown is unknown input type
	WebhookInputUnknown WebhookInputType = iota
	// WebhookInputNotImplemented is not implemented input type
	WebhookInputNotImplemented
	// WebhookInputText is text input type
	WebhookInputText // Facebook, Telegram, Viber
	// WebhookInputVoice is voice input type
	WebhookInputVoice
	// WebhookInputPhoto is photo input type
	WebhookInputPhoto
	// WebhookInputAudio is audio input type
	WebhookInputAudio
	// WebhookInputContact is contact input type
	WebhookInputContact // Facebook, Telegram, Viber
	// WebhookInputPostback is unknown input type
	WebhookInputPostback
	// WebhookInputDelivery is postback input type
	WebhookInputDelivery
	// WebhookInputAttachment is delivery report input type
	WebhookInputAttachment
	// WebhookInputInlineQuery is attachment input type
	WebhookInputInlineQuery // Telegram
	// WebhookInputCallbackQuery is inline input type
	WebhookInputCallbackQuery
	// WebhookInputReferral is callback input type
	WebhookInputReferral // FBM
	// WebhookInputChosenInlineResult is chosen inline result input type
	WebhookInputChosenInlineResult // Telegram
	// WebhookInputSubscribed is subscribed input type
	WebhookInputSubscribed // Viber
	// WebhookInputUnsubscribed is unsubscribed input type
	WebhookInputUnsubscribed // Viber
	// WebhookInputConversationStarted is converstation started input type
	WebhookInputConversationStarted // Viber
	// WebhookInputNewChatMembers is new botChat memebers input type
	WebhookInputNewChatMembers // Telegram groups
	// WebhookInputLeftChatMembers is left botChat members input type
	WebhookInputLeftChatMembers
	// WebhookInputSticker is sticker input type
	WebhookInputSticker // Telegram
)

type WebhookLeftChatMembersMessage

type WebhookLeftChatMembersMessage interface {
	BotChatID() (string, error)
	LeftChatMembers() []WebhookActor
}

WebhookLeftChatMembersMessage represents single message about a member leaving a botChat

type WebhookMessage

type WebhookMessage interface {
	IntID() int64
	StringID() string
	Chat() WebhookChat
}

WebhookMessage represents single message

type WebhookNewChatMembersMessage

type WebhookNewChatMembersMessage interface {
	BotChatID() (string, error)
	NewChatMembers() []WebhookActor
}

WebhookNewChatMembersMessage represents single message about a new member of a botChat

type WebhookNewContext

type WebhookNewContext struct {
	BotContext
	WebhookInput
}

WebhookNewContext TODO: needs to be checked & described

type WebhookPhotoMessage

type WebhookPhotoMessage interface {
	WebhookMessage
}

WebhookPhotoMessage represents single photo message

type WebhookPostback

type WebhookPostback interface {
	PostbackMessage() interface{}
	Payload() string
}

WebhookPostback represents single postback message

type WebhookRecipient

type WebhookRecipient interface {
	WebhookActor
}

WebhookRecipient represents receiver

type WebhookReferralMessage

type WebhookReferralMessage interface {
	Type() string
	Source() string
	RefData() string
}

WebhookReferralMessage represents single referral message https://developers.facebook.com/docs/messenger-platform/webhook-reference/referral

type WebhookResponder

type WebhookResponder interface {
	SendMessage(c context.Context, m MessageFromBot, channel BotAPISendMessageChannel) (OnMessageSentResponse, error)
}

WebhookResponder is an API provider to send messages through a messenger

type WebhookSender

type WebhookSender interface {
	GetAvatar() string // Extension to support avatar (Viber)
	WebhookActor
}

WebhookSender represents sender with avatar

type WebhookStickerMessage

type WebhookStickerMessage interface {
	WebhookMessage
}

WebhookStickerMessage represents single sticker message

type WebhookSubscribed

type WebhookSubscribed interface {
	SubscribedMessage() interface{}
}

WebhookSubscribed represents a subscription message

type WebhookTextMessage

type WebhookTextMessage interface {
	WebhookMessage
	Text() string
	IsEdited() bool
}

WebhookTextMessage represents single text message

type WebhookUnsubscribed

type WebhookUnsubscribed interface {
	UnsubscribedMessage() interface{}
}

WebhookUnsubscribed represents a message when user unsubscribe

type WebhookUser

type WebhookUser interface {
	WebhookSender

	// GetCountry is an extension to support language & country (Viber)
	GetCountry() string
}

WebhookUser represents sender with country

type WebhookVoiceMessage

type WebhookVoiceMessage interface {
	WebhookMessage
}

WebhookVoiceMessage represents single voice message

type WebhooksRouter

type WebhooksRouter struct {
	// contains filtered or unexported fields
}

WebhooksRouter maps routes to commands

func NewWebhookRouter

func NewWebhookRouter(commandsByType map[WebhookInputType][]Command, errorFooterText func() string) WebhooksRouter

NewWebhookRouter creates new router

func (*WebhooksRouter) AddCommands

func (whr *WebhooksRouter) AddCommands(commandsType WebhookInputType, commands []Command)

AddCommands add commands to a router

func (*WebhooksRouter) CommandsCount

func (whr *WebhooksRouter) CommandsCount() int

func (*WebhooksRouter) Dispatch

func (whr *WebhooksRouter) Dispatch(webhookHandler WebhookHandler, responder WebhookResponder, whc WebhookContext)

Dispatch query to commands

func (*WebhooksRouter) DispatchInlineQuery

func (whr *WebhooksRouter) DispatchInlineQuery(responder WebhookResponder)

DispatchInlineQuery dispatches inlines query

func (*WebhooksRouter) RegisterCommands

func (whr *WebhooksRouter) RegisterCommands(commands []Command)

RegisterCommands is registering commands with router

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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