提交 aa773215 编写于 作者: Huan (李卓桓)'s avatar Huan (李卓桓)

implement more padchat methods

上级 8fa2622d
...@@ -149,7 +149,6 @@ export class Bridge extends EventEmitter { ...@@ -149,7 +149,6 @@ export class Bridge extends EventEmitter {
this.botWs = new WebSocket(ADDRESS, { perMessageDeflate: true }) this.botWs = new WebSocket(ADDRESS, { perMessageDeflate: true })
this.autoData = options.autoData || {} this.autoData = options.autoData || {}
// this.state = new StateSwitch('PuppetPadchatBridge', log)
} }
private async sendToWebSocket(name: string, args: string[]): Promise<any> { private async sendToWebSocket(name: string, args: string[]): Promise<any> {
...@@ -271,7 +270,10 @@ export class Bridge extends EventEmitter { ...@@ -271,7 +270,10 @@ export class Bridge extends EventEmitter {
return result return result
} }
public async checkSyncContactOrRoom(): Promise<[Map<string, PadchatContactRawPayload>, Map<string, PadchatRoomRawPayload>]> { public async checkSyncContactOrRoom(): Promise<{
contactMap: Map<string, PadchatContactRawPayload>,
roomMap: Map<string, PadchatRoomRawPayload>,
}> {
log.silly('PuppetPadchat', `checkSyncContact`) log.silly('PuppetPadchat', `checkSyncContact`)
let cont = true let cont = true
...@@ -308,7 +310,10 @@ export class Bridge extends EventEmitter { ...@@ -308,7 +310,10 @@ export class Bridge extends EventEmitter {
log.info('PuppetPadchat', `checkSyncContact, not load yet, continue to WXSyncContact`) log.info('PuppetPadchat', `checkSyncContact, not load yet, continue to WXSyncContact`)
} }
return [syncContactMap, syncRoomMap] return {
contactMap: syncContactMap,
roomMap: syncRoomMap,
}
} }
/** /**
......
...@@ -46,8 +46,9 @@ export interface PadchatContactRawPayload { ...@@ -46,8 +46,9 @@ export interface PadchatContactRawPayload {
* message: string, // '', * message: string, // '',
* ticket: string, // '', * ticket: string, // '',
*/ */
msg_type?: number, msg_type? : number,
continue?: number, continue? : number,
ticket? : string,
big_head : string, // "http://wx.qlogo.cn/mmhead/ver_1/xfCMmibHH74xGLoyeDFJadrZXX3eOEznPefiaCa3iczxZGMwPtDuSbRQKx3Xdm18un303mf0NFia3USY2nO2VEYILw/0", big_head : string, // "http://wx.qlogo.cn/mmhead/ver_1/xfCMmibHH74xGLoyeDFJadrZXX3eOEznPefiaCa3iczxZGMwPtDuSbRQKx3Xdm18un303mf0NFia3USY2nO2VEYILw/0",
city : string, // 'Haidian' city : string, // 'Haidian'
......
...@@ -17,9 +17,9 @@ ...@@ -17,9 +17,9 @@
* *
*/ */
import * as path from 'path' // import * as path from 'path'
import * as fs from 'fs' // import * as fs from 'fs'
import * as cuid from 'cuid' // import * as cuid from 'cuid'
import { import {
FileBox, FileBox,
...@@ -459,24 +459,81 @@ export class PuppetPadchat extends Puppet { ...@@ -459,24 +459,81 @@ export class PuppetPadchat extends Puppet {
return payload.alias || '' return payload.alias || ''
} }
// TODO: modify alias in bridge await this.bridge.WXSetUserRemark(contactId, alias || '')
return return
} }
public async contactFindAll(query: ContactQueryFilter): Promise<string[]> { public async contactFindAll(query: ContactQueryFilter): Promise<string[]> {
log.verbose('PuppetPadchat', 'contactFindAll(%s)', query) log.verbose('PuppetPadchat', 'contactFindAll(%s)', query)
// TODO: query
const contactMap = (await this.bridge.checkSyncContactOrRoom())[0] // const contactRawPayloadMap = (await this.bridge.checkSyncContactOrRoom()).contactMap
const contactIdList: string[] = [] const contactIdList: string[] = []
contactMap.forEach(async (value , key) => { // for (const contactRawPayload in contactRawPayloadMap) {
contactIdList.push(key)
this.Contact.load(key, await this.contactRawPayloadParser(value))
})
// }
// contactRawPayloadMap.forEach((value , id) => {
// contactIdList.push(id)
// this.Contact.load(
// id,
// await this.contactRawPayloadParser(value),
// )
// })
// // const payloadList = await Promise.all(
// // contactIdList.map(
// // id => this.contactPayload(id),
// // ),
// // )
// const contactList = contactIdList.filter(id => {
// await this.contactPayload(id)
// return true
// })
return contactIdList return contactIdList
} }
protected contactQueryFilterToFunction(
query: ContactQueryFilter,
): (payload: ContactPayload) => boolean {
log.verbose('PuppetPadchat', 'contactQueryFilterToFunctionString({ %s })',
Object.keys(query)
.map(k => `${k}: ${query[k as keyof ContactQueryFilter]}`)
.join(', '),
)
if (Object.keys(query).length !== 1) {
throw new Error('query only support one key. multi key support is not availble now.')
}
const filterKey = Object.keys(query)[0] as keyof ContactQueryFilter
let filterValue: string | RegExp | undefined = query[filterKey]
if (!filterValue) {
throw new Error('filterValue not found')
}
/**
* must be string because we need inject variable value
* into code as variable namespecialContactList
*/
let filterFunction: (payload: ContactPayload) => boolean
if (filterValue instanceof RegExp) {
const regex = filterValue
filterFunction = (payload: ContactPayload) => regex.test(payload[filterKey] || '')
} else if (typeof filterValue === 'string') {
filterValue = filterValue.replace(/'/g, '\\\'')
filterFunction = (payload: ContactPayload) => payload[filterKey] === filterValue
} else {
throw new Error('unsupport name type')
}
return filterFunction
}
public async contactAvatar(contactId: string): Promise<FileBox> { public async contactAvatar(contactId: string): Promise<FileBox> {
log.verbose('PuppetPadchat', 'contactAvatar(%s)', contactId) log.verbose('PuppetPadchat', 'contactAvatar(%s)', contactId)
...@@ -767,11 +824,11 @@ export class PuppetPadchat extends Puppet { ...@@ -767,11 +824,11 @@ export class PuppetPadchat extends Puppet {
log.verbose('PuppetPadchat', 'roomFindAll(%s)', query) log.verbose('PuppetPadchat', 'roomFindAll(%s)', query)
// TODO: query // TODO: query
const rooomMap = (await this.bridge.checkSyncContactOrRoom())[1] const rooomMap = (await this.bridge.checkSyncContactOrRoom()).roomMap
const roomIdList: string[] = [] const roomIdList: string[] = []
rooomMap.forEach(async (value , key) => { rooomMap.forEach(async (value , id) => {
roomIdList.push(key) roomIdList.push(id)
this.Room.load(key, await this.roomRawPayloadParser(value)) this.Room.load(id, await this.roomRawPayloadParser(value))
}) })
return roomIdList return roomIdList
...@@ -783,6 +840,7 @@ export class PuppetPadchat extends Puppet { ...@@ -783,6 +840,7 @@ export class PuppetPadchat extends Puppet {
): Promise<void> { ): Promise<void> {
log.verbose('PuppetPadchat', 'roomDel(%s, %s)', roomId, contactId) log.verbose('PuppetPadchat', 'roomDel(%s, %s)', roomId, contactId)
await this.bridge.WXDeleteChatRoomMember(roomId, contactId)
} }
public async roomAdd( public async roomAdd(
...@@ -790,6 +848,7 @@ export class PuppetPadchat extends Puppet { ...@@ -790,6 +848,7 @@ export class PuppetPadchat extends Puppet {
contactId : string, contactId : string,
): Promise<void> { ): Promise<void> {
log.verbose('PuppetPadchat', 'roomAdd(%s, %s)', roomId, contactId) log.verbose('PuppetPadchat', 'roomAdd(%s, %s)', roomId, contactId)
await this.bridge.WXAddChatRoomMember(roomId, contactId)
} }
public async roomTopic( public async roomTopic(
...@@ -804,7 +863,7 @@ export class PuppetPadchat extends Puppet { ...@@ -804,7 +863,7 @@ export class PuppetPadchat extends Puppet {
return payload.topic return payload.topic
} }
// TODO: modify await this.bridge.WXSetChatroomName(roomId, topic)
return return
} }
...@@ -815,11 +874,13 @@ export class PuppetPadchat extends Puppet { ...@@ -815,11 +874,13 @@ export class PuppetPadchat extends Puppet {
): Promise<string> { ): Promise<string> {
log.verbose('PuppetPadchat', 'roomCreate(%s, %s)', contactIdList, topic) log.verbose('PuppetPadchat', 'roomCreate(%s, %s)', contactIdList, topic)
// await this.bridge.crea
return 'mock_room_id' return 'mock_room_id'
} }
public async roomQuit(roomId: string): Promise<void> { public async roomQuit(roomId: string): Promise<void> {
log.verbose('PuppetPadchat', 'roomQuit(%s)', roomId) log.verbose('PuppetPadchat', 'roomQuit(%s)', roomId)
await this.bridge.WXQuitChatRoom(roomId)
} }
/** /**
...@@ -832,6 +893,25 @@ export class PuppetPadchat extends Puppet { ...@@ -832,6 +893,25 @@ export class PuppetPadchat extends Puppet {
hello : string, hello : string,
): Promise<void> { ): Promise<void> {
log.verbose('PuppetPadchat', 'friendRequestSend(%s, %s)', contactId, hello) log.verbose('PuppetPadchat', 'friendRequestSend(%s, %s)', contactId, hello)
const rawPayload = await this.contactRawPayload(contactId)
let strangerV1
let strangerV2
if (/^v1_/i.test(rawPayload.stranger)) {
strangerV1 = rawPayload.stranger
} else if (/^v2_/i.test(rawPayload.stranger)) {
strangerV2 = rawPayload.stranger
} else {
throw new Error('stranger neither v1 nor v2!')
}
await this.bridge.WXAddUser(
strangerV1 || '',
strangerV2 || '',
'14',
hello,
)
} }
public async friendRequestAccept( public async friendRequestAccept(
...@@ -839,6 +919,17 @@ export class PuppetPadchat extends Puppet { ...@@ -839,6 +919,17 @@ export class PuppetPadchat extends Puppet {
ticket : string, ticket : string,
): Promise<void> { ): Promise<void> {
log.verbose('PuppetPadchat', 'friendRequestAccept(%s, %s)', contactId, ticket) log.verbose('PuppetPadchat', 'friendRequestAccept(%s, %s)', contactId, ticket)
const rawPayload = await this.contactRawPayload(contactId)
if (!rawPayload.ticket) {
throw new Error('no ticket')
}
await this.bridge.WXAcceptUser(
rawPayload.stranger,
rawPayload.ticket,
)
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册