diff --git a/README.md b/README.md index 7401b18..1e988c1 100644 --- a/README.md +++ b/README.md @@ -77,13 +77,13 @@ what you need is execute it and scan qrcode in the console - √ Reply Text Message - √ Reply Image Message - √ Reply Video Message - - × Reply Voice Message + - × Reply Voice Message [not support by web wechat] - √ Reply Other Document File - √ Reply ChatRoom Message - √ Revoke Message - √ 50%+ UT Coverage - - × Create ChatRoom - - × Manage Chatroom Member(add/delete) + - × Create Chatroom [not support by web wechat] + - × Manage Chatroom Member(add/delete) [not support by web wechat] - × Plugin Support(AI/Robot plugin) ## License diff --git a/lib/core.js b/lib/core.js index f1165db..0741059 100644 --- a/lib/core.js +++ b/lib/core.js @@ -9,6 +9,7 @@ let logsystem = require('./logsystem') let Login = require('./login') let Messages = require('./messages') let MsgHandler = require('./msghandler') +let RoomManager = require('./roommanager') let instNum = 0 class Core { @@ -57,6 +58,7 @@ class Core { Login.Register(this) Messages.Register(this) MsgHandler.Register(this) + RoomManager.Register(this) instNum++ } diff --git a/lib/roommanager.js b/lib/roommanager.js new file mode 100644 index 0000000..ede5dbf --- /dev/null +++ b/lib/roommanager.js @@ -0,0 +1,202 @@ +'use strict' + +let log4js = require('log4js') +let logger = log4js.getLogger('chatwe') + +async function createChatroom (memberList, topic) { + logger.debug('createChatroom()') + let localTime = Date.now() + + let userNames = [] + for (let i in memberList) { + userNames.push({ UserName: memberList[i].UserName }) + } + + let options = { + uri: this.loginInfo['url'] + '/webwxcreatechatroom', + qs: { + 'r': localTime, + 'pass_ticket': this.loginInfo['pass_ticket'] + }, + body: { + 'BaseRequest': this.loginInfo['BaseRequest'], + 'MemberCount': userNames.length, + 'MemberList': userNames, + 'Topic': topic + }, + json: true, + method: 'POST' + } + + logger.debug('createChatroom, option :', options) + + return this.s(options) + .then(function (resp) { + logger.debug('createChatroom resp :', resp) + let issucc = resp && resp.BaseResponse && resp.BaseResponse.Ret === 0 + logger.debug('createChatroom issucc :', issucc) + return issucc ? resp : null + }) + .catch(function (err) { + logger.warn(err) + return null + }) +} + +async function setChatroomName (chatroom, topic) { + logger.debug('SetChatroomName()') + + let options = { + uri: this.loginInfo['url'] + '/webwxupdatechatroom', + qs: { + 'fun': 'modtopic', + 'pass_ticket': this.loginInfo['pass_ticket'] + }, + body: { + 'BaseRequest': this.loginInfo['BaseRequest'], + 'ChatRoomName': chatroom.UserName, + 'NewTopic': topic + }, + json: true, + method: 'POST' + } + + logger.debug('createChatroom, option :', options) + + return this.s(options) + .then(function (resp) { + logger.debug('SetChatroomName resp :', resp) + let issucc = resp && resp.BaseResponse && resp.BaseResponse.Ret === 0 + logger.debug('SetChatroomName issucc :', issucc) + return issucc ? resp : null + }) + .catch(function (err) { + logger.warn(err) + return null + }) +} + +async function deleteMemberFromChatroom (chatroom, memberList) { + logger.debug('deleteMemberFromChatroom()') + + let userNames = '' + for (let i in memberList) { + userNames += memberList[i].UserName + ',' + } + userNames = userNames.substr(0, userNames.length - 1) + + let options = { + uri: this.loginInfo['url'] + '/webwxupdatechatroom', + qs: { + 'fun': 'delmember', + 'pass_ticket': this.loginInfo['pass_ticket'] + }, + body: { + 'BaseRequest': this.loginInfo['BaseRequest'], + 'ChatRoomName': chatroom.UserName, + 'DelMemberList': userNames + }, + json: true, + method: 'POST' + } + + logger.debug('deleteMemberFromChatroom, option :', options) + + return this.s(options) + .then(function (resp) { + logger.debug('deleteMemberFromChatroom resp :', resp) + let issucc = resp && resp.BaseResponse && resp.BaseResponse.Ret === 0 + logger.debug('deleteMemberFromChatroom issucc :', issucc) + return issucc ? resp : null + }) + .catch(function (err) { + logger.warn(err) + return null + }) +} + +async function inviteMemberToChatroom (chatroom, memberList) { + logger.debug('inviteMemberToChatroom()') + + let userNames = '' + for (let i in memberList) { + userNames += memberList[i].UserName + ',' + } + userNames = userNames.substr(0, userNames.length - 1) + + let options = { + uri: this.loginInfo['url'] + '/webwxupdatechatroom', + qs: { + 'fun': 'invitemember', + 'pass_ticket': this.loginInfo['pass_ticket'] + }, + body: { + 'BaseRequest': this.loginInfo['BaseRequest'], + 'ChatRoomName': chatroom.UserName, + 'InviteMemberList': userNames + }, + json: true, + method: 'POST' + } + + logger.debug('inviteMemberToChatroom, option :', options) + + return this.s(options) + .then(function (resp) { + logger.debug('inviteMemberToChatroom resp :', resp) + let issucc = resp && resp.BaseResponse && resp.BaseResponse.Ret === 0 + logger.debug('inviteMemberToChatroom issucc :', issucc) + return issucc ? resp : null + }) + .catch(function (err) { + logger.warn(err) + return null + }) +} + +async function addMemberToChatroom (chatroom, memberList) { + logger.debug('inviteMemberToChatroom()') + + let userNames = '' + for (let i in memberList) { + userNames += memberList[i].UserName + ',' + } + userNames = userNames.substr(0, userNames.length - 1) + + let options = { + uri: this.loginInfo['url'] + '/webwxupdatechatroom', + qs: { + 'fun': 'addmember', + 'pass_ticket': this.loginInfo['pass_ticket'] + }, + body: { + 'BaseRequest': this.loginInfo['BaseRequest'], + 'ChatRoomName': chatroom.UserName, + 'AddMemberList': userNames + }, + json: true, + method: 'POST' + } + + logger.debug('inviteMemberToChatroom, option :', options) + + return this.s(options) + .then(function (resp) { + logger.debug('inviteMemberToChatroom resp :', resp) + let issucc = resp && resp.BaseResponse && resp.BaseResponse.Ret === 0 + logger.debug('inviteMemberToChatroom issucc :', issucc) + return issucc ? resp : null + }) + .catch(function (err) { + logger.warn(err) + return null + }) +} + +module.exports.Register = function (core) { + core.createChatroom = createChatroom + core.setChatroomName = setChatroomName + core.deleteMemberFromChatroom = deleteMemberFromChatroom + core.inviteMemberToChatroom = inviteMemberToChatroom + core.addMemberToChatroom = addMemberToChatroom +} diff --git a/test/test-addMemberToChatroom.js b/test/test-addMemberToChatroom.js new file mode 100644 index 0000000..898b425 --- /dev/null +++ b/test/test-addMemberToChatroom.js @@ -0,0 +1,72 @@ +'use strict' + +let log4js = require('log4js') +let logger = log4js.getLogger('chatwe') +var http = require('http') +var Wechat = require('../index') +var tape = require('tape') +var _test = require('tape-promise').default +var test = _test(tape) +let Config = require('../lib/config') +Config.BASE_URL = 'http://127.0.0.1:12345' +Config.PUSHLOGIN_BASE_URL = 'http://127.0.0.1:12345' +var wechat = new Wechat() +wechat.setLogging('info') + +let roomName = '@@xxx' +let users = [{ UserName: '1' }, { UserName: '2' }] +let ret = '{"BaseResponse":{"Ret":0}}' +var s = http.createServer(function (req, res) { + res.statusCode = 200 + logger.debug(req.url) + if (req.url.startsWith('/webwxupdatechatroom')) { + var body = '' + req.on('data', function (chunk) { + body += chunk + }) + + req.on('end', function () { + let query = require('url').parse(req.url, true) + + // 解析参数 + body = JSON.parse(body) + if (query.query.fun === 'addmember' && body.AddMemberList === '1,2' && body.ChatRoomName === roomName) { + res.end(ret) + } + }) + } +}) + +test('setup', function (t) { + s.listen({ + host: 'localhost', + port: 12345, + exclusive: true + }, function () { + t.end() + }) +}) + +test('wechat addMemberToChatroom 1', async function (t) { + wechat.loginInfo['url'] = Config.BASE_URL + wechat.loginInfo['User'] = {} + + let resp = await wechat.addMemberToChatroom({ UserName: roomName }, users) + + t.equal(0, resp.BaseResponse.Ret) +}) + +test('wechat addMemberToChatroom 2', async function (t) { + wechat.loginInfo['url'] = Config.BASE_URL + wechat.loginInfo['User'] = {} + ret = '{"BaseResponse":{"Ret":1}}' + let resp = await wechat.addMemberToChatroom({ UserName: roomName }, users) + + t.equal(null, resp) +}) + +test('cleanup', function (t) { + s.close(function () { + t.end() + }) +}) diff --git a/test/test-createChatroom.js b/test/test-createChatroom.js new file mode 100644 index 0000000..e68b347 --- /dev/null +++ b/test/test-createChatroom.js @@ -0,0 +1,70 @@ +'use strict' + +let log4js = require('log4js') +let logger = log4js.getLogger('chatwe') +var http = require('http') +var Wechat = require('../index') +var tape = require('tape') +var _test = require('tape-promise').default +var test = _test(tape) +let Config = require('../lib/config') +Config.BASE_URL = 'http://127.0.0.1:12345' +Config.PUSHLOGIN_BASE_URL = 'http://127.0.0.1:12345' +var wechat = new Wechat() +wechat.setLogging('info') + +let topic = 'R1' +let users = [{ UserName: '1' }, { UserName: '2' }] +let ret = '{"BaseResponse":{"Ret":0}}' +var s = http.createServer(function (req, res) { + res.statusCode = 200 + logger.debug(req.url) + if (req.url.startsWith('/webwxcreatechatroom')) { + var body = '' + req.on('data', function (chunk) { + body += chunk + }) + + req.on('end', function () { + // 解析参数 + body = JSON.parse(body) + if (body.Topic === topic && body.MemberCount === users.length) { + res.end(ret) + } + }) + } +}) + +test('setup', function (t) { + s.listen({ + host: 'localhost', + port: 12345, + exclusive: true + }, function () { + t.end() + }) +}) + +test('wechat createroom 1', async function (t) { + wechat.loginInfo['url'] = Config.BASE_URL + wechat.loginInfo['User'] = {} + + let resp = await wechat.createChatroom(users, topic) + + t.equal(0, resp.BaseResponse.Ret) +}) + +test('wechat createroom 2', async function (t) { + wechat.loginInfo['url'] = Config.BASE_URL + wechat.loginInfo['User'] = {} + ret = '{"BaseResponse":{"Ret":1}}' + let resp = await wechat.createChatroom(users, topic) + + t.equal(null, resp) +}) + +test('cleanup', function (t) { + s.close(function () { + t.end() + }) +}) diff --git a/test/test-deleteMemberFromChatroom.js b/test/test-deleteMemberFromChatroom.js new file mode 100644 index 0000000..d2330be --- /dev/null +++ b/test/test-deleteMemberFromChatroom.js @@ -0,0 +1,71 @@ +'use strict' + +let log4js = require('log4js') +let logger = log4js.getLogger('chatwe') +var http = require('http') +var Wechat = require('../index') +var tape = require('tape') +var _test = require('tape-promise').default +var test = _test(tape) +let Config = require('../lib/config') +Config.BASE_URL = 'http://127.0.0.1:12345' +Config.PUSHLOGIN_BASE_URL = 'http://127.0.0.1:12345' +var wechat = new Wechat() +wechat.setLogging('info') + +let roomName = '@@xxx' +let users = [{ UserName: '1' }, { UserName: '2' }] +let ret = '{"BaseResponse":{"Ret":0}}' +var s = http.createServer(function (req, res) { + res.statusCode = 200 + logger.debug(req.url) + if (req.url.startsWith('/webwxupdatechatroom')) { + var body = '' + req.on('data', function (chunk) { + body += chunk + }) + + req.on('end', function () { + let query = require('url').parse(req.url, true) + // 解析参数 + body = JSON.parse(body) + if (query.query.fun === 'delmember' && body.DelMemberList === '1,2' && body.ChatRoomName === roomName) { + res.end(ret) + } + }) + } +}) + +test('setup', function (t) { + s.listen({ + host: 'localhost', + port: 12345, + exclusive: true + }, function () { + t.end() + }) +}) + +test('wechat deleteMemberFromChatroom 1', async function (t) { + wechat.loginInfo['url'] = Config.BASE_URL + wechat.loginInfo['User'] = {} + + let resp = await wechat.deleteMemberFromChatroom({ UserName: roomName }, users) + + t.equal(0, resp.BaseResponse.Ret) +}) + +test('wechat deleteMemberFromChatroom 2', async function (t) { + wechat.loginInfo['url'] = Config.BASE_URL + wechat.loginInfo['User'] = {} + ret = '{"BaseResponse":{"Ret":1}}' + let resp = await wechat.deleteMemberFromChatroom({ UserName: roomName }, users) + + t.equal(null, resp) +}) + +test('cleanup', function (t) { + s.close(function () { + t.end() + }) +}) diff --git a/test/test-inviteMemberToChatroom.js b/test/test-inviteMemberToChatroom.js new file mode 100644 index 0000000..19d783a --- /dev/null +++ b/test/test-inviteMemberToChatroom.js @@ -0,0 +1,71 @@ +'use strict' + +let log4js = require('log4js') +let logger = log4js.getLogger('chatwe') +var http = require('http') +var Wechat = require('../index') +var tape = require('tape') +var _test = require('tape-promise').default +var test = _test(tape) +let Config = require('../lib/config') +Config.BASE_URL = 'http://127.0.0.1:12345' +Config.PUSHLOGIN_BASE_URL = 'http://127.0.0.1:12345' +var wechat = new Wechat() +wechat.setLogging('info') + +let roomName = '@@xxx' +let users = [{ UserName: '1' }, { UserName: '2' }] +let ret = '{"BaseResponse":{"Ret":0}}' +var s = http.createServer(function (req, res) { + res.statusCode = 200 + logger.debug(req.url) + if (req.url.startsWith('/webwxupdatechatroom')) { + var body = '' + req.on('data', function (chunk) { + body += chunk + }) + + req.on('end', function () { + let query = require('url').parse(req.url, true) + // 解析参数 + body = JSON.parse(body) + if (query.query.fun === 'invitemember' && body.InviteMemberList === '1,2' && body.ChatRoomName === roomName) { + res.end(ret) + } + }) + } +}) + +test('setup', function (t) { + s.listen({ + host: 'localhost', + port: 12345, + exclusive: true + }, function () { + t.end() + }) +}) + +test('wechat inviteMemberToChatroom 1', async function (t) { + wechat.loginInfo['url'] = Config.BASE_URL + wechat.loginInfo['User'] = {} + + let resp = await wechat.inviteMemberToChatroom({ UserName: roomName }, users) + + t.equal(0, resp.BaseResponse.Ret) +}) + +test('wechat inviteMemberToChatroom 2', async function (t) { + wechat.loginInfo['url'] = Config.BASE_URL + wechat.loginInfo['User'] = {} + ret = '{"BaseResponse":{"Ret":1}}' + let resp = await wechat.inviteMemberToChatroom({ UserName: roomName }, users) + + t.equal(null, resp) +}) + +test('cleanup', function (t) { + s.close(function () { + t.end() + }) +}) diff --git a/test/test-setChatroomName.js b/test/test-setChatroomName.js new file mode 100644 index 0000000..8cfe72e --- /dev/null +++ b/test/test-setChatroomName.js @@ -0,0 +1,71 @@ +'use strict' + +let log4js = require('log4js') +let logger = log4js.getLogger('chatwe') +var http = require('http') +var Wechat = require('../index') +var tape = require('tape') +var _test = require('tape-promise').default +var test = _test(tape) +let Config = require('../lib/config') +Config.BASE_URL = 'http://127.0.0.1:12345' +Config.PUSHLOGIN_BASE_URL = 'http://127.0.0.1:12345' +var wechat = new Wechat() +wechat.setLogging('info') + +let topic = 'R1' +let roomName = '@@xxx' +let ret = '{"BaseResponse":{"Ret":0}}' +var s = http.createServer(function (req, res) { + res.statusCode = 200 + logger.debug(req.url) + if (req.url.startsWith('/webwxupdatechatroom')) { + var body = '' + req.on('data', function (chunk) { + body += chunk + }) + + req.on('end', function () { + let query = require('url').parse(req.url, true) + // 解析参数 + body = JSON.parse(body) + if (query.query.fun === 'modtopic' && body.NewTopic === topic && body.ChatRoomName === roomName) { + res.end(ret) + } + }) + } +}) + +test('setup', function (t) { + s.listen({ + host: 'localhost', + port: 12345, + exclusive: true + }, function () { + t.end() + }) +}) + +test('wechat setChatroomName 1', async function (t) { + wechat.loginInfo['url'] = Config.BASE_URL + wechat.loginInfo['User'] = {} + + let resp = await wechat.setChatroomName({ UserName: roomName }, topic) + + t.equal(0, resp.BaseResponse.Ret) +}) + +test('wechat setChatroomName 2', async function (t) { + wechat.loginInfo['url'] = Config.BASE_URL + wechat.loginInfo['User'] = {} + ret = '{"BaseResponse":{"Ret":1}}' + let resp = await wechat.setChatroomName({ UserName: roomName }, topic) + + t.equal(null, resp) +}) + +test('cleanup', function (t) { + s.close(function () { + t.end() + }) +})