Skip to content

[FEAT]get post sayable from server posts #2530

@hcfw007

Description

@hcfw007

In wechaty post mixin:

if (PUPPET.payloads.isPostServer(this.payload)) {
for (const messageId of this.payload.sayableList) {
const message = await this.wechaty.Message.find({ id: messageId })
if (message) {
const sayable = await message.toSayable()
if (sayable) {
yield sayable
}
}
}

We get server post sayable by loading messages from the sayable id. This works for mixed messages (messages containing many sayables), however for moment and moment replies, it doesn't make no scence to convert them to messages.

So I say we create puppet method to get sayables with id, it should be somehting like this:

wechaty-puppet

    // get a sayable from server post (which comes with Id)
    abstract postPayloadSayable (postId: string, sayableId: string): Promise<SayablePayload>

wechaty:

  async * [Symbol.asyncIterator] (): AsyncIterableIterator<Sayable> {
    log.verbose('Post', '[Symbol.asyncIterator]()')

    const payloadToSayable = payloadToSayableWechaty(this.wechaty)

    if (PUPPET.payloads.isPostServer(this.payload)) {
      for (const sayableId of this.payload.sayableList) {
        const sayable = await this.getSayableWithId(sayableId)

        if (sayable) {
          yield sayable
        }
      }

    } else {  // client
      for (const sayablePayload of this.payload.sayableList) {
        const sayable = await payloadToSayable(sayablePayload)
        if (sayable) {
          yield sayable
        }
      }

    }
  }

  async getSayableWithIndex (sayableIndex: number) {
    log.verbose('Post', 'getSayableWithIndex(%s)', sayableIndex)

    const payloadToSayable = payloadToSayableWechaty(this.wechaty)

    if (PUPPET.payloads.isPostServer(this.payload)) {
      const sayablePayload = await this.wechaty.puppet.postPayloadSayable(this.id!, this.payload.sayableList[sayableIndex]!)
      const sayable = await payloadToSayable(sayablePayload)
      return sayable
    } else {
      const sayablePayload = this.payload.sayableList[sayableIndex]
      if (sayablePayload) {
        const sayable = await payloadToSayable(sayablePayload)
        return sayable
      } else {
        throw new Error(`post has no sayable with index ${sayableIndex}`)
      }
    }
  }

  async getSayableWithId (id: string) {
    log.verbose('Post', 'getSayableWithId(%s)', id)

    if (PUPPET.payloads.isPostServer(this.payload)) {
      const payloadToSayable = payloadToSayableWechaty(this.wechaty)
      const sayablePayload = await this.wechaty.puppet.postPayloadSayable(this.id!, id)
      const sayable = await payloadToSayable(sayablePayload)
      return sayable
    } else {
      throw new Error('client post sayable has no Id')
    }
  }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions