cel.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #!/usr/bin/env python3
  2. import json
  3. import re
  4. from datetime import datetime
  5. fieldsFilter = ('id', 'linkedid', 'appdata')
  6. class CELEventChannel:
  7. def __init__(self, chanData):
  8. self._str = chanData
  9. (self.tech,
  10. self.peer,
  11. self.context,
  12. self.id,
  13. self.leg) = re.match(r'(\w+)/(\w+)(?:@([\w-]+))?-([0-9a-f]{8})(?:;([0-9]+))?', chanData).groups()
  14. def __repr__(self):
  15. return self._str
  16. class CELEvent:
  17. def __init__(self, eventData):
  18. for key, value in eventData.items():
  19. if ((key not in fieldsFilter) and (value is not None) and (str(value) != '')):
  20. if key == 'extra':
  21. setattr(self, key, json.loads(value))
  22. elif key == 'channame':
  23. setattr(self, key, CELEventChannel(value))
  24. else:
  25. setattr(self, key, value)
  26. class CELEvents:
  27. def __init__(self):
  28. self._events = []
  29. def add(self, event):
  30. if isinstance(event, CELEvent):
  31. self._events.append(event)
  32. else:
  33. self._events.append(CELEvent(event))
  34. @property
  35. def all(self):
  36. return self._events
  37. @property
  38. def first(self):
  39. return self._events[0] if len(self._events) > 0 else None
  40. @property
  41. def second(self):
  42. return self._events[1] if len(self._events) > 1 else None
  43. @property
  44. def last(self):
  45. return self._events[-1] if len(self._events) > 0 else None
  46. def filter(self, key, value, func='__eq__'):
  47. ''' events.filter('channame','PJSIP/','startswith')
  48. '''
  49. result = CELEvents()
  50. for event in self._events:
  51. if getattr(str(getattr(event, key)), func)(value):
  52. result.add(event)
  53. return result
  54. def has(self, value, key='eventtype'):
  55. for event in self._events:
  56. if getattr(event, key) == value:
  57. return True
  58. return False
  59. def __len__(self):
  60. return len(self._events)
  61. class CELCall:
  62. def __init__(self, event=None):
  63. self.events = CELEvents()
  64. if event is not None:
  65. self.events.add(event)
  66. self.linkedid = event['linkedid']
  67. else:
  68. self.linkedid = None
  69. @property
  70. def start(self):
  71. return self.events.first.eventtime
  72. @property
  73. def isAnswered(self):
  74. return self.events.has('BRIDGE_ENTER');