Интернет Агент - мультиплатформенная альтернатива UTMTray
да мне внутрянка больше интересует, как выбрать новые, как отметить что прочитали и т.д.
но и скрины не помешали бы
П.С. Небольшой косяк нашел. Создал таблицу хелпдеска, написал пару сообщений с виндовс ПО, удалил таблицу, создал заново, без сообщений. В ПО видимо КЭШ, и теперь не отправляет новые сообщения, крутит и все. Хотя в базу сообщения попали.
но и скрины не помешали бы
П.С. Небольшой косяк нашел. Создал таблицу хелпдеска, написал пару сообщений с виндовс ПО, удалил таблицу, создал заново, без сообщений. В ПО видимо КЭШ, и теперь не отправляет новые сообщения, крутит и все. Хотя в базу сообщения попали.
Приложение кеширует сообщения. Так и должно быть. У клиента может быть несколько устройств с Интернет агентом и в отличии от родного хелпдеска в билинге (отдал сообщение первому запросившему и забыл), сообщение в моей системе приходят всем приложениям. Т.е. на всех версиях приложения и на всех устройствах чат с техподдержкой будет идентичным.Cramac писал(а):да мне внутрянка больше интересует, как выбрать новые, как отметить что прочитали и т.д.
но и скрины не помешали бы
П.С. Небольшой косяк нашел. Создал таблицу хелпдеска, написал пару сообщений с виндовс ПО, удалил таблицу, создал заново, без сообщений. В ПО видимо КЭШ, и теперь не отправляет новые сообщения, крутит и все. Хотя в базу сообщения попали.
Для этого приложение, при запросе сообщений, указывает параметр LastMessageId - уникальный ид последнего полученного сообщения сообщения. В базе это автоинкрементный индекс.
Есть возможность принудительно очистить кеш на стороне приложения, для этого нужно отправить сообщение "COMMAND_CLEAR_OLD_FILES" (без кавычек), файл в кешем удалится и приложение при следующем запросе получит актуальную переписку (ёё объем вы можете устанавливать самостоятельно в функции function ReadMessage($account,$login,$last_message_id, $platform = '', $AppType = ''), переменной $FetchMessageInterval (количество месяцев).
InternetAgent.php?cmd=MessageReceive&LastMessageId=44943&APIKey=хххххххххххххххххх&platform=Windows&version=1.1.1.0&AppType=InternetAgent
Я вроде публиковал helpdesk.php ?
Вот структура таблиц хранения:
Код: Выделить всё
CREATE TABLE `helpdesk_message` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`account_id` int(11) NOT NULL,
`date` datetime DEFAULT NULL,
`read` int(1) DEFAULT '0',
`direction` int(1) DEFAULT '0',
`author` text,
`service_text` text,
`text` text,
`masss_message` int(11) DEFAULT '0',
`app_type` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `id_account_id_date` (`id`,`account_id`,`date`) USING BTREE,
KEY `id_account_id` (`id`,`account_id`)
) ENGINE=MyISAM AUTO_INCREMENT=102410 DEFAULT CHARSET=cp1251;
Код: Выделить всё
CREATE TABLE `helpdesk_users` (
`account_id` int(11) NOT NULL,
`login` varchar(50) DEFAULT NULL,
`date_last_write` datetime DEFAULT NULL,
`date_last_read` datetime DEFAULT NULL,
`admin01_read` int(11) DEFAULT '0',
`admin02_read` int(11) DEFAULT '0',
`admin03_read` int(11) DEFAULT '0',
`WindowsUTMTray` bit(1) DEFAULT b'0',
`WindowsInternetAgent` datetime DEFAULT '0000-00-00 00:00:00',
`AndroidInternetAgent` datetime DEFAULT '0000-00-00 00:00:00',
`AndroidInternetAgentPro` datetime DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`account_id`),
UNIQUE KEY `account_id` (`account_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
Не прочитанные сообщения выделяются цветом и сортируются к верху. Вот пример:
Веб вариант отбросил сразу. Ввиду необходимости держать запущенный браузер. Высокой нагрузки на сервер. Необходимости писать серверную часть на php.Cramac писал(а):у Вас оно в виде проги, я думал веб вариант
Попробую разобраться что к чему тут.
П.С. сегодня удалось повесить приложение на андроиде, отчет отправил, не знаю куда правда
Приложение имеет ряд преимуществ - висит в системном трее (в случае виндовс версии), запускается автоматически, коннектится напрямую к базе. Его можно держать запущенным и на рабочем компе, и на домашнем, и на мобильном устройстве паралельно. И отвечать на запросы пользователей откуда удобно в данный момент.
Выложил приложение http://kayfolom.ru/HelpDesk.7z
В архиве:
Sound - звуки оповещения
HelpDesk.exe - подписанный моей подписью разработчика EXE (антивирусы ругаться не будут)
HelpDeskDB.ini - тестовый файл с параметрами коннекта
libmysql.dll - возможно понадобится заменить библиотекой от вашей версии MySql
Сохранение параметров производится в \AppData\Roaming\HelpDesk\ (параметры и логи)
Приложение конечно не блещет дизайном, писано для внутреннего пользования. Но свою функцию выполняет блестяще уже несколько лет.
COMMAND_CLEAR_OLD_FILES можно послать из приложения техподдержки в винде, которое я опубликовал.Cramac писал(а):Спасибо. Интересовало просто формат ответа
Не понял только как и куда послать
COMMAND_CLEAR_OLD_FILES
удаление с телефона и установка заново не помогает, очистка кеша средствами андроида тоже...
Но у вас глюк видимо в другом. При удалении приложения удаляется все, ничего остаться не может в принципе.
Ищите глюк в другом месте.
При отправке сообщения клиент отправляет запрос на сервер с телом сообщения и ждет ответ с этим же самым сообщением. Т.е. то что вы видите в чате приходит только с сервера, ничего локально в кеш сообщений не пишется. Это сделано для унификации работы чата и гарантированного подтверждения приема сообщения сервером. Обратите внимание на строчку "return(ReadMessage($account,$login,$last_message_id)); " в функции WriteMessage в приведенном ниже листинге.
Я запамятовал, публиковал код техподдержки или нет. Вот на всякий случай весь код:
Код: Выделить всё
<?php
//@ini_set("display_errors", "1"); error_reporting(E_ALL);
@ini_set("display_errors", "0"); error_reporting(0);
global $helpdesk_host,$helpdesk_login,$helpdesk_pass,$helpdesk_base;
$helpdesk_host = 'xxx.xxx.xxx.xxx';
$helpdesk_base = 'helpdesk';
$helpdesk_login = '***************';
$helpdesk_pass = '***************';
function SendMessageToUser($account,$author,$message,$service_message) {
global $helpdesk_host,$helpdesk_login,$helpdesk_pass,$helpdesk_base;
$direction = 1;
$helpdesk_db_connect=@mysql_pconnect($helpdesk_host,$helpdesk_login,$helpdesk_pass) or die();
if ($helpdesk_db_connect==False) return($message);
mysql_select_db($helpdesk_base,$helpdesk_db_connect);
mysql_query("SET NAMES 'utf8'",$helpdesk_db_connect);
$message = mysql_real_escape_string($message,$helpdesk_db_connect);
$service_message = mysql_real_escape_string($service_message,$helpdesk_db_connect);
$author = mysql_real_escape_string($author,$helpdesk_db_connect);
$helpdesk_query = "INSERT INTO helpdesk_users (`account_id`) VALUES ($account) ON DUPLICATE KEY UPDATE `admin01_read` = 1, `admin02_read` = 1, `admin03_read` = 1";
$helpdesk_result = mysql_query($helpdesk_query,$helpdesk_db_connect);
$helpdesk_query = "INSERT INTO helpdesk_message (account_id,date,`read`,direction,author,text,service_text) VALUES ($account,NOW(),0,$direction,'$author','$message','$service_message')";
$helpdesk_result = mysql_query($helpdesk_query,$helpdesk_db_connect);
}
function WriteMessage($account,$login,$message,$service_message,$last_message_id, $platform = '', $AppType = '') {
global $helpdesk_host,$helpdesk_login,$helpdesk_pass,$helpdesk_base;
$helpdesk_db_connect=@mysql_pconnect($helpdesk_host,$helpdesk_login,$helpdesk_pass) or die();
if ($helpdesk_db_connect==False) return($message);
mysql_select_db($helpdesk_base,$helpdesk_db_connect);
mysql_query("SET NAMES 'utf8'",$helpdesk_db_connect);
Update_helpdesk_users($helpdesk_db_connect, $account,$login, 'write', $platform, $AppType);
$service_message.='('.$platform.','.$AppType.')';
$helpdesk_query = "INSERT INTO helpdesk_message (account_id,date,`read`,direction,author,text,service_text,app_type) VALUES ($account,NOW(),0,0,'$login','$message','$service_message','$AppType')";
$helpdesk_result = mysql_query($helpdesk_query,$helpdesk_db_connect);
return(ReadMessage($account,$login,$last_message_id));
}
function ReadMessage($account,$login,$last_message_id, $platform = '', $AppType = '') {
global $helpdesk_host,$helpdesk_login,$helpdesk_pass,$helpdesk_base;
// За какой временной интервал выгружать сообщения (месяцев)
$FetchMessageInterval = 3;
$message_array = array();
$helpdesk_db_connect=mysql_pconnect($helpdesk_host,$helpdesk_login,$helpdesk_pass) or die();
if ($helpdesk_db_connect==False) return($message_array);
mysql_select_db($helpdesk_base,$helpdesk_db_connect);
mysql_query("SET NAMES 'utf8'",$helpdesk_db_connect);
Update_helpdesk_users($helpdesk_db_connect, $account,$login, 'read', $platform, $AppType);
$helpdesk_query = "SELECT id,DATE_FORMAT(date,'%d.%m.%Y %H:%i') as date,direction,author,SUBSTRING_INDEX(text,'.)',-1) as text ";
$helpdesk_query.= "FROM helpdesk_message WHERE date >= DATE_ADD(NOW(), INTERVAL -$FetchMessageInterval MONTH) AND account_id = $account AND id > $last_message_id";
$helpdesk_result = mysql_query($helpdesk_query,$helpdesk_db_connect);
$count_result = mysql_num_rows($helpdesk_result);
$read_message = '';
while ($line = mysql_fetch_array($helpdesk_result, MYSQL_ASSOC)) {
$message_array[$line['id']] = array ('date' => $line['date'],'direction' => $line['direction'],'author' => addslashes($line['author']),'text' => addslashes($line['text']));
if ($read_message=='') {
$read_message = $read_message.$line['id'];
} else {
$read_message = $read_message.','.$line['id'];
}
}
if ($count_result>0) {
$helpdesk_query = "UPDATE helpdesk_message SET `read` = 1 WHERE id IN ($read_message)";
$helpdesk_result = mysql_query($helpdesk_query,$helpdesk_db_connect);
}
return($message_array);
}
function Update_helpdesk_users($db_connect, $account,$login, $read_or_write, $platform = '', $AppType = '') {
$date_last_read_or_write = 'date_last_'.$read_or_write;
$helpdesk_query_suffix = '';
switch ($AppType) {
case 'InternetAgentLite' :
$helpdesk_query_suffix = ",AndroidInternetAgent = NOW()";
break;
case 'InternetAgentPro' :
$helpdesk_query_suffix = ",AndroidInternetAgentPro = NOW()";
break;
case 'InternetAgent' :
$helpdesk_query_suffix = ",WindowsInternetAgent = NOW()";
break;
default:
$helpdesk_query_suffix = '';
}
if ($read_or_write=='write') {
$helpdesk_query_suffix.= ', `admin01_read` = 0, `admin02_read` = 0, `admin03_read` = 0 ';
}
$helpdesk_query = "INSERT INTO helpdesk_users (`account_id`,`login`,`$date_last_read_or_write`) VALUES ($account,'$login',NOW()) ON DUPLICATE KEY UPDATE `login` = '$login', `$date_last_read_or_write` = NOW() ";
$helpdesk_query.= $helpdesk_query_suffix;
$helpdesk_result_1 = mysql_query($helpdesk_query,$db_connect);
}
?>
function WriteMessage($account,$login,$message,$service_message,$last_message_id, $platform = '', $AppType = '') // Прием сообщения от клиента
function ReadMessage($account,$login,$last_message_id, $platform = '', $AppType = '') // Отправка сообщения( или сообщений) клиенту
Дополнительные функции:
function SendMessageToUser($account,$author,$message,$service_message) // Отправка сообщения клиенту , используется скриптами приема платежей и прочими приложениями для отсылки извещений (типа баланс пополнен и все такое.
function Update_helpdesk_users($db_connect, $account,$login, $read_or_write, $platform = '', $AppType = '') // Обновление списка клиентов. Предоставляет массу пищи для аналитики и прочего.
по техподдержке:
при открытии клиент делает запрос:
на что сервер отдает ответ:
что то с кодировкой, но пока работало, в ПО отображалось норм. В проге при этом ничего не отображается.
отправляю текст
в базу текст попадает, но в проге крутится и все.
при этом к серверу идут запросы типо:
на что сервер отдает ответ
при открытии клиент делает запрос:
Код: Выделить всё
/stat/InternetAgent/InternetAgent.php?cmd=MessageReceive&LastMessageId=-1&APIKey=&platform=Android&version=1.1.6.0&AppType=InternetAgentLite
Код: Выделить всё
{
"1": {
"date": "17.10.2015 22:30",
"direction": "0",
"author": "zavalishin_nn1",
"text": "???�?�?�???�?�"},
"2": {
"date": "18.10.2015 09:50",
"direction": "0",
"author": "zavalishin_nn1",
"text": "???�??"},
"3": {
"date": "21.10.2015 17:38",
"direction": "0",
"author": "zavalishin_nn1",
"text": "???�?�?�"},
"4": {
"date": "21.10.2015 17:46",
"direction": "0",
"author": "zavalishin_nn1",
"text": "???�???�"},
"5": {
"date": "21.10.2015 17:50",
"direction": "1",
"author": "?????????????",
"text": "sdgsdfg"},
"6": {
"date": "21.10.2015 17:52",
"direction": "1",
"author": "?????????????",
"text": "COMMAND_CLEAR_OLD_FILES"},
"7": {
"date": "21.10.2015 17:54",
"direction": "0",
"author": "zavalishin_nn1",
"text": "Command_clear_old_files"}}
отправляю текст
Код: Выделить всё
/stat/InternetAgent/InternetAgent.php?cmd=MessageSend&message=Dfg&service_message=192.168.0.103&LastMessageId=-1&APIKey=&platform=Android&version=1.1.6.0&AppType=InternetAgentLite
при этом к серверу идут запросы типо:
Код: Выделить всё
/stat/InternetAgent/InternetAgent.php?cmd=MessageReceive&LastMessageId=-1&APIKey=&platform=Android&version=1.1.6.0&AppType=InternetAgentLite
Код: Выделить всё
{
"1": {
"date": "17.10.2015 22:30",
"direction": "0",
"author": "zavalishin_nn1",
"text": "???�?�?�???�?�"},
"2": {
"date": "18.10.2015 09:50",
"direction": "0",
"author": "zavalishin_nn1",
"text": "???�??"},
"3": {
"date": "21.10.2015 17:38",
"direction": "0",
"author": "zavalishin_nn1",
"text": "???�?�?�"},
"4": {
"date": "21.10.2015 17:46",
"direction": "0",
"author": "zavalishin_nn1",
"text": "???�???�"},
"5": {
"date": "21.10.2015 17:50",
"direction": "1",
"author": "?????????????",
"text": "sdgsdfg"},
"6": {
"date": "21.10.2015 17:52",
"direction": "1",
"author": "?????????????",
"text": "COMMAND_CLEAR_OLD_FILES"},
"7": {
"date": "21.10.2015 17:54",
"direction": "0",
"author": "zavalishin_nn1",
"text": "Command_clear_old_files"},
"8": {
"date": "22.10.2015 13:27",
"direction": "0",
"author": "zavalishin_nn1",
"text": "Dfg"}}
Все дело в кодировке, приложение ожидает utf-8, но сервер отдает в чем то другом. В приложении возникает исключение и дальнейшая обработка сообщений не проходит.
Убедитесь что выставляете кодировку. Для этого в файле InternetAgent.php, первыми строками должно идти следующее:
В браузере по запросу /stat/InternetAgent/InternetAgent.php?cmd=MessageReceive вы должны увидеть русский текст.
Убедитесь что выставляете кодировку. Для этого в файле InternetAgent.php, первыми строками должно идти следующее:
Код: Выделить всё
<?php
header('Content-Type: application/json; charset=utf-8');
Приветствую. Не знаю, толи пожелание толи придирка, но:
можно ли отображать новости как отдает Json ?
т.е. у меня в ответе сервера, новая новость сверху, старая в низу.
в приложении новая новость с низу...
Команда COMMAND_CLEAR_OLD_FILES не чистит кэш новостей. Пока подбирал вариант выдачи результата, получил кашу новостей.
П.С. А еще, если бы можно было бы с сервера брать цветовую палитру и логотип компании, что бы как то пользователь мог понять что попал туда куда надо, было бы оч. хорошо.
можно ли отображать новости как отдает Json ?
т.е. у меня в ответе сервера, новая новость сверху, старая в низу.
в приложении новая новость с низу...
Команда COMMAND_CLEAR_OLD_FILES не чистит кэш новостей. Пока подбирал вариант выдачи результата, получил кашу новостей.
П.С. А еще, если бы можно было бы с сервера брать цветовую палитру и логотип компании, что бы как то пользователь мог понять что попал туда куда надо, было бы оч. хорошо.
Первоначально Новости задумывались кешированными, так же как и сообщения. Цель была благая - экономия трафика и нагрузки на сервер. Но путь был ошибочным - некоторые новости могут быть временными (сообщения о перебоях, и их устранениях актуальны несколько часов, потом никому не интересны), да и экономия трафика и ресурсов оказалась мизерная.Cramac писал(а):Приветствую. Не знаю, толи пожелание толи придирка, но:
можно ли отображать новости как отдает Json ?
т.е. у меня в ответе сервера, новая новость сверху, старая в низу.
в приложении новая новость с низу...
Команда COMMAND_CLEAR_OLD_FILES не чистит кэш новостей. Пока подбирал вариант выдачи результата, получил кашу новостей.
П.С. А еще, если бы можно было бы с сервера брать цветовую палитру и логотип компании, что бы как то пользователь мог понять что попал туда куда надо, было бы оч. хорошо.
Так что в следующей версии новости будут отображаться в прямом порядке.
По поводу кеша новостей - вы точно пользуетесь последней версией приложения? Проверил у себя несколько раз - все нормально удаляется. Версия приложения отображается в Настройках, в правом верхнем углу. Последние версии Windows 1.1.7.0, Android 1.1.6.0
Цветовую палитру с сервера брать маловероятно. Потому как берется целиком стиль, и под стиль подгоняются контролы и выравнивания по все платформы. Размер приложения распухнет мегабайт на двадцать, не говоря о трудоемкости редизайна под каждый стиль.
Логотип вполне возможно, но куда его пихать и зачем? В версии под Windows вы можете грузить свой заголовок окна, на вкладке информация можете располагать любую информацию, в том числе и название провайдера.
Версия 1.1.6.0 для какой платформы?Cramac писал(а):да, версия последняя. 1.1.6.0
Сейчас у меня после последней октябрьской новости идет новость за июнь. команду сколько раз не отправлял, список новостей не убирается.
Почему он должен убираться? Алгоритм элементарный - приложение запрашивает новости, вы их отдаете в формате JSON, приложение сохраняет отданный вами JSON в файл News.json (на случай запуска в офлайн режиме), парсит полученный от вас JSON и показывает на вкладке новости. Больше ничего не происходит.
Все файлы хранятся в "C:\Users\Имя пользователя\AppData\Roaming\InternetAgent"
Т.е. если у вас что то не то с содержимым новостей, то проверяйте логи в "C:\Users\Имя пользователя\AppData\Roaming\InternetAgent\InternetAgent30.10.2015_09-27.log" и проверяйте то что отдает сервер.