lowbot

package module
v1.13.4 Latest Latest
Warning

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

Go to latest
Published: May 17, 2025 License: MIT Imports: 34 Imported by: 3

README ΒΆ

lowbot

πŸ€– LowBot is a Go project on GitHub that simplifies bot creation by automatically generating bot journeys from a YAML script. It offers extensive customization options, making it highly versatile and adaptable.

πŸ€” Why LowBot?

  • πŸ“š Simple and Self-Explanatory Scripting:

    LowBot follows a straightforward and intuitive YAML script format, making it easy to understand and modify for creating bot journeys.

  • 🧩 Extensibility for Custom Business Rules:

    LowBot offers extensive flexibility, allowing users to define their own custom actions and implement unique business rules tailored to their specific requirements.

  • πŸ“‘ Expandable Bot Channels:

    With LowBot, users can seamlessly integrate and implement their own channels, empowering them to connect the bot with various platforms and communication channels of their choice.

πŸ“¦ Install

go get github.com/chrissgon/lowbot

πŸš€ Quick Start

Start a bot with Telegram and local persist

import "github.com/chrissgon/lowbot"

flow, _ := lowbot.NewFlow("your_flow.yaml")
channel, _ := lowbot.NewTelegram("your_telegram_token")
persist, _ := lowbot.NewLocalPersist()

lowbot.StartBot(flow, channel, persist)

Start a bot with Discord and custom actions

import "github.com/chrissgon/lowbot"

myActions := lowbot.ActionsMap{
    "Custom": func(flow *lowbot.Flow, channel lowbot.IChannel) (bool, error) {
        // your rules
        wait := true
        return wait, nil
    },
}

lowbot.SetCustomActions(myActions)

flow, _ := lowbot.NewFlow("your_flow.yaml")
channel, _ := lowbot.NewDiscord()
persist, _ := lowbot.NewLocalPersist()

lowbot.StartBot(flow, channel, persist)

You can create your Channel or Persist by implementing their interfaces

import "github.com/chrissgon/lowbot"

func MyNewChannel () lowbot.IChannel {
  // implements Channel
}

func MyNewPersist () lowbot.Persist {
  // implements Persist
}

flow, _ := lowbot.NewFlow("your_flow.yaml")

// And you can pass in the StartBot
lowbot.StartBot(flow, MyNewChannel(), MyNewPersist())

πŸ“š Documentation

Read all documentation in docs folder.

🌎 Global Variables

When you run this project, you can adjusts the following environment variables.

Debug: Show debug => default: true

EnableLocalPersist: Enable local persist => default: true

πŸ”’ Environment Variables

When you run this project, you need set the following environment variables.

  • When you to use Telegram:
    TELEGRAM_TOKEN: Telegram bot token.
  • When you to use Discord:
    DISCORD_TOKEN: Discord bot token.

πŸ“ Anotations

Run all the tests with coverage.

go test ./... -coverprofile=coverage.out && ./coverage-ignore.sh && go tool cover -html=coverage.out

πŸ’ͺ🏻 Contribution

This project is open source and welcomes community contributions. Feel free to fork, implement improvements, and submit a pull request. Every contribution is valued and appreciated!

We hope that lowbot proves useful to you and enhances your manga reading experience. Feel free to explore the source code, provide feedback, and report any issues you encounter.

❀️ Authors

Documentation ΒΆ

Index ΒΆ

Constants ΒΆ

View Source
const (
	CHANNEL_TELEGRAM_NAME        = "telegram"
	CHANNEL_WHATSAPP_TWILIO_NAME = "whatsapp-twilio"
	CHANNEL_WHATSAPP_DEVICE_NAME = "whatsapp-meow"
	CHANNEL_DISCORD_NAME         = "discord"
	CONSUMER_JOURNEY_NAME        = "journey"
	CONSUMER_CHATGPT_NAME        = "chatgpt"
	FLOW_INIT_STEP_NAME          = "init"
	FLOW_END_STEP_NAME           = "end"
	FLOW_DEFAULT_STEP_NAME       = "default"
)

Variables ΒΆ

