howdyai / botkit

Botkit is an open source developer tool for building chat bots, apps and custom integrations for major messaging platforms.
MIT License
11.49k stars 2.28k forks source link

Webex Teams startPrivateConversation error: TypeError: Cannot read property 'id' of undefined #1913

Open darrenparkinson opened 4 years ago

darrenparkinson commented 4 years ago

What are you trying to achieve or the steps to reproduce?

In Webex Teams, after a group chat message, I am trying to initiate a private conversation with the user that initiated the chat using await bot.startPrivateConversation(message.user)

What was the result you received?

On doing this, I receive the following error:

TypeError: Cannot read property 'id' of undefined

It is this line in conversationState.js that is throwing the error:

const conversationId: string = Object.keys(activity.conversation).sort().map((key) => activity.conversation[key]).filter((val) => val !== '' && val !== null && typeof val !== 'undefined').join('-') + '-' + activity.from.id;

This seems to be because activity.conversation essentially just contains { id: 'temporary-value' } and this.changeContext is returning an empty object.

And in botworker.js, the BotWorker.changeContext function never gets past this line:

const dialogContext = yield this._controller.dialogSet.createContext(turnContext);

What did you expect?

I expected a direct conversation with the user.

Context:

It seems this may be a known issue because the documentation for startPrivateConversation says:

Change the context of the next message Due to a quirk in the Webex API, we can't know the address of the DM until after sending the first message. As a result, the internal tracking for this conversation can't be persisted properly. USE WITH CAUTION while we try to sort this out.

This seems to imply that it should work at some level?

Thanks.

dstaudt commented 4 years ago

Seeing the same issue. Perhaps an approach could be to go ahead and accept a required message parameter in startPrivateConversation (as well as startConversationInRoom). The function could then go ahead and send the message, await the response, and extract the roomId/from etc. so that context creation works correctly...

benbrown commented 4 years ago

@darrenparkinson what do you think of the above proposed solution, that the startPrivateConversation and related features take a first message parameter that is used to create the conversation ID?

stale[bot] commented 4 years ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

benbrown commented 4 years ago

not stale

gerice92 commented 4 years ago

Is this issue still open? i'm having exactly the same issue in botkit for webexteams.

stale[bot] commented 4 years ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

dstaudt commented 4 years ago

Issue still exists and developers are still running into it...humbly bumped.

benbrown commented 4 years ago

hey @dstaudt thanks for the bump.

I think we should go ahead and implement your suggested fix - require a message to begin the conversation.

I can do this for the next release.

dstaudt commented 4 years ago

Sounds good, happy to help with testing/validation if useful.

stale[bot] commented 3 years ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

dstaudt commented 3 years ago

Bump to keep-alive, in hopes of a fix in 4.11

stale[bot] commented 3 years ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

dstaudt commented 3 years ago

Still present, bump in hopes of a fix

seansbox commented 2 years ago

Can anyone share a workaround for the time being?

jcalve commented 2 years ago

@seansbox this workaround works for me, replace toPersonEmail with roomId for room messages.

let bot = await controller.spawn();
let message = "The message";
let user_email = "example@mail.com";

bot.api.messages
   .create({  // This already sends the message
       toPersonEmail: user_email,
       markdown: message,
   })
   .then((message) => maybe_do_something_after(message))
derchrisuk commented 2 years ago

What is the current status on this?