Skip to content

Commit e24cfd8

Browse files
Refactoring
1 parent 66894a1 commit e24cfd8

4 files changed

Lines changed: 186 additions & 156 deletions

File tree

emoProxy.conf.example

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
"postFS": "/tmp/",
88
"logFileName": "/var/log/emoProxyss.log",
99
"enableDatabaseAndAPI": false, # For now, default behavior is still without db and api.
10+
"enableReplacements": false, # For now, default behavior is still without replacements.
11+
1012
"sqliteLocation": "/var/data/emo_logs.db",
1113
"chatGptSpeakServer": ""
1214
}

emoProxy.go

Lines changed: 6 additions & 156 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import (
99
"io"
1010
"log"
1111
"net/http"
12-
"net/url"
1312
"os"
1413
"strconv"
1514
"time"
@@ -25,53 +24,6 @@ type emo_code struct {
2524
Errmessage string `json:"errmessage"`
2625
}
2726

28-
type Intent struct {
29-
Name string `json:"name,omitempty"`
30-
Confidence float64 `json:"confidence,omitempty"`
31-
}
32-
33-
type BehaviorParas struct {
34-
UtilityType string `json:"utility_type,omitempty"`
35-
Time []string `json:"time,omitempty"`
36-
Txt string `json:"txt,omitempty"`
37-
Url string `json:"url,omitempty"`
38-
PreAnimation string `json:"pre_animation,omitempty"`
39-
PostAnimation string `json:"post_animation,omitempty"`
40-
PostBehavior string `json:"post_behavior,omitempty"`
41-
RecBehavior string `json:"rec_behavior,omitempty"`
42-
BehaviorParas *BehaviorParas `json:"behavior_paras,omitempty"`
43-
Sentiment string `json:"sentiment,omitempty"`
44-
Listen int `json:"listen,omitempty"`
45-
AnimationName string `json:"animation_name,omitempty"`
46-
}
47-
48-
type QueryResult struct {
49-
ResultCode string `json:"resultCode,omitempty"`
50-
QueryText string `json:"queryText,omitempty"`
51-
Intent *Intent `json:"intent,omitempty"`
52-
RecBehavior string `json:"rec_behavior,omitempty"`
53-
BehaviorParas *BehaviorParas `json:"behavior_paras,omitempty"`
54-
}
55-
56-
type QueryResponse struct {
57-
QueryId string `json:"queryId,omitempty"`
58-
QueryResult *QueryResult `json:"queryResult,omitempty"`
59-
LanguageCode string `json:"languageCode,omitempty"`
60-
Index int `json:"index,omitempty"`
61-
}
62-
63-
type TokenResponse struct {
64-
AccessToken string `json:"access_token,omitempty"`
65-
ExpireIn int `json:"expire_in,omitempty"`
66-
Type string `json:"type,omitempty"`
67-
}
68-
69-
type EmoSpeechResponse struct {
70-
Code int64 `json:"code"`
71-
Errmessage string `json:"errmessage"`
72-
Url string `json:"url"`
73-
}
74-
7527
type Configuration struct {
7628
PidFile string `json:"pidFile"`
7729
Livingio_API_Server string `json:"livingio_api_server"`
@@ -81,6 +33,7 @@ type Configuration struct {
8133
PostFS string `json:"postFS"`
8234
LogFileName string `json:"logFileName"`
8335
EnableDatabaseAndAPI bool `json:"enableDatabaseAndAPI"`
36+
EnableReplacements bool `json:"enableReplacements"`
8437
SqliteLocation string `json:"sqliteLocation"`
8538
ChatGptSpeakServer string `json:"chatGptSpeakServer"`
8639
}
@@ -153,6 +106,7 @@ func loadConfig(filename string) error {
153106
PostFS: "/tmp/",
154107
LogFileName: "/var/log/emoProxy.log",
155108
EnableDatabaseAndAPI: false,
109+
EnableReplacements: false,
156110
SqliteLocation: "/var/data/emo_logs.db",
157111
ChatGptSpeakServer: "",
158112
}
@@ -365,31 +319,13 @@ func makeApiRequest(r *http.Request) string {
365319
body, _ := io.ReadAll(response.Body)
366320
log.Println("Server response: ", string(body))
367321

368-
typedBody := QueryResponse{}
369-
decoder := json.NewDecoder(bytes.NewReader([]byte(body)))
370-
decoder.DisallowUnknownFields()
322+
logResponse(response)
371323

372-
err = decoder.Decode(&typedBody)
373-
if err != nil {
374-
log.Println("Error when decoding JSON (", string(body), ") will return unhandled:", err)
375-
} else {
376-
if typedBody.QueryId != "" {
377-
if typedBody.QueryResult.Intent.Name == "chatgpt_speak" && conf.ChatGptSpeakServer != "" {
378-
speakResponse := makeChatGptSpeakRequest(typedBody.QueryResult.QueryText, typedBody.LanguageCode, typedBody.QueryResult.BehaviorParas.Txt, r)
379-
if speakResponse.Url != "" && speakResponse.Txt != "" {
380-
log.Println("Successfully replaced chatgpt_speak response for request.")
381-
typedBody.QueryResult.BehaviorParas.Url = speakResponse.Url
382-
typedBody.QueryResult.BehaviorParas.Txt = speakResponse.Txt
383-
} else {
384-
log.Println("Failed to get valid response from ChatGptSpeakServer, keeping original response.")
385-
}
386-
}
387-
body, _ = json.Marshal(typedBody)
388-
}
324+
if conf.EnableReplacements {
325+
log.Println("Replacements enabled, checking for replacements...")
326+
body = runReplacementsAndReturnModifiedBody(body)
389327
}
390328

391-
logResponse(response)
392-
393329
if useDatabaseAndAPI {
394330
saveRequest(r.URL.RequestURI(), string(requestBody), string(body))
395331
}
@@ -502,89 +438,3 @@ func makeResRequest(r *http.Request, w http.ResponseWriter) string {
502438
}
503439
return string(body)
504440
}
505-
506-
func makeEmoSpeechRequest(text string, languageCode string, r *http.Request) EmoSpeechResponse {
507-
request, _ := http.NewRequest("GET", "https://"+conf.Livingio_API_Server+"/emo/speech/tts?q="+url.QueryEscape(text)+"&l="+url.QueryEscape(languageCode), nil)
508-
509-
val, exists := r.Header["Authorization"]
510-
if exists {
511-
request.Header.Add("Authorization", val[0])
512-
}
513-
514-
val, exists = r.Header["Secret"]
515-
if exists {
516-
request.Header.Add("Secret", val[0])
517-
}
518-
519-
request.Header.Del("User-Agent")
520-
521-
httpclient := &http.Client{}
522-
response, err := httpclient.Do(request)
523-
524-
if err != nil {
525-
log.Fatalf("An Error Occured %v", err)
526-
}
527-
defer response.Body.Close()
528-
529-
body, _ := io.ReadAll(response.Body)
530-
531-
var emoSpeechResponse EmoSpeechResponse
532-
if err := json.Unmarshal([]byte(body), &emoSpeechResponse); err != nil {
533-
log.Printf("Error unmarshaling ChatGptSpeakServer response: %v\n", err)
534-
return EmoSpeechResponse{}
535-
}
536-
537-
return emoSpeechResponse
538-
}
539-
540-
func makeChatGptSpeakRequest(queryText string, languageCode string, fallbackResponse string, r *http.Request) BehaviorParas {
541-
type ChatGptSpeakRequest struct {
542-
QueryText string `json:"queryText"`
543-
LanguageCode string `json:"languageCode"`
544-
FallbackResponse string `json:"fallbackResponse,omitempty"`
545-
}
546-
type ChatGptSpeakResponse struct {
547-
ResponseText string `json:"responseText"`
548-
}
549-
550-
chatGptRequestData := ChatGptSpeakRequest{
551-
QueryText: queryText,
552-
LanguageCode: languageCode,
553-
FallbackResponse: fallbackResponse,
554-
}
555-
chatGptRequestBody, _ := json.Marshal(chatGptRequestData)
556-
chatGptRequest, _ := http.NewRequest("POST", conf.ChatGptSpeakServer+"/speak", bytes.NewBuffer(chatGptRequestBody))
557-
chatGptRequest.Header.Add("Content-Type", "application/json")
558-
559-
chatGptClient := &http.Client{}
560-
chatGptResponse, err := chatGptClient.Do(chatGptRequest)
561-
if err != nil {
562-
log.Fatalf("An Error Occured while calling ChatGptSpeakServer %v", err)
563-
}
564-
defer chatGptResponse.Body.Close()
565-
566-
chatGptResponseBody, _ := io.ReadAll(chatGptResponse.Body)
567-
568-
var chatGptTypedResponse ChatGptSpeakResponse
569-
if err := json.Unmarshal([]byte(chatGptResponseBody), &chatGptTypedResponse); err != nil {
570-
log.Printf("Error unmarshaling ChatGptSpeakServer response: %v\n", err)
571-
return BehaviorParas{}
572-
}
573-
574-
if chatGptTypedResponse.ResponseText == "" {
575-
log.Println("ChatGptSpeakServer returned empty response text")
576-
return BehaviorParas{}
577-
}
578-
579-
emoSpeechResponse := makeEmoSpeechRequest(chatGptTypedResponse.ResponseText, languageCode, r)
580-
if emoSpeechResponse.Code != 200 || emoSpeechResponse.Url == "" {
581-
log.Printf("Error in EmoSpeechResponse: Code %d, Errmessage: %s\n", emoSpeechResponse.Code, emoSpeechResponse.Errmessage)
582-
return BehaviorParas{}
583-
}
584-
behaviorParasResponse := BehaviorParas{
585-
Txt: chatGptTypedResponse.ResponseText,
586-
Url: emoSpeechResponse.Url,
587-
}
588-
589-
return behaviorParasResponse
590-
}

replacements.go

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
package main
2+
3+
import (
4+
"bytes"
5+
"encoding/json"
6+
"io"
7+
"log"
8+
"net/http"
9+
"net/url"
10+
)
11+
12+
func runReplacementsAndReturnModifiedBody(body []byte) []byte {
13+
typedBody := QueryResponse{}
14+
decoder := json.NewDecoder(bytes.NewReader(body))
15+
decoder.DisallowUnknownFields()
16+
17+
err := decoder.Decode(&typedBody)
18+
if err != nil {
19+
log.Println("Error when decoding JSON (", string(body), ") will return unhandled:", err)
20+
return body
21+
} else {
22+
if typedBody.QueryResult == nil || typedBody.QueryId == "" {
23+
log.Println("Unexpected query response, will return unhandled.")
24+
return body
25+
}
26+
27+
if typedBody.QueryResult.Intent.Name == "chatgpt_speak" && conf.ChatGptSpeakServer != "" {
28+
speakResponse := makeChatGptSpeakRequest(typedBody.QueryResult.QueryText, typedBody.LanguageCode, typedBody.QueryResult.BehaviorParas.Txt, r)
29+
if speakResponse.Url != "" && speakResponse.Txt != "" {
30+
log.Println("Successfully replaced chatgpt_speak response for request.")
31+
typedBody.QueryResult.BehaviorParas.Url = speakResponse.Url
32+
typedBody.QueryResult.BehaviorParas.Txt = speakResponse.Txt
33+
} else {
34+
log.Println("Failed to get valid response from ChatGptSpeakServer, keeping original response.")
35+
}
36+
}
37+
modifiedBody, err := json.Marshal(typedBody)
38+
if err != nil {
39+
log.Println("Error when marshaling modified JSON, will return unhandled:", err)
40+
return body
41+
}
42+
return modifiedBody
43+
}
44+
}
45+
46+
func makeEmoSpeechRequest(text string, languageCode string, r *http.Request) EmoSpeechResponse {
47+
request, _ := http.NewRequest("GET", "https://"+conf.Livingio_API_Server+"/emo/speech/tts?q="+url.QueryEscape(text)+"&l="+url.QueryEscape(languageCode), nil)
48+
49+
val, exists := r.Header["Authorization"]
50+
if exists {
51+
request.Header.Add("Authorization", val[0])
52+
}
53+
54+
val, exists = r.Header["Secret"]
55+
if exists {
56+
request.Header.Add("Secret", val[0])
57+
}
58+
59+
request.Header.Del("User-Agent")
60+
61+
httpclient := &http.Client{}
62+
response, err := httpclient.Do(request)
63+
64+
if err != nil {
65+
log.Fatalf("An Error Occured %v", err)
66+
}
67+
defer response.Body.Close()
68+
69+
body, _ := io.ReadAll(response.Body)
70+
71+
var emoSpeechResponse EmoSpeechResponse
72+
if err := json.Unmarshal([]byte(body), &emoSpeechResponse); err != nil {
73+
log.Printf("Error unmarshaling ChatGptSpeakServer response: %v\n", err)
74+
return EmoSpeechResponse{}
75+
}
76+
77+
return emoSpeechResponse
78+
}
79+
80+
func makeChatGptSpeakRequest(queryText string, languageCode string, fallbackResponse string, r *http.Request) BehaviorParas {
81+
type ChatGptSpeakRequest struct {
82+
QueryText string `json:"queryText"`
83+
LanguageCode string `json:"languageCode"`
84+
FallbackResponse string `json:"fallbackResponse,omitempty"`
85+
}
86+
type ChatGptSpeakResponse struct {
87+
ResponseText string `json:"responseText"`
88+
}
89+
90+
chatGptRequestData := ChatGptSpeakRequest{
91+
QueryText: queryText,
92+
LanguageCode: languageCode,
93+
FallbackResponse: fallbackResponse,
94+
}
95+
chatGptRequestBody, _ := json.Marshal(chatGptRequestData)
96+
chatGptRequest, _ := http.NewRequest("POST", conf.ChatGptSpeakServer+"/speak", bytes.NewBuffer(chatGptRequestBody))
97+
chatGptRequest.Header.Add("Content-Type", "application/json")
98+
99+
chatGptClient := &http.Client{}
100+
chatGptResponse, err := chatGptClient.Do(chatGptRequest)
101+
if err != nil {
102+
log.Fatalf("An Error Occured while calling ChatGptSpeakServer %v", err)
103+
}
104+
defer chatGptResponse.Body.Close()
105+
106+
chatGptResponseBody, _ := io.ReadAll(chatGptResponse.Body)
107+
108+
var chatGptTypedResponse ChatGptSpeakResponse
109+
if err := json.Unmarshal([]byte(chatGptResponseBody), &chatGptTypedResponse); err != nil {
110+
log.Printf("Error unmarshaling ChatGptSpeakServer response: %v\n", err)
111+
return BehaviorParas{}
112+
}
113+
114+
if chatGptTypedResponse.ResponseText == "" {
115+
log.Println("ChatGptSpeakServer returned empty response text")
116+
return BehaviorParas{}
117+
}
118+
119+
emoSpeechResponse := makeEmoSpeechRequest(chatGptTypedResponse.ResponseText, languageCode, r)
120+
if emoSpeechResponse.Code != 200 || emoSpeechResponse.Url == "" {
121+
log.Printf("Error in EmoSpeechResponse: Code %d, Errmessage: %s\n", emoSpeechResponse.Code, emoSpeechResponse.Errmessage)
122+
return BehaviorParas{}
123+
}
124+
behaviorParasResponse := BehaviorParas{
125+
Txt: chatGptTypedResponse.ResponseText,
126+
Url: emoSpeechResponse.Url,
127+
}
128+
129+
return behaviorParasResponse
130+
}

types.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package main
2+
3+
type Intent struct {
4+
Name string `json:"name,omitempty"`
5+
Confidence float64 `json:"confidence,omitempty"`
6+
}
7+
8+
type BehaviorParas struct {
9+
UtilityType string `json:"utility_type,omitempty"`
10+
Time []string `json:"time,omitempty"`
11+
Txt string `json:"txt,omitempty"`
12+
Url string `json:"url,omitempty"`
13+
PreAnimation string `json:"pre_animation,omitempty"`
14+
PostAnimation string `json:"post_animation,omitempty"`
15+
PostBehavior string `json:"post_behavior,omitempty"`
16+
RecBehavior string `json:"rec_behavior,omitempty"`
17+
BehaviorParas *BehaviorParas `json:"behavior_paras,omitempty"`
18+
Sentiment string `json:"sentiment,omitempty"`
19+
Listen int `json:"listen,omitempty"`
20+
AnimationName string `json:"animation_name,omitempty"`
21+
}
22+
23+
type QueryResult struct {
24+
ResultCode string `json:"resultCode,omitempty"`
25+
QueryText string `json:"queryText,omitempty"`
26+
Intent *Intent `json:"intent,omitempty"`
27+
RecBehavior string `json:"rec_behavior,omitempty"`
28+
BehaviorParas *BehaviorParas `json:"behavior_paras,omitempty"`
29+
}
30+
31+
type QueryResponse struct {
32+
QueryId string `json:"queryId,omitempty"`
33+
QueryResult *QueryResult `json:"queryResult,omitempty"`
34+
LanguageCode string `json:"languageCode,omitempty"`
35+
Index int `json:"index,omitempty"`
36+
}
37+
38+
type TokenResponse struct {
39+
AccessToken string `json:"access_token,omitempty"`
40+
ExpireIn int `json:"expire_in,omitempty"`
41+
Type string `json:"type,omitempty"`
42+
}
43+
44+
type EmoSpeechResponse struct {
45+
Code int64 `json:"code"`
46+
Errmessage string `json:"errmessage"`
47+
Url string `json:"url"`
48+
}

0 commit comments

Comments
 (0)