Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Users Mapping Optimization #83

Merged
merged 8 commits into from
Jul 22, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -66,3 +66,4 @@ t/

.DS_Store
.idea
config.yaml
2 changes: 2 additions & 0 deletions bin/matrix-appservice-wechaty.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@ import {
log,
VERSION,
} from '../src/'
import dotenv from 'dotenv'

dotenv.config()
async function main () {
if (process.env.LOG_LEVEL) {
log.level(process.env.LOG_LEVEL as any)
Expand Down
9 changes: 6 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "matrix-appservice-wechaty",
"version": "0.8.28",
"version": "0.8.30",
"description": "Matrix Application Services Bridge for Wechat",
"main": "dist/src/index.js",
"typings": "dist/src/index.d.ts",
Expand All @@ -13,6 +13,8 @@
"lint:es": "eslint --ignore-pattern tests/fixtures/ '{bin,src,tests}/**/*.ts' ",
"lint:ts": "tsc --noEmit",
"dev": "LOG_LEVEL=silly ts-node bin/matrix-appservice-wechaty.ts",
"dev:genarate-registration": "ts-node bin/matrix-appservice-wechaty.ts --config config.yaml --url http://localhost:8788 --generate-registration",
"dev:service": "ts-node bin/matrix-appservice-wechaty.ts --config config.yaml --file wechaty-registration.yaml",
"dev:watch": "LOG_LEVEL=silly npx nodemon --watch '{bin,src,tests}/**/*.ts' --exec './node_modules/.bin/ts-node' bin/matrix-appservice-wechaty.ts",
"pack": "npm pack",
"sloc": "sloc bin scripts src tests --details --format cli-table --keys total,source,comment && sloc bin scripts src tests",
Expand Down Expand Up @@ -40,10 +42,11 @@
"homepage": "https://github.com/huan/matrix-appservice-wechaty#readme",
"dependencies": {
"cuid": "^2.1.8",
"matrix-appservice-bridge": "^2.4.1",
"dotenv": "^10.0.0",
"matrix-appservice-bridge": "^2.7.0",
"read-pkg-up": "^7.0.1",
"update-notifier": "^5.1.0",
"wechaty": "^0.62.2"
"wechaty": "^0.62.3"
},
"devDependencies": {
"@chatie/eslint-config": "^0.12.3",
Expand Down
19 changes: 19 additions & 0 deletions src/appservice-manager.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import cuid from 'cuid'
import { ReadStream } from 'fs'

import {
Bridge,
Expand All @@ -7,6 +8,7 @@ import {
UserBridgeStore,
MatrixRoom,
AppServiceRegistration,
FileUploadOpts,
} from 'matrix-appservice-bridge'

import {
Expand Down Expand Up @@ -210,6 +212,9 @@ export class AppserviceManager extends Manager {
})

const matrixRoom = new MatrixRoom(roomInfo.room_id)
for await (const userId of userIdList.slice(1)) {
await this.bridge.getIntent(userId).join(matrixRoom.getId())
}
return matrixRoom
}

Expand All @@ -232,4 +237,18 @@ export class AppserviceManager extends Manager {
return Object.keys(result.joined)
}

public async setProfile (userId: string, avataUrl: string, displayName: string): Promise<void> {
const intent = this.bridge.getIntent(userId)
await intent.setAvatarUrl(avataUrl)
await intent.setDisplayName(displayName)
}

public async uploadContent (
content: string | Buffer | ReadStream,
userId?: string,
opts?: FileUploadOpts | undefined
): Promise<string> {
return this.bridge.getIntent(userId).uploadContent(content, opts)
}

}
22 changes: 20 additions & 2 deletions src/middle-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -264,12 +264,29 @@ export class MiddleManager extends Manager {
)

const matrixUserId = this.appserviceManager.generateVirtualUserId()
const matrixUser = new MatrixUser(matrixUserId)

const avatarFile = await wechatyUser.avatar()
const avatarBuffer = await avatarFile.toBuffer()
const avatarUrl = await this.appserviceManager.uploadContent(
avatarBuffer,
matrixUserId,
{ type: avatarFile.mimeType },
)
Comment on lines +268 to +274
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can also use the wechat image source url directly.


const matrixUser = new MatrixUser(matrixUserId, {
avatarUrl,
displayName: wechatyUser.name(),
})

// userData.name = wechatyUser.name() + APPSERVICE_NAME_POSTFIX

matrixUser.set(WECHATY_USER_DATA_KEY, userData)
await this.appserviceManager.userStore.setMatrixUser(matrixUser)
void this.appserviceManager.setProfile(
matrixUserId,
avatarUrl,
wechatyUser.name()
)

return matrixUser
}
Expand Down Expand Up @@ -300,7 +317,8 @@ export class MiddleManager extends Manager {
roomName = await wechatyRoomOrUser.topic()
for await (const member of wechatyRoomOrUser) {
const matrixUser = await this.matrixUser(member)
inviteeIdList.push(matrixUser.getId())
this.wechatyManager.ifSelfWechaty(member.id)
|| inviteeIdList.push(matrixUser.getId())
}
} else if (wechatyRoomOrUser instanceof WechatyUser) {
// User: direct message
Expand Down
8 changes: 7 additions & 1 deletion src/wechaty-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ export class WechatyManager extends Manager {

protected matrixWechatyDict: Map<string, Wechaty>
protected wechatyMatrixDict: WeakMap<Wechaty, string>
protected selfWechaty: Wechaty | undefined

public appserviceManager!: AppserviceManager
public middleManager!: MiddleManager
Expand Down Expand Up @@ -237,6 +238,7 @@ export class WechatyManager extends Manager {
wechatyContact: Contact,
): Promise<void> {
log.verbose('WechatyManager', 'onLogin(%s)', wechatyContact)
this.selfWechaty = wechatyContact.wechaty

const text = 'You are now logged in to Wechat. Your user name is: ' + wechatyContact.name()

Expand Down Expand Up @@ -270,7 +272,7 @@ export class WechatyManager extends Manager {
log.verbose('WechatyManager', 'onMessage("%s") from "%s" to "%s" with age "%s" (timestamp: "%s")',
message,
message.from()!.id,
message.to()!.id,
(message.to() || message.room())!.id,
message.age(),
(message as any).payload.timestamp,
)
Expand Down Expand Up @@ -350,4 +352,8 @@ export class WechatyManager extends Manager {
// )
}

public ifSelfWechaty (wechatyId:string):boolean {
return this.selfWechaty!.puppet.selfId() === wechatyId
}

}