| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 | package chatbotimport (	"github.com/0xJacky/Nginx-UI/internal/helper"	"github.com/0xJacky/Nginx-UI/internal/logger"	"github.com/0xJacky/Nginx-UI/internal/nginx"	"github.com/sashabaranov/go-openai"	"os"	"regexp"	"strings")type includeContext struct {	Paths    []string	PathsMap map[string]bool}func IncludeContext(filename string) (includes []string) {	c := &includeContext{		Paths:    make([]string, 0),		PathsMap: make(map[string]bool),	}	c.extractIncludes(filename)	return c.Paths}// extractIncludes extracts all include statements from the given nginx configuration file.func (c *includeContext) extractIncludes(filename string) {	if !helper.FileExists(filename) {		logger.Error("File does not exist: ", filename)		return	}	if !helper.IsUnderDirectory(filename, nginx.GetConfPath()) {		logger.Error("File is not under the nginx conf path: ", filename)		return	}	// Read the file content	content, err := os.ReadFile(filename)	if err != nil {		logger.Error(err)		return	}	// Find all include statements	pattern := regexp.MustCompile(`(?m)^\s*include\s+([^;]+);`)	matches := pattern.FindAllStringSubmatch(string(content), -1)	for _, match := range matches {		if len(match) > 1 {			// Resolve the path of the included file			includePath := match[1]			// to avoid infinite loop			if c.PathsMap[includePath] {				continue			}			c.push(includePath)			// Recursively extract includes from the included file			c.extractIncludes(includePath)		}	}	return}func (c *includeContext) push(path string) {	c.Paths = append(c.Paths, path)	c.PathsMap[path] = true}// getConfigIncludeContext returns the context of the given filename.func getConfigIncludeContext(filename string) (multiContent []openai.ChatMessagePart) {	multiContent = make([]openai.ChatMessagePart, 0)	if !helper.IsUnderDirectory(filename, nginx.GetConfPath()) {		return	}	includes := IncludeContext(filename)	logger.Debug(includes)	var sb strings.Builder	for _, include := range includes {		text, _ := os.ReadFile(nginx.GetConfPath(include))		if len(text) == 0 {			continue		}		sb.WriteString("The Content of ")		sb.WriteString(include)		sb.WriteString(",")		sb.WriteString(string(text))		multiContent = append(multiContent, openai.ChatMessagePart{			Type: openai.ChatMessagePartTypeText,			Text: sb.String(),		})		sb.Reset()	}	return}
 |