View Source
var (
	DEBUG                           = false
	ERR_CHANNEL_RUNNING             = fmt.Errorf("channel is running")
	ERR_CHANNEL_NOT_RUNNING         = fmt.Errorf("channel is not running")
	ERR_UNKNOWN_TELEGRAM_TOKEN      = fmt.Errorf("unknown telegram token")
	ERR_UNKNOWN_DISCORD_TOKEN       = fmt.Errorf("unknown discord token")
	ERR_UNKNOWN_CHATGPT_TOKEN       = fmt.Errorf("unknown chatgpt token")
	ERR_CONNECT_CHATGPT             = fmt.Errorf("connect to chatgpt failed")
	ERR_UNDEFINED_CHATGPT_ASSISTANT = fmt.Errorf("undefined chatgpt assistant")
	ERR_UNKNOWN_ACTION              = fmt.Errorf("unknown action")
	ERR_UNKNOWN_ROOM                = fmt.Errorf("unknown room")
	ERR_NIL_FLOW                    = fmt.Errorf("nil flow")
	ERR_NIL_STEP                    = fmt.Errorf("nil step")
	ERR_NIL_CHANNEL                 = fmt.Errorf("nil channel")
	ERR_UNKNOWN_DEFAULT_STEP        = fmt.Errorf("unknown step: default")
	ERR_UNKNOWN_INIT_STEP           = fmt.Errorf("unknown step: init")
	ERR_UNKNOWN_NEXT_STEP           = fmt.Errorf("unknown next step")
	ERR_PATTERN_NEXT_STEP           = fmt.Errorf("step pattern invalid")
	ERR_ENDED_FLOW                  = fmt.Errorf("flow ended")
	ERR_ROOM_STOPPED_FLOW           = fmt.Errorf("flow finished by room")
	ERR_FILE_NOT_PUBLIC             = fmt.Errorf("file is not public")

	ERR_FEATURE_UNIMPLEMENTED = fmt.Errorf("feature unimplemented")
)
View Source
var (
	FILETYPE_AUDIO_EXT = []string{".aac", ".mp3", ".oga", ".opus", ".wav", ".weba", ".cda"}
	FILETYPE_IMAGE_EXT = []string{".apng", ".avif", ".gif", ".jpg", ".jpeg", ".png", ".svg", ".webp"}
	FILETYPE_VIDEO_EXT = []string{".avi", ".mp4", ".mpeg", ".ogv", ".webm"}
)
View Source
var WhatsMeowReplyDuration time.Duration = 2 * time.Second

Functions ΒΆ

func FormatTestError ΒΆ

func FormatTestError(expect, have any) string

func InitWhatsappMeowChannel ΒΆ added in v1.13.2

func InitWhatsappMeowChannel(ctx context.Context, db *sql.DB, dialect string, log waLog.Logger) error

func InitWhatsappTwilioChannel ΒΆ added in v1.13.1

func InitWhatsappTwilioChannel(webhook *gin.Engine, path string)

func IsURL ΒΆ

func IsURL(str string) bool

func ParseTemplate ΒΆ

func ParseTemplate(texts []string) string

func PrintLog ΒΆ added in v1.13.2

func PrintLog(msg string)

func SendInteraction ΒΆ added in v1.10.0

func SendInteraction(channel IChannel, interaction *Interaction) error

func SetCustomActions ΒΆ added in v1.1.0

func SetCustomActions(custom ActionsMap)

Types ΒΆ

type ActionFunc ΒΆ added in v1.11.0

type ActionFunc func(*Interaction) (*Interaction, bool)

func GetAction ΒΆ added in v1.11.0

func GetAction(flow *Flow) (ActionFunc, error)

type ActionsMap ΒΆ

type ActionsMap map[string]ActionFunc

type Bot ΒΆ added in v1.11.0

type Bot struct {
	BotID    uuid.UUID
	Consumer IConsumer
	Channels map[uuid.UUID]IChannel
	Running  bool
}

func NewBot ΒΆ added in v1.11.0

func NewBot(consumer IConsumer, channels map[uuid.UUID]IChannel) *Bot

func (*Bot) Start ΒΆ added in v1.11.0

func (bot *Bot) Start() error

func (*Bot) StartChannel ΒΆ added in v1.11.0

func (bot *Bot) StartChannel(channel IChannel) error

func (*Bot) StartConsumerChannel ΒΆ added in v1.11.0

func (bot *Bot) StartConsumerChannel(channel IChannel)

func (*Bot) Stop ΒΆ added in v1.11.0

func (bot *Bot) Stop() error

type Broadcast ΒΆ added in v1.10.0

