sclass Handover { sclass Form_DoYouWantAHuman > FormInFlight { *() { steps.add(nu FormStep( key := "answer", displayText := "Would you like to be connected to a sales representative?", buttons := ll("Yes", "No") )); } S complete() { if (isYes(getValue("answer"))) { conversation.setForm(new ConnectToWorkerForm); ret ""; } ret "OK then have nice day"; } } sS handleHashtag(Conversation conversation, S tag) null { if (eqic(tag, "#ConnectMeToAHuman")) ret tryToConnect(conversation); if (eqic(tag, "#DoYouWantAHuman")) { conversation.setForm(new Form_DoYouWantAHuman); ret ""; // Text comes from Q&A admin } } sS tryToConnect(Conversation conversation) { if (workerChat.anyWorkersAvailable()) { conversation.setForm(new ConnectToWorkerForm); ret ""; } else ret noWorkerAvailableMsg(conversation); } sclass ConnectToWorkerForm > FormInFlight { runnable class TimeoutAction { onTimeout(); } S initialMessage() { addTimeout(20.0, new TimeoutAction); ret getCannedAnswer("#connecting", conversation); } void onWorkerAccepts(Worker worker) { // turn off bot done elsewhere // mark conversation as connected to worker done elsewhere conversation.cancelForm(); // cancel this form conversation.add(new Msg(getCannedAnswer("#connected", conv), false)); } void onTimeout() { /*new NoWorkerAvailable form; conversation.setForm(); conversation.add(new Msg(form.initialMessage(), false));*/ conversation.add(new Msg(noWorkerAvailableMsg(conversation), false)); } } sS noWorkerAvailableMsg(Conversation conv) { ret getCannedAnswer("#away", conv); } }