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

code clean & bug fix & refactoring

上级 ed72a78b
......@@ -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
......@@ -600,6 +605,28 @@ export class Contact extends Accessory implements Sayable {
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
......@@ -86,9 +86,6 @@ export class Bridge extends EventEmitter {
super() // for EventEmitter
log.verbose('PuppetPadchatBridge', 'constructor()')
// this.userId = options.token
// this.initCache()
this.autoData = {}
this.padchatRpc = new PadchatRpc(options.endpoint, options.token)
......@@ -215,7 +212,9 @@ export class Bridge extends EventEmitter {
public logout(): void {
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
......@@ -568,7 +567,7 @@ export class Bridge extends EventEmitter {
public async syncRoomMember(
roomId: string,
): Promise<{ [contactId: string]: PadchatRoomMemberPayload }> {
log.verbose('PuppetPadchatBridge', 'syncRoomMember(%s)', roomId)
log.silly('PuppetPadchatBridge', 'syncRoomMember(%s)', roomId)
const memberListPayload = await this.padchatRpc.WXGetChatRoomMember(roomId)
......@@ -576,15 +575,14 @@ export class Bridge extends EventEmitter {
throw new Error('no memberListPayload')
}
log.silly('PuppetPadchatBridge', 'syncRoomMember(%s) total %d members',
roomId,
Object.keys(memberListPayload).length,
)
const memberDict: { [contactId: string]: PadchatRoomMemberPayload } = {}
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
memberDict[contactId] = memberPayload
}
......@@ -628,10 +626,10 @@ export class Bridge extends EventEmitter {
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,
[...this.cacheContactRawPayload.keys()].length,
[...this.cacheRoomRawPayload.keys()].length,
this.cacheContactRawPayload.size,
this.cacheRoomRawPayload.size,
)
for (const syncContact of syncContactList) {
......@@ -647,7 +645,7 @@ export class Bridge extends EventEmitter {
/**
* Room
*/
log.verbose('PuppetPadchatBridge', 'syncContactsAndRooms() sync Room %s(%s)',
log.silly('PuppetPadchatBridge', 'syncContactsAndRooms() updating Room %s(%s)',
syncContact.nick_name,
syncContact.user_name,
)
......@@ -661,7 +659,7 @@ export class Bridge extends EventEmitter {
/**
* Contact
*/
log.verbose('PuppetPadchatBridge', 'syncContactsAndRooms() sync Contact %s(%s)',
log.silly('PuppetPadchatBridge', 'syncContactsAndRooms() updating Contact %s(%s)',
syncContact.nick_name,
syncContact.user_name,
)
......@@ -693,41 +691,23 @@ export class Bridge extends EventEmitter {
}
}
// private async WXGetContact(id: string): Promise<PadchatContactPayload | PadchatRoomPayload> {
// const result = await this.jsonRpcCall('WXGetContact', [id])
// 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)
public async contactRawPayload(contactid: string): Promise<PadchatContactPayload> {
log.silly('PuppetPadchatBridge', 'contactRawPayload(%s)', contactid)
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) {
throw new Error('no cache')
}
if (this.cacheContactRawPayload.has(id)) {
return this.cacheContactRawPayload.get(id)
if (this.cacheContactRawPayload.has(contactid)) {
return this.cacheContactRawPayload.get(contactid)
}
const tryRawPayload = await this.padchatRpc.WXGetContactPayload(id)
const tryRawPayload = await this.padchatRpc.WXGetContactPayload(contactid)
if (tryRawPayload) {
this.cacheContactRawPayload.set(id, tryRawPayload)
this.cacheContactRawPayload.set(contactid, tryRawPayload)
return tryRawPayload
}
return retry(new Error('tryRawPayload empty'))
......@@ -831,4 +811,12 @@ export class Bridge extends EventEmitter {
public async WXAddUser(strangerV1: string, strangerV2: string, type: string, verify: string): Promise<void> {
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 {
if (padchatPayload.type === PadchatPayloadType.Logout) {
// this.emit('logout', this.selfId())
console.log('onSocketPadchat: ', JSON.stringify(padchatPayload))
this.emit('logout')
}
......@@ -552,17 +553,36 @@ export class PadchatRpc extends EventEmitter {
return emptyResult
}
// tslint:disable-next-line:max-line-length
// 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"}]'
// to Array (PadchatRoomRawMember[])
if (Array.isArray(JSON.parse(decodeURIComponent(result.member)))) {
result.member = JSON.parse(decodeURIComponent(result.member)) as PadchatRoomMemberPayload[]
} else {
log.warn('PadchatRpc', 'WXGetChatRoomMember(%s) member is not array: %s', roomId, JSON.stringify(result.member))
// throw Error('faild to parse chatroom member!')
try {
// tslint:disable-next-line:max-line-length
// 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"}]'
// to Array (PadchatRoomRawMember[])
if (Array.isArray(JSON.parse(decodeURIComponent(result.member)))) {
result.member = JSON.parse(decodeURIComponent(result.member)) as PadchatRoomMemberPayload[]
} else {
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 = []
}
return result
}
......@@ -1337,4 +1357,16 @@ export class PadchatRpc extends EventEmitter {
}
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 {
}
export enum PadchatRoomMemberStatus {
Zero = 0,
Todo,
}
......
......@@ -74,6 +74,7 @@ import {
PadchatRoomPayload,
// PadchatRoomMemberListPayload,
PadchatRoomMemberPayload,
PadchatMessageType,
// PadchatMessageType,
// PadchatContinue,
......@@ -89,7 +90,7 @@ export type ScanFoodType = 'scan' | 'login' | 'logout'
export class PuppetPadchat extends Puppet {
// 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 cachePadchatRoomPayload : LRU.Cache<string, PadchatRoomRawPayload>
......@@ -110,7 +111,7 @@ export class PuppetPadchat extends Puppet {
}
// 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.cachePadchatRoomPayload = new LRU<string, PadchatRoomRawPayload>(lruOptions)
......@@ -218,13 +219,8 @@ export class PuppetPadchat extends Puppet {
this.bridge.on('logout', () => {
this.logout()
})
this.bridge.on('message', (messagePayload: PadchatMessagePayload) => {
log.silly('PuppetPadchat', 'startBridge() bridge.on(message)')
this.cachePadchatMessagePayload.set(
messagePayload.msg_id,
messagePayload,
)
this.emit('message', messagePayload.msg_id)
this.bridge.on('message', (rawPayload: PadchatMessagePayload) => {
this.onPadchatMessage(rawPayload)
})
this.bridge.on('scan', (qrCode: string, status: number, data?: string) => {
this.emit('scan', qrCode, status, data)
......@@ -233,6 +229,28 @@ export class PuppetPadchat extends Puppet {
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> {
log.verbose('PuppetPadchat', 'quit()')
......@@ -311,14 +329,14 @@ export class PuppetPadchat extends Puppet {
}
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)
return rawPayload
}
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)
return payload
......@@ -562,6 +580,18 @@ export class PuppetPadchat extends Puppet {
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
......@@ -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)
const payload: FriendRequestPayload = pfHelper.friendRequestRawPayloadParser(rawPayload)
return payload
}
public async friendRequestRawPayload(id: string): Promise<any> {
// log.verbose('PuppetPadchat', 'friendRequestRawPayload(%s)', id)
public async friendRequestRawPayload(friendRequestId: string): Promise<PadchatMessagePayload> {
log.verbose('PuppetPadchat', 'friendRequestRawPayload(%s)', friendRequestId)
throw new Error('todo: ' + id)
// const rawPayload = this.cacheMessageRawPayload.get(id)
// if (!rawPayload) {
// throw new Error('no rawPayload')
// }
const rawPayload = this.cachePadchatFriendRequestPayload.get(friendRequestId)
if (!rawPayload) {
throw new Error('no rawPayload')
}
// return rawPayload
return rawPayload
}
}
......
......@@ -135,7 +135,7 @@ export class PadchatPureFunctionHelper {
rawPayload: PadchatMessagePayload,
): MessagePayload {
console.log(rawPayload)
// console.log(rawPayload)
let type: MessageType
......@@ -189,10 +189,11 @@ export class PadchatPureFunctionHelper {
// Msg from room
if (this.isRoomId(rawPayload.from_user)) {
const parts = rawPayload.content.split(':\n')
// 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
payloadBase.text = rawPayload.content.split(':\n')[1]
payloadBase.text = parts[1]
roomId = rawPayload.from_user
......@@ -236,39 +237,22 @@ export class PadchatPureFunctionHelper {
public static roomRawPayloadParser(
rawPayload : PadchatRoomPayload,
// roomRawMemberList : PadchatRoomMember[],
): 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 = {
id : rawPayload.user_name,
topic : rawPayload.nick_name,
ownerId : rawPayload.chatroom_owner,
// memberIdList,
// aliasDict,
}
return payload
}
public static friendRequestRawPayloadParser(
rawPayload: any,
rawPayload: PadchatMessagePayload,
) : FriendRequestPayload {
// to do:
throw new Error('todo' + rawPayload)
// switch (rawPayload.MsgType) {
// case WebMessageType.VERIFYMSG:
throw new Error('to do ' + rawPayload)
// switch (rawPayload.sub_type) {
// case PadchatMessageType.VerifyMsg:
// if (!rawPayload.RecommendInfo) {
// throw new Error('no RecommendInfo')
// }
......@@ -287,7 +271,7 @@ export class PadchatPureFunctionHelper {
// }
// return payloadReceive
// case WebMessageType.SYS:
// case PadchatMessageType.Sys:
// const payloadConfirm: FriendRequestPayloadConfirm = {
// id : rawPayload.MsgId,
// contactId : rawPayload.FromUserName,
......@@ -298,7 +282,6 @@ export class PadchatPureFunctionHelper {
// default:
// throw new Error('not supported friend request message raw payload')
// }
}
public static async imageBase64ToQrCode(base64: string): Promise<string> {
......
......@@ -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, 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 contactList() : Promise<string[]>
......@@ -464,7 +464,7 @@ export abstract class Puppet extends EventEmitter implements Sayable {
}
if (noCache) {
log.silly('Puppet', 'contactPayload() cache PURGE')
log.silly('Puppet', 'contactPayload(%s) cache PURGE', contactId)
this.cacheContactPayload.del(contactId)
......@@ -484,7 +484,7 @@ export abstract class Puppet extends EventEmitter implements Sayable {
const payload = await this.contactRawPayloadParser(rawPayload)
this.cacheContactPayload.set(contactId, payload)
log.silly('Puppet', 'contactPayload() cache SET')
log.silly('Puppet', 'contactPayload(%s) cache SET', contactId)
return payload
}
......@@ -527,7 +527,7 @@ export abstract class Puppet extends EventEmitter implements Sayable {
}
if (noCache) {
log.silly('Puppet', 'friendRequestPayload() cache PURGE')
log.silly('Puppet', 'friendRequestPayload(%s) cache PURGE', friendRequestId)
this.cacheFriendRequestPayload.del(friendRequestId)
......@@ -590,7 +590,7 @@ export abstract class Puppet extends EventEmitter implements Sayable {
}
if (noCache) {
log.silly('Puppet', 'messagePayload() cache PURGE')
log.silly('Puppet', 'messagePayload(%s) cache PURGE', messageId)
this.cacheMessagePayload.del(messageId)
......@@ -610,7 +610,7 @@ export abstract class Puppet extends EventEmitter implements Sayable {
const payload = await this.messageRawPayloadParser(rawPayload)
this.cacheMessagePayload.set(messageId, payload)
log.silly('Puppet', 'messagePayload() cache SET')
log.silly('Puppet', 'messagePayload(%s) cache SET', messageId)
return payload
}
......@@ -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 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(
roomId : string,
query : string | RoomMemberQueryFilter,
......@@ -790,7 +793,7 @@ export abstract class Puppet extends EventEmitter implements Sayable {
}
if (noCache) {
log.silly('Puppet', 'roomPayload() cache PURGE')
log.silly('Puppet', 'roomPayload(%s) cache PURGE', roomId)
this.cacheRoomPayload.del(roomId)
......@@ -810,7 +813,7 @@ export abstract class Puppet extends EventEmitter implements Sayable {
const payload = await this.roomRawPayloadParser(rawPayload)
this.cacheRoomPayload.set(roomId, payload)
log.silly('Puppet', 'roomPayload() cache SET')
log.silly('Puppet', 'roomPayload(%s) cache SET', roomId)
return payload
}
......@@ -833,9 +836,9 @@ export abstract class Puppet extends EventEmitter implements Sayable {
const cachedPayload = this.cacheRoomMemberPayload.get(cacheKey)
if (cachedPayload) {
log.silly('Puppet', 'roomMemberPayloadCache() cache HIT')
log.silly('Puppet', 'roomMemberPayloadCache(%s) cache HIT', roomId)
} else {
log.silly('Puppet', 'roomMemberPayloadCache() cache MISS')
log.silly('Puppet', 'roomMemberPayloadCache(%s) cache MISS', roomId)
}
return cachedPayload
......@@ -855,7 +858,7 @@ export abstract class Puppet extends EventEmitter implements Sayable {
const cacheKey = this.cacheKeyRoomMember(roomId, contactId)
if (noCache) {
log.silly('Puppet', 'roomMemberPayload() cache PURGE')
log.silly('Puppet', 'roomMemberPayload(%s) cache PURGE', roomId)
this.cacheRoomMemberPayload.del(cacheKey)
......@@ -874,7 +877,7 @@ export abstract class Puppet extends EventEmitter implements Sayable {
const payload = await this.roomMemberRawPayloadParser(rawPayload)
this.cacheRoomMemberPayload.set(cacheKey, payload)
log.silly('Puppet', 'roomMemberPayload() cache SET')
log.silly('Puppet', 'roomMemberPayload(%s) cache SET', roomId)
return payload
}
......
......@@ -538,6 +538,25 @@ export class Room extends Accessory implements Sayable {
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
* @param {Contact} contact
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册