Skip to content
This repository has been archived by the owner on Jun 1, 2020. It is now read-only.

Commit

Permalink
add app message process logic
Browse files Browse the repository at this point in the history
  • Loading branch information
windmemory committed Aug 11, 2018
1 parent 4d5381d commit a2cc86f
Show file tree
Hide file tree
Showing 8 changed files with 436 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/padchat-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -742,7 +742,7 @@ export class PadchatManager extends PadchatRpc {
if (!this.cacheRoomRawPayload) {
throw new Error('cache not inited' )
}
const roomIdList = [...this.cacheRoomRawPayload.keys()]
const roomIdList = [...this.cacheRoomRawPayload.keys()].filter(id => !!id)
log.verbose('PuppetPadchatManager', 'getRoomIdList()=%d', roomIdList.length)
return roomIdList
}
Expand Down
9 changes: 9 additions & 0 deletions src/padchat-schemas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import {
ContactGender,
FriendshipType,
AppType
} from 'wechaty-puppet'

// 1 when use WXSyncContact, 0 when use WXGetContact
Expand Down Expand Up @@ -449,6 +450,14 @@ export interface PadchatRoomInvitationPayload {
url: string,
}

export interface PadchatAppMessagePayload {
des?: string,
thumburl?: string,
title: string,
url: string,
type: AppType
}

export interface PadchatFriendshipPayload {
fromusername : string, // 'lizhuohuan'
encryptusername : string, // v1_xxx@stranger'
Expand Down
11 changes: 11 additions & 0 deletions src/puppet-padchat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ import {
roomLeaveEventMessageParser,
roomRawPayloadParser,
roomTopicEventMessageParser,
appMessageParser,
} from './pure-function-helpers'

import {
Expand Down Expand Up @@ -330,6 +331,14 @@ export class PuppetPadchat extends Puppet {
}
}

protected async onPadchatAppMessage (rawPayload: PadchatMessagePayload): Promise<void> {
log.info('PuppetPadchat', JSON.stringify(rawPayload, null, 2))

const appMsg = appMessageParser(rawPayload)
log.info('PuppetPadchat', JSON.stringify(appMsg, null, 2))
this.emit('message', rawPayload.msg_id)
}

protected async onPadchatMessageRoomInvitation (rawPayload: PadchatMessagePayload): Promise<void> {
log.verbose('PuppetPadchat', 'onPadchatMessageRoomInvitation(%s)', rawPayload)
const roomInviteEvent = await roomInviteEventMessageParser(rawPayload)
Expand All @@ -342,6 +351,8 @@ export class PuppetPadchat extends Puppet {
await this.padchatManager.saveRoomInvitationRawPayload(roomInviteEvent)

this.emit('room-invite', roomInviteEvent.msgId)
} else {
this.emit('message', rawPayload.msg_id)
}
}

Expand Down
17 changes: 17 additions & 0 deletions src/pure-function-helpers/app-message-generator.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { AppPayload } from "wechaty-puppet";

export const generateAppXMLMessage = ({ title, des, url, thumburl, appType }: AppPayload): string => {
return `
<appmsg appid="" sdkver="0">
<title>${title}</title>
<des>${des}</des>
<username></username>
<action>view</action>
<type>${appType}</type>
<showtype>0</showtype>
<url>${url}</url>
<contentattr>0</contentattr>
${thumburl ? '<thumburl>' + thumburl + '</thumburl>' : ''}
</appmsg>
`
}
1 change: 1 addition & 0 deletions src/pure-function-helpers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
*
*/

export * from './message-app-payload-parser'
export * from './compatible-wei-bug'
export * from './contact-raw-payload-parser'
export * from './file-box-to-qrcode'
Expand Down
319 changes: 319 additions & 0 deletions src/pure-function-helpers/message-app-payload-parser.spec.ts

Large diffs are not rendered by default.

60 changes: 60 additions & 0 deletions src/pure-function-helpers/message-app-payload-parser.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import { toJson } from 'xml2json'

import {
PadchatMessagePayload, PadchatAppMessagePayload
} from '../padchat-schemas'

import { isPayload } from './is-type'
import { AppType } from 'wechaty-puppet'

export function appMessageParser(rawPayload: PadchatMessagePayload): PadchatAppMessagePayload | null {
if (!isPayload(rawPayload)) {
return null
}

const { content, msg_id, timestamp, from_user } = rawPayload

interface XmlSchema {
msg: {
appmsg: {
title: string,
des: string,
type: number,
url: string,
appattach: {
totallen: string,
attachid: any,
emoticonmd5: any,
fileext: any,
cdnthumbaeskey: any,
aeskey: any
},
thumburl: string,
md5: any,
recorditem?: string
},
fromusername: string,
appinfo: {
appname: any
}
}
}

const tryXmlText = content.replace(/^[^\n]+\n/, '')

try {
const jsonPayload = toJson(tryXmlText, { object: true }) as XmlSchema

console.log(jsonPayload.msg.appmsg.type === AppType.Link)
return {
title: jsonPayload.msg.appmsg.title,
des: jsonPayload.msg.appmsg.des,
url: jsonPayload.msg.appmsg.url,
thumburl: jsonPayload.msg.appmsg.thumburl,
type: jsonPayload.msg.appmsg.type
}
} catch (e) {
console.error(e)
return null
}
}
18 changes: 18 additions & 0 deletions src/pure-function-helpers/message-raw-payload-parser.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import {
MessagePayload,
MessageType,
AppType,
} from 'wechaty-puppet'

import {
Expand All @@ -19,6 +20,7 @@ import {
import {
messageType,
} from './message-type'
import { appMessageParser } from '.';

export function messageRawPayloadParser (
rawPayload: PadchatMessagePayload,
Expand Down Expand Up @@ -185,5 +187,21 @@ export function messageRawPayloadParser (
throw new Error('neither toId nor roomId')
}

if (type === MessageType.Attachment) {
const appPayload = appMessageParser(rawPayload)
if (appPayload) {
if (appPayload.type === AppType.Link) {
payload.type = MessageType.Link
}
payload.appPayload = {
title: appPayload.title,
des: appPayload.des,
url: appPayload.url,
thumburl: appPayload.thumburl,
appType: appPayload.type
}
}
}

return payload
}

0 comments on commit a2cc86f

Please sign in to comment.