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

code clean & bug fix & refactoring

上级 ed72a78b
...@@ -186,6 +186,11 @@ export class Contact extends Accessory implements Sayable { ...@@ -186,6 +186,11 @@ export class Contact extends Accessory implements Sayable {
} }
} }
// TODO
public static async delete(contact: Contact): Promise<void> {
log.verbose('Cotnact', 'static delete(%s)', contact.id)
}
/** /**
* *
* Instance properties * Instance properties
...@@ -600,6 +605,28 @@ export class Contact extends Accessory implements Sayable { ...@@ -600,6 +605,28 @@ export class Contact extends Accessory implements Sayable {
return this.payload && this.payload.weixin || null return this.payload && this.payload.weixin || null
} }
/**
*
* Need a new class for manage user profile
*
*/
// TODO:
public async qrcode(): Promise<string> {
log.verbose('Contact', 'qrcode()')
if (!this.self()) {
throw new Error('only can get qrcode for the login userself')
}
return 'url of qrcode data for this contact(self only)'
}
public async setAvatar(file: FileBox): Promise<void> {
log.verbose('Contact', 'setAvatar(%s)', file.name)
// should not in contact class ?
// too many methods that can only use on the login-ed userself.
}
} }
export default Contact export default Contact
...@@ -86,9 +86,6 @@ export class Bridge extends EventEmitter { ...@@ -86,9 +86,6 @@ export class Bridge extends EventEmitter {
super() // for EventEmitter super() // for EventEmitter
log.verbose('PuppetPadchatBridge', 'constructor()') log.verbose('PuppetPadchatBridge', 'constructor()')
// this.userId = options.token
// this.initCache()
this.autoData = {} this.autoData = {}
this.padchatRpc = new PadchatRpc(options.endpoint, options.token) this.padchatRpc = new PadchatRpc(options.endpoint, options.token)
...@@ -215,7 +212,9 @@ export class Bridge extends EventEmitter { ...@@ -215,7 +212,9 @@ export class Bridge extends EventEmitter {
public logout(): void { public logout(): void {
if (!this.selfId) { if (!this.selfId) {
throw new Error('no username') // throw new Error('no username')
log.warn('PuppetPadchatBridge', 'logout() selfId not exist, already logout-ed')
return
} }
this.selfId = undefined this.selfId = undefined
...@@ -568,7 +567,7 @@ export class Bridge extends EventEmitter { ...@@ -568,7 +567,7 @@ export class Bridge extends EventEmitter {
public async syncRoomMember( public async syncRoomMember(
roomId: string, roomId: string,
): Promise<{ [contactId: string]: PadchatRoomMemberPayload }> { ): Promise<{ [contactId: string]: PadchatRoomMemberPayload }> {
log.verbose('PuppetPadchatBridge', 'syncRoomMember(%s)', roomId) log.silly('PuppetPadchatBridge', 'syncRoomMember(%s)', roomId)
const memberListPayload = await this.padchatRpc.WXGetChatRoomMember(roomId) const memberListPayload = await this.padchatRpc.WXGetChatRoomMember(roomId)
...@@ -576,15 +575,14 @@ export class Bridge extends EventEmitter { ...@@ -576,15 +575,14 @@ export class Bridge extends EventEmitter {
throw new Error('no memberListPayload') throw new Error('no memberListPayload')
} }
log.silly('PuppetPadchatBridge', 'syncRoomMember(%s) total %d members',
roomId,
Object.keys(memberListPayload).length,
)
const memberDict: { [contactId: string]: PadchatRoomMemberPayload } = {} const memberDict: { [contactId: string]: PadchatRoomMemberPayload } = {}
for (const memberPayload of memberListPayload.member) { for (const memberPayload of memberListPayload.member) {
log.info('PuppetPadchatBridge', 'syncRoomMember(%s) member(%s)="%s"',
roomId,
memberPayload.user_name,
JSON.stringify(memberPayload),
)
const contactId = memberPayload.user_name const contactId = memberPayload.user_name
memberDict[contactId] = memberPayload memberDict[contactId] = memberPayload
} }
...@@ -628,10 +626,10 @@ export class Bridge extends EventEmitter { ...@@ -628,10 +626,10 @@ export class Bridge extends EventEmitter {
throw new Error('no cache') throw new Error('no cache')
} }
log.verbose('PuppetPadchatBridge', 'syncContactsAndRooms() update %d to Contact(%d) & Room(%d) ...', log.silly('PuppetPadchatBridge', 'syncContactsAndRooms() updating %d to Contact(%d) & Room(%d) ...',
syncContactList.length, syncContactList.length,
[...this.cacheContactRawPayload.keys()].length, this.cacheContactRawPayload.size,
[...this.cacheRoomRawPayload.keys()].length, this.cacheRoomRawPayload.size,
) )
for (const syncContact of syncContactList) { for (const syncContact of syncContactList) {
...@@ -647,7 +645,7 @@ export class Bridge extends EventEmitter { ...@@ -647,7 +645,7 @@ export class Bridge extends EventEmitter {
/** /**
* Room * Room
*/ */
log.verbose('PuppetPadchatBridge', 'syncContactsAndRooms() sync Room %s(%s)', log.silly('PuppetPadchatBridge', 'syncContactsAndRooms() updating Room %s(%s)',
syncContact.nick_name, syncContact.nick_name,
syncContact.user_name, syncContact.user_name,
) )
...@@ -661,7 +659,7 @@ export class Bridge extends EventEmitter { ...@@ -661,7 +659,7 @@ export class Bridge extends EventEmitter {
/** /**
* Contact * Contact
*/ */
log.verbose('PuppetPadchatBridge', 'syncContactsAndRooms() sync Contact %s(%s)', log.silly('PuppetPadchatBridge', 'syncContactsAndRooms() updating Contact %s(%s)',
syncContact.nick_name, syncContact.nick_name,
syncContact.user_name, syncContact.user_name,
) )
...@@ -693,41 +691,23 @@ export class Bridge extends EventEmitter { ...@@ -693,41 +691,23 @@ export class Bridge extends EventEmitter {
} }
} }
// private async WXGetContact(id: string): Promise<PadchatContactPayload | PadchatRoomPayload> { public async contactRawPayload(contactid: string): Promise<PadchatContactPayload> {
// const result = await this.jsonRpcCall('WXGetContact', [id]) log.silly('PuppetPadchatBridge', 'contactRawPayload(%s)', contactid)
// if (!result) {
// throw Error('PuppetPadchatBridge, WXGetContact, cannot get result from websocket server!')
// }
// log.silly('PuppetPadchatBridge', 'WXGetContact(%s) result: %s', id, JSON.stringify(result))
// if (!result.user_name) {
// log.warn('PuppetPadchatBridge', 'WXGetContact cannot get user_name, id: %s', id)
// }
// if (result.member) {
// result.member = JSON.parse(decodeURIComponent(result.member))
// }
// return result
// }
public async contactRawPayload(id: string): Promise<PadchatContactPayload> {
log.verbose('PuppetPadchatBridge', 'contactRawPayload(%s)', id)
const rawPayload = await Misc.retry(async (retry, attempt) => { const rawPayload = await Misc.retry(async (retry, attempt) => {
log.verbose('PuppetPadchatBridge', 'contactRawPayload(%s) retry() attempt=%d', id, attempt) log.silly('PuppetPadchatBridge', 'contactRawPayload(%s) retry() attempt=%d', contactid, attempt)
if (!this.cacheContactRawPayload) { if (!this.cacheContactRawPayload) {
throw new Error('no cache') throw new Error('no cache')
} }
if (this.cacheContactRawPayload.has(id)) { if (this.cacheContactRawPayload.has(contactid)) {
return this.cacheContactRawPayload.get(id) return this.cacheContactRawPayload.get(contactid)
} }
const tryRawPayload = await this.padchatRpc.WXGetContactPayload(id) const tryRawPayload = await this.padchatRpc.WXGetContactPayload(contactid)
if (tryRawPayload) { if (tryRawPayload) {
this.cacheContactRawPayload.set(id, tryRawPayload) this.cacheContactRawPayload.set(contactid, tryRawPayload)
return tryRawPayload return tryRawPayload
} }
return retry(new Error('tryRawPayload empty')) return retry(new Error('tryRawPayload empty'))
...@@ -831,4 +811,12 @@ export class Bridge extends EventEmitter { ...@@ -831,4 +811,12 @@ export class Bridge extends EventEmitter {
public async WXAddUser(strangerV1: string, strangerV2: string, type: string, verify: string): Promise<void> { public async WXAddUser(strangerV1: string, strangerV2: string, type: string, verify: string): Promise<void> {
await this.padchatRpc.WXAddUser(strangerV1, strangerV2, type, verify) await this.padchatRpc.WXAddUser(strangerV1, strangerV2, type, verify)
} }
public async WXSetChatroomAnnouncement(chatroom: string, content: string): Promise<void> {
await this.padchatRpc.WXSetChatroomAnnouncement(chatroom, content)
}
public async WXGetChatroomAnnouncement(chatroom: string): Promise<string> {
return await this.padchatRpc.WXGetChatroomAnnouncement(chatroom)
}
} }
...@@ -259,6 +259,7 @@ export class PadchatRpc extends EventEmitter { ...@@ -259,6 +259,7 @@ export class PadchatRpc extends EventEmitter {
if (padchatPayload.type === PadchatPayloadType.Logout) { if (padchatPayload.type === PadchatPayloadType.Logout) {
// this.emit('logout', this.selfId()) // this.emit('logout', this.selfId())
console.log('onSocketPadchat: ', JSON.stringify(padchatPayload))
this.emit('logout') this.emit('logout')
} }
...@@ -552,17 +553,36 @@ export class PadchatRpc extends EventEmitter { ...@@ -552,17 +553,36 @@ export class PadchatRpc extends EventEmitter {
return emptyResult return emptyResult
} }
// tslint:disable-next-line:max-line-length try {
// change '[{"big_head":"http://wx.qlogo.cn/mmhead/ver_1/DpS0ZssJ5s8tEpSr9JuPTRxEUrCK0USrZcR3PjOMfUKDwpnZLxWXlD4Q38bJpcXBtwXWwevsul1lJqwsQzwItQ/0","chatroom_nick_name":"","invited_by":"wxid_7708837087612","nick_name":"李佳芮","small_head":"http://wx.qlogo.cn/mmhead/ver_1/DpS0ZssJ5s8tEpSr9JuPTRxEUrCK0USrZcR3PjOMfUKDwpnZLxWXlD4Q38bJpcXBtwXWwevsul1lJqwsQzwItQ/132","user_name":"qq512436430"},{"big_head":"http://wx.qlogo.cn/mmhead/ver_1/kcBj3gSibfFd2I9vQ8PBFyQ77cpPIfqkFlpTdkFZzBicMT6P567yj9IO6xG68WsibhqdPuG82tjXsveFATSDiaXRjw/0","chatroom_nick_name":"","invited_by":"wxid_7708837087612","nick_name":"梦君君","small_head":"http://wx.qlogo.cn/mmhead/ver_1/kcBj3gSibfFd2I9vQ8PBFyQ77cpPIfqkFlpTdkFZzBicMT6P567yj9IO6xG68WsibhqdPuG82tjXsveFATSDiaXRjw/132","user_name":"mengjunjun001"},{"big_head":"http://wx.qlogo.cn/mmhead/ver_1/3CsKibSktDV05eReoAicV0P8yfmuHSowfXAMvRuU7HEy8wMcQ2eibcaO1ccS95PskZchEWqZibeiap6Gpb9zqJB1WmNc6EdD6nzQiblSx7dC1eGtA/0","chatroom_nick_name":"","invited_by":"wxid_7708837087612","nick_name":"苏轼","small_head":"http://wx.qlogo.cn/mmhead/ver_1/3CsKibSktDV05eReoAicV0P8yfmuHSowfXAMvRuU7HEy8wMcQ2eibcaO1ccS95PskZchEWqZibeiap6Gpb9zqJB1WmNc6EdD6nzQiblSx7dC1eGtA/132","user_name":"wxid_zj2cahpwzgie12"},{"big_head":"http://wx.qlogo.cn/mmhead/ver_1/piaHuicak41b6ibmcEVxoWKnnhgGDG5EbaD0hibwkrRvKeDs3gs7XQrkym3Q5MlUeSKY8vw2FRVVstialggUxf2zic2O8CvaEsicSJcghf41nibA940/0","chatroom_nick_name":"","invited_by":"wxid_zj2cahpwzgie12","nick_name":"王宁","small_head":"http://wx.qlogo.cn/mmhead/ver_1/piaHuicak41b6ibmcEVxoWKnnhgGDG5EbaD0hibwkrRvKeDs3gs7XQrkym3Q5MlUeSKY8vw2FRVVstialggUxf2zic2O8CvaEsicSJcghf41nibA940/132","user_name":"wxid_7708837087612"}]' // tslint:disable-next-line:max-line-length
// to Array (PadchatRoomRawMember[]) // change '[{"big_head":"http://wx.qlogo.cn/mmhead/ver_1/DpS0ZssJ5s8tEpSr9JuPTRxEUrCK0USrZcR3PjOMfUKDwpnZLxWXlD4Q38bJpcXBtwXWwevsul1lJqwsQzwItQ/0","chatroom_nick_name":"","invited_by":"wxid_7708837087612","nick_name":"李佳芮","small_head":"http://wx.qlogo.cn/mmhead/ver_1/DpS0ZssJ5s8tEpSr9JuPTRxEUrCK0USrZcR3PjOMfUKDwpnZLxWXlD4Q38bJpcXBtwXWwevsul1lJqwsQzwItQ/132","user_name":"qq512436430"},{"big_head":"http://wx.qlogo.cn/mmhead/ver_1/kcBj3gSibfFd2I9vQ8PBFyQ77cpPIfqkFlpTdkFZzBicMT6P567yj9IO6xG68WsibhqdPuG82tjXsveFATSDiaXRjw/0","chatroom_nick_name":"","invited_by":"wxid_7708837087612","nick_name":"梦君君","small_head":"http://wx.qlogo.cn/mmhead/ver_1/kcBj3gSibfFd2I9vQ8PBFyQ77cpPIfqkFlpTdkFZzBicMT6P567yj9IO6xG68WsibhqdPuG82tjXsveFATSDiaXRjw/132","user_name":"mengjunjun001"},{"big_head":"http://wx.qlogo.cn/mmhead/ver_1/3CsKibSktDV05eReoAicV0P8yfmuHSowfXAMvRuU7HEy8wMcQ2eibcaO1ccS95PskZchEWqZibeiap6Gpb9zqJB1WmNc6EdD6nzQiblSx7dC1eGtA/0","chatroom_nick_name":"","invited_by":"wxid_7708837087612","nick_name":"苏轼","small_head":"http://wx.qlogo.cn/mmhead/ver_1/3CsKibSktDV05eReoAicV0P8yfmuHSowfXAMvRuU7HEy8wMcQ2eibcaO1ccS95PskZchEWqZibeiap6Gpb9zqJB1WmNc6EdD6nzQiblSx7dC1eGtA/132","user_name":"wxid_zj2cahpwzgie12"},{"big_head":"http://wx.qlogo.cn/mmhead/ver_1/piaHuicak41b6ibmcEVxoWKnnhgGDG5EbaD0hibwkrRvKeDs3gs7XQrkym3Q5MlUeSKY8vw2FRVVstialggUxf2zic2O8CvaEsicSJcghf41nibA940/0","chatroom_nick_name":"","invited_by":"wxid_zj2cahpwzgie12","nick_name":"王宁","small_head":"http://wx.qlogo.cn/mmhead/ver_1/piaHuicak41b6ibmcEVxoWKnnhgGDG5EbaD0hibwkrRvKeDs3gs7XQrkym3Q5MlUeSKY8vw2FRVVstialggUxf2zic2O8CvaEsicSJcghf41nibA940/132","user_name":"wxid_7708837087612"}]'
if (Array.isArray(JSON.parse(decodeURIComponent(result.member)))) { // to Array (PadchatRoomRawMember[])
result.member = JSON.parse(decodeURIComponent(result.member)) as PadchatRoomMemberPayload[] if (Array.isArray(JSON.parse(decodeURIComponent(result.member)))) {
} else { result.member = JSON.parse(decodeURIComponent(result.member)) as PadchatRoomMemberPayload[]
log.warn('PadchatRpc', 'WXGetChatRoomMember(%s) member is not array: %s', roomId, JSON.stringify(result.member)) } else {
// throw Error('faild to parse chatroom member!') log.warn('PadchatRpc', 'WXGetChatRoomMember(%s) member is not array: %s', roomId, JSON.stringify(result.member))
// throw Error('faild to parse chatroom member!')
result.member = []
}
} catch (e) {
// 18:27:54 SILL Puppet contactPayload(shanzhifeng644634) cache MISS
// tslint:disable-next-line:max-line-length
// 18:27:55 SILL PadchatRpc WXGetChatRoomMember() result: {"chatroom_id":700002836,"count":442,"member":"[{\"big_head\":\"http://wx.qlogo.cn/mmhead/ver_1/VCnC8c3icQpcsCpMeSq1w2MZm6Q3ZNqHINoOUhUic9icB3Tm6BK9hyyB9XiaFxjVNIHF0oO11zZTez0nictu2nRWLH7OaKcRkZQdiaz0UjjYlBeWk/0\",\"chatroom_nick_name\":\"宁杰+野生土蜂蜜\",\"invited_by\":\"\",\"nick_name\":\"宁杰¥野生土蜂蜜\",\"small_head\":\"http://wx.qlogo.cn/mmhead/ver_1/VCnC8c3icQpcsCpMeSq1w2MZm6Q3ZNqHINoOUhUic9icB3Tm6BK9hyyB9XiaFxjVNIHF0oO11zZTez0nictu2nRWLH7OaKcRkZQdiaz0UjjYlBeWk/132\",\"user_name\":\"jack_85802\"},{\"b
// 18:27:55 ERR Config ###########################
// 18:27:55 ERR Config unhandledRejection: URIError: URI malformed [object Promise]
// 18:27:55 ERR Config ###########################
// 18:27:55 ERR Config process.on(unhandledRejection) promise.catch(URI malformed)
// Config URIError: URI malformed
// at decodeURIComponent (<anonymous>)
// at PadchatRpc.<anonymous> (/home/zixia/chatie/wechaty/src/puppet-padchat/padchat-rpc.ts:559:34)
// at Generator.next (<anonymous>)
// at fulfilled (/home/zixia/chatie/wechaty/src/puppet-padchat/padchat-rpc.ts:4:58)
// at process._tickCallback (internal/process/next_tick.js:68:7)
// (node:22232) PromiseRejectionHandledWarning: Promise rejection was handled asynchronously (rejection id: 834)
console.error(e)
log.warn('PadchatRpc', 'WXGetChatRoomMember(%s) result.member decode error: %s', roomId, e)
result.member = [] result.member = []
} }
return result return result
} }
...@@ -1337,4 +1357,16 @@ export class PadchatRpc extends EventEmitter { ...@@ -1337,4 +1357,16 @@ export class PadchatRpc extends EventEmitter {
} }
return result return result
} }
// FIXME: does Get exist?
// FIXME2: what's the structure of result? result.data???
public async WXGetChatroomAnnouncement(chatroom: string): Promise<string> {
const result = await this.rpcCall('WXGetChatroomAnnouncement', chatroom)
log.silly('PadchatRpc', 'WXGetChatroomAnnouncement ,result: %s', JSON.stringify(result))
if (!result || result.status !== 0) {
throw Error('WXGetChatroomAnnouncement , error! canot get result from websocket server')
}
return result.data
}
} }
...@@ -27,6 +27,7 @@ export enum PadchatContactRoomStatus { ...@@ -27,6 +27,7 @@ export enum PadchatContactRoomStatus {
} }
export enum PadchatRoomMemberStatus { export enum PadchatRoomMemberStatus {
Zero = 0,
Todo, Todo,
} }
......
...@@ -74,6 +74,7 @@ import { ...@@ -74,6 +74,7 @@ import {
PadchatRoomPayload, PadchatRoomPayload,
// PadchatRoomMemberListPayload, // PadchatRoomMemberListPayload,
PadchatRoomMemberPayload, PadchatRoomMemberPayload,
PadchatMessageType,
// PadchatMessageType, // PadchatMessageType,
// PadchatContinue, // PadchatContinue,
...@@ -89,7 +90,7 @@ export type ScanFoodType = 'scan' | 'login' | 'logout' ...@@ -89,7 +90,7 @@ export type ScanFoodType = 'scan' | 'login' | 'logout'
export class PuppetPadchat extends Puppet { export class PuppetPadchat extends Puppet {
// private readonly cachePadchatContactPayload : LRU.Cache<string, PadchatContactRawPayload> // private readonly cachePadchatContactPayload : LRU.Cache<string, PadchatContactRawPayload>
// private readonly cachePadchatFriendRequestRawPayload : LRU.Cache<string, FriendRequestRawPayload> private readonly cachePadchatFriendRequestPayload : LRU.Cache<string, PadchatMessagePayload>
private readonly cachePadchatMessagePayload : LRU.Cache<string, PadchatMessagePayload> private readonly cachePadchatMessagePayload : LRU.Cache<string, PadchatMessagePayload>
// private readonly cachePadchatRoomPayload : LRU.Cache<string, PadchatRoomRawPayload> // private readonly cachePadchatRoomPayload : LRU.Cache<string, PadchatRoomRawPayload>
...@@ -110,7 +111,7 @@ export class PuppetPadchat extends Puppet { ...@@ -110,7 +111,7 @@ export class PuppetPadchat extends Puppet {
} }
// this.cachePadchatContactPayload = new LRU<string, PadchatContactRawPayload>(lruOptions) // this.cachePadchatContactPayload = new LRU<string, PadchatContactRawPayload>(lruOptions)
// this.cacheFriendRequestPayload = new LRU<string, FriendRequestPayload>(lruOptions) this.cachePadchatFriendRequestPayload = new LRU<string, PadchatMessagePayload>(lruOptions)
this.cachePadchatMessagePayload = new LRU<string, PadchatMessagePayload>(lruOptions) this.cachePadchatMessagePayload = new LRU<string, PadchatMessagePayload>(lruOptions)
// this.cachePadchatRoomPayload = new LRU<string, PadchatRoomRawPayload>(lruOptions) // this.cachePadchatRoomPayload = new LRU<string, PadchatRoomRawPayload>(lruOptions)
...@@ -218,13 +219,8 @@ export class PuppetPadchat extends Puppet { ...@@ -218,13 +219,8 @@ export class PuppetPadchat extends Puppet {
this.bridge.on('logout', () => { this.bridge.on('logout', () => {
this.logout() this.logout()
}) })
this.bridge.on('message', (messagePayload: PadchatMessagePayload) => { this.bridge.on('message', (rawPayload: PadchatMessagePayload) => {
log.silly('PuppetPadchat', 'startBridge() bridge.on(message)') this.onPadchatMessage(rawPayload)
this.cachePadchatMessagePayload.set(
messagePayload.msg_id,
messagePayload,
)
this.emit('message', messagePayload.msg_id)
}) })
this.bridge.on('scan', (qrCode: string, status: number, data?: string) => { this.bridge.on('scan', (qrCode: string, status: number, data?: string) => {
this.emit('scan', qrCode, status, data) this.emit('scan', qrCode, status, data)
...@@ -233,6 +229,28 @@ export class PuppetPadchat extends Puppet { ...@@ -233,6 +229,28 @@ export class PuppetPadchat extends Puppet {
await this.bridge.start() await this.bridge.start()
} }
protected onPadchatMessage(rawPayload: PadchatMessagePayload) {
log.verbose('PuppetPadchat', 'onPadchatMessage({id=%s, type=%s(%s)})',
rawPayload.msg_id,
PadchatMessageType[rawPayload.sub_type],
rawPayload.msg_type,
)
switch (rawPayload.sub_type) {
case PadchatMessageType.VerifyMsg:
this.cachePadchatFriendRequestPayload.set(rawPayload.msg_id, rawPayload)
this.emit('friend', rawPayload.msg_id)
break
default:
this.cachePadchatMessagePayload.set(
rawPayload.msg_id,
rawPayload,
)
this.emit('message', rawPayload.msg_id)
break
}
}
public async stop(): Promise<void> { public async stop(): Promise<void> {
log.verbose('PuppetPadchat', 'quit()') log.verbose('PuppetPadchat', 'quit()')
...@@ -311,14 +329,14 @@ export class PuppetPadchat extends Puppet { ...@@ -311,14 +329,14 @@ export class PuppetPadchat extends Puppet {
} }
public async contactRawPayload(contactId: string): Promise<PadchatContactPayload> { public async contactRawPayload(contactId: string): Promise<PadchatContactPayload> {
log.verbose('PuppetPadchat', 'contactRawPayload(%s)', contactId) log.silly('PuppetPadchat', 'contactRawPayload(%s)', contactId)
const rawPayload = await this.bridge.contactRawPayload(contactId) const rawPayload = await this.bridge.contactRawPayload(contactId)
return rawPayload return rawPayload
} }
public async contactRawPayloadParser(rawPayload: PadchatContactPayload): Promise<ContactPayload> { public async contactRawPayloadParser(rawPayload: PadchatContactPayload): Promise<ContactPayload> {
log.verbose('PuppetPadchat', 'contactRawPayloadParser(rawPayload.user_name="%s")', rawPayload.user_name) log.silly('PuppetPadchat', 'contactRawPayloadParser({user_name="%s"})', rawPayload.user_name)
const payload: ContactPayload = pfHelper.contactRawPayloadParser(rawPayload) const payload: ContactPayload = pfHelper.contactRawPayloadParser(rawPayload)
return payload return payload
...@@ -562,6 +580,18 @@ export class PuppetPadchat extends Puppet { ...@@ -562,6 +580,18 @@ export class PuppetPadchat extends Puppet {
await this.bridge.WXQuitChatRoom(roomId) await this.bridge.WXQuitChatRoom(roomId)
} }
public async roomAnnounce(roomId: string) : Promise<string>
public async roomAnnounce(roomId: string, text: string) : Promise<void>
public async roomAnnounce(roomId: string, text?: string): Promise<void | string> {
log.verbose('PuppetPadchat', 'roomAnnounce(%s, %s)', roomId, text ? text : '')
if (text) {
await this.bridge.WXSetChatroomAnnouncement(roomId, text)
} else {
return await this.bridge.WXGetChatroomAnnouncement(roomId)
}
}
/** /**
* *
* FriendRequest * FriendRequest
...@@ -615,23 +645,22 @@ export class PuppetPadchat extends Puppet { ...@@ -615,23 +645,22 @@ export class PuppetPadchat extends Puppet {
// ) // )
} }
public async friendRequestRawPayloadParser(rawPayload: any) : Promise<FriendRequestPayload> { public async friendRequestRawPayloadParser(rawPayload: PadchatMessagePayload) : Promise<FriendRequestPayload> {
log.verbose('PuppetPadchat', 'friendRequestRawPayloadParser(%s)', rawPayload) log.verbose('PuppetPadchat', 'friendRequestRawPayloadParser(%s)', rawPayload)
const payload: FriendRequestPayload = pfHelper.friendRequestRawPayloadParser(rawPayload) const payload: FriendRequestPayload = pfHelper.friendRequestRawPayloadParser(rawPayload)
return payload return payload
} }
public async friendRequestRawPayload(id: string): Promise<any> { public async friendRequestRawPayload(friendRequestId: string): Promise<PadchatMessagePayload> {
// log.verbose('PuppetPadchat', 'friendRequestRawPayload(%s)', id) log.verbose('PuppetPadchat', 'friendRequestRawPayload(%s)', friendRequestId)
throw new Error('todo: ' + id) const rawPayload = this.cachePadchatFriendRequestPayload.get(friendRequestId)
// const rawPayload = this.cacheMessageRawPayload.get(id) if (!rawPayload) {
// if (!rawPayload) { throw new Error('no rawPayload')
// throw new Error('no rawPayload') }
// }
// return rawPayload return rawPayload
} }
} }
......
...@@ -135,7 +135,7 @@ export class PadchatPureFunctionHelper { ...@@ -135,7 +135,7 @@ export class PadchatPureFunctionHelper {
rawPayload: PadchatMessagePayload, rawPayload: PadchatMessagePayload,
): MessagePayload { ): MessagePayload {
console.log(rawPayload) // console.log(rawPayload)
let type: MessageType let type: MessageType
...@@ -189,10 +189,11 @@ export class PadchatPureFunctionHelper { ...@@ -189,10 +189,11 @@ export class PadchatPureFunctionHelper {
// Msg from room // Msg from room
if (this.isRoomId(rawPayload.from_user)) { if (this.isRoomId(rawPayload.from_user)) {
const parts = rawPayload.content.split(':\n')
// update fromId to actual sender instead of the room // update fromId to actual sender instead of the room
payloadBase.fromId = rawPayload.content.split(':\n')[0] payloadBase.fromId = parts[0]
// update the text to actual text of the message // update the text to actual text of the message
payloadBase.text = rawPayload.content.split(':\n')[1] payloadBase.text = parts[1]
roomId = rawPayload.from_user roomId = rawPayload.from_user
...@@ -236,39 +237,22 @@ export class PadchatPureFunctionHelper { ...@@ -236,39 +237,22 @@ export class PadchatPureFunctionHelper {
public static roomRawPayloadParser( public static roomRawPayloadParser(
rawPayload : PadchatRoomPayload, rawPayload : PadchatRoomPayload,
// roomRawMemberList : PadchatRoomMember[],
): RoomPayload { ): RoomPayload {
// const aliasDict = {} as { [id: string]: string | undefined }
// if (Array.isArray(roomRawMemberList)) {
// roomRawMemberList.forEach(
// rawMember => {
// aliasDict[rawMember.user_name] = rawMember.chatroom_nick_name
// },
// )
// }
// const memberIdList = roomRawMemberList.map(m => m.user_name)
const payload: RoomPayload = { const payload: RoomPayload = {
id : rawPayload.user_name, id : rawPayload.user_name,
topic : rawPayload.nick_name, topic : rawPayload.nick_name,
ownerId : rawPayload.chatroom_owner, ownerId : rawPayload.chatroom_owner,
// memberIdList,
// aliasDict,
} }
return payload return payload
} }
public static friendRequestRawPayloadParser( public static friendRequestRawPayloadParser(
rawPayload: any, rawPayload: PadchatMessagePayload,
) : FriendRequestPayload { ) : FriendRequestPayload {
// to do: throw new Error('to do ' + rawPayload)
throw new Error('todo' + rawPayload) // switch (rawPayload.sub_type) {
// case PadchatMessageType.VerifyMsg:
// switch (rawPayload.MsgType) {
// case WebMessageType.VERIFYMSG:
// if (!rawPayload.RecommendInfo) { // if (!rawPayload.RecommendInfo) {
// throw new Error('no RecommendInfo') // throw new Error('no RecommendInfo')
// } // }
...@@ -287,7 +271,7 @@ export class PadchatPureFunctionHelper { ...@@ -287,7 +271,7 @@ export class PadchatPureFunctionHelper {
// } // }
// return payloadReceive // return payloadReceive
// case WebMessageType.SYS: // case PadchatMessageType.Sys:
// const payloadConfirm: FriendRequestPayloadConfirm = { // const payloadConfirm: FriendRequestPayloadConfirm = {
// id : rawPayload.MsgId, // id : rawPayload.MsgId,
// contactId : rawPayload.FromUserName, // contactId : rawPayload.FromUserName,
...@@ -298,7 +282,6 @@ export class PadchatPureFunctionHelper { ...@@ -298,7 +282,6 @@ export class PadchatPureFunctionHelper {
// default: // default:
// throw new Error('not supported friend request message raw payload') // throw new Error('not supported friend request message raw payload')
// } // }
} }
public static async imageBase64ToQrCode(base64: string): Promise<string> { public static async imageBase64ToQrCode(base64: string): Promise<string> {
......
...@@ -354,7 +354,7 @@ export abstract class Puppet extends EventEmitter implements Sayable { ...@@ -354,7 +354,7 @@ export abstract class Puppet extends EventEmitter implements Sayable {
*/ */
public abstract async contactAlias(contactId: string) : Promise<string> public abstract async contactAlias(contactId: string) : Promise<string>
public abstract async contactAlias(contactId: string, alias: string | null) : Promise<void> public abstract async contactAlias(contactId: string, alias: string | null) : Promise<void>
public abstract async contactAlias(contactId: string, alias?: string|null) : Promise<string | void> // public abstract async contactAlias(contactId: string, alias?: string|null) : Promise<string | void>
public abstract async contactAvatar(contactId: string) : Promise<FileBox> public abstract async contactAvatar(contactId: string) : Promise<FileBox>
public abstract async contactList() : Promise<string[]> public abstract async contactList() : Promise<string[]>
...@@ -464,7 +464,7 @@ export abstract class Puppet extends EventEmitter implements Sayable { ...@@ -464,7 +464,7 @@ export abstract class Puppet extends EventEmitter implements Sayable {
} }
if (noCache) { if (noCache) {
log.silly('Puppet', 'contactPayload() cache PURGE') log.silly('Puppet', 'contactPayload(%s) cache PURGE', contactId)
this.cacheContactPayload.del(contactId) this.cacheContactPayload.del(contactId)
...@@ -484,7 +484,7 @@ export abstract class Puppet extends EventEmitter implements Sayable { ...@@ -484,7 +484,7 @@ export abstract class Puppet extends EventEmitter implements Sayable {
const payload = await this.contactRawPayloadParser(rawPayload) const payload = await this.contactRawPayloadParser(rawPayload)
this.cacheContactPayload.set(contactId, payload) this.cacheContactPayload.set(contactId, payload)
log.silly('Puppet', 'contactPayload() cache SET') log.silly('Puppet', 'contactPayload(%s) cache SET', contactId)
return payload return payload
} }
...@@ -527,7 +527,7 @@ export abstract class Puppet extends EventEmitter implements Sayable { ...@@ -527,7 +527,7 @@ export abstract class Puppet extends EventEmitter implements Sayable {
} }
if (noCache) { if (noCache) {
log.silly('Puppet', 'friendRequestPayload() cache PURGE') log.silly('Puppet', 'friendRequestPayload(%s) cache PURGE', friendRequestId)
this.cacheFriendRequestPayload.del(friendRequestId) this.cacheFriendRequestPayload.del(friendRequestId)
...@@ -590,7 +590,7 @@ export abstract class Puppet extends EventEmitter implements Sayable { ...@@ -590,7 +590,7 @@ export abstract class Puppet extends EventEmitter implements Sayable {
} }
if (noCache) { if (noCache) {
log.silly('Puppet', 'messagePayload() cache PURGE') log.silly('Puppet', 'messagePayload(%s) cache PURGE', messageId)
this.cacheMessagePayload.del(messageId) this.cacheMessagePayload.del(messageId)
...@@ -610,7 +610,7 @@ export abstract class Puppet extends EventEmitter implements Sayable { ...@@ -610,7 +610,7 @@ export abstract class Puppet extends EventEmitter implements Sayable {
const payload = await this.messageRawPayloadParser(rawPayload) const payload = await this.messageRawPayloadParser(rawPayload)
this.cacheMessagePayload.set(messageId, payload) this.cacheMessagePayload.set(messageId, payload)
log.silly('Puppet', 'messagePayload() cache SET') log.silly('Puppet', 'messagePayload(%s) cache SET', messageId)
return payload return payload
} }
...@@ -639,6 +639,9 @@ export abstract class Puppet extends EventEmitter implements Sayable { ...@@ -639,6 +639,9 @@ export abstract class Puppet extends EventEmitter implements Sayable {
public abstract async roomMemberRawPayload(roomId: string, contactId: string) : Promise<any> public abstract async roomMemberRawPayload(roomId: string, contactId: string) : Promise<any>
public abstract async roomMemberRawPayloadParser(rawPayload: any) : Promise<RoomMemberPayload> public abstract async roomMemberRawPayloadParser(rawPayload: any) : Promise<RoomMemberPayload>
public abstract async roomAnnounce(roomId: string) : Promise<string>
public abstract async roomAnnounce(roomId: string, text: string) : Promise<void>
public async roomMemberSearch( public async roomMemberSearch(
roomId : string, roomId : string,
query : string | RoomMemberQueryFilter, query : string | RoomMemberQueryFilter,
...@@ -790,7 +793,7 @@ export abstract class Puppet extends EventEmitter implements Sayable { ...@@ -790,7 +793,7 @@ export abstract class Puppet extends EventEmitter implements Sayable {
} }
if (noCache) { if (noCache) {
log.silly('Puppet', 'roomPayload() cache PURGE') log.silly('Puppet', 'roomPayload(%s) cache PURGE', roomId)
this.cacheRoomPayload.del(roomId) this.cacheRoomPayload.del(roomId)
...@@ -810,7 +813,7 @@ export abstract class Puppet extends EventEmitter implements Sayable { ...@@ -810,7 +813,7 @@ export abstract class Puppet extends EventEmitter implements Sayable {
const payload = await this.roomRawPayloadParser(rawPayload) const payload = await this.roomRawPayloadParser(rawPayload)
this.cacheRoomPayload.set(roomId, payload) this.cacheRoomPayload.set(roomId, payload)
log.silly('Puppet', 'roomPayload() cache SET') log.silly('Puppet', 'roomPayload(%s) cache SET', roomId)
return payload return payload
} }
...@@ -833,9 +836,9 @@ export abstract class Puppet extends EventEmitter implements Sayable { ...@@ -833,9 +836,9 @@ export abstract class Puppet extends EventEmitter implements Sayable {
const cachedPayload = this.cacheRoomMemberPayload.get(cacheKey) const cachedPayload = this.cacheRoomMemberPayload.get(cacheKey)
if (cachedPayload) { if (cachedPayload) {
log.silly('Puppet', 'roomMemberPayloadCache() cache HIT') log.silly('Puppet', 'roomMemberPayloadCache(%s) cache HIT', roomId)
} else { } else {
log.silly('Puppet', 'roomMemberPayloadCache() cache MISS') log.silly('Puppet', 'roomMemberPayloadCache(%s) cache MISS', roomId)
} }
return cachedPayload return cachedPayload
...@@ -855,7 +858,7 @@ export abstract class Puppet extends EventEmitter implements Sayable { ...@@ -855,7 +858,7 @@ export abstract class Puppet extends EventEmitter implements Sayable {
const cacheKey = this.cacheKeyRoomMember(roomId, contactId) const cacheKey = this.cacheKeyRoomMember(roomId, contactId)
if (noCache) { if (noCache) {
log.silly('Puppet', 'roomMemberPayload() cache PURGE') log.silly('Puppet', 'roomMemberPayload(%s) cache PURGE', roomId)
this.cacheRoomMemberPayload.del(cacheKey) this.cacheRoomMemberPayload.del(cacheKey)
...@@ -874,7 +877,7 @@ export abstract class Puppet extends EventEmitter implements Sayable { ...@@ -874,7 +877,7 @@ export abstract class Puppet extends EventEmitter implements Sayable {
const payload = await this.roomMemberRawPayloadParser(rawPayload) const payload = await this.roomMemberRawPayloadParser(rawPayload)
this.cacheRoomMemberPayload.set(cacheKey, payload) this.cacheRoomMemberPayload.set(cacheKey, payload)
log.silly('Puppet', 'roomMemberPayload() cache SET') log.silly('Puppet', 'roomMemberPayload(%s) cache SET', roomId)
return payload return payload
} }
......
...@@ -538,6 +538,25 @@ export class Room extends Accessory implements Sayable { ...@@ -538,6 +538,25 @@ export class Room extends Accessory implements Sayable {
return future return future
} }
public async announce() : Promise<string>
public async announce(text: string) : Promise<void>
public async announce(text?: string): Promise<void | string> {
log.verbose('Room', 'announce(%s)', text ? text : '')
if (text) {
await this.puppet.roomAnnounce(this.id, text)
} else {
return await this.puppet.roomAnnounce(this.id)
}
}
// TODO
public async qrcode(): Promise<string> {
log.verbose('Room', 'qrcode()')
return 'qrcode url for entry room'
}
/** /**
* Return contact's roomAlias in the room, the same as roomAlias * Return contact's roomAlias in the room, the same as roomAlias
* @param {Contact} contact * @param {Contact} contact
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册