package main import ( chatgpt_request_converter "freechatgpt/conversion/requests/chatgpt" chatgpt "freechatgpt/internal/chatgpt" "freechatgpt/internal/tokens" official_types "freechatgpt/typings/official" "os" "strings" "github.com/gin-gonic/gin" ) func openaiHandler(c *gin.Context) { var authorizations struct { OpenAI_Email string `json:"openai_email"` OpenAI_Password string `json:"openai_password"` Official_API_Key string `json:"official_api_key"` } err := c.BindJSON(&authorizations) if err != nil { c.JSON(400, gin.H{"error": "JSON invalid"}) } if authorizations.OpenAI_Email != "" && authorizations.OpenAI_Password != "" { os.Setenv("OPENAI_EMAIL", authorizations.OpenAI_Email) os.Setenv("OPENAI_PASSWORD", authorizations.OpenAI_Password) } if authorizations.Official_API_Key != "" { os.Setenv("OFFICIAL_API_KEY", authorizations.Official_API_Key) } if authorizations.OpenAI_Email == "" && authorizations.OpenAI_Password == "" && authorizations.Official_API_Key == "" { c.JSON(400, gin.H{"error": "JSON invalid"}) return } c.String(200, "OpenAI credentials updated") } func passwordHandler(c *gin.Context) { // Get the password from the request (json) and update the password type password_struct struct { Password string `json:"password"` } var password password_struct err := c.BindJSON(&password) if err != nil { c.String(400, "password not provided") return } ADMIN_PASSWORD = password.Password // Set environment variable os.Setenv("ADMIN_PASSWORD", ADMIN_PASSWORD) c.String(200, "password updated") } func puidHandler(c *gin.Context) { // Get the password from the request (json) and update the password type puid_struct struct { PUID string `json:"puid"` } var puid puid_struct err := c.BindJSON(&puid) if err != nil { c.String(400, "puid not provided") return } // Set environment variable os.Setenv("PUID", puid.PUID) c.String(200, "puid updated") } func tokensHandler(c *gin.Context) { // Get the request_tokens from the request (json) and update the request_tokens var request_tokens []tokens.Secret err := c.BindJSON(&request_tokens) if err != nil { c.String(400, "tokens not provided") return } ACCESS_TOKENS = tokens.NewAccessToken(request_tokens, true) c.String(200, "tokens updated") } func optionsHandler(c *gin.Context) { // Set headers for CORS c.Header("Access-Control-Allow-Origin", "*") c.Header("Access-Control-Allow-Methods", "POST") c.Header("Access-Control-Allow-Headers", "*") c.JSON(200, gin.H{ "message": "pong", }) } func nightmare(c *gin.Context) { var original_request official_types.APIRequest err := c.BindJSON(&original_request) if err != nil { c.JSON(400, gin.H{"error": gin.H{ "message": "Request must be proper JSON", "type": "invalid_request_error", "param": nil, "code": err.Error(), }}) return } authHeader := c.GetHeader("Authorization") token, puid := ACCESS_TOKENS.GetSecret() if authHeader != "" { customAccessToken := strings.Replace(authHeader, "Bearer ", "", 1) // Check if customAccessToken starts with sk- if strings.HasPrefix(customAccessToken, "eyJhbGciOiJSUzI1NiI") { token = customAccessToken } } var proxy_url string if len(proxies) == 0 { proxy_url = "" } else { proxy_url = proxies[0] // Push used proxy to the back of the list proxies = append(proxies[1:], proxies[0]) } // Convert the chat request to a ChatGPT request translated_request := chatgpt_request_converter.ConvertAPIRequest(original_request, puid, proxy_url) response, err := chatgpt.POSTconversation(translated_request, token, puid, proxy_url) if err != nil { c.JSON(500, gin.H{ "error": "error sending request", }) return } defer response.Body.Close() if chatgpt.Handle_request_error(c, response) { return } var full_response string for i := 3; i > 0; i-- { var continue_info *chatgpt.ContinueInfo var response_part string response_part, continue_info = chatgpt.Handler(c, response, token, translated_request, original_request.Stream) full_response += response_part if continue_info == nil { break } println("Continuing conversation") translated_request.Messages = nil translated_request.Action = "continue" translated_request.ConversationID = continue_info.ConversationID translated_request.ParentMessageID = continue_info.ParentID response, err = chatgpt.POSTconversation(translated_request, token, puid, proxy_url) if err != nil { c.JSON(500, gin.H{ "error": "error sending request", }) return } defer response.Body.Close() if chatgpt.Handle_request_error(c, response) { return } } if !original_request.Stream { c.JSON(200, official_types.NewChatCompletion(full_response)) } else { c.String(200, "data: [DONE]\n\n") } } func engines_handler(c *gin.Context) { resp, status, err := chatgpt.GETengines() if err != nil { c.JSON(500, gin.H{ "error": "error sending request", }) return } c.JSON(status, resp) }