diff --git a/handler.go b/handler.go index e1db5d5..935271a 100644 --- a/handler.go +++ b/handler.go @@ -2,14 +2,21 @@ package main import ( "irc" - //"fmt" + "fmt" "strings" + "http" + "io/ioutil" + "json" + "container/vector" + "html" ) var commands = map [string]func(*irc.Conn, string, string, string) { - "kill": kill, + "tr": translate, } +const googleAPIKey = "ABQIAAAA6-N_jl4ETgtMf2M52JJ_WRQjQjNunkAJHIhTdFoxe8Di7fkkYhRRcys7ZxNbH3MIy_MKKcEO4-9_Ag" + func handlePrivmsg(conn *irc.Conn, line *irc.Line) { target := line.Args[0] if target[0] == '#' || target[0] == '&' { @@ -22,7 +29,7 @@ func handlePrivmsg(conn *irc.Conn, line *irc.Line) { } func command(conn *irc.Conn, nick, text, target string) { - if text[:len(trigger)] != trigger { + if !strings.HasPrefix(text, trigger) { return } split := strings.Split(text, " ", 2) @@ -39,6 +46,73 @@ func command(conn *irc.Conn, nick, text, target string) { } } -func kill(conn *irc.Conn, nick, args, target string) { - conn.Action(target, "dies.") +func say(conn *irc.Conn, target, message string, a ...interface{}) { + conn.Privmsg(target, fmt.Sprintf(message, a...)) +} + +func translate(conn *irc.Conn, nick, args, target string) { + var langPairs vector.StringVector + for { + split := strings.Split(args, " ", 2) + if len(split) == 2 && len(split[0]) == 5 && split[0][2] == '|' { + langPairs.Push("&langpair=" + split[0]) + args = split[1] + } else { + break + } + } + + var url string + if langPairs.Len() > 0 { + // translate + langPairsSlice := []string(langPairs) + url = fmt.Sprintf("http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=%s%s&key=%s", + http.URLEscape(args), strings.Join(langPairsSlice, ""), googleAPIKey) + } else { + // language detect + url = fmt.Sprintf("http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&q=%s&key=%s", + http.URLEscape(args), googleAPIKey) + } + + response, _, err := http.Get(url) + defer response.Body.Close() + if err != nil { + say(conn, target, "%s: Error while requesting translation", nick); return + } + b, err := ioutil.ReadAll(response.Body) + if err != nil { + say(conn, target, "%s: Error while downloading translation", nick); return + } + + var result map[string]interface{} + err = json.Unmarshal(b, &result) + if err != nil { + say(conn, target, "%s: Error while decoding translation", nick); return + } + if result["responseStatus"] != float64(200) { + say(conn, target, "%s: %s", nick, result["responseDetails"]); return + } + + if langPairs.Len() > 0 { + // translate + sayTr(conn, target, result["responseData"]) + } else { + // language detect + var data map[string]interface{} = result["responseData"].(map[string]interface{}) + say(conn, target, "Language: %s, confidence: %f, is reliable: %t", data["language"], data["confidence"], data["isReliable"]) + } +} + +func sayTr(conn *irc.Conn, target string, data interface{}) { + switch t := data.(type) { + case []interface{}: + var dataList []interface{} = data.([]interface{}) + for _, d := range dataList { + var innerData map[string]interface{} = d.(map[string]interface{}) + sayTr(conn, target, innerData["responseData"]) + } + case map[string]interface{}: + trText := data.(map[string]interface{})["translatedText"].(string) + say(conn, target, html.UnescapeString(trText)) + } }