add speak as the first example
This commit is contained in:
Коммит
950a394517
|
@ -0,0 +1 @@
|
||||||
|
node_modules
|
|
@ -0,0 +1,20 @@
|
||||||
|
Copyright (c) 2011 GitHub Inc.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -0,0 +1,15 @@
|
||||||
|
test: deps
|
||||||
|
@find test -name '*_test.coffee' | xargs -n 1 -t coffee
|
||||||
|
|
||||||
|
dev: generate-js
|
||||||
|
@coffee -wc --bare -o lib src/*.coffee
|
||||||
|
|
||||||
|
generate-js:
|
||||||
|
@find src -name '*.coffee' | xargs coffee -c -o lib
|
||||||
|
|
||||||
|
remove-js:
|
||||||
|
@rm -fr lib/
|
||||||
|
|
||||||
|
deps:
|
||||||
|
|
||||||
|
.PHONY: all
|
|
@ -0,0 +1,14 @@
|
||||||
|
Hubot Speaks!
|
||||||
|
=============
|
||||||
|
|
||||||
|
Use Microsoft's Language Translation API to link to wav files of
|
||||||
|
sentences.
|
||||||
|
|
||||||
|
http://www.microsofttranslator.com/dev/
|
||||||
|
|
||||||
|
Installing
|
||||||
|
==========
|
||||||
|
|
||||||
|
Add `hubot-speak` to your hubot installation
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
{
|
||||||
|
"name": "hubot-scripts",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"author": "GitHub Inc.",
|
||||||
|
"keywords": "hubot plugin scripts campfire bot robot",
|
||||||
|
"description": "Allows you to open in to a variety of scripts",
|
||||||
|
"licenses": [{
|
||||||
|
"type": "MIT",
|
||||||
|
"url": "http://github.com/github/github/raw/master/LICENSE"
|
||||||
|
}],
|
||||||
|
|
||||||
|
"repository" : {
|
||||||
|
"type" : "git",
|
||||||
|
"url" : "http://github.com/github/hubot-scripts.git"
|
||||||
|
},
|
||||||
|
|
||||||
|
"dependencies": {
|
||||||
|
"hubot": "0.1.0"
|
||||||
|
},
|
||||||
|
|
||||||
|
"directories": {
|
||||||
|
"lib": "./src"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
# Allows Hubot to speak many languages.
|
||||||
|
#
|
||||||
|
# speak me <phrase> - Detects the language 'phrase' is written in, then
|
||||||
|
# sends back a spoken version of that phrase in its native
|
||||||
|
# language.
|
||||||
|
|
||||||
|
module.exports = (robot) ->
|
||||||
|
robot.hear /(speak)( me)? (.*)/i, (msg) ->
|
||||||
|
term = "\"#{msg.match[3]}\""
|
||||||
|
apiKey = process.env.HUBOT_MSTRANSLATE_APIKEY
|
||||||
|
langs = ["en"]
|
||||||
|
|
||||||
|
getLanguagesForSpeak = "http://api.microsofttranslator.com/V2/Ajax.svc/GetLanguagesForSpeak"
|
||||||
|
detect = "http://api.microsofttranslator.com/V2/Ajax.svc/Detect"
|
||||||
|
speak = "http://api.microsofttranslator.com/V2/Ajax.svc/Speak"
|
||||||
|
|
||||||
|
unless apiKey
|
||||||
|
msg.send "MS Translate API key isn't set, get a key at http://www.bing.com/developers/appids.aspx"
|
||||||
|
msg.send "Then, set the HUBOT_MSTRANSLATE_APIKEY environment variable"
|
||||||
|
return
|
||||||
|
|
||||||
|
msg.http(getLanguagesForSpeak)
|
||||||
|
.query({ appId: apiKey })
|
||||||
|
.get() (err, res, body) ->
|
||||||
|
langs = eval(body) unless err
|
||||||
|
|
||||||
|
msg.http(detect)
|
||||||
|
.query({appId: apiKey, text: term})
|
||||||
|
.get() (err, res, body) ->
|
||||||
|
if err or (langs.indexOf(eval(body)) == -1)
|
||||||
|
msg.send "Sorry, I can't speak #{err or eval(body)}"
|
||||||
|
return
|
||||||
|
lang = eval(body)
|
||||||
|
|
||||||
|
msg.http(speak)
|
||||||
|
.query({ appId: apiKey, text: term, language: lang, format: "audio/wav" })
|
||||||
|
.get() (err, res, body) ->
|
||||||
|
msg.send(eval(body)) unless err
|
|
@ -0,0 +1,17 @@
|
||||||
|
# Tests hubot listeners
|
||||||
|
module.exports = (robot) ->
|
||||||
|
assert = require 'assert'
|
||||||
|
|
||||||
|
robot.hear /test/i, (msg) ->
|
||||||
|
msg.send "OK"
|
||||||
|
|
||||||
|
robot.hear /reply/i, (msg) ->
|
||||||
|
msg.reply "OK"
|
||||||
|
|
||||||
|
robot.hear /random/i, (msg) ->
|
||||||
|
msg.send msg.random([1,2]).toString()
|
||||||
|
|
||||||
|
robot.hear /http/i, (msg) ->
|
||||||
|
msg.http('http://127.0.0.1').port(9001)
|
||||||
|
.get() (err, res, body) ->
|
||||||
|
msg.send body
|
|
@ -0,0 +1,25 @@
|
||||||
|
Tests = require('./tests')
|
||||||
|
assert = require 'assert'
|
||||||
|
helper = Tests.helper()
|
||||||
|
|
||||||
|
require('../src/scripts/speak') helper
|
||||||
|
|
||||||
|
process.env.HUBOT_MSTRANSLATE_APIKEY ||= "0xDEADBEEF"
|
||||||
|
|
||||||
|
# start up a danger room for hubt speak
|
||||||
|
danger = Tests.danger helper, (req, res, url) ->
|
||||||
|
res.writeHead 200
|
||||||
|
res.end JSON.stringify(
|
||||||
|
{responseData: {results: [
|
||||||
|
{unescapedUrl: url.query }
|
||||||
|
]}}
|
||||||
|
)
|
||||||
|
|
||||||
|
# callbacks for when hubot sends messages
|
||||||
|
tests = [
|
||||||
|
(msg) -> assert.equal "", msg
|
||||||
|
]
|
||||||
|
|
||||||
|
# run the async tests
|
||||||
|
danger.start tests, ->
|
||||||
|
helper.receive 'hubot speak me Ich bin ein Berliner'
|
|
@ -0,0 +1,53 @@
|
||||||
|
Robot = require 'hubot/src/robot'
|
||||||
|
Url = require 'url'
|
||||||
|
|
||||||
|
# A programmer's best friend.
|
||||||
|
# http://timenerdworld.files.wordpress.com/2010/12/joint-venture-s1e3_1.jpg
|
||||||
|
#
|
||||||
|
# Instantiates a test-only Robot that sends messages to an optional callback
|
||||||
|
# and a @sent array.
|
||||||
|
exports.helper = ->
|
||||||
|
new Helper "#{__dirname}/scripts"
|
||||||
|
|
||||||
|
# Training facility built for the Hubot scripts. Starts up a web server to
|
||||||
|
# emulate backends (like google images) so we can test that the response
|
||||||
|
# parsing code functions.
|
||||||
|
exports.danger = (helper, cb) ->
|
||||||
|
server = require('http').createServer (req, res) ->
|
||||||
|
url = Url.parse req.url, true
|
||||||
|
cb req, res, url
|
||||||
|
|
||||||
|
server.start = (tests, cb) ->
|
||||||
|
server.listen 9001, ->
|
||||||
|
helper.cb = (messages...) ->
|
||||||
|
tests.shift() messages...
|
||||||
|
server.close() if tests.length == 0
|
||||||
|
|
||||||
|
cb()
|
||||||
|
|
||||||
|
server
|
||||||
|
|
||||||
|
class Helper extends Robot
|
||||||
|
constructor: (path) ->
|
||||||
|
super path
|
||||||
|
@sent = []
|
||||||
|
@Response = Helper.Response
|
||||||
|
|
||||||
|
send: (user, strings...) ->
|
||||||
|
strings.forEach (str) =>
|
||||||
|
@sent.push str
|
||||||
|
@cb? strings...
|
||||||
|
|
||||||
|
reply: (user, strings...) ->
|
||||||
|
strings.forEach (str) =>
|
||||||
|
@send user, "#{user.name}: #{str}"
|
||||||
|
|
||||||
|
# modified to accept a string and pass the Robot.Message to super()
|
||||||
|
receive: (text) ->
|
||||||
|
user = new Robot.User 1, 'helper'
|
||||||
|
super new Robot.Message(user, text)
|
||||||
|
|
||||||
|
class Helper.Response extends Robot.Response
|
||||||
|
http: (url) ->
|
||||||
|
super(url).host('127.0.0.1').port(9001)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче