From 1bdc7613197c07d7056b43d1183d70758adfa41b Mon Sep 17 00:00:00 2001 From: cherry-geqi Date: Wed, 16 Nov 2016 18:00:58 +0800 Subject: [PATCH] convert wechaty-bro.js to plain old javascript syntax in favour of phantomjs --- src/puppet-web/wechaty-bro.js | 862 +++++++++++++++++----------------- 1 file changed, 437 insertions(+), 425 deletions(-) diff --git a/src/puppet-web/wechaty-bro.js b/src/puppet-web/wechaty-bro.js index edbae933..a1550245 100644 --- a/src/puppet-web/wechaty-bro.js +++ b/src/puppet-web/wechaty-bro.js @@ -28,48 +28,49 @@ /*global angular*/ -(function(port) { +(function (port) { function init() { if (!angularIsReady()) { - retObj.code = 503 // 503 SERVICE UNAVAILABLE https://httpstatuses.com/503 - retObj.message = 'init() without a ready angular env' - return retObj + retObj.code = 503; // 503 SERVICE UNAVAILABLE https://httpstatuses.com/503 + retObj.message = 'init() without a ready angular env'; + return retObj; } - if (!initClog(false)) { // make console.log work (wxapp disabled the console.log) - retObj.code = 503 // 503 Service Unavailable http://www.restapitutorial.com/httpstatuscodes.html - retObj.message = 'initClog fail' - return retObj + if (!initClog(false)) { + // make console.log work (wxapp disabled the console.log) + retObj.code = 503; // 503 Service Unavailable http://www.restapitutorial.com/httpstatuscodes.html + retObj.message = 'initClog fail'; + return retObj; } if (WechatyBro.vars.initStatus === true) { - log('WechatyBro.init() called twice: already inited') - retObj.code = 304 // 304 Not Modified https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.5 - retObj.message = 'init() already inited before. returned with do nothing' - return retObj + log('WechatyBro.init() called twice: already inited'); + retObj.code = 304; // 304 Not Modified https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.5 + retObj.message = 'init() already inited before. returned with do nothing'; + return retObj; } - clog('init on port:' + port) + clog('init on port:' + port); if (MMCgiLogined()) { - login('page refresh') + login('page refresh'); } - glueToAngular() - connectSocket() - hookEvents() + glueToAngular(); + connectSocket(); + hookEvents(); - checkScan() + checkScan(); - heartBeat(true) + heartBeat(true); - clog('inited!. ;-D') - WechatyBro.vars.initStatus = true + clog('inited!. ;-D'); + WechatyBro.vars.initStatus = true; - retObj.code = 200 - retObj.message = 'WechatyBro Init Succ on port: ' + port - return retObj + retObj.code = 200; + retObj.message = 'WechatyBro Init Succ on port: ' + port; + return retObj; } /** @@ -78,81 +79,92 @@ */ function initClog(enabled) { if (!enabled) { - return true + return true; } if (WechatyBro.vars.iframe) { - log('initClog() again? there is already a iframe') - return true + log('initClog() again? there is already a iframe'); + return true; } - if (!document.body) { // Javascript Error Null is not an Object + if (!document.body) { + // Javascript Error Null is not an Object // log('initClog() not ready because document.body not ready') - return false + return false; } - var i = document.createElement('iframe') + var i = document.createElement('iframe'); if (!i) { // log('initClog() not ready because document.createElement fail') - return false + return false; } // slog('initClog got iframe element') - i.style.display = 'none' - document.body.appendChild(i) - WechatyBro.vars.iframe = i + i.style.display = 'none'; + document.body.appendChild(i); + WechatyBro.vars.iframe = i; // if (!WechatyBro.vars.iframe) { // throw new Error('iframe gone after appendChild, WTF???') // } // slog('initClog done') - return true + return true; } function clog(s) { if (!WechatyBro.vars.iframe) { // throw new Error('clog() iframe not found when be invocked') - return + return; } - var d = new Date() - s = d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds() + ' ' + s + var d = new Date(); + s = d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds() + ' ' + s; - WechatyBro.vars.iframe.contentWindow.console.log(s) + WechatyBro.vars.iframe.contentWindow.console.log(s); } - function slog(msg) { WechatyBro.emit('log', msg) } - function log(s) { clog(s); slog(s) } + function slog(msg) { + WechatyBro.emit('log', msg); + } + function log(s) { + clog(s);slog(s); + } /** * WechatyBro.emit, will save event & data when there's no socket io connection to prevent event lost * NOTICE: only clog available here, because slog & log will call emit, death loop */ function emit(event, data) { - var eventsBuf = WechatyBro.vars.eventsBuf + var eventsBuf = WechatyBro.vars.eventsBuf; if (!eventsBuf.map) { - throw new Error('WechatyBro.vars.eventsBuf must be a Array') + throw new Error('WechatyBro.vars.eventsBuf must be a Array'); } if (event) { - eventsBuf.unshift([event, data]) + eventsBuf.unshift([event, data]); } - var socket = WechatyBro.vars.socket + var socket = WechatyBro.vars.socket; if (!socket) { - clog('WechatyBro.vars.socket not ready') - return setTimeout(emit, 1000) // resent eventsBuf after 1000ms + clog('WechatyBro.vars.socket not ready'); + return setTimeout(emit, 1000); // resent eventsBuf after 1000ms } - var bufLen = eventsBuf.length + var bufLen = eventsBuf.length; if (bufLen) { - if (bufLen > 1) { clog('WechatyBro.vars.eventsBuf has ' + bufLen + ' unsend events') } + if (bufLen > 1) { + clog('WechatyBro.vars.eventsBuf has ' + bufLen + ' unsend events'); + } while (eventsBuf.length) { - var eventData = eventsBuf.pop() - if (eventData && eventData.map && eventData.length===2) { - clog('emiting ' + eventData[0]) - socket.emit(eventData[0], eventData[1]) - } else { clog('WechatyBro.emit() got invalid eventData: ' + eventData[0] + ', ' + eventData[1] + ', length: ' + eventData.length) } + var eventData = eventsBuf.pop(); + if (eventData && eventData.map && eventData.length === 2) { + clog('emiting ' + eventData[0]); + socket.emit(eventData[0], eventData[1]); + } else { + clog('WechatyBro.emit() got invalid eventData: ' + eventData[0] + ', ' + eventData[1] + ', length: ' + eventData.length); + } } - if (bufLen > 1) { clog('WechatyBro.vars.eventsBuf[' + bufLen + '] all sent') } + if (bufLen > 1) { + clog('WechatyBro.vars.eventsBuf[' + bufLen + '] all sent'); + } } } @@ -161,118 +173,115 @@ * Functions that Glued with AngularJS * */ - function MMCgiLogined() { return !!(window.MMCgi && window.MMCgi.isLogin) } + function MMCgiLogined() { + return !!(window.MMCgi && window.MMCgi.isLogin); + } function angularIsReady() { // don't log inside, because we has not yet init clog here. - return !!( - (typeof angular) !== 'undefined' - && angular.element - && angular.element('body') - && angular.element(document).injector() - ) + return !!(typeof angular !== 'undefined' && angular.element && angular.element('body') && angular.element(document).injector()); } function heartBeat(firstTime) { - var TIMEOUT = 15000 // 15s + var TIMEOUT = 15000; // 15s if (firstTime && WechatyBro.vars.heartBeatTimmer) { - WechatyBro.log('heartBeat timer exist when 1st time is true? return for do nothing') - return + WechatyBro.log('heartBeat timer exist when 1st time is true? return for do nothing'); + return; } - WechatyBro.emit('ding', 'heartbeat@browser') - WechatyBro.vars.heartBeatTimmer = setTimeout(heartBeat, TIMEOUT) - return TIMEOUT + WechatyBro.emit('ding', 'heartbeat@browser'); + WechatyBro.vars.heartBeatTimmer = setTimeout(heartBeat, TIMEOUT); + return TIMEOUT; } function glueToAngular() { - var injector = angular.element(document).injector() + var injector = angular.element(document).injector(); if (!injector) { - throw new Error('glueToAngular cant get injector(right now)') - } - - var accountFactory = injector.get('accountFactory') - var appFactory = injector.get('appFactory') - var chatroomFactory = injector.get('chatroomFactory') - var chatFactory = injector.get('chatFactory') - var contactFactory = injector.get('contactFactory') - var confFactory = injector.get('confFactory') - var emojiFactory = injector.get('emojiFactory') - var loginFactory = injector.get('loginFactory') - - var http = injector.get('$http') - var state = injector.get('$state') - var mmHttp = injector.get('mmHttp') - - var appScope = angular.element('[ng-controller="appController"]').scope() - var rootScope = injector.get('$rootScope') - var loginScope = angular.element('[ng-controller="loginController"]').scope() - -/* - // method 1 - appFactory.syncOrig = appFactory.sync - appFactory.syncCheckOrig = appFactory.syncCheck - appFactory.sync = function() { WechatyBro.log('appFactory.sync() !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); return appFactory.syncOrig(arguments) } - appFactory.syncCheck = function() { WechatyBro.log('appFactory.syncCheck() !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); return appFactory.syncCheckOrig(arguments) } - - // method 2 - $.ajaxOrig = $.ajax - $.ajax = function() { WechatyBro.log('$.ajax() !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); return $.ajaxOrig(arguments) } - - $.ajax({ - url: "https://wx.qq.com/zh_CN/htmledition/v2/images/webwxgeticon.jpg" - , type: "GET" - }).done(function (response) { - alert("success"); - }) - - // method 3 - mmHttp - mmHttp.getOrig = mmHttp.get - mmHttp.get = function() { WechatyBro.log('mmHttp.get() !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); return mmHttp.getOrig(arguments) } -*/ + throw new Error('glueToAngular cant get injector(right now)'); + } + + var accountFactory = injector.get('accountFactory'); + var appFactory = injector.get('appFactory'); + var chatroomFactory = injector.get('chatroomFactory'); + var chatFactory = injector.get('chatFactory'); + var contactFactory = injector.get('contactFactory'); + var confFactory = injector.get('confFactory'); + var emojiFactory = injector.get('emojiFactory'); + var loginFactory = injector.get('loginFactory'); + + var http = injector.get('$http'); + var state = injector.get('$state'); + var mmHttp = injector.get('mmHttp'); + + var appScope = angular.element('[ng-controller="appController"]').scope(); + var rootScope = injector.get('$rootScope'); + var loginScope = angular.element('[ng-controller="loginController"]').scope(); + + /* + // method 1 + appFactory.syncOrig = appFactory.sync + appFactory.syncCheckOrig = appFactory.syncCheck + appFactory.sync = function() { WechatyBro.log('appFactory.sync() !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); return appFactory.syncOrig(arguments) } + appFactory.syncCheck = function() { WechatyBro.log('appFactory.syncCheck() !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); return appFactory.syncCheckOrig(arguments) } + + // method 2 + $.ajaxOrig = $.ajax + $.ajax = function() { WechatyBro.log('$.ajax() !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); return $.ajaxOrig(arguments) } + + $.ajax({ + url: "https://wx.qq.com/zh_CN/htmledition/v2/images/webwxgeticon.jpg" + , type: "GET" + }).done(function (response) { + alert("success"); + }) + + // method 3 - mmHttp + mmHttp.getOrig = mmHttp.get + mmHttp.get = function() { WechatyBro.log('mmHttp.get() !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); return mmHttp.getOrig(arguments) } + */ /** * generate $scope with a contoller (as it is not assigned in html staticly) * https://github.com/angular/angular.js/blob/a4e60cb6970d8b6fa9e0af4b9f881ee3ba7fdc99/test/ng/controllerSpec.js#L24 */ - var contentChatScope = rootScope.$new() - injector.get('$controller')('contentChatController', {$scope: contentChatScope }) + var contentChatScope = rootScope.$new(); + injector.get('$controller')('contentChatController', { $scope: contentChatScope }); // get all we need from wx in browser(angularjs) WechatyBro.glue = { - injector: injector - , http: http - , mmHttp - , state + injector: injector, + http: http, + mmHttp: mmHttp, + state: state, - , accountFactory: accountFactory - , chatroomFactory - , chatFactory: chatFactory - , confFactory: confFactory - , contactFactory: contactFactory - , emojiFactory - , loginFactory: loginFactory + accountFactory: accountFactory, + chatroomFactory: chatroomFactory, + chatFactory: chatFactory, + confFactory: confFactory, + contactFactory: contactFactory, + emojiFactory: emojiFactory, + loginFactory: loginFactory, - , rootScope: rootScope - , appScope: appScope - , loginScope: loginScope + rootScope: rootScope, + appScope: appScope, + loginScope: loginScope, - , contentChatScope: contentChatScope - } + contentChatScope: contentChatScope + }; - return true + return true; } function checkScan() { - clog('checkScan()') + clog('checkScan()'); if (isLogin()) { - log('checkScan() - already login, no more check, and return(only)') //but I will emit a login event') + log('checkScan() - already login, no more check, and return(only)'); //but I will emit a login event') // login('checkScan found already login') - return + return; } if (!WechatyBro.glue.loginScope) { - log('checkScan() - loginScope disappeared, no more check') - login('loginScope disappeared') - return + log('checkScan() - loginScope disappeared, no more check'); + login('loginScope disappeared'); + return; } // loginScope.code: @@ -280,114 +289,119 @@ // 408: 未确认(显示二维码后30秒触发) // 201: 扫描,未确认 // 200: 登录成功 - var code = +WechatyBro.glue.loginScope.code - var url = WechatyBro.glue.loginScope.qrcodeUrl + var code = +WechatyBro.glue.loginScope.code; + var url = WechatyBro.glue.loginScope.qrcodeUrl; if (url && code !== WechatyBro.vars.scanCode) { - log('checkScan() - code change detected: from ' - + WechatyBro.vars.scanCode - + ' to ' - + code - ) + log('checkScan() - code change detected: from ' + WechatyBro.vars.scanCode + ' to ' + code); WechatyBro.emit('scan', { - code: code - , url: url - }) - WechatyBro.vars.scanCode = code + code: code, + url: url + }); + WechatyBro.vars.scanCode = code; } if (code === 200) { - login('scan code 200') + login('scan code 200'); } else { - setTimeout(checkScan, 1000) + setTimeout(checkScan, 1000); } - return + return; } - function isLogin() { return !!WechatyBro.vars.loginStatus } + function isLogin() { + return !!WechatyBro.vars.loginStatus; + } function login(data) { - log('login(' + data + ')') + log('login(' + data + ')'); if (!WechatyBro.vars.loginStatus) { - WechatyBro.vars.loginStatus = true + WechatyBro.vars.loginStatus = true; } - WechatyBro.emit('login', data) + WechatyBro.emit('login', data); } function logout(data) { - log('logout(' + data + ')') - WechatyBro.vars.loginStatus = false + log('logout(' + data + ')'); + WechatyBro.vars.loginStatus = false; // WechatyBro.emit('logout', data) if (WechatyBro.glue.loginFactory) { - WechatyBro.glue.loginFactory.loginout() + WechatyBro.glue.loginFactory.loginout(); } - checkScan() + checkScan(); } function quit() { - log('quit()') - logout('quit()') + log('quit()'); + logout('quit()'); if (WechatyBro.vars.socket) { - WechatyBro.vars.socket.close() - WechatyBro.vars.socket = null + WechatyBro.vars.socket.close(); + WechatyBro.vars.socket = null; } } - function ding(data) { log('recv ding'); return data || 'dong' } + function ding(data) { + log('recv ding');return data || 'dong'; + } function hookEvents() { - var rootScope = WechatyBro.glue.rootScope - var appScope = WechatyBro.glue.appScope + var rootScope = WechatyBro.glue.rootScope; + var appScope = WechatyBro.glue.appScope; if (!rootScope || !appScope) { - log('hookEvents() no rootScope') - return false + log('hookEvents() no rootScope'); + return false; } - rootScope.$on('message:add:success', function(event, data) { - if (!isLogin()) { // in case of we missed the pageInit event - login('by event[message:add:success]') + rootScope.$on('message:add:success', function (event, data) { + if (!isLogin()) { + // in case of we missed the pageInit event + login('by event[message:add:success]'); } - WechatyBro.emit('message', data) - }) + WechatyBro.emit('message', data); + }); rootScope.$on('root:pageInit:success'), function (event, data) { - login('by event[root:pageInit:success]') - } + login('by event[root:pageInit:success]'); + }; // newLoginPage seems not stand for a user login action // appScope.$on("newLoginPage", function(event, data) { // login('by event[newLoginPage]') // }) - window.addEventListener('unload', function(e) { + window.addEventListener('unload', function (e) { // XXX only 1 event can be emitted here??? - WechatyBro.emit('unload', String(e)) + WechatyBro.emit('unload', String(e)); // WechatyBro.slog('emit unload') // WechatyBro.emit('logout', e) // WechatyBro.slog('emit logout') // WechatyBro.slog('emit logout&unload over') - }) - return true + }); + return true; } function connectSocket() { - log('connectSocket()') + log('connectSocket()'); if (typeof io !== 'function') { - log('connectSocket: io not found. loading lib...') + log('connectSocket: io not found. loading lib...'); // http://stackoverflow.com/a/3248500/1123955 - var script = document.createElement('script') - script.onload = function() { - log('socket io lib loaded.') - connectSocket() - } - script.src = '//cdnjs.cloudflare.com/ajax/libs/socket.io/1.4.5/socket.io.min.js' - document.getElementsByTagName('head')[0].appendChild(script) - return // wait to be called via script.onload() + var script = document.createElement('script'); + script.onload = function () { + log('socket io lib loaded.'); + connectSocket(); + }; + script.src = '//cdnjs.cloudflare.com/ajax/libs/socket.io/1.4.5/socket.io.min.js'; + document.getElementsByTagName('head')[0].appendChild(script); + return; // wait to be called via script.onload() } /*global io*/ // WechatyBro global variable: socket - var socket = WechatyBro.vars.socket = io.connect('wss://127.0.0.1:' + port/*, {transports: ['websocket']}*/) + var socket = WechatyBro.vars.socket = io.connect('wss://127.0.0.1:' + port /*, {transports: ['websocket']}*/); // ding -> dong. for test & live check purpose // ping/pong are reserved by socket.io https://github.com/socketio/socket.io/issues/2414 - socket.on('ding', function(data) { - log('received socket io event: ding(' + data + '). emit dong...') - socket.emit('dong', data) - }) + socket.on('ding', function (data) { + log('received socket io event: ding(' + data + '). emit dong...'); + socket.emit('dong', data); + }); - socket.on('connect' , function(e) { clog('connected to server:' + e) }) - socket.on('disconnect', function(e) { clog('socket disconnect:' + e) }) + socket.on('connect', function (e) { + clog('connected to server:' + e); + }); + socket.on('disconnect', function (e) { + clog('socket disconnect:' + e); + }); } /** @@ -397,177 +411,184 @@ * getMsgImg(message.MsgId,'big',message) */ function getMsgImg(id, type, message) { - var contentChatScope = WechatyBro.glue.contentChatScope + var contentChatScope = WechatyBro.glue.contentChatScope; if (!contentChatScope) { - throw new Error('getMsgImg() contentChatScope not found') + throw new Error('getMsgImg() contentChatScope not found'); } - var location = window.location.href.replace(/\/$/, '') - var path = contentChatScope.getMsgImg(id, type, message) - return location + path + var location = window.location.href.replace(/\/$/, ''); + var path = contentChatScope.getMsgImg(id, type, message); + return location + path; } function getMsgEmoticon(id) { - var chatFactory = WechatyBro.glue.chatFactory + var chatFactory = WechatyBro.glue.chatFactory; - var message = chatFactory.getMsg(id) - return message.MMPreviewSrc || getMsgImg(message.MsgId,'big',message) || message.MMThumbSrc + var message = chatFactory.getMsg(id); + return message.MMPreviewSrc || getMsgImg(message.MsgId, 'big', message) || message.MMThumbSrc; } function getMsgVideo(id) { - var contentChatScope = WechatyBro.glue.contentChatScope + var contentChatScope = WechatyBro.glue.contentChatScope; if (!contentChatScope) { - throw new Error('getMsgVideo() contentChatScope not found') + throw new Error('getMsgVideo() contentChatScope not found'); } - var location = window.location.href.replace(/\/$/, '') - var path = contentChatScope.getMsgVideo(id) - return location + path + var location = window.location.href.replace(/\/$/, ''); + var path = contentChatScope.getMsgVideo(id); + return location + path; } /** * from playVoice() */ function getMsgVoice(id) { - var confFactory = WechatyBro.glue.confFactory - var accountFactory = WechatyBro.glue.accountFactory + var confFactory = WechatyBro.glue.confFactory; + var accountFactory = WechatyBro.glue.accountFactory; - var location = window.location.href.replace(/\/$/, '') - var path = confFactory.API_webwxgetvoice + "?msgid=" + id + "&skey=" + accountFactory.getSkey() - return location + path + var location = window.location.href.replace(/\/$/, ''); + var path = confFactory.API_webwxgetvoice + "?msgid=" + id + "&skey=" + accountFactory.getSkey(); + return location + path; } function getMsgPublicLinkImg(id) { - var location = window.location.href.replace(/\/$/, '') - var path = '/cgi-bin/mmwebwx-bin/webwxgetpubliclinkimg?url=xxx&msgid=' + id + '&pictype=location' - return location + path + var location = window.location.href.replace(/\/$/, ''); + var path = '/cgi-bin/mmwebwx-bin/webwxgetpubliclinkimg?url=xxx&msgid=' + id + '&pictype=location'; + return location + path; } function send(ToUserName, Content) { - var chatFactory = WechatyBro.glue.chatFactory - var confFactory = WechatyBro.glue.confFactory + var chatFactory = WechatyBro.glue.chatFactory; + var confFactory = WechatyBro.glue.confFactory; if (!chatFactory || !confFactory) { - log('send() chatFactory or confFactory not exist.') - return false + log('send() chatFactory or confFactory not exist.'); + return false; } var m = chatFactory.createMessage({ - ToUserName: ToUserName - , Content: Content - , MsgType: confFactory.MSGTYPE_TEXT - }) - chatFactory.appendMessage(m) - return chatFactory.sendMessage(m) + ToUserName: ToUserName, + Content: Content, + MsgType: confFactory.MSGTYPE_TEXT + }); + chatFactory.appendMessage(m); + return chatFactory.sendMessage(m); } function getContact(id) { - var contactFactory = WechatyBro.glue.contactFactory + var contactFactory = WechatyBro.glue.contactFactory; if (!contactFactory) { - log('contactFactory not inited') - return null + log('contactFactory not inited'); + return null; } - var c = contactFactory.getContact(id) - var contactWithoutFunction = {} + var c = contactFactory.getContact(id); + var contactWithoutFunction = {}; if (c) { if (c.isContact) { // extend rawObj to identify `stranger` - c.stranger = !(c.isContact()) + c.stranger = !c.isContact(); } - Object.keys(c).forEach(function(k) { + Object.keys(c).forEach(function (k) { if (typeof c[k] !== 'function') { - contactWithoutFunction[k] = c[k] + contactWithoutFunction[k] = c[k]; } - }) - + }); } else { /** * when `id` does not exist in _contact Array, maybe it is belongs to a stranger in a room. * try to find in room's member list for this `id`, and return the contact info, if any. */ - c = Object.keys(_contacts) - .filter(id => id.match(/^@@/)) // only search in room - .map(id => _contacts[id]) // map to room array - .filter(r => r.MemberList.length) // get rid of room without member list - .filter(r => r.MemberList - .filter(m => m.UserName === id) - .length - ) - .map(c => c.MemberList - .filter(m => m.UserName === id) - [0] - ) - [0] + c = Object.keys(_contacts).filter(function (id) { + return id.match(/^@@/); + }) // only search in room + .map(function (id) { + return _contacts[id]; + }) // map to room array + .filter(function (r) { + return r.MemberList.length; + }) // get rid of room without member list + .filter(function (r) { + return r.MemberList.filter(function (m) { + return m.UserName === id; + }).length; + }).map(function (c) { + return c.MemberList.filter(function (m) { + return m.UserName === id; + })[0]; + })[0]; if (c) { - c.stranger = true + c.stranger = true; - Object.keys(c).forEach(function(k) { + Object.keys(c).forEach(function (k) { if (typeof c[k] !== 'function') { - contactWithoutFunction[k] = c[k] + contactWithoutFunction[k] = c[k]; } - }) + }); } - } - return contactWithoutFunction + return contactWithoutFunction; } function getUserName() { - var accountFactory = WechatyBro.glue.accountFactory - return accountFactory - ? accountFactory.getUserName() - : null + var accountFactory = WechatyBro.glue.accountFactory; + return accountFactory ? accountFactory.getUserName() : null; } function contactFindAsync(filterFunction) { - const callback = arguments[arguments.length - 1] + var callback = arguments[arguments.length - 1]; if (typeof callback !== 'function') { // here we should in sync mode, because there's no callback - throw new Error('async method need to be called via webdriver.executeAsyncScript') + throw new Error('async method need to be called via webdriver.executeAsyncScript'); } - var contactFactory = WechatyBro.glue.contactFactory + var contactFactory = WechatyBro.glue.contactFactory; - var match + var match; if (!filterFunction) { - match = function() { return true } + match = function match() { + return true; + }; } else { - match = eval(filterFunction) + match = eval(filterFunction); } - return retryFind(0) + return retryFind(0); // retry 3 times, sleep 300ms between each time - function retryFind(attempt = 0) { - const contactList = contactFactory - .getAllFriendContact() - .filter(c => match(c.NickName)) - .map(c => c.UserName) + function retryFind() { + var attempt = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + + var contactList = contactFactory.getAllFriendContact().filter(function (c) { + return match(c.NickName); + }).map(function (c) { + return c.UserName; + }); if (contactList && contactList.length) { - callback(contactList) + callback(contactList); } else if (attempt > 3) { - callback([]) + callback([]); } else { - attempt++ - setTimeout(_ => retryFind(attempt), 300) + attempt++; + setTimeout(function (_) { + return retryFind(attempt); + }, 300); } - } } function contactRemarkAsync(UserName, remark) { - const callback = arguments[arguments.length - 1] + var callback = arguments[arguments.length - 1]; if (typeof callback !== 'function') { // here we should in sync mode, because there's no callback - throw new Error('async method need to be called via webdriver.executeAsyncScript') + throw new Error('async method need to be called via webdriver.executeAsyncScript'); } - var accountFactory = WechatyBro.glue.accountFactory - var confFactory = WechatyBro.glue.confFactory - var emojiFactory = WechatyBro.glue.emojiFactory - var mmHttp = WechatyBro.glue.mmHttp + var accountFactory = WechatyBro.glue.accountFactory; + var confFactory = WechatyBro.glue.confFactory; + var emojiFactory = WechatyBro.glue.emojiFactory; + var mmHttp = WechatyBro.glue.mmHttp; mmHttp({ method: "POST", @@ -582,141 +603,133 @@ timeout: 1e4, serial: !0 } - }).success(function() { - callback(true) - }).error(function() { - callback(false) - }) + }).success(function () { + callback(true); + }).error(function () { + callback(false); + }); } function roomFind(filterFunction) { - var contactFactory = WechatyBro.glue.contactFactory + var contactFactory = WechatyBro.glue.contactFactory; - var match + var match; if (!filterFunction) { - match = function() { return true } + match = function match() { + return true; + }; } else { - match = eval(filterFunction) + match = eval(filterFunction); } // log(match.toString()) - return contactFactory.getAllChatroomContact() - .filter(r => match(r.NickName)) - .map(r => r.UserName) + return contactFactory.getAllChatroomContact().filter(function (r) { + return match(r.NickName); + }).map(function (r) { + return r.UserName; + }); } function roomDelMember(ChatRoomName, UserName) { - const chatroomFactory = WechatyBro.glue.chatroomFactory - return chatroomFactory.delMember(ChatRoomName, UserName) + var chatroomFactory = WechatyBro.glue.chatroomFactory; + return chatroomFactory.delMember(ChatRoomName, UserName); } function roomAddMember(ChatRoomName, UserName) { - const chatroomFactory = WechatyBro.glue.chatroomFactory + var chatroomFactory = WechatyBro.glue.chatroomFactory; // XXX // log(ChatRoomName) // log(UserName) - return chatroomFactory.addMember(ChatRoomName, UserName) + return chatroomFactory.addMember(ChatRoomName, UserName); } function roomModTopic(ChatRoomName, topic) { - const chatroomFactory = WechatyBro.glue.chatroomFactory - return chatroomFactory.modTopic(ChatRoomName, topic) + var chatroomFactory = WechatyBro.glue.chatroomFactory; + return chatroomFactory.modTopic(ChatRoomName, topic); } function roomCreateAsync(UserNameList, topic) { - const callback = arguments[arguments.length - 1] + var callback = arguments[arguments.length - 1]; if (typeof callback !== 'function') { // here we should in sync mode, because there's no callback - throw new Error('async method need to be called via webdriver.executeAsyncScript') - } - - const UserNameListArg = UserNameList.map(n => { return { UserName: n } }) - - const chatroomFactory = WechatyBro.glue.chatroomFactory - const state = WechatyBro.glue.state - chatroomFactory.create(UserNameListArg) - .then(r => { - if (r.BaseResponse && 0 == r.BaseResponse.Ret || -2013 == r.BaseResponse.Ret) { - state.go('chat', { userName: r.ChatRoomName }) // BE CAREFUL: key name is userName, not UserName! 20161001 - // if (topic) { - // setTimeout(_ => roomModTopic(r.ChatRoomName, topic), 3000) - // } - if (!r.ChatRoomName) { - throw new Error('chatroomFactory.create() got empty r.ChatRoomName') - } - callback(r.ChatRoomName) - } else { - throw new Error('chatroomFactory.create() error with Ret: ' - + r && r.BaseResponse.Ret - + 'with ErrMsg: ' - + r && r.BaseResponse.ErrMsg - ) - } - }) - .catch(e => { - // Async can only return by call callback - callback( - JSON.parse( - JSON.stringify( - e - , Object.getOwnPropertyNames(e) - ) - ) - ) - }) - } - - function verifyUserRequest(UserName, VerifyContent = '') { - var contactFactory = WechatyBro.glue.contactFactory - var confFactory = WechatyBro.glue.confFactory - - var Ticket = '' // what's this? + throw new Error('async method need to be called via webdriver.executeAsyncScript'); + } + + var UserNameListArg = UserNameList.map(function (n) { + return { UserName: n }; + }); + + var chatroomFactory = WechatyBro.glue.chatroomFactory; + var state = WechatyBro.glue.state; + chatroomFactory.create(UserNameListArg).then(function (r) { + if (r.BaseResponse && 0 == r.BaseResponse.Ret || -2013 == r.BaseResponse.Ret) { + state.go('chat', { userName: r.ChatRoomName }); // BE CAREFUL: key name is userName, not UserName! 20161001 + // if (topic) { + // setTimeout(_ => roomModTopic(r.ChatRoomName, topic), 3000) + // } + if (!r.ChatRoomName) { + throw new Error('chatroomFactory.create() got empty r.ChatRoomName'); + } + callback(r.ChatRoomName); + } else { + throw new Error('chatroomFactory.create() error with Ret: ' + r && r.BaseResponse.Ret + 'with ErrMsg: ' + r && r.BaseResponse.ErrMsg); + } + }).catch(function (e) { + // Async can only return by call callback + callback(JSON.parse(JSON.stringify(e, Object.getOwnPropertyNames(e)))); + }); + } + + function verifyUserRequest(UserName) { + var VerifyContent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + + var contactFactory = WechatyBro.glue.contactFactory; + var confFactory = WechatyBro.glue.confFactory; + + var Ticket = ''; // what's this? contactFactory.verifyUser({ - UserName - , Opcode: confFactory.VERIFYUSER_OPCODE_SENDREQUEST - , Scene: confFactory.ADDSCENE_PF_WEB - , Ticket - , VerifyContent - }) - .then(function() { // succ + UserName: UserName, + Opcode: confFactory.VERIFYUSER_OPCODE_SENDREQUEST, + Scene: confFactory.ADDSCENE_PF_WEB, + Ticket: Ticket, + VerifyContent: VerifyContent + }).then(function () { + // succ // alert('ok') - log('friendAdd(' + UserName + ', ' + VerifyContent + ') done') - }, function(t) { // fail + log('friendAdd(' + UserName + ', ' + VerifyContent + ') done'); + }, function (t) { + // fail // alert('not ok') - log('friendAdd(' + UserName + ', ' + VerifyContent + ') fail: ' + t) - }) + log('friendAdd(' + UserName + ', ' + VerifyContent + ') fail: ' + t); + }); } function verifyUserOk(UserName, Ticket) { - var contactFactory = WechatyBro.glue.contactFactory - var confFactory = WechatyBro.glue.confFactory + var contactFactory = WechatyBro.glue.contactFactory; + var confFactory = WechatyBro.glue.confFactory; contactFactory.verifyUser({ - UserName - , Opcode: confFactory.VERIFYUSER_OPCODE_VERIFYOK - , Scene: confFactory.ADDSCENE_PF_WEB - , Ticket - }).then(function() { // succ + UserName: UserName, + Opcode: confFactory.VERIFYUSER_OPCODE_VERIFYOK, + Scene: confFactory.ADDSCENE_PF_WEB, + Ticket: Ticket + }).then(function () { + // succ // alert('ok') - log('friendVerify(' + UserName + ', ' + Ticket + ') done') - }, function() { // fail + log('friendVerify(' + UserName + ', ' + Ticket + ') done'); + }, function () { + // fail // alert('err') - log('friendVerify(' + UserName + ', ' + Ticket + ') fail') - }) + log('friendVerify(' + UserName + ', ' + Ticket + ') fail'); + }); } - - - ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// - - - - port = port || 8788 + port = port || 8788; /* * WechatyBro injectio must return this object. @@ -724,95 +737,94 @@ */ var retObj = { code: 200 // 2XX ok, 4XX/5XX error. HTTP like - , message: 'any message' - , port: port - } + , message: 'any message', + port: port + }; if (typeof this.WechatyBro !== 'undefined') { - retObj.code = 201 - retObj.message = 'WechatyBro already injected?' - return retObj + retObj.code = 201; + retObj.message = 'WechatyBro already injected?'; + return retObj; } var WechatyBro = { - glue: { - // will be initialized by glueToAngular() function - } + glue: {} + // will be initialized by glueToAngular() function + // glue funcs // , getLoginStatusCode: function() { return WechatyBro.glue.loginScope.code } // , getLoginQrImgUrl: function() { return WechatyBro.glue.loginScope.qrcodeUrl } - , angularIsReady: angularIsReady + , angularIsReady: angularIsReady // variable , vars: { - loginStatus: false - , initStatus: false + loginStatus: false, + initStatus: false, - , socket: null - , eventsBuf: [] - , scanCode: null - , heartBeatTimmer: null + socket: null, + eventsBuf: [], + scanCode: null, + heartBeatTimmer: null } // funcs - , init: init // initialize WechatyBro @ Browser - , send: send // send message to wechat user - , clog: clog // log to Console - , slog: slog // log to SocketIO - , log: log // log to both Console & SocketIO - , ding: ding // simple return 'dong' - , quit: quit // quit wechat - , emit: emit // send event to server + , init: init // initialize WechatyBro @ Browser + , send: send // send message to wechat user + , clog: clog // log to Console + , slog: slog // log to SocketIO + , log: log // log to both Console & SocketIO + , ding: ding // simple return 'dong' + , quit: quit // quit wechat + , emit: emit // send event to server , logout: logout // logout current logined user - , getContact - , getUserName - , getMsgImg - , getMsgEmoticon - , getMsgVideo - , getMsgVoice - , getMsgPublicLinkImg + , getContact: getContact, + getUserName: getUserName, + getMsgImg: getMsgImg, + getMsgEmoticon: getMsgEmoticon, + getMsgVideo: getMsgVideo, + getMsgVoice: getMsgVoice, + getMsgPublicLinkImg: getMsgPublicLinkImg // for Wechaty Contact Class - , contactFindAsync - , contactRemarkAsync + , contactFindAsync: contactFindAsync, + contactRemarkAsync: contactRemarkAsync // for Wechaty Room Class - , roomCreateAsync - , roomFind - , roomAddMember - , roomDelMember - , roomModTopic + , roomCreateAsync: roomCreateAsync, + roomFind: roomFind, + roomAddMember: roomAddMember, + roomDelMember: roomDelMember, + roomModTopic: roomModTopic // for Friend Request - , verifyUserRequest - , verifyUserOk + , verifyUserRequest: verifyUserRequest, + verifyUserOk: verifyUserOk // , friendAdd // , friendVerify // test purpose - , isLogin: isLogin - , initClog: initClog - } + , isLogin: isLogin, + initClog: initClog + }; - this.WechatyBro = WechatyBro - retObj.code = 200 - retObj.message = 'WechatyBro Inject Done' + this.WechatyBro = WechatyBro; + retObj.code = 200; + retObj.message = 'WechatyBro Inject Done'; /** * Two return mode of WebDriver (should be one of them at a time) * 1. a callback. return a value by call callback with args * 2. direct return */ - var callback = arguments[arguments.length - 1] + var callback = arguments[arguments.length - 1]; if (typeof callback === 'function') { - return callback(retObj) + return callback(retObj); } - return retObj + return retObj; // retObj.code = 500 // retObj.message = 'SHOULD NOT RUN TO HERE' // return retObj - -}.apply(window, arguments)) +}).apply(window, arguments); -- GitLab