/
celcombiller.py
37 lines (32 loc) · 1.03 KB
/
celcombiller.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/usr/bin/env python
"""
celcombiller AGI:
* Consult the user balance and authorize a call
* Save the call CDRs
* Update the user balance
"""
# pylint: disable=C0103
from datetime import datetime
import asterisk.agi
from asterisk.agi import AGIAppError
from models import session, User, CDR
agi = asterisk.agi.AGI()
from_user = session.query(User).filter_by(
clid=agi.env['agi_callerid']).one()
to_user = session.query(User).filter_by(
clid=agi.env['agi_extension']).one()
try:
agi.appexec('DIAL', 'SIP/%s,40,S(%d)' % (to_user.clid, from_user.balance))
except AGIAppError:
pass
if agi.get_variable('DIALSTATUS') == 'ANSWER':
# Time from answer to hangup
billsec = int(agi.get_variable('CDR(billsec)'))
# Time the user answered
answer = datetime.fromtimestamp(float(agi.get_variable('CDR(answer,u)')))
# Create a new CDR record
cdr = CDR(from_user=from_user, to_user=to_user,
billsec=billsec, answer=answer)
# Update user balance
from_user.balance -= billsec
session.commit()