app

package
v0.0.0-...-673da16 Latest Latest
Warning

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

Go to latest
Published: Jan 5, 2026 License: MIT Imports: 23 Imported by: 0

Documentation

Index

Constants

View Source
const (
	MCBRP  string = "MCBRP"
	DJBRP  string = "DJBRP"
	DNTBRP string = "DNTBRP"
	N5XBRP string = "N5XBRP"
	DGORG  string = "DGORG"
	DTMSV  string = "DTMSV"
	MUFHH  string = "MUFHH"
)
View Source
const (
	Keyboard    string = "Keyboard"
	Passage     string = "Passage"
	MemoryVerse string = "MemoryVerse"
)
View Source
const ADM_CMD_DUMP = "admin_dump"
View Source
const ADM_MIGRATE = "admin_migrate"
View Source
const CMD_ASK = "ask"
View Source
const CMD_CLOSE = "close"
View Source
const CMD_DEVO = "devo"
View Source
const CMD_PASSAGE = "passage"
View Source
const CMD_SEARCH = "search"
View Source
const CMD_SUBSCRIBE = "subscribe"
View Source
const CMD_TMS = "tms"
View Source
const CMD_VERSION = "version"

Variables

View Source
var BibleBooks = map[string]string{}/* 272 elements not displayed */
View Source
var CLOSEMSGS = []string{
	"Okay %s",
	"Got it, %s!",
	"As you wish, %s",
	"Because you said so, %s",
	"I hear and obey, %s",
}
View Source
var DEVOS = map[string]string{
	"M'Cheyne Bible Reading Plan":                 MCBRP,
	"Discipleship Journal Bible Reading Plan":     DJBRP,
	"Daily New Testament Reading Plan":            DNTBRP,
	"Navigators 5x5x5 New Testament Reading Plan": N5XBRP,
	"Desiring God Articles":                       DGORG,
	"Daily Topical Memory System Verse":           DTMSV,
	"My Utmost For His Highest Articles":          MUFHH,
}
View Source
var DEVO_NAMES = map[string]string{
	MCBRP:  "M'Cheyne Bible Reading Plan",
	DJBRP:  "Discipleship Journal Bible Reading Plan",
	DNTBRP: "Daily New Testament Reading Plan",
	N5XBRP: "Navigators 5x5x5 New Testament Reading Plan",
	DGORG:  "Desiring God Articles",
	DTMSV:  "Daily Topical Memory System Verse",
	MUFHH:  "My Utmost For His Highest Articles",
}
View Source
var GetPassageHTML = func(ref, ver string) *html.Node {
	ref = url.QueryEscape(ref)
	ver = url.QueryEscape(ver)
	query := fmt.Sprintf("https://classic.biblegateway.com/passage/?search=%s&version=%s&interface=print", ref, ver)

	return utils.QueryHtml(query)
}
View Source
var SingleChapterBooks = map[string]bool{
	"Obadiah":  true,
	"Philemon": true,
	"2 John":   true,
	"3 John":   true,
	"Jude":     true,
}
View Source
var SubmitQuery = func(req QueryRequest, result interface{}) error {
	apiURL, apiKey := getAPIConfig()
	if apiURL == "" {
		return fmt.Errorf("BIBLE_API_URL environment variable is not set")
	}

	if apiURL == "https://example.com" {
		switch r := result.(type) {
		case *WordSearchResponse:
			*r = WordSearchResponse{
				{Verse: "John 3:16", URL: "https://example.com/John3:16"},
			}
		case *OQueryResponse:
			*r = OQueryResponse{
				Text: "This is a mock response.",
				References: []SearchResult{
					{Verse: "John 3:16", URL: "https://example.com/John3:16"},
				},
			}
		case *VerseResponse:
			*r = VerseResponse{
				Verse: "For God so loved the world...",
			}
		}
		return nil
	}

	jsonData, err := json.Marshal(req)
	if err != nil {
		return fmt.Errorf("failed to marshal request: %v", err)
	}

	client := &http.Client{}
	httpReq, err := http.NewRequest("POST", apiURL+"/query", bytes.NewBuffer(jsonData))
	if err != nil {
		return fmt.Errorf("failed to create request: %v", err)
	}

	httpReq.Header.Set("Content-Type", "application/json")
	if apiKey != "" {
		httpReq.Header.Set("X-API-KEY", apiKey)
	}

	resp, err := client.Do(httpReq)
	if err != nil {
		return fmt.Errorf("request failed: %v", err)
	}
	defer resp.Body.Close()

	body, err := io.ReadAll(resp.Body)
	if err != nil {
		return fmt.Errorf("failed to read response body: %v", err)
	}

	if resp.StatusCode != http.StatusOK {
		// Try to parse error response
		var errResp ErrorResponse
		if jsonErr := json.Unmarshal(body, &errResp); jsonErr == nil && errResp.Error.Message != "" {
			return fmt.Errorf("api error (%d): %s", errResp.Error.Code, errResp.Error.Message)
		}
		return fmt.Errorf("api request failed with status %d: %s", resp.StatusCode, string(body))
	}

	if err := json.Unmarshal(body, result); err != nil {
		return fmt.Errorf("failed to unmarshal response: %v", err)
	}

	return nil
}

