Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
.Veneno.
wechaty
提交
1c58f9d3
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,发现更多精彩内容 >>
提交
1c58f9d3
编写于
6月 14, 2018
作者:
ruiruibupt
浏览文件
操作
浏览文件
下载
差异文件
add bug-compatible for dirty fix
上级
244d9913
e4a0fe90
变更
13
隐藏空白更改
内联
并排
Showing
13 changed file
with
194 addition
and
89 deletion
+194
-89
examples/gist-bot/on-message.ts
examples/gist-bot/on-message.ts
+1
-1
examples/room-bot.ts
examples/room-bot.ts
+8
-3
package.json
package.json
+1
-1
src/contact.ts
src/contact.ts
+2
-2
src/message.ts
src/message.ts
+18
-8
src/puppet-mock/puppet-mock.ts
src/puppet-mock/puppet-mock.ts
+0
-10
src/puppet-padchat/padchat-manager.ts
src/puppet-padchat/padchat-manager.ts
+34
-15
src/puppet-padchat/padchat-rpc.ts
src/puppet-padchat/padchat-rpc.ts
+3
-1
src/puppet-padchat/puppet-padchat.ts
src/puppet-padchat/puppet-padchat.ts
+74
-20
src/puppet/index.ts
src/puppet/index.ts
+0
-1
src/puppet/puppet.ts
src/puppet/puppet.ts
+47
-19
src/puppet/schemas/puppet.ts
src/puppet/schemas/puppet.ts
+5
-7
src/room.ts
src/room.ts
+1
-1
未找到文件。
examples/gist-bot/on-message.ts
浏览文件 @
1c58f9d3
...
...
@@ -56,7 +56,7 @@ export async function onMessage(this: Wechaty, message: Message): Promise<void>
const
myRoom
=
await
this
.
Room
.
find
({
topic
:
'
ding
'
})
if
(
!
myRoom
)
return
if
(
myRoom
.
has
(
sender
))
{
if
(
await
myRoom
.
has
(
sender
))
{
await
sender
.
say
(
'
no need to ding again, because you are already in ding room
'
)
return
}
...
...
examples/room-bot.ts
浏览文件 @
1c58f9d3
...
...
@@ -34,7 +34,7 @@
* vvvvvvvvv
* vvvvvvvvv
*/
const
HELPER_CONTACT_NAME
=
'
Huan LI
'
const
HELPER_CONTACT_NAME
=
'
李佳芮
'
/**
* ^^^^^^^^^
...
...
@@ -162,6 +162,11 @@ bot
* Global Event: message
*/
.
on
(
'
message
'
,
async
function
(
msg
)
{
if
(
msg
.
age
()
>
3
*
60
)
{
log
.
info
(
'
Bot
'
,
'
on(message) skip age(%d) > 3 * 60 seconds: %s
'
,
msg
.
age
(),
msg
)
return
}
const
room
=
msg
.
room
()
const
from
=
msg
.
from
()
const
text
=
msg
.
text
()
...
...
@@ -210,9 +215,9 @@ bot
/**
* room found
*/
log
.
info
(
'
Bot
'
,
'
onMessage: got dingRoom: %s
'
,
dingRoom
.
topic
())
log
.
info
(
'
Bot
'
,
'
onMessage: got dingRoom: %s
'
,
await
dingRoom
.
topic
())
if
(
dingRoom
.
has
(
from
))
{
if
(
await
dingRoom
.
has
(
from
))
{
/**
* speaker is already in room
*/
...
...
package.json
浏览文件 @
1c58f9d3
{
"name"
:
"wechaty"
,
"version"
:
"0.15.1
69
"
,
"version"
:
"0.15.1
70
"
,
"description"
:
"Wechat for Bot(Personal Account)"
,
"main"
:
"dist/src/index.js"
,
"typings"
:
"dist/src/index.d.ts"
,
...
...
src/contact.ts
浏览文件 @
1c58f9d3
...
...
@@ -72,8 +72,8 @@ export class Contact extends Accessory implements Sayable {
* About the Generic: https://stackoverflow.com/q/43003970/1123955
*/
public
static
load
<
T
extends
typeof
Contact
>
(
this
:
T
,
id
:
string
,
this
:
T
,
id
:
string
,
):
T
[
'
prototype
'
]
{
if
(
!
this
.
pool
)
{
log
.
verbose
(
'
Contact
'
,
'
load(%s) init pool
'
,
id
)
...
...
src/message.ts
浏览文件 @
1c58f9d3
...
...
@@ -290,9 +290,11 @@ export class Message extends Accessory implements Sayable {
textOrContactOrFile
:
string
|
Contact
|
FileBox
,
mention
?
:
Contact
|
Contact
[],
):
Promise
<
void
>
{
log
.
verbose
(
'
Message
'
,
'
say(%s
,
%s)
'
,
log
.
verbose
(
'
Message
'
,
'
say(%s%s)
'
,
textOrContactOrFile
.
toString
(),
mention
,
mention
?
'
,
'
+
mention
:
''
,
)
// const user = this.puppet.userSelf()
...
...
@@ -416,8 +418,8 @@ export class Message extends Accessory implements Sayable {
* const contactList = message.mentioned()
* console.log(contactList)
*/
public
async
mention
ed
():
Promise
<
Contact
[]
>
{
log
.
verbose
(
'
Message
'
,
'
mention
ed
()
'
)
public
async
mention
():
Promise
<
Contact
[]
>
{
log
.
verbose
(
'
Message
'
,
'
mention()
'
)
const
room
=
this
.
room
()
if
(
this
.
type
()
!==
MessageType
.
Text
||
!
room
)
{
...
...
@@ -432,7 +434,7 @@ export class Message extends Accessory implements Sayable {
if
(
atList
.
length
===
0
)
return
[]
// Using `filter(e => e.indexOf('@') > -1)` to filter the string without `@`
const
rawMention
ed
List
=
atList
const
rawMentionList
=
atList
.
filter
(
str
=>
str
.
includes
(
'
@
'
))
.
map
(
str
=>
multipleAt
(
str
))
...
...
@@ -455,11 +457,11 @@ export class Message extends Accessory implements Sayable {
let
mentionNameList
:
string
[]
=
[]
// Flatten Array
// see http://stackoverflow.com/a/10865042/1123955
mentionNameList
=
mentionNameList
.
concat
.
apply
([],
rawMention
ed
List
)
mentionNameList
=
mentionNameList
.
concat
.
apply
([],
rawMentionList
)
// filter blank string
mentionNameList
=
mentionNameList
.
filter
(
s
=>
!!
s
)
log
.
verbose
(
'
Message
'
,
'
mention
ed
() text = "%s", mentionNameList = "%s"
'
,
log
.
verbose
(
'
Message
'
,
'
mention() text = "%s", mentionNameList = "%s"
'
,
this
.
text
(),
JSON
.
stringify
(
mentionNameList
),
)
...
...
@@ -474,11 +476,19 @@ export class Message extends Accessory implements Sayable {
contactList
=
contactList
.
concat
.
apply
([],
contactListNested
)
if
(
contactList
.
length
===
0
)
{
log
.
warn
(
'
Message
'
,
`message.mentioned
() can not found member using room.member() from mentionList, metion string:
${
JSON
.
stringify
(
mentionNameList
)}
`
)
log
.
silly
(
'
Message
'
,
`message.mention
() can not found member using room.member() from mentionList, metion string:
${
JSON
.
stringify
(
mentionNameList
)}
`
)
}
return
contactList
}
/**
* @deprecated: use mention() instead
*/
public
async
mentioned
():
Promise
<
Contact
[]
>
{
log
.
warn
(
'
Message
'
,
'
mentioned() DEPRECATED. use mention() instead.
'
)
return
this
.
mention
()
}
/**
* @private
*/
...
...
src/puppet-mock/puppet-mock.ts
浏览文件 @
1c58f9d3
...
...
@@ -25,7 +25,6 @@ import {
import
{
MessagePayload
,
// ContactQueryFilter,
ContactGender
,
ContactType
,
ContactPayload
,
...
...
@@ -33,9 +32,6 @@ import {
FriendshipPayload
,
RoomPayload
,
RoomMemberPayload
,
// RoomQueryFilter,
WATCHDOG_TIMEOUT
,
}
from
'
../puppet/
'
import
{
Puppet
,
...
...
@@ -70,12 +66,6 @@ export interface MockRoomRawPayload {
}
export
class
PuppetMock
extends
Puppet
{
/**
* Watchdog Timeout in Seconds
* if set this value, the default timeout value will be overwrited,
* and the parent Puppet class will use it to init watchdog
*/
protected
[
WATCHDOG_TIMEOUT
]
=
30
constructor
(
public
options
:
PuppetOptions
,
...
...
src/puppet-padchat/padchat-manager.ts
浏览文件 @
1c58f9d3
...
...
@@ -668,10 +668,10 @@ export class PadchatManager extends PadchatRpc {
return
roomIdList
}
public
purgeRoomMemberIdList
(
public
roomMemberRawPayloadDirty
(
roomId
:
string
,
):
void
{
log
.
verbose
(
'
PuppetPadchatManager
'
,
'
purgeRoomMemberIdList
(%d)
'
,
roomId
)
log
.
verbose
(
'
PuppetPadchatManager
'
,
'
roomMemberRawPayloadDirty
(%d)
'
,
roomId
)
if
(
!
this
.
cacheRoomMemberRawPayload
)
{
throw
new
Error
(
'
cache not inited
'
)
}
...
...
@@ -680,16 +680,15 @@ export class PadchatManager extends PadchatRpc {
public
async
getRoomMemberIdList
(
roomId
:
string
,
noCache
=
false
,
dirty
=
false
,
):
Promise
<
string
[]
>
{
log
.
verbose
(
'
PuppetPadchatManager
'
,
'
getRoomMemberIdList(%d)
'
,
roomId
)
if
(
!
this
.
cacheRoomMemberRawPayload
)
{
throw
new
Error
(
'
cache not inited
'
)
}
if
(
noCache
)
{
log
.
verbose
(
'
PuppetPadchatManager
'
,
'
getRoomMemberIdList(%d) cache PURGE
'
,
roomId
)
this
.
cacheRoomMemberRawPayload
.
delete
(
roomId
)
if
(
dirty
)
{
this
.
roomMemberRawPayloadDirty
(
roomId
)
}
const
memberRawPayloadDict
=
this
.
cacheRoomMemberRawPayload
.
get
(
roomId
)
...
...
@@ -702,11 +701,22 @@ export class PadchatManager extends PadchatRpc {
const
memberIdList
=
Object
.
keys
(
memberRawPayloadDict
)
// console.log('memberRawPayloadDict:', memberRawPayloadDict)
log
.
verbose
(
'
PuppetPadchatManager
'
,
'
getRoomMemberIdList(%d) length=%d
'
,
roomId
,
memberIdList
.
length
)
return
memberIdList
}
public
async
roomMemberRawPayload
(
roomId
:
string
,
contactId
:
string
):
Promise
<
PadchatRoomMemberPayload
>
{
public
roomRawPayloadDirty
(
roomId
:
string
,
):
void
{
log
.
verbose
(
'
PuppetPadchatManager
'
,
'
roomRawPayloadDirty(%d)
'
,
roomId
)
if
(
!
this
.
cacheRoomRawPayload
)
{
throw
new
Error
(
'
cache not inited
'
)
}
this
.
cacheRoomRawPayload
.
delete
(
roomId
)
}
public
async
roomMemberRawPayload
(
roomId
:
string
):
Promise
<
{
[
contactId
:
string
]:
PadchatRoomMemberPayload
}
>
{
log
.
verbose
(
'
PuppetPadchatManager
'
,
'
roomMemberRawPayload(%s)
'
,
roomId
)
if
(
!
this
.
cacheRoomMemberRawPayload
)
{
...
...
@@ -720,12 +730,12 @@ export class PadchatManager extends PadchatRpc {
throw
new
Error
(
'
roomId not found:
'
+
roomId
)
}
const
memberRawPayload
=
memberRawPayloadDict
[
contactId
]
if
(
!
memberRawPayload
)
{
throw
new
Error
(
'
contactId not found in room member dict
'
)
}
//
const memberRawPayload = memberRawPayloadDict[contactId]
//
if (!memberRawPayload) {
//
throw new Error('contactId not found in room member dict')
//
}
return
memberRawPayload
return
memberRawPayload
Dict
}
public
async
syncRoomMember
(
...
...
@@ -737,7 +747,7 @@ export class PadchatManager extends PadchatRpc {
const
memberListPayload
=
await
this
.
WXGetChatRoomMember
(
roomId
)
if
(
!
memberListPayload
||
!
(
'
user_name
'
in
memberListPayload
))
{
// check user_name too becasue the server might return {}
console
.
log
(
'
memberListPayload
'
,
memberListPayload
)
//
console.log('memberListPayload', memberListPayload)
throw
new
Error
(
'
no memberListPayload
'
)
}
...
...
@@ -782,8 +792,7 @@ export class PadchatManager extends PadchatRpc {
// console.log('syncContactList:', syncContactList)
if
(
!
Array
.
isArray
(
syncContactList
)
||
syncContactList
.
length
<=
0
)
{
console
.
log
(
'
syncContactList:
'
,
syncContactList
)
log
.
error
(
'
PuppetPadchatManager
'
,
'
syncContactsAndRooms() cannot get array result!
'
)
log
.
warn
(
'
PuppetPadchatManager
'
,
'
syncContactsAndRooms() cannot get array result: %s
'
,
JSON
.
stringify
(
syncContactList
))
continue
}
...
...
@@ -867,6 +876,16 @@ export class PadchatManager extends PadchatRpc {
}
}
public
contactRawPayloadDirty
(
contactId
:
string
,
):
void
{
log
.
verbose
(
'
PuppetPadchatManager
'
,
'
contactRawPayloadDirty(%d)
'
,
contactId
)
if
(
!
this
.
cacheContactRawPayload
)
{
throw
new
Error
(
'
cache not inited
'
)
}
this
.
cacheContactRawPayload
.
delete
(
contactId
)
}
public
async
contactRawPayload
(
contactId
:
string
):
Promise
<
PadchatContactPayload
>
{
log
.
silly
(
'
PuppetPadchatManager
'
,
'
contactRawPayload(%s)
'
,
contactId
)
...
...
src/puppet-padchat/padchat-rpc.ts
浏览文件 @
1c58f9d3
...
...
@@ -985,7 +985,9 @@ export class PadchatRpc extends EventEmitter {
}
// {"message":"\n\u0010Everything is OK","status":0,"user_name":"\n\u00135907139882@chatroom"}
public
async
WXCreateChatRoom
(
userList
:
string
[]):
Promise
<
any
>
{
// BUG compitable: "\n\u00135907139882@chatroom" -> "5907139882@chatroom"
// https://github.com/lijiarui/wechaty-puppet-padchat/issues/62
public
async
WXCreateChatRoom
(
userList
:
string
[]):
Promise
<
string
>
{
const
result
=
await
this
.
rpcCall
(
'
WXCreateChatRoom
'
,
JSON
.
stringify
(
userList
))
log
.
silly
(
'
PadchatRpc
'
,
'
WXCreateChatRoom(userList.length=%d) = "%s"
'
,
userList
.
length
,
JSON
.
stringify
(
result
))
if
(
!
result
||
result
.
status
!==
0
)
{
...
...
src/puppet-padchat/puppet-padchat.ts
浏览文件 @
1c58f9d3
...
...
@@ -46,8 +46,6 @@ import {
FriendshipPayload
,
FriendshipPayloadReceive
,
WATCHDOG_TIMEOUT
,
}
from
'
../puppet/
'
import
{
...
...
@@ -102,9 +100,6 @@ import {
export
class
PuppetPadchat
extends
Puppet
{
// in seconds, 4 minute for padchat
protected
[
WATCHDOG_TIMEOUT
]
=
4
*
60
// private readonly cachePadchatContactPayload : LRU.Cache<string, PadchatContactRawPayload>
// private readonly cachePadchatFriendshipPayload : LRU.Cache<string, PadchatMessagePayload>
private
readonly
cachePadchatMessagePayload
:
LRU
.
Cache
<
string
,
PadchatMessagePayload
>
...
...
@@ -115,7 +110,10 @@ export class PuppetPadchat extends Puppet {
constructor
(
public
options
:
PuppetOptions
,
)
{
super
(
options
)
super
({
timeout
:
60
*
4
,
// Default set timeout to 4 minutes
...
options
,
})
const
lruOptions
:
LRU
.
Options
=
{
max
:
1000
,
...
...
@@ -141,7 +139,7 @@ export class PuppetPadchat extends Puppet {
}
public
startWatchdog
():
void
{
log
.
verbose
(
'
PuppetPadchat
'
,
'
initWatchdogForPuppet
()
'
)
log
.
verbose
(
'
PuppetPadchat
'
,
'
startWatchdog
()
'
)
if
(
!
this
.
padchatManager
)
{
throw
new
Error
(
'
no bridge
'
)
...
...
@@ -264,7 +262,10 @@ export class PuppetPadchat extends Puppet {
* 1. Sometimes will get duplicated same messages from rpc, drop the same message from here.
*/
if
(
this
.
cachePadchatMessagePayload
.
has
(
rawPayload
.
msg_id
))
{
log
.
warn
(
'
PuppetPadchat
'
,
'
onPadchatMessage({id=%s, type=%s(%s)}) duplicate message
'
)
log
.
warn
(
'
PuppetPadchat
'
,
'
onPadchatMessage(id=%s) duplicate message: %s
'
,
rawPayload
.
msg_id
,
JSON
.
stringify
(
rawPayload
).
substr
(
0
,
500
),
)
return
}
...
...
@@ -335,6 +336,7 @@ export class PuppetPadchat extends Puppet {
const
inviteeNameList
=
roomJoinEvent
.
inviteeNameList
const
inviterName
=
roomJoinEvent
.
inviterName
const
roomId
=
roomJoinEvent
.
roomId
log
.
silly
(
'
PuppetPadchat
'
,
'
onPadchatMessageRoomEventJoin() roomJoinEvent="%s"
'
,
JSON
.
stringify
(
roomJoinEvent
))
const
inviteeIdList
=
await
Misc
.
retry
(
async
(
retry
,
attempt
)
=>
{
log
.
verbose
(
'
PuppetPadchat
'
,
'
onPadchatMessageRoomEvent({id=%s}) roomJoin retry(attempt=%d)
'
,
attempt
)
...
...
@@ -356,9 +358,9 @@ export class PuppetPadchat extends Puppet {
}
/**
*
PURGE Cache and Reload
*
Dirty Cache
*/
this
.
padchatManager
.
purgeRoomMemberIdList
(
roomId
)
this
.
roomMemberPayloadDirty
(
roomId
)
return
retry
(
new
Error
(
'
roomMemberSearch() not found
'
))
...
...
@@ -393,6 +395,7 @@ export class PuppetPadchat extends Puppet {
const
leaverNameList
=
roomLeaveEvent
.
leaverNameList
const
removerName
=
roomLeaveEvent
.
removerName
const
roomId
=
roomLeaveEvent
.
roomId
log
.
silly
(
'
PuppetPadchat
'
,
'
onPadchatMessageRoomEventLeave() roomLeaveEvent="%s"
'
,
JSON
.
stringify
(
roomLeaveEvent
))
const
leaverIdList
=
flatten
<
string
>
(
await
Promise
.
all
(
...
...
@@ -414,10 +417,9 @@ export class PuppetPadchat extends Puppet {
}
/**
*
Update L1 Cache & PURGE L2
Cache
*
Dirty
Cache
*/
this
.
cacheRoomMemberPayload
.
del
(
roomId
)
this
.
padchatManager
.
purgeRoomMemberIdList
(
roomId
)
this
.
roomMemberPayloadDirty
(
roomId
)
this
.
emit
(
'
room-leave
'
,
roomId
,
leaverIdList
,
removerId
)
}
...
...
@@ -435,6 +437,7 @@ export class PuppetPadchat extends Puppet {
const
changerName
=
roomTopicEvent
.
changerName
const
newTopic
=
roomTopicEvent
.
topic
const
roomId
=
roomTopicEvent
.
roomId
log
.
silly
(
'
PuppetPadchat
'
,
'
onPadchatMessageRoomEventTopic() roomTopicEvent="%s"
'
,
JSON
.
stringify
(
roomTopicEvent
))
const
roomPayload
=
await
this
.
roomPayload
(
roomId
)
const
oldTopic
=
roomPayload
.
topic
...
...
@@ -456,7 +459,8 @@ export class PuppetPadchat extends Puppet {
const
updateRoomPayload
=
await
this
.
roomPayload
(
roomId
)
updateRoomPayload
.
topic
=
newTopic
this
.
cacheRoomPayload
.
set
(
roomId
,
updateRoomPayload
)
this
.
padchatManager
.
purgeRoomMemberIdList
(
roomId
)
this
.
roomPayloadDirty
(
roomId
)
this
.
emit
(
'
room-topic
'
,
roomId
,
newTopic
,
oldTopic
,
changerId
)
}
...
...
@@ -622,6 +626,16 @@ export class PuppetPadchat extends Puppet {
return
qrcode
}
public
async
contactPayloadDirty
(
contactId
:
string
):
Promise
<
void
>
{
log
.
verbose
(
'
PuppetPadchat
'
,
'
contactPayloadDirty(%s)
'
,
contactId
)
if
(
this
.
padchatManager
)
{
this
.
padchatManager
.
contactRawPayloadDirty
(
contactId
)
}
super
.
contactPayloadDirty
(
contactId
)
}
public
async
contactRawPayload
(
contactId
:
string
):
Promise
<
PadchatContactPayload
>
{
log
.
silly
(
'
PuppetPadchat
'
,
'
contactRawPayload(%s)
'
,
contactId
)
...
...
@@ -701,6 +715,16 @@ export class PuppetPadchat extends Puppet {
return
file
}
public
async
messagePayloadDirty
(
messageId
:
string
):
Promise
<
void
>
{
log
.
verbose
(
'
PuppetPadchat
'
,
'
messagePayloadDirty(%s)
'
,
messageId
)
if
(
this
.
padchatManager
)
{
// this.padchatManager.messageRawPayloadDirty(messageId)
}
super
.
messagePayloadDirty
(
messageId
)
}
public
async
messageRawPayload
(
id
:
string
):
Promise
<
PadchatMessagePayload
>
{
// throw Error('should not call messageRawPayload: ' + id)
...
...
@@ -839,6 +863,16 @@ export class PuppetPadchat extends Puppet {
* Room
*
*/
public
async
roomMemberPayloadDirty
(
roomId
:
string
)
{
log
.
silly
(
'
PuppetPadchat
'
,
'
roomMemberRawPayloadDirty(%s)
'
,
roomId
)
if
(
this
.
padchatManager
)
{
await
this
.
padchatManager
.
roomMemberRawPayloadDirty
(
roomId
)
}
super
.
roomMemberPayloadDirty
(
roomId
)
}
public
async
roomMemberRawPayload
(
roomId
:
string
,
contactId
:
string
,
...
...
@@ -849,8 +883,9 @@ export class PuppetPadchat extends Puppet {
throw
new
Error
(
'
no bridge
'
)
}
const
rawPayload
=
await
this
.
padchatManager
.
roomMemberRawPayload
(
roomId
,
contactId
)
return
rawPayload
const
memberDictRawPayload
=
await
this
.
padchatManager
.
roomMemberRawPayload
(
roomId
)
return
memberDictRawPayload
[
contactId
]
}
public
async
roomMemberRawPayloadParser
(
...
...
@@ -867,6 +902,16 @@ export class PuppetPadchat extends Puppet {
return
payload
}
public
async
roomPayloadDirty
(
roomId
:
string
):
Promise
<
void
>
{
log
.
verbose
(
'
PuppetPadchat
'
,
'
roomPayloadDirty(%s)
'
,
roomId
)
if
(
this
.
padchatManager
)
{
this
.
padchatManager
.
roomRawPayloadDirty
(
roomId
)
}
super
.
roomPayloadDirty
(
roomId
)
}
public
async
roomRawPayload
(
roomId
:
string
,
):
Promise
<
PadchatRoomPayload
>
{
...
...
@@ -883,11 +928,7 @@ export class PuppetPadchat extends Puppet {
public
async
roomRawPayloadParser
(
rawPayload
:
PadchatRoomPayload
):
Promise
<
RoomPayload
>
{
log
.
verbose
(
'
PuppetPadchat
'
,
'
roomRawPayloadParser(rawPayload.user_name="%s")
'
,
rawPayload
.
user_name
)
// const memberIdList = await this.bridge.getRoomMemberIdList()
// WXGetChatRoomMember(rawPayload.user_name)
const
payload
:
RoomPayload
=
roomRawPayloadParser
(
rawPayload
)
return
payload
}
...
...
@@ -929,6 +970,7 @@ export class PuppetPadchat extends Puppet {
// Should check whether user is in the room. WXDeleteChatRoomMember won't check if user in the room automatically
await
this
.
padchatManager
.
WXDeleteChatRoomMember
(
roomId
,
contactId
)
await
this
.
roomMemberPayloadDirty
(
roomId
)
}
public
async
roomQrcode
(
roomId
:
string
):
Promise
<
string
>
{
...
...
@@ -975,6 +1017,7 @@ export class PuppetPadchat extends Puppet {
log
.
verbose
(
'
PuppetPadchat
'
,
'
roomAdd(%s, %s) try to Invite
'
,
roomId
,
contactId
)
await
this
.
padchatManager
.
WXInviteChatRoomMember
(
roomId
,
contactId
)
}
await
this
.
roomMemberPayloadDirty
(
roomId
)
}
public
async
roomTopic
(
roomId
:
string
)
:
Promise
<
string
>
...
...
@@ -996,6 +1039,7 @@ export class PuppetPadchat extends Puppet {
}
await
this
.
padchatManager
.
WXSetChatroomName
(
roomId
,
topic
)
await
this
.
roomPayloadDirty
(
roomId
)
return
}
...
...
@@ -1125,6 +1169,16 @@ export class PuppetPadchat extends Puppet {
return
payload
}
public
async
friendshipPayloadDirty
(
friendshipId
:
string
):
Promise
<
void
>
{
log
.
verbose
(
'
PuppetPadchat
'
,
'
friendshipPayloadDirty(%s)
'
,
friendshipId
)
if
(
this
.
padchatManager
)
{
// this.padchatManager.friendshipRawPayloadDirty(friendshipId)
}
this
.
friendshipPayloadDirty
(
friendshipId
)
}
public
async
friendshipRawPayload
(
friendshipId
:
string
):
Promise
<
PadchatMessagePayload
>
{
log
.
verbose
(
'
PuppetPadchat
'
,
'
friendshipRawPayload(%s)
'
,
friendshipId
)
...
...
src/puppet/index.ts
浏览文件 @
1c58f9d3
...
...
@@ -10,6 +10,5 @@ export {
}
from
'
./puppet
'
export
{
WATCHDOG_TIMEOUT
,
YOU
,
}
from
'
./schemas/puppet
'
src/puppet/puppet.ts
浏览文件 @
1c58f9d3
...
...
@@ -68,7 +68,6 @@ import {
PuppetOptions
,
Receiver
,
WATCHDOG_TIMEOUT
,
YOU
,
}
from
'
./schemas/puppet
'
...
...
@@ -94,13 +93,6 @@ export abstract class Puppet extends EventEmitter implements Sayable {
protected
readonly
watchdog
:
Watchdog
protected
readonly
counter
:
number
/**
* Watchdog Timeout in Seconds
* if set this value, the default timeout value will be overwrited,
* and the parent Puppet class will use it to init watchdog
*/
protected
[
WATCHDOG_TIMEOUT
]?:
number
// Watchdog timeout, in seconds
/**
* childPkg stores the `package.json` that the NPM module who extends the `Puppet`
*/
...
...
@@ -122,13 +114,16 @@ export abstract class Puppet extends EventEmitter implements Sayable {
public
options
:
PuppetOptions
,
)
{
super
()
log
.
verbose
(
'
Puppet
'
,
'
constructor(%s)
'
,
JSON
.
stringify
(
options
))
this
.
counter
=
PUPPET_COUNTER
++
this
.
state
=
new
StateSwitch
(
this
.
constructor
.
name
,
log
)
const
timeout
=
this
[
WATCHDOG_TIMEOUT
]
||
DEFAULT_WATCHDOG_TIMEOUT
this
.
watchdog
=
new
Watchdog
(
1000
*
timeout
,
'
Puppet
'
)
this
.
options
.
timeout
=
this
.
options
.
timeout
||
DEFAULT_WATCHDOG_TIMEOUT
log
.
verbose
(
'
Puppet
'
,
'
constructor() watchdog timeout set to %d seconds
'
,
this
.
options
.
timeout
)
this
.
watchdog
=
new
Watchdog
(
1000
*
this
.
options
.
timeout
,
'
Puppet
'
)
const
lruOptions
:
LRU
.
Options
=
{
max
:
10000
,
...
...
@@ -377,6 +372,11 @@ export abstract class Puppet extends EventEmitter implements Sayable {
public
abstract
async
contactRawPayload
(
contactId
:
string
)
:
Promise
<
any
>
public
abstract
async
contactRawPayloadParser
(
rawPayload
:
any
)
:
Promise
<
ContactPayload
>
protected
async
contactPayloadDirty
(
contactId
:
string
):
Promise
<
void
>
{
log
.
verbose
(
'
Puppet
'
,
'
contactPayloadDirty(%s)
'
,
contactId
)
this
.
cacheContactPayload
.
del
(
contactId
)
}
public
async
contactSearch
(
query
?
:
ContactQueryFilter
,
searchIdList
?
:
string
[],
...
...
@@ -512,8 +512,9 @@ export abstract class Puppet extends EventEmitter implements Sayable {
*/
public
abstract
async
friendshipVerify
(
contactId
:
string
,
hello
?:
string
)
:
Promise
<
void
>
public
abstract
async
friendshipAccept
(
friendshipId
:
string
)
:
Promise
<
void
>
public
abstract
async
friendshipRawPayload
(
friendshipId
:
string
)
:
Promise
<
any
>
public
abstract
async
friendshipRawPayloadParser
(
rawPayload
:
any
)
:
Promise
<
FriendshipPayload
>
public
abstract
async
friendshipRawPayload
(
friendshipId
:
string
)
:
Promise
<
any
>
public
abstract
async
friendshipRawPayloadParser
(
rawPayload
:
any
)
:
Promise
<
FriendshipPayload
>
public
friendshipPayloadCache
(
friendshipId
:
string
):
undefined
|
FriendshipPayload
{
// log.silly('Puppet', 'friendshipPayloadCache(id=%s) @ %s', friendshipId, this)
...
...
@@ -531,6 +532,11 @@ export abstract class Puppet extends EventEmitter implements Sayable {
return
cachedPayload
}
protected
async
friendshipPayloadDirty
(
friendshipId
:
string
):
Promise
<
void
>
{
log
.
verbose
(
'
Puppet
'
,
'
friendshipPayloadDirty(%s)
'
,
friendshipId
)
this
.
cacheFriendshipPayload
.
del
(
friendshipId
)
}
public
async
friendshipPayload
(
friendshipId
:
string
,
noCache
=
false
,
...
...
@@ -595,6 +601,11 @@ export abstract class Puppet extends EventEmitter implements Sayable {
return
cachedPayload
}
protected
async
messagePayloadDirty
(
messageId
:
string
):
Promise
<
void
>
{
log
.
verbose
(
'
Puppet
'
,
'
messagePayloadDirty(%s)
'
,
messageId
)
this
.
cacheMessagePayload
.
del
(
messageId
)
}
public
async
messagePayload
(
messageId
:
string
,
noCache
=
false
,
...
...
@@ -669,6 +680,9 @@ export abstract class Puppet extends EventEmitter implements Sayable {
if
(
!
this
.
id
)
{
throw
new
Error
(
'
no puppet.id. need puppet to be login-ed for a search
'
)
}
if
(
!
query
)
{
throw
new
Error
(
'
no query
'
)
}
/**
* 0. for YOU: 'You', '你' in sys message
...
...
@@ -807,6 +821,11 @@ export abstract class Puppet extends EventEmitter implements Sayable {
return
cachedPayload
}
protected
async
roomPayloadDirty
(
roomId
:
string
):
Promise
<
void
>
{
log
.
verbose
(
'
Puppet
'
,
'
roomPayloadDirty(%s)
'
,
roomId
)
this
.
cacheRoomPayload
.
del
(
roomId
)
}
public
async
roomPayload
(
roomId
:
string
,
noCache
=
false
,
...
...
@@ -869,12 +888,24 @@ export abstract class Puppet extends EventEmitter implements Sayable {
return
cachedPayload
}
protected
async
roomMemberPayloadDirty
(
roomId
:
string
):
Promise
<
void
>
{
log
.
verbose
(
'
Puppet
'
,
'
roomMemberPayloadDirty(%s)
'
,
roomId
)
const
contactIdList
=
await
this
.
roomMemberList
(
roomId
)
let
cacheKey
contactIdList
.
forEach
(
contactId
=>
{
cacheKey
=
this
.
cacheKeyRoomMember
(
roomId
,
contactId
)
this
.
cacheRoomMemberPayload
.
del
(
cacheKey
)
})
}
public
async
roomMemberPayload
(
roomId
:
string
,
contactId
:
string
,
noCache
=
false
,
dirty
=
false
,
):
Promise
<
RoomMemberPayload
>
{
log
.
verbose
(
'
Puppet
'
,
'
roomMemberPayload(roomId=%s, contactId=%s noCache=%s)
'
,
roomId
,
contactId
,
noCache
)
log
.
verbose
(
'
Puppet
'
,
'
roomMemberPayload(roomId=%s, contactId=%s noCache=%s)
'
,
roomId
,
contactId
,
dirty
)
if
(
!
roomId
||
!
contactId
)
{
throw
new
Error
(
'
no id
'
)
...
...
@@ -882,11 +913,8 @@ export abstract class Puppet extends EventEmitter implements Sayable {
const
cacheKey
=
this
.
cacheKeyRoomMember
(
roomId
,
contactId
)
if
(
noCache
)
{
log
.
silly
(
'
Puppet
'
,
'
roomMemberPayload(%s) cache PURGE
'
,
roomId
)
this
.
cacheRoomMemberPayload
.
del
(
cacheKey
)
if
(
dirty
)
{
this
.
roomMemberPayloadDirty
(
roomId
)
}
else
{
const
cachedPayload
=
this
.
roomMemberPayloadCache
(
roomId
,
contactId
)
...
...
src/puppet/schemas/puppet.ts
浏览文件 @
1c58f9d3
...
...
@@ -2,12 +2,6 @@ import {
MemoryCard
,
}
from
'
memory-card
'
/**
* Watchdog timeout
* in seconds
*/
export
const
WATCHDOG_TIMEOUT
=
Symbol
(
'
WATCHDOG_TIMEOUT
'
)
/**
* This is used internally to as a placeholder for the bot name.
*
...
...
@@ -66,8 +60,12 @@ export const PUPPET_EVENT_DICT = {
export
type
PuppetEventName
=
keyof
typeof
PUPPET_EVENT_DICT
/**
* timeout: WatchDog Timeout in Seconds
*/
export
interface
PuppetOptions
{
memory
:
MemoryCard
,
memory
:
MemoryCard
,
timeout
?
:
number
,
}
export
interface
Receiver
{
...
...
src/room.ts
浏览文件 @
1c58f9d3
...
...
@@ -606,7 +606,7 @@ export class Room extends Accessory implements Sayable {
* const contact = await Contact.find({name: 'lijiarui'}) // change 'lijiarui' to any of contact in your wechat
* const room = await Room.find({topic: 'wechaty'}) // change 'wechaty' to any of the room in your wechat
* if (contact && room) {
* if (room.has(contact)) {
* if (
await
room.has(contact)) {
* console.log(`${contact.name()} is in the room ${room.topic()}!`)
* } else {
* console.log(`${contact.name()} is not in the room ${room.topic()} !`)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录