type Broadcast[T any] struct {
	// contains filtered or unexported fields
}

func NewBroadcast ΒΆ added in v1.10.0

func NewBroadcast[T any]() *Broadcast[T]

func (*Broadcast[T]) Close ΒΆ added in v1.10.0

func (b *Broadcast[T]) Close() error

func (*Broadcast[T]) Listen ΒΆ added in v1.10.0

func (b *Broadcast[T]) Listen() chan T

func (*Broadcast[T]) Send ΒΆ added in v1.10.0

func (b *Broadcast[T]) Send(v T)

type Channel ΒΆ

type Channel struct {
	ChannelID uuid.UUID
	Name      string
	Running   bool
	Broadcast *Broadcast[*Interaction]
}

type ChatGPTAssistantConsumer ΒΆ added in v1.8.0

type ChatGPTAssistantConsumer struct {
	*Consumer
	// contains filtered or unexported fields
}

func (*ChatGPTAssistantConsumer) GetConsumer ΒΆ added in v1.9.5

func (consumer *ChatGPTAssistantConsumer) GetConsumer() *Consumer

func (*ChatGPTAssistantConsumer) Run ΒΆ added in v1.8.0

func (consumer *ChatGPTAssistantConsumer) Run(interaction *Interaction) ([]*Interaction, error)

type ChatGPTConsumer ΒΆ added in v1.7.1

type ChatGPTConsumer struct {
	*Consumer
	// contains filtered or unexported fields
}

func (*ChatGPTConsumer) GetConsumer ΒΆ added in v1.9.5

func (consumer *ChatGPTConsumer) GetConsumer() *Consumer

func (*ChatGPTConsumer) Run ΒΆ added in v1.7.1

func (consumer *ChatGPTConsumer) Run(interaction *Interaction) ([]*Interaction, error)

type Consumer ΒΆ added in v1.7.1

type Consumer struct {
	ConsumerID uuid.UUID
	Name       string
}

type DiscordChannel ΒΆ added in v1.7.1

type DiscordChannel struct {
	*Channel
	// contains filtered or unexported fields
}

func (*DiscordChannel) GetChannel ΒΆ added in v1.7.1

func (channel *DiscordChannel) GetChannel() *Channel

func (*DiscordChannel) RespondInteraction ΒΆ added in v1.7.1

func (channel *DiscordChannel) RespondInteraction(in *discordgo.Interaction)

func (*DiscordChannel) SendAudio ΒΆ added in v1.7.1

func (channel *DiscordChannel) SendAudio(interaction *Interaction) error

func (*DiscordChannel) SendButton ΒΆ added in v1.7.1

func (channel *DiscordChannel) SendButton(interaction *Interaction) error

func (*DiscordChannel) SendDocument ΒΆ added in v1.7.1

func (channel *DiscordChannel) SendDocument(interaction *Interaction) error

func (*DiscordChannel) SendFile ΒΆ added in v1.7.1

func (channel *DiscordChannel) SendFile(sessionID, text, path string) error

func (*DiscordChannel) SendImage ΒΆ added in v1.7.1

func (channel *DiscordChannel) SendImage(interaction *Interaction) error

func (*DiscordChannel) SendText ΒΆ added in v1.7.1

func (channel *DiscordChannel) SendText(interaction *Interaction) error

func (*DiscordChannel) SendVideo ΒΆ added in v1.7.1

func (channel *DiscordChannel) SendVideo(interaction *Interaction) error

func (*DiscordChannel) Start ΒΆ added in v1.11.0

func (channel *DiscordChannel) Start() error

func (*DiscordChannel) Stop ΒΆ added in v1.11.0

func (channel *DiscordChannel) Stop() error

type File ΒΆ added in v1.7.1

type File struct {
	FileID    uuid.UUID
	FileType  FileType
	Name      string
	Bytes     []byte
	Path      string
	Extension string
	Mime      string
	Err       error
}

func (*File) GetFile ΒΆ added in v1.7.1

func (file *File) GetFile() *File

func (*File) IsAudio ΒΆ added in v1.7.1

func (file *File) IsAudio() bool

func (*File) IsDocument ΒΆ added in v1.7.1

func (file *File) IsDocument() bool

func (*File) IsImage ΒΆ added in v1.7.1

func (file *File) IsImage() bool

func (*File) IsVideo ΒΆ added in v1.7.1

func (file *File) IsVideo() bool