SubmitQuery sends the QueryRequest to the Bible API and unmarshals the response into result. result should be a pointer to the expected response struct.

View Source
var VERSIONS = map[string]string{
	"NIV":  "NIV",
	"ESV":  "ESV",
	"KJV":  "KJV",
	"NASB": "NASB",
	"NLT":  "NLT",
	"AMP":  "AMP",
}

Functions

func AcronymizeDevo

func AcronymizeDevo(msg string) (string, error)

func CheckBibleReference

func CheckBibleReference(ref string) bool

CheckBibleReference validates if the string is a valid Bible reference using local logic.

func CleanPassageText

func CleanPassageText(text string) string

func CloseAction

func CloseAction(env def.SessionData) def.SessionData

func DumpUserList

func DumpUserList(env def.SessionData) def.SessionData

func ExpandDevo

func ExpandDevo(msg string) (string, error)

func ExtractBibleReferences

func ExtractBibleReferences(input string) []string

ExtractBibleReferences extracts all valid Bible references from a text.

func FormatQuery

func FormatQuery(query string, t TMSQueryType) string

func GetBibleAsk

func GetBibleAsk(env def.SessionData) def.SessionData

func GetBibleAskWithContext

func GetBibleAskWithContext(env def.SessionData, contextVerses []string) def.SessionData

func GetBiblePassage

func GetBiblePassage(env def.SessionData) def.SessionData

func GetBiblePassageFallback

func GetBiblePassageFallback(env def.SessionData) def.SessionData

func GetBibleSearch

func GetBibleSearch(env def.SessionData) def.SessionData

func GetDailyNewTestamentReadingReferences

func GetDailyNewTestamentReadingReferences(env def.SessionData) string

func GetDesiringGodArticles

func GetDesiringGodArticles() []def.Option

func GetDevo

func GetDevo(env def.SessionData, bot platform.Platform) def.SessionData

func GetDevotionalData

func GetDevotionalData(env def.SessionData, devo string) def.ResponseData

func GetDevotionalDispatchMethod

func GetDevotionalDispatchMethod(devo string) string

func GetDevotionalText

func GetDevotionalText(devo string) string

func GetDiscipleshipJournalReferences

func GetDiscipleshipJournalReferences(env def.SessionData) []def.Option

func GetMCheyneHtml

func GetMCheyneHtml() *html.Node

func GetMCheyneReferences

func GetMCheyneReferences() []def.Option

func GetNavigators5xReferences

func GetNavigators5xReferences(env def.SessionData) string

func GetNavigators5xRestDayPrompt

func GetNavigators5xRestDayPrompt(env def.SessionData) (string, []def.Option)

func GetPassage

func GetPassage(ref string, doc *html.Node, version string) string

func GetRandomTMSVerse

func GetRandomTMSVerse(env def.SessionData) string

func GetReference

func GetReference(doc *html.Node) string

func GetTMSVerse

func GetTMSVerse(env def.SessionData) def.SessionData

func GetUtmostForHisHighestArticles

func GetUtmostForHisHighestArticles() []def.Option

func Migrate

func Migrate(env def.SessionData) def.SessionData

func MockSubmitQuery

func MockSubmitQuery(t HelperT, callback func(QueryRequest)) func(QueryRequest, interface{}) error

MockSubmitQuery is a helper to mock SubmitQuery for testing purposes. It captures the request in a closure and allows verifying it.

func ParseBibleReference

func ParseBibleReference(input string) (string, bool)

ParseBibleReference parses a string to identify and normalize a Bible reference. It returns the normalized reference string and a boolean indicating validity.

func ParseBibleReferenceFromStart

func ParseBibleReferenceFromStart(input string) (string, int, bool)

ParseBibleReferenceFromStart attempts to parse a Bible reference at the beginning of the string. Returns the normalized reference, the length of text consumed from input, and whether a match was found.

func ParseNodesForPassage

func ParseNodesForPassage(node *html.Node) string

func ParsePassageFromHtml

func ParsePassageFromHtml(ref string, rawHtml string, version string) string

func ProcessCommand

func ProcessCommand(env def.SessionData, bot platform.Platform) def.SessionData

func ProcessNaturalLanguage

func ProcessNaturalLanguage(env def.SessionData) def.SessionData

func QueryTMSPack

func QueryTMSPack(db TMSDatabase, p PackSelector) (TMSPack, TMSVerse, error)

func QueryTMSSeries

func QueryTMSSeries(db TMSDatabase, s SeriesSelector) (TMSPack, TMSVerse, error)

func QueryTMSVerse

func QueryTMSVerse(db TMSDatabase, v VerseSelector) (TMSPack, TMSVerse, error)

func ResetAPIConfigCache

