package web import ( "bufio" "log" "os" "regexp" "strings" ) type CommandStat struct { Command string Count int } func ProcessHistory(fileName string) (map[string]int, map[string]int, map[string]int, map[string]int) { commandCounts := make(map[string]int) categories := make(map[string]int) pipeRedirectionCounts := make(map[string]int) commonPatterns := make(map[string]int) re := regexp.MustCompile(`\S+\.(log|txt|conf|json)`) file, err := os.Open(fileName) if err != nil { log.Fatal(err) } defer file.Close() scanner := bufio.NewScanner(file) for scanner.Scan() { command := scanner.Text() if command == "" { continue } commandCounts[command]++ if strings.Contains(command, "git") { categories["Git"]++ } else if strings.Contains(command, "docker") { categories["Docker"]++ } else if strings.Contains(command, "ssh") { categories["SSH"]++ } if strings.Contains(command, "|") { pipeRedirectionCounts["pipe"]++ } if strings.Contains(command, ">") || strings.Contains(command, "<") || strings.Contains(command, ">>") { pipeRedirectionCounts["redirection"]++ } matches := re.FindAllString(command, -1) for _, match := range matches { commonPatterns[match]++ } } return commandCounts, categories, pipeRedirectionCounts, commonPatterns } func GenerateStats(commandCounts map[string]int, categories map[string]int, commonPatterns map[string]int) map[string]interface{} { stats := map[string]interface{}{ "topCommands": commandCounts, "categories": categories, "commonPatterns": commonPatterns, } return stats }