func (*File) Read ΒΆ added in v1.7.1

func (file *File) Read() error

func (*File) SetFilePath ΒΆ added in v1.7.1

func (file *File) SetFilePath(path string)

func (*File) SetFileType ΒΆ added in v1.7.1

func (file *File) SetFileType()

type FileType ΒΆ added in v1.7.1

type FileType string
const (
	FILETYPE_AUDIO    FileType = "FILETYPE_AUDIO"
	FILETYPE_DOCUMENT FileType = "FILETYPE_DOCUMENT"
	FILETYPE_IMAGE    FileType = "FILETYPE_IMAGE"
	FILETYPE_VIDEO    FileType = "FILETYPE_VIDEO"
)

type Flow ΒΆ

type Flow struct {
	FlowID          uuid.UUID
	Name            string `yaml:"name" json:"name"`
	Description     string `yaml:"description" json:"description"`
	Steps           Steps  `yaml:"steps" json:"steps"`
	CurrentStep     *Step
	CurrentStepName string
}

func NewFlow ΒΆ

func NewFlow(path string) (*Flow, error)

func NewFlowByJSON ΒΆ added in v1.10.0

func NewFlowByJSON(strJSON string) (*Flow, error)

func NewFlowByJSONFile ΒΆ added in v1.10.0

func NewFlowByJSONFile(path string) (*Flow, error)

func (*Flow) Ended ΒΆ added in v1.10.0

func (flow *Flow) Ended() bool

func (*Flow) Next ΒΆ

func (flow *Flow) Next(interaction *Interaction) error

func (*Flow) NoHasNext ΒΆ added in v1.4.0

func (flow *Flow) NoHasNext() bool

func (*Flow) Start ΒΆ

func (flow *Flow) Start() error

type FlowPersist ΒΆ added in v1.7.1

type FlowPersist interface {
	Set(any, *Flow) error
	Get(any) (*Flow, error)
}

func NewMemoryFlowPersist ΒΆ added in v1.7.1

func NewMemoryFlowPersist() (FlowPersist, error)

type IChannel ΒΆ added in v1.7.1

type IChannel interface {
	GetChannel() *Channel
	Stop() error
	Start() error
	SendAudio(*Interaction) error
	SendButton(*Interaction) error
	SendDocument(*Interaction) error
	SendImage(*Interaction) error
	SendText(*Interaction) error
	SendVideo(*Interaction) error
}

func NewDiscordChannel ΒΆ added in v1.7.1

func NewDiscordChannel(token string) (IChannel, error)

func NewTelegramChannel ΒΆ added in v1.7.1

func NewTelegramChannel(token string) (IChannel, error)

func NewWhatsappMeowChannel ΒΆ added in v1.13.2

func NewWhatsappMeowChannel(ctx context.Context, JID types.JID, qrcodeChan chan WhatsappMeowUpdate) (IChannel, error)

func NewWhatsappTwilioChannel ΒΆ added in v1.11.0

func NewWhatsappTwilioChannel(number, token, SID string) (IChannel, error)

type IConsumer ΒΆ added in v1.7.1

type IConsumer interface {
	Run(*Interaction) ([]*Interaction, error)
	GetConsumer() *Consumer
}

func NewChatGPTAssistantConsumer ΒΆ added in v1.8.0

func NewChatGPTAssistantConsumer(token string, assistantID string) (IConsumer, error)

func NewChatGPTConsumer ΒΆ added in v1.7.1

func NewChatGPTConsumer(token string, model string) (IConsumer, error)

func NewJourneyConsumer ΒΆ added in v1.7.1

func NewJourneyConsumer(flow *Flow, persist FlowPersist) IConsumer

type IFile ΒΆ added in v1.7.1

type IFile interface {
	GetFile() *File
	Read() error
	IsAudio() bool
	IsDocument() bool
	IsImage() bool
	IsVideo() bool
}

func NewFile ΒΆ added in v1.7.1

func NewFile(path string) IFile

type Interaction ΒΆ

type Interaction struct {
	To      *Who
	From    *Who
	Replier *Who

	Type       InteractionType
	Parameters InteractionParameters
	Step       Step
	Custom     map[string]any
}

func NewInteractionMessageButton ΒΆ

func NewInteractionMessageButton(buttons []string, text string) *Interaction

func NewInteractionMessageFile ΒΆ added in v1.7.1