func ResetAPIConfigCache()

ResetAPIConfigCache invalidates the cache, forcing a reload on next call. This is primarily for testing purposes.

func SanitizeVersion

func SanitizeVersion(msg string) (string, error)

func SetAPIConfigOverride

func SetAPIConfigOverride(url, key string)

SetAPIConfigOverride forces the configuration to use the provided values. This is intended for testing or manual configuration.

func SetEnv

func SetEnv(key, value string) func()

SetEnv is a helper function to temporarily set an environment variable and return a function to restore it.

func SetVersion

func SetVersion(env def.SessionData) def.SessionData

func UnsetEnv

func UnsetEnv(key string) func()

UnsetEnv is a helper function to temporarily unset an environment variable and return a function to restore it.

func UpdateSubscription

func UpdateSubscription(env def.SessionData) def.SessionData

Types

type BibleReadingPlanChapter

type BibleReadingPlanChapter struct {
	Verses string `yaml:"Verses,flow"`
}

type BibleReadingPlanDevo

type BibleReadingPlanDevo struct {
	Verses []string `yaml:"Verses,flow"`
}

type DailyBRP

type DailyBRP struct {
	BibleReadingPlan []BibleReadingPlanDevo `yaml:"BibleReadingPlan"`
}

func GetDiscipleshipJournalDatabase

func GetDiscipleshipJournalDatabase(dataPath string) DailyBRP

type DailyChapterBRP

type DailyChapterBRP struct {
	BibleReadingPlan []BibleReadingPlanChapter `yaml:"BibleReadingPlan"`
}

func GetDailyNewTestamentDatabase

func GetDailyNewTestamentDatabase(dataPath string) DailyChapterBRP

func GetNavigators5xDatabase

func GetNavigators5xDatabase(dataPath string) DailyChapterBRP

type ErrorDetails

type ErrorDetails struct {
	Code    int    `json:"code"`
	Message string `json:"message"`
}

type ErrorResponse

type ErrorResponse struct {
	Error ErrorDetails `json:"error"`
}

type HelperT

type HelperT interface {
	Helper()
	Errorf(format string, args ...interface{})
}

HelperT is an interface to allow passing *testing.T

type MockBot

type MockBot struct{}

func (*MockBot) Post

func (b *MockBot) Post(env def.SessionData) bool

func (*MockBot) Translate

func (b *MockBot) Translate(body []byte) (def.SessionData, error)

type OQueryResponse

type OQueryResponse struct {
	Text       string         `json:"text"`
	References []SearchResult `json:"references"`
}

type PackSelector

type PackSelector func(TMSPack) bool

type QueryContext

type QueryContext struct {
	History []string    `json:"history,omitempty"`
	Schema  string      `json:"schema,omitempty"`
	Verses  []string    `json:"verses,omitempty"`
	Words   []string    `json:"words,omitempty"`
	User    UserContext `json:"user,omitempty"`
}

type QueryObject

type QueryObject struct {
	Verses []string `json:"verses,omitempty"`
	Words  []string `json:"words,omitempty"`
	Prompt string   `json:"prompt,omitempty"`
}

type QueryRequest

type QueryRequest struct {
	Query   QueryObject  `json:"query"`
	Context QueryContext `json:"context,omitempty"`
}

type SearchResult

type SearchResult struct {
	Verse string `json:"verse"`
	URL   string `json:"url"`
}

type SeriesSelector

type SeriesSelector func(TMSSeries) bool

type TMSDatabase

type TMSDatabase struct {
	Series []TMSSeries `yaml:"Series"`
}

func GetTMSData

func GetTMSData(dataPath string) TMSDatabase

type TMSPack

type TMSPack struct {
	ID     string     `yaml:"ID"`
	Title  string     `yaml:"Title"`
	Verses []TMSVerse `yaml:"Verses"`
}

type TMSQueryType

type TMSQueryType string
const (
	ID        TMSQueryType = "ID"
	Tag       TMSQueryType = "Tag"
	Reference TMSQueryType = "Reference"
	Null      TMSQueryType = "0"
)

func IdentifyQuery

func IdentifyQuery(db TMSDatabase, query string) TMSQueryType

type TMSSeries

type TMSSeries struct {
	ID    string    `yaml:"ID"`
	Title string    `yaml:"Title"`
	Packs []TMSPack `yaml:"Packs"`
}

type TMSVerse

type TMSVerse struct {
	ID        string   `yaml:"ID"`
	Title     string   `yaml:"Title"`
	Reference string   `yaml:"Reference"`
	Tags      []string `yaml:"Tags,flow"`
}

type UserContext

type UserContext struct {
	Version string `json:"version,omitempty"`
}

type VerseResponse

type VerseResponse struct {
	Verse string `json:"verse"`
}

type VerseSelector

type VerseSelector func(TMSVerse) bool

type WordSearchResponse

type WordSearchResponse []SearchResult

WordSearchResponse is a list of SearchResults

Jump to

Keyboard shortcuts

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