chat.js 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. // FUNCTIONS FOR CHAT
  2. chatLaunch()
  3. function chatLaunch(){
  4. if(typeof activeInfo == 'undefined'){
  5. setTimeout(function () {
  6. chatLaunch();
  7. }, 1000);
  8. }else{
  9. if(activeInfo.plugins["CHAT-enabled"] == true && activeInfo.plugins.includes["CHAT-authKey-include"] !== '' && activeInfo.plugins.includes["CHAT-appID-include"] !== '' && activeInfo.plugins.includes["CHAT-cluster-include"] !== ''){
  10. if (activeInfo.user.groupID <= activeInfo.plugins.includes["CHAT-Auth-include"]) {
  11. var menuList = `<li><a class="" href="javascript:void(0)" onclick="tabActions(event,'chat','plugin');chatEntry();"><i class="fa fa-comments-o fa-fw"></i> <span lang="en">Chat</span><small class="chat-counter label label-rouded label-info pull-right hidden">0</small></a></li>`;
  12. var htmlDOM = `
  13. <div id="container-plugin-chat" class="plugin-container hidden">
  14. <div class="chat-main-box bg-org">
  15. <!-- .chat-left-panel -->
  16. <div class="chat-left-aside">
  17. <div class="open-panel"><i class="ti-angle-right"></i></div>
  18. <div class="chat-left-inner bg-org"><ul class="chatonline style-none "></ul></div>
  19. </div>
  20. <!-- .chat-left-panel -->
  21. <!-- .chat-right-panel -->
  22. <div class="chat-right-aside">
  23. <div class="chat-box">
  24. <ul class="chat-list p-t-30"></ul>
  25. <div class="row send-chat-box">
  26. <div class="col-sm-12">
  27. <textarea class="form-control chat-input-send" placeholder="Type your message"></textarea>
  28. <div class="custom-send">
  29. <button type="button" class="btn btn-info btn-lg custom-send-button"><i class="fa fa-paper-plane fa-2x"></i> </button>
  30. </div>
  31. </div>
  32. </div>
  33. </div>
  34. </div>
  35. <!-- .chat-right-panel -->
  36. </div>
  37. </div>
  38. `;
  39. $('.append-menu').after(menuList);
  40. $('.plugin-listing').append(htmlDOM);
  41. pageLoad();
  42. // Enable pusher logging - don't include this in production
  43. //Pusher.logToConsole = true;
  44. // Add API Key & cluster here to make the connection
  45. var pusher = new Pusher(activeInfo.plugins.includes["CHAT-authKey-include"], {
  46. cluster: activeInfo.plugins.includes["CHAT-cluster-include"],
  47. encrypted: true
  48. });
  49. // Enter a unique channel you wish your users to be subscribed in.
  50. var channel = pusher.subscribe('org_channel');
  51. // bind the server event to get the response data and append it to the message div
  52. channel.bind('my-event',
  53. function(data) {
  54. formatMessage(data);
  55. $('.chat-list').append(formatMessage(data));
  56. $('.custom-send').html('<button type="button" class="btn btn-info btn-lg custom-send-button"><i class="fa fa-paper-plane fa-2x"></i> </button>');
  57. $(".chat-list").scrollTop($(".chat-list")[0].scrollHeight);
  58. if($('#container-plugin-chat').hasClass('hidden')){
  59. var chatSound = new Audio(activeInfo.plugins.includes["CHAT-newMessageSound-include"]);
  60. chatSound.play();
  61. message(data.username,data.message,activeInfo.settings.notifications.position,"#FFF","success","20000");
  62. $('.profile-image').addClass('animated loop-animation rubberBand');
  63. $('.chat-counter').removeClass('hidden').html(parseInt($('.chat-counter').text()) + 1);
  64. }
  65. });
  66. // check if the user is subscribed to the above channel
  67. channel.bind('pusher:subscription_succeeded', function(members) {
  68. console.log('Chat Websocket Connected!');
  69. console.log('Connecting to Organizr Chat DB');
  70. getMessagesAndUsers(activeInfo.settings.homepage.refresh["CHAT-userRefreshTimeout"], true);
  71. });
  72. /*jslint browser: true*/
  73. /*global $, jQuery, alert*/
  74. $(document).ready(function () {
  75. "use strict";
  76. $('.chat-left-inner > .chatonline').slimScroll({
  77. height: '100%',
  78. position: 'right',
  79. size: "0px",
  80. color: '#dcdcdc'
  81. });
  82. $('.chat-list').slimScroll({
  83. height: '100%',
  84. position: 'right',
  85. size: "0px",
  86. color: '#dcdcdc',
  87. start: 'bottom',
  88. });
  89. $(".open-panel").on("click", function () {
  90. $(".chat-left-aside").toggleClass("open-pnl");
  91. $(".open-panel i").toggleClass("ti-angle-left");
  92. });
  93. });
  94. }
  95. }
  96. }
  97. }
  98. $(document).on('click', '#CHAT-settings-button', function() {
  99. var post = {
  100. plugin:'chat/settings/get', // used for switch case in your API call
  101. };
  102. ajaxloader(".content-wrap","in");
  103. organizrAPI('POST','api/?v1/plugin',post).success(function(data) {
  104. var response = JSON.parse(data);
  105. $('#CHAT-settings-items').html(buildFormGroup(response.data));
  106. }).fail(function(xhr) {
  107. console.error("Organizr Function: API Connection Failed");
  108. });
  109. ajaxloader();
  110. });
  111. //Chat functions!
  112. $(document).on('keypress', '.chat-input-send', function(ev) {
  113. var keycode = (ev.keyCode ? ev.keyCode : ev.which);
  114. if (keycode == '13') {
  115. ev.preventDefault();
  116. $('.custom-send-button').click();
  117. }
  118. });
  119. // Send the Message enter by User
  120. $('body').on('click', '.custom-send-button', function(e) {
  121. e.preventDefault();
  122. var message = $('.chat-input-send').val();
  123. // Validate Name field
  124. if (message !== '') {
  125. var post = {
  126. plugin:'chat/message',
  127. message:message
  128. };
  129. organizrAPI('POST','api/?v1/plugin',post).success(function(data) {
  130. // Nada yet
  131. }).fail(function(xhr) {
  132. console.error("Organizr Function: API Connection Failed");
  133. });
  134. // Clear the message input field
  135. $('.chat-input-send').val('');
  136. // Show a loading image while sending
  137. $('.custom-send').html('<button type="button" class="btn btn-info btn-lg custom-send-button" disabled><i class="fa fa-spinner fa-pulse fa-2x"></i> </button>');
  138. }
  139. });
  140. function formatMessage(msg){
  141. var className = 'odd';
  142. if(msg.username == activeInfo.user.username){
  143. if(activeInfo.user.username == 'Guest' && activeInfo.user.uid !== msg.uid){
  144. className = '';
  145. }
  146. }else{
  147. className = '';
  148. }
  149. return `
  150. <li class="`+className+`">
  151. <div class="chat-image"> <img alt="male" src="`+msg.gravatar+`"> </div>
  152. <div class="chat-body">
  153. <div class="chat-text">
  154. <h4>`+msg.username+`</h4>
  155. <p> `+msg.message+` </p> <b>`+moment.utc(msg.date, "YYYY-MM-DD hh:mm").local().format('LLL')+`</b> </div>
  156. </div>
  157. </li>
  158. `;
  159. }
  160. function formatUsers(array){
  161. var users = {};
  162. var userList = '';
  163. array.reverse();
  164. $.each(array, function (i, v){
  165. if(!users.hasOwnProperty(v.username)){
  166. users[v.username] = {
  167. 'last':v.date,
  168. 'gravatar':v.gravatar
  169. }
  170. }
  171. });
  172. $.each(users, function (i, v) {
  173. userList += `
  174. <li>
  175. <a href="javascript:void(0)"><img src="`+v.gravatar+`" alt="user-img" class="img-circle"> <span>`+i+`<small class="text-success">`+moment.utc(v.last, "YYYY-MM-DD hh:mm[Z]").local().fromNow()+`</small></span></a>
  176. </li>
  177. `;
  178. });
  179. userList += '<li class="p-20"></li>';
  180. return userList;
  181. }
  182. function chatEntry(){
  183. $(".chat-list").scrollTop($(".chat-list")[0].scrollHeight);
  184. $('.chat-input-send').focus();
  185. $('.chat-counter').addClass('hidden').html('0');
  186. }
  187. function getMessagesAndUsers(timeout, initial = false){
  188. var timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh["CHAT-userRefreshTimeout"];
  189. organizrAPI('GET','api/?v1/plugin&plugin=chat&cmd=chat/message').success(function(data) {
  190. var response = JSON.parse(data);
  191. if(initial == true){
  192. $.each(response.data, function (i, v){
  193. $('.chat-list').append(formatMessage(v));
  194. });
  195. }
  196. $('.chatonline').html(formatUsers(response.data));
  197. }).fail(function(xhr) {
  198. console.error("Organizr Function: API Connection Failed");
  199. });
  200. var timeoutTitle = 'ChatUserList';
  201. if(typeof timeouts[timeoutTitle] !== 'undefined'){ clearTimeout(timeouts[timeoutTitle]); }
  202. timeouts[timeoutTitle] = setTimeout(function(){ getMessagesAndUsers(timeout, false); }, timeout);
  203. }
  204. $(document).on('click', '.profile-pic', function(e) {
  205. $('.profile-image').removeClass('animated loop-animation rubberBand');
  206. });