2010-11-30 3 views
2

Si je crée une ligne d'amusement pour les tout-petits (voir http://blog.tropo.com/2010/11/22/something-fun-and-quick-to-make-the-toddler-amusement-line/) en utilisant Twilio et Kynetx, dois-je définir une condition d'arrêt dans mon jeu de règles ou les évaluations se termineront-elles lorsque l'appelant raccroche?Les règles KRL s'arrêtent-elles lorsqu'un appel Twilio se termine?

// WARNING! Do not use this ruleset! 
rule callstart { 
    select when twilio callstart 
    always { raise explicit event loves_me } 
} 

rule loves_me { 
    select when explicit loves_me 
    twilio:say("She loves me.") 
    always { raise explicit event loves_me_not } 
} 

rule loves_me_not { 
    select when explicit loves_me_not 
    twilio:say("She loves me not.") 
    always { raise explicit event loves_me } 
} 

Ma conjecture: L'appel démarre l'ensemble de règles en cours d'exécution. L'appelant sonne. Une petite partie de KNS pleure.

Répondre

1

En fait, votre code ici ne reviendra jamais à Twilio du tout. Twilio déclenche des événements au démarrage de l'appel et pendant un appel lorsque cela lui est demandé. Cela se produit avec un twilio: gather_start() et twilio: redirect() parmi d'autres.

Lorsque vous déclenchez un événement explicite, les règles correspondantes sont sélectionnées et déclenchées AVANT l'envoi de la réponse. En raison de votre boucle ici, la réponse ne sera jamais envoyée. Une bonne façon de tester cela est d'appeler le webhook que vous donnez à twilio depuis un navigateur, et regardez la réponse.

Une meilleure façon d'y arriver est de donner à Twilio une instruction, et d'en faire un autre quand vous aurez terminé. Pour réécrire votre code ci-dessus:

rule callstart { 
    select when twilio callstart 
    always { raise explicit event loves_me } 
} 

rule loves_me { 
    select when explicit loves_me or twilio loves_me 
    twilio:say("She loves me."); 
    always { raise explicit event loves_me_not } 
} 

rule loves_me_not { 
    select when explicit loves_me_not 
    { 
    twilio:say("She loves me not."); 
    twilio:redirect("loves_me"); 
    { 
} 

Notez que je ne remplacé un des raise explicit event déclarations. Vous pourriez tous les remplacer de la même manière, mais cela entraînerait plus d'événements soulevés à Kynetx alors vraiment nécessaire. C'est vraiment un équilibre et peut être ajusté si nécessaire.

(Notez également le OU dans l'instruction select de la règle de loves_me, et l'ajout de {} pour permettre deux actions en une seule règle et la;.. S après des actions)

Ce modèle d'utilisation une redirection est également utile lorsque vous souhaitez répéter les options de menu, si l'utilisateur ne choisit pas une option avant le délai d'expiration. Ceci est illustré dans le document Phone Menu Tutorial dans les documents Kynetx.

+1

Merci! Je pense que je comprends mieux maintenant. –

+0

Il y a ici un principe important à comprendre. Lorsqu'un événement est élevé à KRE (par Twilio ou toute autre chose), les règles que cet événement sélectionne sont ajoutées à la planification et le moteur commence à traiter le planning. Lorsque vous déclenchez un événement explicite, la même planification est modifiée pour ajouter les nouvelles règles sélectionnées par cet événement. Si vous continuez à soulever le même événement que le résultat de ce traitement, comme Sam l'a expliqué, vous entrerez dans une boucle. Nous avons un disjoncteur dans le code pour empêcher les boucles infinies. –

Questions connexes