Browse Source

Modification : On a maintenant un générateur de séquence.
- les 3-4 première répliques sont toujours dans le même ordre.
- ensuite, ca tappe dans un lot au hasard, que je pourrais agrandir à volonté.

Jean-Francois Burdet 6 years ago
parent
commit
bcf18b6b35

+ 43 - 18
lenny.py

@@ -1,6 +1,7 @@
 #!/usr/bin/env python2
 # -*- coding: utf-8 -*-
 
+import random
 import ConfigParser
 import audioop
 import contextlib
@@ -27,6 +28,8 @@ from enum import Enum
 
 VOLUME_THRESHOLD = 100
 
+current_dir = os.path.dirname(os.path.realpath(__file__))
+
 
 def slugify(s):
     """
@@ -49,6 +52,42 @@ def get_ip_from_logfile(remote_sip_client_tag, log_file):
         return s[0]
 
 
+class RepliesFactory(object):
+
+    def __init__(self, base_path):
+        self._base_path = base_path
+        self._start_replies = None
+        self._random_replies = None
+        self._pos = None
+        self.reset()
+
+    def reset(self):
+        self._pos = 0
+        self.reset_random()
+        self.reset_start()
+
+    def reset_start(self):
+        self._start_replies = glob.glob(self._base_path + "/start_sequence/*.wav")
+        self._start_replies.sort()
+
+    def reset_random(self):
+        self._random_replies = glob.glob(self._base_path + "/random/*.wav")
+
+    def next(self):
+        # On commence par la sequence du début
+        if self._pos < len(self._start_replies):
+            result = self._start_replies[self._pos]
+            self._pos += 1
+        else:
+            # Puis une fois épuisée, on puisse dans celle random
+            if len(self._random_replies) == 0:
+                self.reset_random()
+            result = random.choice(self._random_replies)
+            self._random_replies.remove(result)
+
+        return result
+
+
 class ConversationStatus(Enum):
     READY_TO_TALK = 0
     IMTALKING = 1
@@ -69,13 +108,6 @@ class Conversation(object):
             self._status = value
 
 
-current_dir = os.path.dirname(os.path.realpath(__file__))
-replies_seq = glob.glob(current_dir + "/replies/sequence/*.wav")
-replies_seq.sort()
-
-replies_generic = glob.glob(current_dir + "/replies/generic/*.wav")
-replies_generic.sort()
-
 THREADS_MUST_QUIT = False
 
 
@@ -119,15 +151,7 @@ class SipConnection(object):
         if self._conversation.status is not ConversationStatus.IMTALKING:
             self._conversation.status = ConversationStatus.IMTALKING
 
-            # On joue les repliques en sequence, puis quand
-            # on arrive au bout, on en joue une au hasard
-            # du groupe 'generic'
-
-            voice_filename = replies_seq[self._replies_pos]
-            self._replies_pos = (self._replies_pos + 1) % len(replies_seq)
-            if self._replies_pos == 0:
-                # On ne rejoue jamais la première réplique "allo"
-                self._replies_pos = 1
+            voice_filename = self._replies.next()
 
             duration = get_wav_duration(voice_filename)
             self.log("Saying : " + voice_filename)
@@ -217,7 +241,7 @@ class SipConnection(object):
 
             self.mail_if_needed(call.remote_address.username, self.MailType.Notify_Incoming_Call)
 
-            self._replies_pos = 0
+            self._replies.reset()
 
             if self.shoul_daccept_first_call(call.remote_address.username) or self.is_in_blacklists(
                     call.remote_address.username):
@@ -306,13 +330,14 @@ class SipConnection(object):
 
         self._config_info = config_info
 
+        self._replies = RepliesFactory(current_dir + "/replies/")
+
         self._core = linphone.Core.new(callbacks, None, None)
         self._is_quitting = False
 
         self._registration_previous_message = ""
 
         self._conversation = Conversation()
-        self._replies_pos = 0
         self._volume_threshold = VOLUME_THRESHOLD
         self._incoming_stream_file = tempfile.NamedTemporaryFile(delete=False).name
         self._core.iterate()

+ 0 - 0
replies/generic/atchoum.wav → replies/random/atchoum.wav


+ 0 - 0
replies/generic/baillement_mal_dormi.wav → replies/random/baillement_mal_dormi.wav


+ 0 - 0
replies/sequence/13_bruit_chien.wav → replies/random/bruit_chien.wav


+ 0 - 0
replies/generic/ca_va_me_couter_combien.wav → replies/random/ca_va_me_couter_combien.wav


+ 0 - 0
replies/sequence/06_cest_quoi_votre_nom_deja.wav → replies/random/cest_quoi_votre_nom_deja.wav


+ 0 - 0
replies/sequence/02_entends_pas_bien.wav → replies/random/entends_pas_bien.wav


+ 0 - 0
replies/sequence/05_me_semble_deja_appelle.wav → replies/random/me_semble_deja_appelle.wav


+ 0 - 0
replies/sequence/07_niece_jeter_un_oeil.wav → replies/random/niece_jeter_un_oeil.wav


+ 0 - 0
replies/sequence/10_on_ma_fait_la_morale.wav → replies/random/on_ma_fait_la_morale.wav


+ 0 - 0
replies/sequence/03_oui_oui_cest_ca.wav → replies/random/oui_oui_cest_ca.wav


+ 0 - 0
replies/sequence/04_oui_tres_bien_oui.wav → replies/random/oui_tres_bien_oui.wav


+ 0 - 0
replies/sequence/09_rappeler_nom_entreprise.wav → replies/random/rappeler_nom_entreprise.wav


+ 0 - 0
replies/sequence/11_satane_telephone_entends_rien.wav → replies/random/satane_telephone_entends_rien.wav


+ 0 - 0
replies/generic/toutafait.wav → replies/random/toutafait.wav


+ 0 - 0
replies/sequence/12_vous_etes_sympathique.wav → replies/random/vous_etes_sympathique.wav


+ 0 - 0
replies/sequence/08_vous_pouvez_repeter.wav → replies/random/vous_pouvez_repeter.wav


BIN
replies/sequence/14_ca_va_me_couter_combien.wav


+ 0 - 0
replies/sequence/00_allo.wav → replies/start_sequence/00_allo.wav


+ 0 - 0
replies/sequence/01_quoi_jai_pas_compris.wav → replies/start_sequence/01_quoi_jai_pas_compris.wav


BIN
replies/start_sequence/02_oui_oui_cest_ca.wav


BIN
replies/start_sequence/03_oui_tres_bien_oui.wav