forked from ViStepRU/callme
-
Notifications
You must be signed in to change notification settings - Fork 0
/
CallMeIn.php
240 lines (210 loc) · 13 KB
/
CallMeIn.php
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
<?php
/**
* CallMe events listener for incoming calls
* @author Автор: ViStep.RU
* @version 1.0
* @copyright: ViStep.RU (admin@vistep.ru)
*/
// проверка на запуск из браузера
(PHP_SAPI !== 'cli' || isset($_SERVER['HTTP_USER_AGENT'])) && die('access error');
require __DIR__ . '/vendor/autoload.php';
/*
* start: for events listener
*/
use PAMI\Listener\IEventListener;
use PAMI\Message\Event\EventMessage;
use PAMI\Message\Event;
use PAMI\Message\Event\DialBeginEvent;
use PAMI\Message\Event\DialEndEvent;
use PAMI\Message\Event\NewchannelEvent;
use PAMI\Message\Event\VarSetEvent;
use PAMI\Message\Event\HangupEvent;
use PAMI\Message\Action\ActionMessage;
use PAMI\Message\Action\SetVarAction;
/*
* end: for events listener
*/
$helper = new HelperFuncs();
$callami = new CallAMI();
//объект с глобальными массивами
$globalsObj = Globals::getInstance();
//массив внешних номеров
$globalsObj->extentions = $helper->getConfig('extentions');
//создаем экземпляр класса PAMI
$pamiClient = $callami->NewPAMIClient();
$pamiClient->open();
//обрабатываем NewchannelEvent события
$pamiClient->registerEventListener(
function (EventMessage $event) use ($helper,$callami,$globalsObj){
//выгребаем параметры звонка
$callUniqueid = $event->getUniqueid();
$extNum = $event->getCallerIDNum();
$CallChannel = $event->getChannel();
//добавляем звонок в массив, для обработки в других ивентах
$globalsObj->uniqueids[] = $callUniqueid;
//берем Exten из ивента
$extention = $event->getExtension();
//логируем параметры звонка
$helper->writeToLog(array('extNum'=>$extNum,
'callUniqueid'=>$callUniqueid,
'Exten'=>$extention),
'New NewchannelEvent call');
//выбираем из битрикса полное имя контакта по номеру телефона и логируем
$CallMeCallerIDName = $helper->getCrmContactNameByExtNum($extNum);
$helper->writeToLog(array('CallMeCallerIDName'=>$CallMeCallerIDName,),
'Contact name by extNum');
// выставим CallerID
$newpami = new SetVarAction('CallMeCallerIDName', $CallMeCallerIDName, $CallChannel);
$helper->writeToLog(array('Channel'=>$CallChannel),
'Trying to set CallMeCallerIDName');
$pamiClient = $callami->NewPAMIClient();
$pamiClient->open();
$resultFromB24 = $pamiClient->send($newpami);
$helper->writeToLog(array('resultFromB24'=>$resultFromB24),
'Trying to set CallMeCallerIDName second step');
$pamiClient->close();
},function (EventMessage $event) use ($globalsObj){
//для фильтра берем только указанные внешние номера
return
$event instanceof NewchannelEvent
//проверяем на вхождение в массив
&& in_array($event->getExtension(), $globalsObj->extentions);
}
);
//обрабатываем VarSetEvent события, получаем url записи звонка
$pamiClient->registerEventListener(
function (EventMessage $event) use ($helper,$globalsObj) {
$callUniqueid = $event->getUniqueID();
if(preg_match('/^http.+$/',$event->getValue())) $globalsObj->FullFnameUrls[$callUniqueid] = $event->getValue();
if(preg_match('/^\d+$/',$event->getValue())) $globalsObj->Durations[$callUniqueid] = $event->getValue();
if(preg_match('/^[A-Z\ ]+$/',$event->getValue())) $globalsObj->Dispositions[$callUniqueid] = $event->getValue();
//логируем параметры звонка
$helper->writeToLog(array('FullFnameUrls'=>$globalsObj->FullFnameUrls,
'Durations'=>$globalsObj->Durations,
'Dispositions'=>$globalsObj->Dispositions),
'New VarSetEvent - get FullFname,CallMeDURATION,CallMeDISPOSITION');
},function (EventMessage $event) use ($globalsObj) {
return
$event instanceof VarSetEvent
//проверяем что это именно нужная нам переменная
&& ($event->getVariableName() === 'FullFname'
|| $event->getVariableName() === 'CallMeDURATION'
|| $event->getVariableName() === 'CallMeDISPOSITION')
//проверяем на вхождение в массив
&& in_array($event->getUniqueID(), $globalsObj->uniqueids);
}
);
//обрабатываем DialBeginEvent события
$pamiClient->registerEventListener(
function (EventMessage $event) use ($helper,$globalsObj) {
//выгребаем параметры звонка
$callUniqueid = $event->getUniqueid();
$intNum = $event->getDestCallerIDNum();
$extNum = $event->getCallerIDNum();
$CallChannel = $event->getChannel();
//регистриуем звонок в битриксе
$globalsObj->calls[$callUniqueid] = $helper->runInputCall($intNum,$extNum);
//показываем карточку пользователю
$helper->showInputCall($intNum, $globalsObj->calls[$callUniqueid]);
$helper->writeToLog(array('intNum'=>$intNum,
'extNum'=>$extNum,
'callUniqueid'=>$callUniqueid,
'CALL_ID'=>$globalsObj->calls[$callUniqueid]),
'New incoming call');
},function (EventMessage $event) use ($globalsObj) {
//для фильтра по uniqueid
return
$event instanceof DialBeginEvent
//проверяем входит ли событие в массив с uniqueid внешних звоноков
&& in_array($event->getUniqueid(), $globalsObj->uniqueids);
}
);
//обрабатываем DialEndEvent события
$pamiClient->registerEventListener(
function (EventMessage $event) use ($helper,$globalsObj) {
//выгребаем параметры звонка
$callUniqueid = $event->getUniqueid();
$globalsObj->intNums[$callUniqueid] = $event->getDestCallerIDNum();
$extNum = $event->getCallerIDNum();
switch ($event->getDialStatus()) {
case 'ANSWER': //кто-то отвечает на звонок
$helper->writeToLog(array('intNum'=>$globalsObj->intNums[$callUniqueid],
'extNum'=>$extNum,
'callUniqueid'=>$callUniqueid,
'CALL_ID'=>$globalsObj->calls[$callUniqueid]),
'incoming call ANSWER');
//для всех, кроме отвечающего, скрываем карточку
$helper->hideInputCallExcept($globalsObj->intNums[$callUniqueid], $globalsObj->calls[$callUniqueid]);
break;
case 'BUSY': //занято
$helper->writeToLog(array('intNum'=>$globalsObj->intNums[$callUniqueid],
'extNum'=>$extNum,
'callUniqueid'=>$callUniqueid,
'CALL_ID'=>$globalsObj->calls[$callUniqueid]),
'incoming call BUSY');
//скрываем карточку для юзера
$helper->hideInputCall($globalsObj->intNums[$callUniqueid], $globalsObj->calls[$callUniqueid]);
break;
case 'CANCEL': //звонивший бросил трубку
$helper->writeToLog(array('intNum'=>$globalsObj->intNums[$callUniqueid],
'extNum'=>$extNum,
'callUniqueid'=>$callUniqueid,
'CALL_ID'=>$globalsObj->calls[$callUniqueid]),
'incoming call CANCEL');
//скрываем карточку для юзера
$helper->hideInputCall($globalsObj->intNums[$callUniqueid], $globalsObj->calls[$callUniqueid]);
break;
default:
break;
}
},
function (EventMessage $event) use ($globalsObj) {
//для фильтра по uniqueid
return
$event instanceof DialEndEvent
//проверяем входит ли событие в массив с uniqueid внешних звонков
&& in_array($event->getUniqueid(), $globalsObj->uniqueids);
}
);
//обрабатываем HangupEvent события, отдаем информацию о звонке и url его записи в битрикс
$pamiClient->registerEventListener(
function (EventMessage $event) use ($helper,$globalsObj) {
$callUniqueid = $event->getUniqueID();
$FullFname = $globalsObj->FullFnameUrls[$callUniqueid];
$CallDuration = $globalsObj->Durations[$callUniqueid];
$CallDisposition = $globalsObj->Dispositions[$callUniqueid];
$call_id = $globalsObj->calls[$callUniqueid];
$CallIntNum = $globalsObj->intNums[$callUniqueid];
// логируем $callUniqueid, $FullFnameUrls, $calls, $Durations, $Dispositions
$helper->writeToLog(array($callUniqueid,$globalsObj->FullFnameUrls,$globalsObj->calls,$globalsObj->Durations,$globalsObj->Dispositions),
'New HangupEvent Zero step - params');
// логируем то, что мы собрались отдать битриксу
$helper->writeToLog(
array('FullFname'=>$FullFname,
'call_id'=>$call_id,
'intNum'=>$CallIntNum,
'Duration'=>$CallDuration,
'Disposition'=>$CallDisposition),
'New HangupEvent First step - recording filename URL, intNum, Duration, Disposition');
$resultFromB24 = $helper->uploadRecordedFile($call_id,$FullFname,$CallIntNum,$CallDuration,$CallDisposition);
//логируем, что нам рассказал битрикс в ответ на наш реквест
$helper->writeToLog($resultFromB24,'New HangupEvent Second Step - upload filename');
// удаляем из массивов тот вызов, который завершился
$helper->removeItemFromArray($globalsObj->uniqueids,$callUniqueid,'value');
$helper->removeItemFromArray($globalsObj->intNums,$callUniqueid,'key');
$helper->removeItemFromArray($globalsObj->FullFnameUrls,$callUniqueid,'key');
$helper->removeItemFromArray($globalsObj->Durations,$callUniqueid,'key');
$helper->removeItemFromArray($globalsObj->Dispositions,$callUniqueid,'key');
$helper->removeItemFromArray($globalsObj->calls,$callUniqueid,'key');
},function (EventMessage $event) use ($globalsObj) {
return
$event instanceof HangupEvent
//проверяем на вхождение в массив
&& in_array($event->getUniqueID(), $globalsObj->uniqueids);
}
);
while(true) {
$pamiClient->process();
usleep($helper->getConfig('listener_timeout'));
}
$pamiClient->ClosePAMIClient($pamiClient);