diff --git a/README.md b/README.md index a5612f759ed32435e76b07beb71d8e53d52282dc..c97ebb4b0157fb1f0f186ea41472098ffc8410b4 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,10 @@ Wechaty is a Bot Framework for Wechat **Personal** Account which can help you cr > @naishstar: thanks for great SDK [link](https://github.com/wechaty/wechaty/issues/57) +> @shevyan: 简单的接口...和Docker化的封装,结合Docker绝对是一个不错的选择 [link](http://mp.weixin.qq.com/s/o-4VMcAMz0K8yJVdNaUXow) + +> @lijiarui: [Chat实录|李佳芮:向前一步的程序媛](http://mp.weixin.qq.com/s/dWHAj8XtiKG-1fIS5Og79g) + # Example The shortest wechat bot code in the world: 6 lines JavaScript @@ -196,11 +200,11 @@ You can directly submit pull requests for documentation changes. ## Join us -Scanning the following QR Code in WeChat, with secret code 'wechaty', you can join our **Wechaty Developers' Home**. +Scan the following QR Code in WeChat, with secret code _wechaty_, you can join our **Wechaty Developers' Home**. ![Wechaty Developers' Home](https://raw.githubusercontent.com/wechaty/wechaty/master/image/BotQrcode.png) -Scan now, then chat with other Wechaty developers! +Scan now, then you can chat with other Wechaty developers! # See Also diff --git a/example/ding-dong-bot.ts b/example/ding-dong-bot.ts index dbde7cefd03a1d46d439a686ed41334fb33a38f0..0398985a583507625eb415d9f8c0ea952dee94b6 100644 --- a/example/ding-dong-bot.ts +++ b/example/ding-dong-bot.ts @@ -8,7 +8,8 @@ */ /* tslint:disable:variable-name */ -const QrcodeTerminal = require('qrcode-terminal') +const QrcodeTerminal = require('qrcode-terminal') +const nodeCleanup = require('node-cleanup') import { Wechaty @@ -71,17 +72,15 @@ bot }) bot.init() +.then(() => { + bot.say('Wechaty init') +}) .catch(e => { log.error('Bot', 'init() fail: %s', e) bot.quit() process.exit(-1) }) -function logToFile(data) { - require('fs').appendFile('message.log', data + '\n\n#############################\n\n', err => { - if (err) { log.error('LogToFile: %s', err) } - }) -} -if (typeof logToFile === 'fasdfsd') { - console.log('disable linting warning') -} +nodeCleanup(() => { + bot.say('Wechaty exit') +}) diff --git a/example/speech-to-text-bot.ts b/example/speech-to-text-bot.ts index df765e634d8270069d04d86fd83271504b02439f..1f3d6c6ad5550f5c5245af20d54e594627930c6a 100644 --- a/example/speech-to-text-bot.ts +++ b/example/speech-to-text-bot.ts @@ -35,26 +35,25 @@ bot console.log(`${url}\n[${code}] Scan QR Code in above url to login: `) }) .on('login' , user => console.log(`${user} logined`)) -.on('message', async function(this, m) { - console.log(`RECV: ${m}`) +.on('message', async function(this, msg) { + console.log(`RECV: ${msg}`) - if (m.type() !== MsgType.VOICE) { + if (msg.type() !== MsgType.VOICE) { return // skip no-VOICE message } - const mp3File = createWriteStream(m.filename()) + const mp3Stream = await (msg as MediaMessage).readyStream() - const mp3Stream = await (m as MediaMessage).readyStream() - - mp3Stream.pipe(mp3File) + const file = createWriteStream(msg.filename()) + mp3Stream.pipe(file) const text = await speechToText(mp3Stream) console.log('VOICE TO TEXT: ' + text) - if (m.self()) { + if (msg.self()) { this.say(text) // send text to 'filehelper' } else { - m.say(text) // to original sender + msg.say(text) // to original sender } }) diff --git a/package.json b/package.json index 617df555fa31e91ab2862c64842acee56985281b..df911594bcbc9b1df593547f5a591ad8a9ddf867 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wechaty", - "version": "0.6.41", + "version": "0.6.42", "description": "Wechat for Bot(Personal Account)", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -35,7 +35,7 @@ "test:chrome:fast": "cross-env LC_ALL=C WECHATY_HEAD=chrome ava --fail-fast --timeout=3m \"dist/{src,test}/**/*.spec.js\"", "testdev": "cross-env LC_ALL=C WECHATY_LOG=silly ava --ext ts --serial --verbose --fail-fast --timeout=2m", "testdist": "cross-env WECHATY_LOG=SILLY WECHATY_HEAD=chrome ava --ext ts --verbose --fail-fast --timeout=2m", - "ava": "cross-env LC_ALL=C WECHATY_LOG=verbose node_modules/.bin/ava", + "ava": "ava --extension ts", "io-client": "ts-node bin/io-client", "dev": "ts-node dev.ts", "demo": "ts-node example/ding-dong-bot.ts", @@ -125,6 +125,7 @@ "eslint": "^3.4.0", "eslint-plugin-ava": "^3.1.1", "fluent-ffmpeg": "^2.1.0", + "node-cleanup": "^1.0.1", "nyc": "^8.3.2", "qrcode-terminal": "^0.10.0", "request": "^2.79.0", diff --git a/src/contact.ts b/src/contact.ts index d9e26969f1f1a51b708dc16c680b9c97d9758c95..a715c492f64ebb14892e987baa8536285570d16e 100644 --- a/src/contact.ts +++ b/src/contact.ts @@ -186,7 +186,7 @@ export class Contact implements Sayable { } log.verbose('Cotnact', 'findAll({ name: %s })', query.name) - const nameFilter = query.name + let nameFilter = query.name if (!nameFilter) { throw new Error('nameFilter not found') @@ -201,6 +201,7 @@ export class Contact implements Sayable { if (nameFilter instanceof RegExp) { filterFunction = `(function (c) { return ${nameFilter.toString()}.test(c) })` } else if (typeof nameFilter === 'string') { + nameFilter = nameFilter.replace(/'/g, '\\\'') filterFunction = `(function (c) { return c === '${nameFilter}' })` } else { throw new Error('unsupport name type') diff --git a/src/puppet-web/browser-driver.ts b/src/puppet-web/browser-driver.ts index f5ba3ef3e819c45b6b926d37d40d46d50cbe2f5b..e32f26b78b25561d6423ba96e011c6fe0e284f26 100644 --- a/src/puppet-web/browser-driver.ts +++ b/src/puppet-web/browser-driver.ts @@ -141,6 +141,11 @@ export class BrowserDriver { } } catch (e) { + if (/could not be found/.test(e.message)) { + // The ChromeDriver could not be found on the current PATH + log.error('PuppetWebBrowserDriver', 'initChromeDriver() Wechaty require `chrome-driver` to be installed.') + throw e + } log.warn('PuppetWebBrowserDriver', 'initChromeDriver() exception: %s, retry: %d', e.message, retry) driverError = e } diff --git a/src/puppet-web/wechaty-bro.js b/src/puppet-web/wechaty-bro.js index b1100d4f86437653f19a34ea81be1af93d473c2a..c08e369cad6ee8e74d10ce125fc89d4c5c798a45 100644 --- a/src/puppet-web/wechaty-bro.js +++ b/src/puppet-web/wechaty-bro.js @@ -720,7 +720,7 @@ }) } - function verifyUserOk(UserName, Ticket) { + function verifyUserOkAsync(UserName, Ticket) { var callback = arguments[arguments.length - 1] if (typeof callback !== 'function') { // here we should in sync mode, because there's no callback @@ -827,8 +827,8 @@ , roomModTopic: roomModTopic // for Friend Request - , verifyUserRequest: verifyUserRequest - , verifyUserOk: verifyUserOk + , verifyUserRequestAsync: verifyUserRequestAsync + , verifyUserOkAsync: verifyUserOkAsync // , friendAdd // , friendVerify diff --git a/src/room.ts b/src/room.ts index 2031459cd91f08a29108aca2fada0c8909e781ea..1eb017b5a445e3f80f32dee94a42af0ca22330cb 100644 --- a/src/room.ts +++ b/src/room.ts @@ -415,7 +415,7 @@ export class Room extends EventEmitter implements Sayable { } log.verbose('Room', 'findAll({ topic: %s })', query.topic) - const topicFilter = query.topic + let topicFilter = query.topic if (!topicFilter) { throw new Error('topicFilter not found') @@ -426,6 +426,7 @@ export class Room extends EventEmitter implements Sayable { if (topicFilter instanceof RegExp) { filterFunction = `(function (c) { return ${topicFilter.toString()}.test(c) })` } else if (typeof topicFilter === 'string') { + topicFilter = topicFilter.replace(/'/g, '\\\'') filterFunction = `(function (c) { return c === '${topicFilter}' })` } else { throw new Error('unsupport topic type') diff --git a/test/puppet-web/event.spec.ts b/test/puppet-web/event.spec.ts index 0c9486daff87acae2795b0947f76e79eefb88b33..a9ad5eff2bb46893de088cea784a18e3441d4336 100644 --- a/test/puppet-web/event.spec.ts +++ b/test/puppet-web/event.spec.ts @@ -31,6 +31,5 @@ test('Puppet Web Event smoking test', async t => { await pw.quit() } catch (e) { t.fail('exception: ' + e.message) - throw e } })