func NewInteractionMessageFile(path string, text string) *Interaction

func NewInteractionMessageText ΒΆ

func NewInteractionMessageText(text string) *Interaction

func RunActionButton ΒΆ added in v1.10.0

func RunActionButton(interaction *Interaction) (*Interaction, bool)

func RunActionFile ΒΆ added in v1.10.0

func RunActionFile(interaction *Interaction) (*Interaction, bool)

func RunActionInput ΒΆ added in v1.10.0

func RunActionInput(interaction *Interaction) (*Interaction, bool)

func RunActionText ΒΆ added in v1.10.0

func RunActionText(interaction *Interaction) (*Interaction, bool)

func (*Interaction) SetFrom ΒΆ added in v1.11.0

func (interaction *Interaction) SetFrom(from *Who) *Interaction

func (*Interaction) SetReplier ΒΆ added in v1.7.1

func (interaction *Interaction) SetReplier(replier *Who) *Interaction

func (*Interaction) SetStep ΒΆ added in v1.11.0

func (interaction *Interaction) SetStep(step Step) *Interaction

func (*Interaction) SetTo ΒΆ added in v1.11.0

func (interaction *Interaction) SetTo(to *Who) *Interaction

type InteractionParameters ΒΆ

type InteractionParameters struct {
	Buttons []string
	File    IFile
	Text    string
	Custom  map[string]any
}

type InteractionType ΒΆ

type InteractionType string
const (
	MESSAGE_BUTTON InteractionType = "MESSAGE_BUTTON"
	MESSAGE_FILE   InteractionType = "MESSAGE_FILE"
	MESSAGE_TEXT   InteractionType = "MESSAGE_TEXT"
	EVENT_TYPING   InteractionType = "EVENT_TYPING"
)

type JourneyConsumer ΒΆ added in v1.7.1

type JourneyConsumer struct {
	*Consumer
	Flow    *Flow
	Persist FlowPersist
}

func (*JourneyConsumer) GetConsumer ΒΆ added in v1.9.5

func (consumer *JourneyConsumer) GetConsumer() *Consumer

func (*JourneyConsumer) Run ΒΆ added in v1.7.1

func (consumer *JourneyConsumer) Run(interaction *Interaction) ([]*Interaction, error)

type MemoryFlowPersist ΒΆ added in v1.7.1

type MemoryFlowPersist struct {
	Sessions map[any]*Flow
}

func (*MemoryFlowPersist) Get ΒΆ added in v1.7.1

func (memory *MemoryFlowPersist) Get(ID any) (*Flow, error)

func (*MemoryFlowPersist) Set ΒΆ added in v1.7.1

func (memory *MemoryFlowPersist) Set(ID any, flow *Flow) error

type Step ΒΆ

type Step struct {
	Action     string            `yaml:"action" json:"action"`
	Next       map[string]string `yaml:"next" json:"next"`
	Parameters StepParameters    `yaml:"parameters" json:"parameters"`
}

type StepParameters ΒΆ

type StepParameters struct {
	Buttons []string       `yaml:"buttons" json:"buttons"`
	Path    string         `yaml:"path" json:"path"`
	Text    string         `yaml:"text" json:"text"`
	Texts   []string       `yaml:"texts" json:"texts"`
	Custom  map[string]any `yaml:"custom" json:"custom"`
}

type Steps ΒΆ

type Steps map[string]*Step

type TelegramChannel ΒΆ added in v1.7.1

type TelegramChannel struct {
	*Channel
	// contains filtered or unexported fields
}

func (*TelegramChannel) GetChannel ΒΆ added in v1.7.1

func (channel *TelegramChannel) GetChannel() *Channel

func (*TelegramChannel) SendAudio ΒΆ added in v1.7.1

func (channel *TelegramChannel) SendAudio(interaction *Interaction) error

func (*TelegramChannel) SendButton ΒΆ added in v1.7.1

func (channel *TelegramChannel) SendButton(interaction *Interaction) error

func (*TelegramChannel) SendDocument ΒΆ added in v1.7.1

func (channel *TelegramChannel) SendDocument(interaction *Interaction) error

func (*TelegramChannel) SendImage ΒΆ added in v1.7.1

func (channel *TelegramChannel) SendImage(interaction *Interaction) error

func (*TelegramChannel) SendText ΒΆ added in v1.7.1

func (channel *TelegramChannel) SendText(interaction *Interaction) error

