#!/usr/bin/env python3 import json import re from datetime import datetime fieldsFilter = ('id', 'linkedid', 'appdata') class CELEventChannel: def __init__(self, chanData): self._str = chanData (self.tech, self.peer, self.context, self.id, self.leg) = re.match(r'(\w+)/(\w+)(?:@([\w-]+))?-([0-9a-f]{8})(?:;([0-9]+))?', chanData).groups() def __repr__(self): return self._str class CELEvent: def __init__(self, eventData): for key, value in eventData.items(): if ((key not in fieldsFilter) and (value is not None) and (str(value) != '')): if key == 'extra': setattr(self, key, json.loads(value)) elif key == 'channame': setattr(self, key, CELEventChannel(value)) else: setattr(self, key, value) class CELEvents: def __init__(self): self._events = [] def add(self, event): if isinstance(event, CELEvent): self._events.append(event) else: self._events.append(CELEvent(event)) @property def all(self): return self._events @property def first(self): return self._events[0] if len(self._events) > 0 else None @property def second(self): return self._events[1] if len(self._events) > 1 else None @property def last(self): return self._events[-1] if len(self._events) > 0 else None def filter(self, key, value, func='__eq__'): ''' events.filter('channame','PJSIP/','startswith') ''' result = CELEvents() for event in self._events: if getattr(str(getattr(event, key)), func)(value): result.add(event) return result def has(self, value, key='eventtype'): for event in self._events: if getattr(event, key) == value: return True return False def __len__(self): return len(self._events) class CELCall: def __init__(self, event=None): self.events = CELEvents() if event is not None: self.events.add(event) self.linkedid = event['linkedid'] else: self.linkedid = None @property def start(self): return self.events.first.eventtime @property def isAnswered(self): return self.events.has('BRIDGE_ENTER');