git add stuff
This commit is contained in:
106
simpla/design/js/prostiezvonki/README.md
Normal file
106
simpla/design/js/prostiezvonki/README.md
Normal file
@@ -0,0 +1,106 @@
|
||||
API
|
||||
---
|
||||
|
||||
Prostiezvonki
|
||||
=============
|
||||
|
||||
### Конифгураця
|
||||
|
||||
При подключении скрипта создаётся глобальная переменная `prostiezvonki`. Для удобства к ней можно обращаться через псевдоним `pz`.
|
||||
|
||||
Для начала работы следует задать внутренний номер сотрудника:
|
||||
|
||||
```js
|
||||
pz.setUserPhone(
|
||||
phone // внутренний номер телефона сотрудника
|
||||
);
|
||||
```
|
||||
|
||||
### Подключение к серверу
|
||||
|
||||
```js
|
||||
pz.connect({
|
||||
host: 'ws://localhost:10150', // Адрес сервера
|
||||
client_id: 'password', // Пароль
|
||||
client_type: 'tinycrm' // Тип приложения
|
||||
});
|
||||
```
|
||||
|
||||
### Разрыв подключения
|
||||
|
||||
```js
|
||||
pz.disconnect();
|
||||
```
|
||||
|
||||
### Исходящий звонок
|
||||
|
||||
```js
|
||||
pz.call(
|
||||
phone // номер телефона, на который будет совершён звонок
|
||||
);
|
||||
```
|
||||
|
||||
### Перевод звонка
|
||||
|
||||
```js
|
||||
pz.transfer(
|
||||
call_id, // идентификатор звонка, полученный от сервера
|
||||
phone // номер телефона, на который нужно перевести звонок
|
||||
);
|
||||
```
|
||||
|
||||
### Получение событий
|
||||
|
||||
```js
|
||||
pz.onEvent(
|
||||
callback // функция, которая будет вызвана при получении события от сервера
|
||||
);
|
||||
```
|
||||
|
||||
Первым аргументом функция принимает объект event:
|
||||
|
||||
```js
|
||||
function (event) {
|
||||
alert('Индентификатор звонка — ' + event.callID)
|
||||
}
|
||||
```
|
||||
|
||||
Event
|
||||
=====
|
||||
|
||||
### Методы
|
||||
|
||||
Для определения типа события можно использовать вспомогательные методы:
|
||||
|
||||
```js
|
||||
event.isTransfer() // входящий запрос на переадресацию?
|
||||
event.isIncoming() // входящий вызов на менеджера?
|
||||
event.isHistory() // завершенный вызов?
|
||||
```
|
||||
|
||||
### Свойства
|
||||
|
||||
Для всех типов:
|
||||
|
||||
* **event.type** - тип события.
|
||||
|
||||
```
|
||||
1 - входящий запрос на переадресацию
|
||||
2 - входящий вызов на менеджера
|
||||
3 - завершенный вызов
|
||||
```
|
||||
|
||||
* **event.callID** - идентификатор звонка
|
||||
* **event.from** - Номер звонящего абонента
|
||||
|
||||
Для входящего запроса на менеджера и завершённого вызова
|
||||
|
||||
* **event.to** - Номер вызываемого абонента
|
||||
|
||||
Для завершённого вызова
|
||||
|
||||
* **event.start** - Время начала вызова, в формате Timestamp
|
||||
* **event.end** - Время окончания вызов, в формате Timestamp
|
||||
* **event.duration** - Длина разговора, в секундах
|
||||
* **event.direction** - Направление вызова: 0 – входящий, 1 – исходящий
|
||||
* **event.record** - Ссылка на файл записи
|
||||
168
simpla/design/js/prostiezvonki/prostiezvonki.js
Normal file
168
simpla/design/js/prostiezvonki/prostiezvonki.js
Normal file
@@ -0,0 +1,168 @@
|
||||
/*jslint browser: true*/
|
||||
/*global WebSocket, DOMParser, ActiveXObject*/
|
||||
(function () {
|
||||
"use strict";
|
||||
|
||||
var ProstieZvonki, prostiezvonki, pz, Event, Message;
|
||||
|
||||
/**
|
||||
* Parse xml string to xml document
|
||||
* @link http://goessner.net/download/prj/jsonxml/
|
||||
* @param string xml
|
||||
* @return Document
|
||||
*/
|
||||
function parseXml(a){var b=null;if(window.DOMParser)try{b=(new DOMParser).parseFromString(a,"text/xml")}catch(c){b=null}else if(window.ActiveXObject)try{b=new ActiveXObject("Microsoft.XMLDOM"),b.async=!1,b.loadXML(a)||(b=null)}catch(d){b=null}return b}
|
||||
|
||||
/**
|
||||
* atob and btoa shim
|
||||
* Copyright (C) 1999 Masanao Izumo <iz@onicos.co.jp>
|
||||
* Version: 1.0
|
||||
* LastModified: Dec 25 1999
|
||||
* This library is free. You can redistribute it and/or modify it.
|
||||
* @link http://code.google.com/p/gflot/source/browse/trunk/flot/base64.js?r=153
|
||||
*/
|
||||
(function(){function c(b){var c,d,e,f,g,h;for(e=b.length,d=0,c="";e>d;){if(f=255&b.charCodeAt(d++),d==e){c+=a.charAt(f>>2),c+=a.charAt((3&f)<<4),c+="==";break}if(g=b.charCodeAt(d++),d==e){c+=a.charAt(f>>2),c+=a.charAt((3&f)<<4|(240&g)>>4),c+=a.charAt((15&g)<<2),c+="=";break}h=b.charCodeAt(d++),c+=a.charAt(f>>2),c+=a.charAt((3&f)<<4|(240&g)>>4),c+=a.charAt((15&g)<<2|(192&h)>>6),c+=a.charAt(63&h)}return c}function d(a){var c,d,e,f,g,h,i;for(h=a.length,g=0,i="";h>g;){do c=b[255&a.charCodeAt(g++)];while(h>g&&-1==c);if(-1==c)break;do d=b[255&a.charCodeAt(g++)];while(h>g&&-1==d);if(-1==d)break;i+=String.fromCharCode(c<<2|(48&d)>>4);do{if(e=255&a.charCodeAt(g++),61==e)return i;e=b[e]}while(h>g&&-1==e);if(-1==e)break;i+=String.fromCharCode((15&d)<<4|(60&e)>>2);do{if(f=255&a.charCodeAt(g++),61==f)return i;f=b[f]}while(h>g&&-1==f);if(-1==f)break;i+=String.fromCharCode((3&e)<<6|f)}return i}var a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",b=Array(-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,-1,0,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,-1,-1,-1,-1,-1,-1,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,-1,-1,-1,-1,-1);window.btoa||(window.btoa=c),window.atob||(window.atob=d)})();
|
||||
|
||||
Event = function () {
|
||||
this.type = null;
|
||||
};
|
||||
|
||||
Event.prototype.isTransfer = function () {
|
||||
return this.type === '1';
|
||||
};
|
||||
|
||||
Event.prototype.isIncoming = function () {
|
||||
return this.type === '2';
|
||||
};
|
||||
|
||||
Event.prototype.isHistory = function () {
|
||||
return this.type === '4';
|
||||
};
|
||||
|
||||
Message = function (string, use_ssl) {
|
||||
if (!use_ssl) {
|
||||
string = atob(string);
|
||||
}
|
||||
|
||||
this.body = $(parseXml(string));
|
||||
};
|
||||
|
||||
Message.prototype.getEvents = function () {
|
||||
var events = [];
|
||||
|
||||
this.body.find('Event').each(function () {
|
||||
var event = new Event();
|
||||
|
||||
$.each(this.attributes, function (index, attr) {
|
||||
event[attr.name] = attr.value.trim();
|
||||
});
|
||||
|
||||
events.push(event);
|
||||
});
|
||||
|
||||
return events;
|
||||
};
|
||||
|
||||
Message.prepareRequest = function (method_name, data_string, use_ssl) {
|
||||
var request = '<Request><ProtocolVersion>1</ProtocolVersion><Method>' + method_name + '</Method><RequestID>0</RequestID><Data>' + data_string + '</Data></Request>';
|
||||
|
||||
if (!use_ssl) {
|
||||
request = btoa(request);
|
||||
}
|
||||
|
||||
return request;
|
||||
};
|
||||
|
||||
ProstieZvonki = function () {
|
||||
var user_phone = '',
|
||||
websocket = null,
|
||||
use_ssl = false,
|
||||
callbacks = {};
|
||||
|
||||
this.setUserPhone = function (phone) {
|
||||
user_phone = phone;
|
||||
};
|
||||
|
||||
this.connect = function (params) {
|
||||
var connection_url = params.host
|
||||
+ '?CID=' + (params.client_id || 0)
|
||||
+ '&CT=' + params.client_type
|
||||
+ '&GID=' + user_phone;
|
||||
|
||||
use_ssl = params.host.indexOf('wss') === 0;
|
||||
|
||||
websocket = new WebSocket(connection_url);
|
||||
|
||||
websocket.onopen = function (e) {
|
||||
if (callbacks.onConnect && typeof callbacks.onConnect === 'function') {
|
||||
callbacks.onConnect(e);
|
||||
}
|
||||
};
|
||||
|
||||
websocket.onclose = function (e) {
|
||||
if (callbacks.onDisconnect && typeof callbacks.onDisconnect === 'function') {
|
||||
callbacks.onDisconnect(e);
|
||||
}
|
||||
};
|
||||
|
||||
websocket.onmessage = function (e) {
|
||||
var i, message, events;
|
||||
|
||||
if (typeof (e.data) === 'undefined') {
|
||||
return false;
|
||||
}
|
||||
|
||||
message = new Message(e.data, use_ssl);
|
||||
events = message.getEvents();
|
||||
|
||||
for (i = 0; i < events.length; i += 1) {
|
||||
if (callbacks.onEvent && typeof callbacks.onEvent === 'function') {
|
||||
callbacks.onEvent(events[i]);
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
this.disconnect = function () {
|
||||
websocket && websocket.close();
|
||||
};
|
||||
|
||||
this.isConnected = function () {
|
||||
return websocket && websocket.readyState === 1;
|
||||
};
|
||||
|
||||
this.onConnect = function (callback) {
|
||||
callbacks.onConnect = callback;
|
||||
};
|
||||
|
||||
this.onDisconnect = function (callback) {
|
||||
callbacks.onDisconnect = callback;
|
||||
};
|
||||
|
||||
this.onEvent = function (callback) {
|
||||
callbacks.onEvent = callback;
|
||||
};
|
||||
|
||||
this.call = function (number) {
|
||||
websocket.send(Message.prepareRequest(
|
||||
'Call',
|
||||
'<From>' + user_phone + '</From><To>' + number + '</To>',
|
||||
use_ssl
|
||||
));
|
||||
}
|
||||
|
||||
this.transfer = function (call_id, number) {
|
||||
number = number || 0;
|
||||
|
||||
websocket.send(Message.prepareRequest(
|
||||
'Transfer',
|
||||
'<CallID>' + call_id + '</CallID><To>' + user_phone + '</To>',
|
||||
use_ssl
|
||||
));
|
||||
}
|
||||
};
|
||||
|
||||
prostiezvonki = window.prostiezvonki = new ProstieZvonki();
|
||||
|
||||
pz = window.pz = prostiezvonki;
|
||||
}());
|
||||
1
simpla/design/js/prostiezvonki/prostiezvonki.min.js
vendored
Normal file
1
simpla/design/js/prostiezvonki/prostiezvonki.min.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
(function(){"use strict";function f(a){var b=null;if(window.DOMParser)try{b=(new DOMParser).parseFromString(a,"text/xml")}catch(c){b=null}else if(window.ActiveXObject)try{b=new ActiveXObject("Microsoft.XMLDOM"),b.async=!1,b.loadXML(a)||(b=null)}catch(d){b=null}return b}var a,b,c,d,e;(function(){function a(a){var b,d,e,f,g,h;for(e=a.length,d=0,b="";e>d;){if(f=255&a.charCodeAt(d++),d==e){b+=c.charAt(f>>2),b+=c.charAt((3&f)<<4),b+="==";break}if(g=a.charCodeAt(d++),d==e){b+=c.charAt(f>>2),b+=c.charAt((3&f)<<4|(240&g)>>4),b+=c.charAt((15&g)<<2),b+="=";break}h=a.charCodeAt(d++),b+=c.charAt(f>>2),b+=c.charAt((3&f)<<4|(240&g)>>4),b+=c.charAt((15&g)<<2|(192&h)>>6),b+=c.charAt(63&h)}return b}function b(a){var b,c,e,f,g,h,i;for(h=a.length,g=0,i="";h>g;){do b=d[255&a.charCodeAt(g++)];while(h>g&&-1==b);if(-1==b)break;do c=d[255&a.charCodeAt(g++)];while(h>g&&-1==c);if(-1==c)break;i+=String.fromCharCode(b<<2|(48&c)>>4);do{if(e=255&a.charCodeAt(g++),61==e)return i;e=d[e]}while(h>g&&-1==e);if(-1==e)break;i+=String.fromCharCode((15&c)<<4|(60&e)>>2);do{if(f=255&a.charCodeAt(g++),61==f)return i;f=d[f]}while(h>g&&-1==f);if(-1==f)break;i+=String.fromCharCode((3&e)<<6|f)}return i}var c="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",d=[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,-1,0,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,-1,-1,-1,-1,-1,-1,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,-1,-1,-1,-1,-1];window.btoa||(window.btoa=a),window.atob||(window.atob=b)})(),d=function(){this.type=null},d.prototype.isTransfer=function(){return"1"===this.type},d.prototype.isIncoming=function(){return"2"===this.type},d.prototype.isHistory=function(){return"4"===this.type},e=function(a,b){b||(a=atob(a)),this.body=$(f(a))},e.prototype.getEvents=function(){var a=[];return this.body.find("Event").each(function(){var b=new d;$.each(this.attributes,function(a,c){b[c.name]=c.value.trim()}),a.push(b)}),a},e.prepareRequest=function(a,b,c){var d="<Request><ProtocolVersion>1</ProtocolVersion><Method>"+a+"</Method><RequestID>0</RequestID><Data>"+b+"</Data></Request>";return c||(d=btoa(d)),d},a=function(){var a="",b=null,c=!1,d={};this.setUserPhone=function(b){a=b},this.connect=function(f){var g=f.host+"?CID="+(f.client_id||0)+"&CT="+f.client_type+"&GID="+a;c=0===f.host.indexOf("wss"),b=new WebSocket(g),b.onopen=function(a){d.onConnect&&"function"==typeof d.onConnect&&d.onConnect(a)},b.onclose=function(a){d.onDisconnect&&"function"==typeof d.onDisconnect&&d.onDisconnect(a)},b.onmessage=function(a){var b,f,g;if(a.data===void 0)return!1;for(f=new e(a.data,c),g=f.getEvents(),b=0;g.length>b;b+=1)d.onEvent&&"function"==typeof d.onEvent&&d.onEvent(g[b])}},this.disconnect=function(){b&&b.close()},this.isConnected=function(){return b&&1===b.readyState},this.onConnect=function(a){d.onConnect=a},this.onDisconnect=function(a){d.onDisconnect=a},this.onEvent=function(a){d.onEvent=a},this.call=function(d){b.send(e.prepareRequest("Call","<From>"+a+"</From><To>"+d+"</To>",c))},this.transfer=function(d,f){f=f||0,b.send(e.prepareRequest("Transfer","<CallID>"+d+"</CallID><To>"+a+"</To>",c))}},b=window.prostiezvonki=new a,c=window.pz=b})();
|
||||
Reference in New Issue
Block a user