Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

comet:simple-chat-example [2017/11/13 02:31]
levhav
comet:simple-chat-example [2019/12/18 01:58]
Строка 1: Строка 1:
-<​rst>​RU::​12-Примеры::​Пример Realtime чата</​rst>​ 
-<​rst>​Header:​ Пример Realtime чата</​rst>​ 
  
-====== Пример Realtime чата ====== 
- 
-В этой статье будет рассмотрен пример простого чата между пользователями. Для реализации чата не потребуется использование серверной стороны,​ в этой статье всё только на JavaScript. Живой пример работы можно наблюдать в конце статьи. 
- 
-<​note>​В данной статье рассматривается вопрос создания чата где все пользователи общаются в одной общей комнате. Если вам нужен чат для личного общения пользователей между собой (общение в диалогах один на один) то вам больше подойдёт [[comet:​star-comet-chat|чат плагин личной переписки между пользователями]]</​note>​ 
-====== Принцип организации чата ====== 
- 
-  * Все сообщения от всех пользователей отправляются в общий канал web_chat_pipe. 
-  * Структура сообщения содержит в себе текст сообщения и имя отправившего это сообщение. 
-  * Все пользователи участвующие в чате подписаны на канал чата. И полученные из него сообщения отображаются в ленте общения. 
-  * В момент отправки мы сохраняем текущее время в переменную timer, а в момент получения отчёта о доставке сообщения определяем сколько было затрачено времени. 
- 
-====== Весь код примера:​ ====== 
-Полностью исходный код чата web_chat.js 
-<file JavaScript web_chat.js>​ 
-var timer = new Date(); 
-function web_send_msg() 
-{ 
-    // Получение значений из элементов ввода. 
-    var text = $("#​WebChatTextID"​).val();​ 
-    var name = $("#​WebChatNameID"​).val();​ 
-    ​ 
-    // Очистка формы 
-    $("#​WebChatTextID"​).val(""​);  ​ 
-    ​ 
-    // Зпишем время в момент отправки сообщения 
-    timer = new Date(); 
-    ​ 
-    // Добавление отправленного сообщения к списку сообщений. 
-    //​$("#​WebChatFormForm"​).append("<​p><​b>"​+HtmlEncode(name)+":​ </​b>"​+HtmlEncode(text)+"</​p>"​);​ 
-    ​ 
-    // Отправка сообщения в канал чата 
-    CometServer().web_pipe_send("​web_chat_pipe",​ {"​text":​text,​ "​name":​name});​ 
-    ​ 
-    // Уведомим остальные вкладки о том что мы добавили сообщение в чат 
-    comet_server_signal().send_emit("​AddToChat",​ {"​text":​text,​ "​name":​name}) 
-} 
- 
-    
-// Функция выполнится в после загрузки страницы 
-$(document).ready(function() 
-{ 
-    // Создание формы для чата. Вёрстка. 
-    var html =  "<​div style=\"​border:​ 1px solid #​ccc;​padding:​10px;​\"​ >" 
-           + "<​div id=\"​WebChatFormForm\"​ style=\"​max-width:​ 600px;​overflow:​ auto;​max-height:​ 900px;​\"></​div>"​ 
-   + "<​input type=\"​text\"​ id=\"​WebChatNameID\"​ style=\"​margin-top:​10px;​\"​ placeholder=\"​Укажите ваше имя...\"​ > <div id=\"​answer_div\"​ style=\"​float:​right;​\"​ ></​div>"​ 
-           + "<​textarea id = \"​WebChatTextID\"​ placeholder = \"​Отправьте сообщение в online чат...\"​ style=\"​max-width:​ 600px;​max-height:​ 100px;​width:​ 600px;​margin-top:​10px;​\"​ ></​textarea>"​ 
- 
-                  + "<​div style=\"​margin-bottom:​ 0px;​margin-top:​ 10px;​\">"​ 
-                  +    "<​input type=\"​button\"​ style=\"​width:​ 220px;​\"​ onclick=\"​web_send_msg();​\"​ value=\"​Отправить\"​ >" 
-                  +    " <div id=\"​answer_error\" ​ style=\"​float:​right;​\"​ ></​div>"​ 
-                  + "</​div>"​ 
-             ​+ ​ "</​div>";​ 
-    $("#​web_chat_holder"​).html(html);​ 
- 
-    // Подписываемся на канал в который и будут отпавлятся сообщения чата. ​ 
-    CometServer().subscription("​web_chat_pipe",​ function(msg){ 
-        console.log(["​msg",​ msg]); 
-        // Добавление полученого сообщения к списку сообщений. 
-        $("#​WebChatFormForm"​).append("<​p><​b>"​+HtmlEncode(msg.data.name)+":​ </​b>"​+HtmlEncode(msg.data.text)+"</​p>"​);​ 
-    }); 
- 
-    // Подписываемся на событие добавления сообщения в чат нами, для того чтобы если чат открыт в нескольких вкладках 
-    // наше сообщение добавленое на одной вкладке отобразилось на всех остальных без перезагрузки страницы 
-    comet_server_signal().connect("​AddToChat",​ function(msg){ 
-        console.log(["​msg",​ msg]); 
-        // Добавление полученого сообщения к списку сообщений. 
-        $("#​WebChatFormForm"​).append("<​p><​b>"​+HtmlEncode(msg.name)+":​ </​b>"​+HtmlEncode(msg.text)+"</​p>"​);​ 
-    }); 
-    ​ 
-    // Подписываемся на канал в который и будут отпавлятся уведомления о доставке отправленых сообщений. 
-    CometServer().subscription("#​web_chat_pipe",​ function(p) 
-    { 
-        // Зпишем время в момент получения отчёта о доставке сообщения 
-        var etime = new Date(); 
-        ​ 
-        console.log(["​answer_to_web_chat_pipe",​ p]); 
-        $("#​answer_div"​).html("​Сообщение доставлено "​+p.data.number_messages+"​ получателям за "+ (etime.getTime() - timer.getTime() )+"​ms"​);​ 
-        $("#​answer_error"​).html("​ "​+p.data.error);​ 
-    }); 
- 
-   // Загружаем историю сообщений 
-   ​CometServer().get_pipe_log("​web_chat_pipe"​);​ 
-}); 
- 
- 
-function HtmlEncode(s) 
-{ 
-  var el = document.createElement("​div"​);​ 
-  el.innerText = el.textContent = s; 
-  s = el.innerHTML;​ 
-  return s; 
-} 
-</​file>​ 
-Следует отметить что сообщения от правленые в канал приходят всем кроме того к отправил это сообщение,​ ему приходит отчёт о доставке либо уведомление об ошибке. 
- 
-Отчёт о доставке содержит количество человек получивших сообщение. То есть если на канал было подписано два человека и один из них отправил сообщение в этот канал то в отчёте количество получателей будет 1. А если на канал был подписан только один человек и он же отправил сообщение в этот канал в отчёте будет указан 0. 
- 
-<​html>​ 
- 
-<p data-height="​512"​ data-theme-id="​0"​ data-slug-hash="​yPgddg"​ data-default-tab="​result"​ data-user="​Levhav"​ data-embed-version="​2"​ data-pen-title="​CppComet chat example"​ class="​codepen">​See the Pen <a href="​https://​codepen.io/​Levhav/​pen/​yPgddg/">​CppComet chat example</​a>​ by Trapenok Victor (<a href="​https://​codepen.io/​Levhav">​@Levhav</​a>​) on <a href="​https://​codepen.io">​CodePen</​a>​.</​p>​ 
-<script async src="​https://​production-assets.codepen.io/​assets/​embed/​ei.js"></​script>​ 
- 
-</​html>​ 
- 
-===== История сообщений для чата ===== 
- 
-Можно до 99 последних сообщений чата загружать из истории комет сервера. 
-Для включения сохранения истории сообщений в канале чата надо выполнить CometQL запрос в online командной строке для CometQL на странице в разделе Real time monitor. 
-<code sql> 
-INSERT INTO pipes_settings ('​name',​ '​length'​) VALUES ('​web_chat_pipe',​ 10); 
-</​code>​ 
- 
-==== Очищение истории сообщений чата ==== 
- 
-Для очищения истории сообщений в чате надо выполнить CometQL запрос в online командной строке для CometQL на странице в разделе Real time monitor. 
-<code sql> 
-DELETE FROM pipes_messages WHERE name = '​web_chat_pipe';​ 
-</​code>​ 
- 
-<note important>​Обратите внимание на разницу в командной строке CometQL: на страницах с документацией демо доступ для dev_id = 15 а в разделе Real time monitor командная строка для управления вашим личным dev_id</​note> ​ 
- 
-===== Примечания ===== 
- 
-<note tip>​Если вы захотите указать другое имя канала для работы чата то учтите что из Javascript api можно отправлять сообщения только в каналы начинающиеся с web_ Более подробно об этом смотрите в  [[comet:​javascript_api#​зарезервированные_имена_каналов|JavaScript API - зарезервированные_имена_каналов]]</​note>​