diff --git a/webpage/backend/main.go b/webpage/backend/main.go index 23482ff..e80c688 100644 --- a/webpage/backend/main.go +++ b/webpage/backend/main.go @@ -32,17 +32,17 @@ var colorComponentKeys = []string{ "ERR_COLOR", "SEPARATOR_COLOR", "BORDCOL", "PATH_COLOR", } -func decodeColorLogic(encodedData string) (map[string]string, string, error) { +func decodeColorLogic(encodedData string) (map[string]string, string, bool, error) { standardBase64 := strings.ReplaceAll(encodedData, "-", "+") standardBase64 = strings.ReplaceAll(standardBase64, "_", "/") decodedBytes, err := base64.RawStdEncoding.DecodeString(standardBase64) if err != nil { - return nil, "", fmt.Errorf("Base64 decoding failed: %v. Input: '%s'", err, encodedData) + return nil, "", false, fmt.Errorf("Base64 decoding failed: %v. Input: '%s'", err, encodedData) } if len(decodedBytes) != 6 { - return nil, "", fmt.Errorf("Decoded data must be 6 bytes long, got %d bytes from input '%s'", len(decodedBytes), encodedData) + return nil, "", false, fmt.Errorf("Decoded data must be 6 bytes long, got %d bytes from input '%s'", len(decodedBytes), encodedData) } fiveBitValues := make([]byte, 9) @@ -57,6 +57,9 @@ func decodeColorLogic(encodedData string) (map[string]string, string, error) { fiveBitValues[7] = b[4] & 0x1F fiveBitValues[8] = b[5] >> 3 + // Extract avatar bit from the first bit of the 6th byte + avatarEnabled := (b[5] & 0x80) != 0 + colorsMap := make(map[string]string) var resultList strings.Builder @@ -81,12 +84,20 @@ func decodeColorLogic(encodedData string) (map[string]string, string, error) { // Ensure each definition is on a new line, directly usable in shell script resultList.WriteString(fmt.Sprintf("%s='%s'\n", colorComponentKeys[i], bashColor)) } + + // Add the AVATAR variable + avatarValue := "false" + if avatarEnabled { + avatarValue = "true" + } + resultList.WriteString(fmt.Sprintf("AVATAR='%s'\n", avatarValue)) + // Remove the last newline character from the block of definitions if present for cleaner insertion - return colorsMap, strings.TrimSuffix(resultList.String(), "\n"), nil + return colorsMap, strings.TrimSuffix(resultList.String(), "\n"), avatarEnabled, nil } func serveDecodedColorsOnlyHandler(w http.ResponseWriter, r *http.Request, encodedData string) { - _, formattedOutput, err := decodeColorLogic(encodedData) + _, formattedOutput, _, err := decodeColorLogic(encodedData) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return @@ -101,7 +112,7 @@ func serveDecodedColorsOnlyHandler(w http.ResponseWriter, r *http.Request, encod func serveFileWithColorsHandler(w http.ResponseWriter, r *http.Request, encodedData string, requestedFilePath string) { // Note: The 'colorsMap' is not strictly needed for the new bb.sh logic, // as 'formattedColorDefinitions' is used directly. But decodeColorLogic provides it. - _, formattedColorDefinitions, err := decodeColorLogic(encodedData) + _, formattedColorDefinitions, _, err := decodeColorLogic(encodedData) if err != nil { http.Error(w, fmt.Sprintf("Failed to decode colors: %v", err), http.StatusBadRequest) return @@ -169,7 +180,7 @@ func serveFileWithColorsHandler(w http.ResponseWriter, r *http.Request, encodedD if strings.HasPrefix(firstLineOriginal, "#!") { finalScript.WriteString(firstLineOriginal) // Write shebang finalScript.WriteString("\n") // Newline after shebang - finalScript.WriteString(formattedColorDefinitions) // This is KEY='VAL'\nKEY2='VAL2' + finalScript.WriteString(formattedColorDefinitions) // This is KEY='VAL'\nKEY2='VAL2'\nAVATAR='true/false' finalScript.WriteString("\n") // Ensure a newline after the injected block if restOfScript != "" { finalScript.WriteString(restOfScript)