mirror of
				https://github.com/fluffle/goirc
				synced 2025-11-03 19:48:04 +00:00 
			
		
		
		
	Add !tr (language detection and translation)
This commit is contained in:
		
							parent
							
								
									3e83d30e71
								
							
						
					
					
						commit
						bfe0705337
					
				
					 1 changed files with 79 additions and 5 deletions
				
			
		
							
								
								
									
										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…
	
	Add table
		Add a link
		
	
		Reference in a new issue