func (*TelegramChannel) SendVideo ΒΆ added in v1.7.1

func (channel *TelegramChannel) SendVideo(interaction *Interaction) error

func (*TelegramChannel) Start ΒΆ added in v1.11.0

func (channel *TelegramChannel) Start() error

func (*TelegramChannel) Stop ΒΆ added in v1.11.0

func (channel *TelegramChannel) Stop() error

type WebhookChannel ΒΆ added in v1.13.2

type WebhookChannel struct {
	*Channel
}

type WhatsappMeowChannel ΒΆ added in v1.13.2

type WhatsappMeowChannel struct {
	*Channel

	JID *types.JID
	// contains filtered or unexported fields
}

func (*WhatsappMeowChannel) GetChannel ΒΆ added in v1.13.2

func (channel *WhatsappMeowChannel) GetChannel() *Channel

func (*WhatsappMeowChannel) SendAudio ΒΆ added in v1.13.2

func (channel *WhatsappMeowChannel) SendAudio(interaction *Interaction) error

func (*WhatsappMeowChannel) SendButton ΒΆ added in v1.13.2

func (channel *WhatsappMeowChannel) SendButton(interaction *Interaction) error

func (*WhatsappMeowChannel) SendDocument ΒΆ added in v1.13.2

func (channel *WhatsappMeowChannel) SendDocument(interaction *Interaction) error

func (*WhatsappMeowChannel) SendImage ΒΆ added in v1.13.2

func (channel *WhatsappMeowChannel) SendImage(interaction *Interaction) error

func (*WhatsappMeowChannel) SendText ΒΆ added in v1.13.2

func (channel *WhatsappMeowChannel) SendText(interaction *Interaction) error

func (*WhatsappMeowChannel) SendVideo ΒΆ added in v1.13.2

func (channel *WhatsappMeowChannel) SendVideo(interaction *Interaction) error

func (*WhatsappMeowChannel) Start ΒΆ added in v1.13.2

func (channel *WhatsappMeowChannel) Start() error

func (*WhatsappMeowChannel) Stop ΒΆ added in v1.13.2

func (channel *WhatsappMeowChannel) Stop() error

type WhatsappMeowUpdate ΒΆ added in v1.13.4

type WhatsappMeowUpdate struct {
	JID types.JID
	// contains filtered or unexported fields
}

type WhatsappTwilioChannel ΒΆ added in v1.11.0

type WhatsappTwilioChannel struct {
	*Channel
	// contains filtered or unexported fields
}

func (*WhatsappTwilioChannel) GetChannel ΒΆ added in v1.11.0

func (channel *WhatsappTwilioChannel) GetChannel() *Channel

func (*WhatsappTwilioChannel) SendAudio ΒΆ added in v1.11.0

func (channel *WhatsappTwilioChannel) SendAudio(interaction *Interaction) error

func (*WhatsappTwilioChannel) SendButton ΒΆ added in v1.11.0

func (channel *WhatsappTwilioChannel) SendButton(interaction *Interaction) error

func (*WhatsappTwilioChannel) SendDocument ΒΆ added in v1.11.0

func (channel *WhatsappTwilioChannel) SendDocument(interaction *Interaction) error

func (*WhatsappTwilioChannel) SendImage ΒΆ added in v1.11.0

func (channel *WhatsappTwilioChannel) SendImage(interaction *Interaction) error

func (*WhatsappTwilioChannel) SendText ΒΆ added in v1.11.0

func (channel *WhatsappTwilioChannel) SendText(interaction *Interaction) error

func (*WhatsappTwilioChannel) SendVideo ΒΆ added in v1.11.0

func (channel *WhatsappTwilioChannel) SendVideo(interaction *Interaction) error

func (*WhatsappTwilioChannel) Start ΒΆ added in v1.11.0

func (channel *WhatsappTwilioChannel) Start() error

func (*WhatsappTwilioChannel) Stop ΒΆ added in v1.11.0

func (channel *WhatsappTwilioChannel) Stop() error

type Who ΒΆ added in v1.7.1

type Who struct {
	WhoID  string
	Name   string
	Custom map[string]any
}

func NewWho ΒΆ added in v1.7.1

func NewWho(whoID string, name string) *Who

Directories ΒΆ

Path Synopsis
docs
examples/hello command
examples/types command

Jump to

Keyboard shortcuts

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