mirror of https://github.com/fluffle/goirc
Add !tr (language detection and translation)
This commit is contained in:
parent
3e83d30e71
commit
bfe0705337
84
handler.go
84
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))
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue