|
@@ -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()
|