chat.js 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  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" lang="en"></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. organizrConsole('Plugin Function','Chat Websocket Connected!');
  69. organizrConsole('Plugin Function','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. ajaxloader(".content-wrap","in");
  100. organizrAPI2('GET','api/v2/plugins/chat/settings').success(function(data) {
  101. var response = data.response;
  102. $('#CHAT-settings-items').html(buildFormGroup(response.data));
  103. }).fail(function(xhr) {
  104. console.error("Organizr Function: API Connection Failed");
  105. });
  106. ajaxloader();
  107. });
  108. //Chat functions!
  109. $(document).on('keypress', '.chat-input-send', function(ev) {
  110. var keycode = (ev.keyCode ? ev.keyCode : ev.which);
  111. if (keycode == '13') {
  112. ev.preventDefault();
  113. $('.custom-send-button').click();
  114. }
  115. });
  116. // Send the Message enter by User
  117. $('body').on('click', '.custom-send-button', function(e) {
  118. e.preventDefault();
  119. var message = $('.chat-input-send').val();
  120. // Validate Name field
  121. if (message !== '') {
  122. organizrAPI2('POST','api/v2/plugins/chat/message',{ message : message }).success(function(data) {
  123. // Nada yet
  124. }).fail(function(xhr) {
  125. console.error("Organizr Function: API Connection Failed");
  126. });
  127. // Clear the message input field
  128. $('.chat-input-send').val('');
  129. // Show a loading image while sending
  130. $('.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>');
  131. }
  132. });
  133. function formatMessage(msg){
  134. var className = 'odd';
  135. if(msg.username == activeInfo.user.username){
  136. if(activeInfo.user.username == 'Guest' && activeInfo.user.uid !== msg.uid){
  137. className = '';
  138. }
  139. }else{
  140. className = '';
  141. }
  142. return `
  143. <li class="`+className+`">
  144. <div class="chat-image"> <img alt="male" src="`+msg.gravatar+`"> </div>
  145. <div class="chat-body">
  146. <div class="chat-text">
  147. <h4>`+msg.username+`</h4>
  148. <p> `+msg.message+` </p> <b>`+moment.utc(msg.date, "YYYY-MM-DD hh:mm").local().format('LLL')+`</b> </div>
  149. </div>
  150. </li>
  151. `;
  152. }
  153. function formatUsers(array){
  154. var users = {};
  155. var userList = '';
  156. array.reverse();
  157. $.each(array, function (i, v){
  158. if(!users.hasOwnProperty(v.username)){
  159. users[v.username] = {
  160. 'last':v.date,
  161. 'gravatar':v.gravatar
  162. }
  163. }
  164. });
  165. $.each(users, function (i, v) {
  166. userList += `
  167. <li>
  168. <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>
  169. </li>
  170. `;
  171. });
  172. userList += '<li class="p-20"></li>';
  173. return userList;
  174. }
  175. function chatEntry(){
  176. $(".chat-list").scrollTop($(".chat-list")[0].scrollHeight);
  177. $('.chat-input-send').focus();
  178. $('.chat-counter').addClass('hidden').html('0');
  179. }
  180. function getMessagesAndUsers(timeout, initial = false){
  181. var timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh["CHAT-userRefreshTimeout"];
  182. organizrAPI2('GET','api/v2/plugins/chat/message').success(function(data) {
  183. var response = data.response;
  184. if(initial == true){
  185. $.each(response.data, function (i, v){
  186. $('.chat-list').append(formatMessage(v));
  187. });
  188. }
  189. $('.chatonline').html(formatUsers(response.data));
  190. }).fail(function(xhr) {
  191. console.error("Organizr Function: API Connection Failed");
  192. });
  193. var timeoutTitle = 'ChatUserList';
  194. if(typeof timeouts[timeoutTitle] !== 'undefined'){ clearTimeout(timeouts[timeoutTitle]); }
  195. timeouts[timeoutTitle] = setTimeout(function(){ getMessagesAndUsers(timeout, false); }, timeout);
  196. }
  197. $(document).on('click', '.profile-pic', function(e) {
  198. $('.profile-image').removeClass('animated loop-animation rubberBand');
  199. });