Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
.Veneno.
wechaty
提交
99ca26f9
W
wechaty
项目概览
.Veneno.
/
wechaty
与 Fork 源项目一致
Fork自
wechaty / wechaty
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
W
wechaty
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
99ca26f9
编写于
10月 01, 2016
作者:
Huan (李卓桓)
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
#32
group add/del
上级
d3d1ae34
变更
8
显示空白变更内容
内联
并排
Showing
8 changed file
with
396 addition
and
137 deletion
+396
-137
doc/webwxapp.js
doc/webwxapp.js
+5
-1
package.json
package.json
+1
-0
src/puppet-web/bridge.js
src/puppet-web/bridge.js
+34
-2
src/puppet-web/browser.js
src/puppet-web/browser.js
+19
-14
src/puppet-web/puppet-web.js
src/puppet-web/puppet-web.js
+62
-4
src/puppet-web/wechaty-bro.js
src/puppet-web/wechaty-bro.js
+136
-81
src/room.js
src/room.js
+139
-27
test/room.spec.js
test/room.spec.js
+0
-8
未找到文件。
doc/webwxapp.js
浏览文件 @
99ca26f9
...
...
@@ -3809,7 +3809,11 @@ angular.module("Services", []),
}).
error
(
function
()
{}),
i
.
promise
},
pickContacts
:
function
(
e
,
t
,
o
)
{
pickContacts
:
function
(
e
:
string
[]
,
t
:
{}
filter
,
o
:
boolean
?
)
{
for
(
var
n
,
r
,
a
,
i
=
[],
c
=
this
,
s
=
t
.
all
||
{},
l
=
0
;
l
<
e
.
length
;
l
++
)
switch
(
n
=
e
[
l
],
a
=
t
[
n
]
||
{},
...
...
package.json
浏览文件 @
99ca26f9
...
...
@@ -26,6 +26,7 @@
"testdev"
:
"cross-env LC_ALL=C WECHATY_LOG=silly ava --serial --verbose --fail-fast --timeout=3m"
,
"ava"
:
"cross-env LC_ALL=C WECHATY_LOG=verbose ava
\"
{src,test}/**/*.spec.js
\"
"
,
"start"
:
"node bin/client"
,
"dev"
:
"node t.js"
,
"demo"
:
"node example/ding-dong-bot.js"
},
"repository"
:
{
...
...
src/puppet-web/bridge.js
浏览文件 @
99ca26f9
...
...
@@ -143,6 +143,38 @@ class Bridge {
})
}
roomFind
(
filterFunction
)
{
return
this
.
proxyWechaty
(
'
roomFind
'
,
filterFunction
)
.
catch
(
e
=>
{
log
.
error
(
'
PuppetWebBridge
'
,
'
roomFind() exception: %s
'
,
e
.
message
)
throw
e
})
}
roomDelMember
(
roomId
,
contactId
)
{
return
this
.
proxyWechaty
(
'
roomDelMember
'
,
roomId
,
contactId
)
.
catch
(
e
=>
{
log
.
error
(
'
PuppetWebBridge
'
,
'
roomDelMember(%s, %s) exception: %s
'
,
roomId
,
contactId
,
e
.
message
)
throw
e
})
}
roomAddMember
(
roomId
,
contactId
)
{
return
this
.
proxyWechaty
(
'
roomAddMember
'
,
roomId
,
contactId
)
.
catch
(
e
=>
{
log
.
error
(
'
PuppetWebBridge
'
,
'
roomAddMember(%s, %s) exception: %s
'
,
roomId
,
contactId
,
e
.
message
)
throw
e
})
}
roomCreate
(
contactIdList
)
{
return
this
.
proxyWechaty
(
'
roomCreate
'
,
contactIdList
)
.
catch
(
e
=>
{
log
.
error
(
'
PuppetWebBridge
'
,
'
roomCreate(%s) exception: %s
'
,
contactIdList
,
e
.
message
)
throw
e
})
}
send
(
toUserName
,
content
)
{
return
this
.
proxyWechaty
(
'
send
'
,
toUserName
,
content
)
.
catch
(
e
=>
{
...
...
src/puppet-web/browser.js
浏览文件 @
99ca26f9
...
...
@@ -415,6 +415,11 @@ this.onResourceRequested = function(request, net) {
// log.verbose('PuppetWebBrowser', `Browser.execute() driver.getSession: %s`, util.inspect(this.driver.getSession()))
if
(
this
.
dead
())
{
return
Promise
.
reject
(
new
Error
(
'
browser dead
'
))
}
// XXX
console
.
log
(
'
#############
'
)
console
.
log
(
script
)
console
.
log
(
args
)
return
this
.
driver
.
executeScript
.
apply
(
this
.
driver
,
arguments
)
.
catch
(
e
=>
{
// this.dead(e)
...
...
src/puppet-web/puppet-web.js
浏览文件 @
99ca26f9
...
...
@@ -340,6 +340,64 @@ class PuppetWeb extends Puppet {
throw
e
})
}
roomFind
(
filterFunction
)
{
if
(
!
this
.
bridge
)
{
return
Promise
.
reject
(
new
Error
(
'
findRoom fail: no bridge(yet)!
'
))
}
return
this
.
bridge
.
roomFind
(
filterFunction
)
.
catch
(
e
=>
{
log
.
warn
(
'
PuppetWeb
'
,
'
roomFind(%s) rejected: %s
'
,
filterFunction
,
e
.
message
)
throw
e
})
}
roomDelMember
(
room
,
contact
)
{
if
(
!
this
.
bridge
)
{
return
Promise
.
reject
(
new
Error
(
'
roomDelMember fail: no bridge(yet)!
'
))
}
const
roomId
=
room
.
get
(
'
id
'
)
const
contactId
=
contact
.
get
(
'
id
'
)
return
this
.
bridge
.
roomDelMember
(
roomId
,
contactId
)
.
catch
(
e
=>
{
log
.
warn
(
'
PuppetWeb
'
,
'
roomDelMember(%s) rejected: %s
'
,
contact
,
e
.
message
)
throw
e
})
}
roomAddMember
(
room
,
contact
)
{
if
(
!
this
.
bridge
)
{
return
Promise
.
reject
(
new
Error
(
'
fail: no bridge(yet)!
'
))
}
const
roomId
=
room
.
get
(
'
id
'
)
const
contactId
=
contact
.
get
(
'
id
'
)
return
this
.
bridge
.
roomAddMember
(
roomId
,
contactId
)
.
catch
(
e
=>
{
log
.
warn
(
'
PuppetWeb
'
,
'
roomAddMember(%s) rejected: %s
'
,
contact
,
e
.
message
)
throw
e
})
}
roomCreate
(
contactList
)
{
if
(
!
this
.
bridge
)
{
return
Promise
.
reject
(
new
Error
(
'
fail: no bridge(yet)!
'
))
}
if
(
!
contactList
||
!
typeof
contactList
===
'
array
'
)
{
throw
new
Error
(
'
contactList not found
'
)
}
const
contactIdList
=
contactList
.
map
(
c
=>
c
.
get
(
'
id
'
))
return
this
.
bridge
.
roomCreate
(
contactIdList
)
.
catch
(
e
=>
{
log
.
warn
(
'
PuppetWeb
'
,
'
roomCreate(%s) rejected: %s
'
,
contact
,
e
.
message
)
throw
e
})
}
}
module
.
exports
=
PuppetWeb
.
default
=
PuppetWeb
.
PuppetWeb
=
PuppetWeb
src/puppet-web/wechaty-bro.js
浏览文件 @
99ca26f9
...
...
@@ -29,87 +29,6 @@
/*global angular*/
(
function
(
port
)
{
port
=
port
||
8788
/*
* WechatyBro injectio must return this object.
* PuppetWebBridge need this to decide if injection is successful.
*/
var
retObj
=
{
code
:
200
// 2XX ok, 4XX/5XX error. HTTP like
,
message
:
'
any message
'
,
port
:
port
}
if
(
typeof
this
.
WechatyBro
!==
'
undefined
'
)
{
retObj
.
code
=
201
retObj
.
message
=
'
WechatyBro already injected?
'
return
retObj
}
var
WechatyBro
=
{
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
// variable
,
vars
:
{
loginStatus
:
false
,
initStatus
:
false
,
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
,
logout
:
logout
// logout current logined user
,
getContact
:
getContact
,
getUserName
:
getUserName
,
getMsgImg
:
getMsgImg
// test purpose
,
isLogin
:
isLogin
,
initClog
:
initClog
}
this
.
WechatyBro
=
WechatyBro
retObj
.
code
=
200
retObj
.
message
=
'
WechatyBro Inject Succ
'
return
retObj
/**
* 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]
// if (typeof callback === 'function') {
// return callback(retObj)
// } else {
// return retObj
// }
retObj
.
code
=
500
retObj
.
message
=
'
SHOULD NOT RUN TO HERE
'
return
retObj
/////////////////////////////////////////////////////////////////////////////
function
init
()
{
if
(
!
angularIsReady
())
{
...
...
@@ -273,12 +192,14 @@
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
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
()
...
...
@@ -323,8 +244,10 @@
WechatyBro
.
glue
=
{
injector
:
injector
,
http
:
http
,
state
,
accountFactory
:
accountFactory
,
chatroomFactory
,
chatFactory
:
chatFactory
,
confFactory
:
confFactory
,
contactFactory
:
contactFactory
...
...
@@ -528,4 +451,136 @@
:
null
}
function
roomFind
(
filterFunction
)
{
var
contactFactory
=
WechatyBro
.
glue
.
contactFactory
var
match
if
(
!
filterFunction
)
{
match
=
function
()
{
return
true
}
}
else
{
match
=
eval
(
filterFunction
)
}
// log(match.toString())
return
contactFactory
.
getAllChatroomContact
()
.
filter
(
r
=>
match
(
r
.
NickName
))
.
map
(
r
=>
r
.
UserName
)
}
function
roomDelMember
(
ChatRoomName
,
UserName
)
{
const
chatroomFactory
=
WechatyBro
.
glue
.
chatroomFactory
return
chatroomFactory
.
delMember
(
ChatRoomName
,
UserName
)
}
function
roomAddMember
(
ChatRoomName
,
UserName
)
{
const
chatroomFactory
=
WechatyBro
.
glue
.
chatroomFactory
// XXX
log
(
ChatRoomName
)
log
(
UserName
)
return
chatroomFactory
.
addMember
(
ChatRoomName
,
UserName
)
}
function
roomCreate
(
UserNameList
)
{
const
UserNameListArg
=
UserNameList
.
map
(
n
=>
{
return
{
UserName
:
n
}
})
const
chatroomFactory
=
WechatyBro
.
glue
.
chatroomFactory
chatroomFactory
.
create
(
UserNameListArg
)
.
then
(
r
=>
{
if
(
r
.
BaseResponse
&&
0
==
r
.
BaseResponse
.
Ret
||
-
2013
==
e
.
BaseResponse
.
Ret
)
{
// be careful: key name is userName, not UserName! 20161001
WechatyBro
.
glue
.
state
.
go
(
'
chat
'
,
{
userName
:
r
.
ChatRoomName
})
}
})
.
catch
(
e
=>
{
// TBD
console
.
log
(
e
)
})
return
'
no callback (yet)
'
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
port
=
port
||
8788
/*
* WechatyBro injectio must return this object.
* PuppetWebBridge need this to decide if injection is successful.
*/
var
retObj
=
{
code
:
200
// 2XX ok, 4XX/5XX error. HTTP like
,
message
:
'
any message
'
,
port
:
port
}
if
(
typeof
this
.
WechatyBro
!==
'
undefined
'
)
{
retObj
.
code
=
201
retObj
.
message
=
'
WechatyBro already injected?
'
return
retObj
}
var
WechatyBro
=
{
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
// variable
,
vars
:
{
loginStatus
:
false
,
initStatus
:
false
,
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
,
logout
:
logout
// logout current logined user
,
getContact
:
getContact
,
getUserName
:
getUserName
,
getMsgImg
:
getMsgImg
,
roomFind
,
roomCreate
,
roomAddMember
,
roomDelMember
// test purpose
,
isLogin
:
isLogin
,
initClog
:
initClog
}
this
.
WechatyBro
=
WechatyBro
retObj
.
code
=
200
retObj
.
message
=
'
WechatyBro Inject Succ
'
/**
* 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
]
if
(
typeof
callback
===
'
function
'
)
{
return
callback
(
retObj
)
}
return
retObj
// retObj.code = 500
// retObj.message = 'SHOULD NOT RUN TO HERE'
// return retObj
}.
apply
(
window
,
arguments
))
src/room.js
浏览文件 @
99ca26f9
...
...
@@ -22,15 +22,25 @@ class Room {
toString
()
{
return
this
.
id
}
toStringEx
()
{
return
`Room(
${
this
.
obj
.
name
}
[
${
this
.
id
}
])`
}
isReady
()
{
return
this
.
obj
.
members
&&
this
.
obj
.
members
.
length
}
refresh
()
{
this
.
obj
=
{}
return
this
.
ready
()
}
ready
(
contactGetter
)
{
log
.
silly
(
'
Room
'
,
'
ready(%s)
'
,
contactGetter
?
contactGetter
.
constructor
.
name
:
''
)
if
(
!
this
.
id
)
{
log
.
warn
(
'
Room
'
,
'
ready() on a un-inited Room
'
)
return
Promise
.
resolve
(
this
)
}
else
if
(
this
.
obj
.
members
&&
this
.
obj
.
members
.
length
)
{
const
e
=
new
Error
(
'
ready() on a un-inited Room
'
)
log
.
warn
(
'
Room
'
,
e
.
message
)
return
Promise
.
reject
(
e
)
}
else
if
(
this
.
isReady
())
{
return
Promise
.
resolve
(
this
)
}
else
if
(
this
.
obj
.
id
)
{
log
.
warn
(
'
Room
'
,
'
ready()
ready
but members list empty in room %s. reloading
'
,
this
.
obj
.
name
)
log
.
warn
(
'
Room
'
,
'
ready()
has obj.id
but members list empty in room %s. reloading
'
,
this
.
obj
.
name
)
}
contactGetter
=
contactGetter
||
Room
.
puppet
.
getContact
.
bind
(
Room
.
puppet
)
...
...
@@ -50,7 +60,10 @@ class Room {
get
(
prop
)
{
return
this
.
obj
[
prop
]
}
parse
(
rawObj
)
{
return
!
rawObj
?
{}
:
{
if
(
!
rawObj
)
{
return
{}
}
return
{
id
:
rawObj
.
UserName
,
encryId
:
rawObj
.
EncryChatRoomId
// ???
,
name
:
rawObj
.
NickName
...
...
@@ -79,33 +92,132 @@ class Room {
Object
.
keys
(
this
.
obj
).
forEach
(
k
=>
console
.
error
(
`
${
k
}
:
${
this
.
obj
[
k
]}
`
))
}
static
find
()
{
return
new
Room
(
'
-1
'
)
del
(
contact
)
{
log
.
verbose
(
'
Room
'
,
'
del(%s) from %s
'
,
contact
,
this
)
if
(
!
contact
)
{
throw
new
Error
(
'
contact not found
'
)
}
return
Room
.
puppet
.
roomDelMember
(
this
,
contact
)
}
static
findAll
()
{
return
[
new
Room
(
'
-2
'
)
,
new
Room
(
'
-3
'
)
]
quit
()
{
throw
new
Error
(
'
wx web not implement yet
'
)
// WechatyBro.glue.chatroomFactory.quit("@@1c066dfcab4ef467cd0a8da8bec90880035aa46526c44f504a83172a9086a5f7"
}
}
Room
.
init
=
function
()
{
Room
.
pool
=
{}
}
Room
.
init
()
Room
.
load
=
function
(
id
)
{
add
(
contact
)
{
log
.
verbose
(
'
Room
'
,
'
add(%s) to %s
'
,
contact
,
this
)
if
(
!
contact
)
{
throw
new
Error
(
'
contact not found
'
)
}
return
Room
.
puppet
.
roomAddMember
(
this
,
contact
)
}
static
create
(
contactList
)
{
log
.
verbose
(
'
Room
'
,
'
create(%s)
'
,
contactList
.
join
(
'
,
'
))
if
(
!
contactList
||
!
typeof
contactList
===
'
array
'
)
{
throw
new
Error
(
'
contactList not found
'
)
}
return
Room
.
puppet
.
roomCreate
(
contactList
)
}
// private
static
_find
({
name
})
{
log
.
silly
(
'
Room
'
,
'
_find(%s)
'
,
name
)
if
(
!
name
)
{
throw
new
Error
(
'
name not found
'
)
}
let
filterFunction
if
(
name
instanceof
RegExp
)
{
filterFunction
=
`c =>
${
name
.
toString
()}
.test(c)`
}
else
if
(
typeof
name
===
'
string
'
)
{
filterFunction
=
`c => c ===
${
name
}
`
}
else
{
throw
new
Error
(
'
unsupport name type
'
)
}
return
Room
.
puppet
.
roomFind
(
filterFunction
)
.
then
(
idList
=>
{
return
idList
})
.
catch
(
e
=>
{
log
.
error
(
'
Room
'
,
'
_find() rejected: %s
'
,
e
.
message
)
throw
e
})
}
static
find
({
name
})
{
log
.
verbose
(
'
Room
'
,
'
find(%s)
'
,
name
)
return
Room
.
_find
({
name
})
.
then
(
idList
=>
{
if
(
!
idList
||
!
Array
.
isArray
(
idList
)){
throw
new
Error
(
'
_find return error
'
)
}
if
(
idList
.
length
<
1
)
{
return
null
}
const
id
=
idList
[
0
]
return
Room
.
load
(
id
)
})
.
catch
(
e
=>
{
log
.
error
(
'
Room
'
,
'
find() rejected: %s
'
,
e
.
message
)
return
[]
// fail safe
})
}
static
findAll
({
name
})
{
log
.
verbose
(
'
Room
'
,
'
findAll(%s)
'
,
name
)
return
Room
.
_find
({
name
})
.
then
(
idList
=>
{
// console.log(idList)
if
(
!
idList
||
!
Array
.
isArray
(
idList
)){
throw
new
Error
(
'
_find return error
'
)
}
if
(
idList
.
length
<
1
)
{
return
[]
}
return
idList
.
map
(
i
=>
Room
.
load
(
i
))
})
.
catch
(
e
=>
{
log
.
error
(
'
Room
'
,
'
findAll() rejected: %s
'
,
e
.
message
)
throw
e
})
}
static
init
()
{
Room
.
pool
=
{}
}
static
load
(
id
)
{
if
(
!
id
)
{
return
null
}
if
(
id
in
Room
.
pool
)
{
return
Room
.
pool
[
id
]
}
return
Room
.
pool
[
id
]
=
new
Room
(
id
)
}
Room
.
attach
=
function
(
puppet
)
{
}
static
attach
(
puppet
)
{
// if (!puppet) {
// throw new Error('Room.attach got no puppet to attach!')
// }
Room
.
puppet
=
puppet
}
}
Room
.
init
()
module
.
exports
=
Room
test/room.spec.js
浏览文件 @
99ca26f9
...
...
@@ -9,14 +9,6 @@ import {
Room
.
attach
(
new
Puppet
())
// const test = require('tape')
// const Message = require('../src/message')
// const Room = require('../src/room')
// const Contact = require('../src/contact')
// const Puppet = require('../src/puppet')
// const log = require('../src/brolog-env')
test
(
'
Room smoke testing
'
,
async
t
=>
{
const
UserName
=
'
@0bb3e4dd746fdbd4a80546aef66f4085
'
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录