From 224c51b5b7614661a724fbb3fada5bba30b2476e Mon Sep 17 00:00:00 2001 From: arzynik Date: Thu, 6 Nov 2014 12:47:04 -0800 Subject: [PATCH 1/9] fixed support sizing --- www/assets/cockpit/scss/cockpit.scss | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/www/assets/cockpit/scss/cockpit.scss b/www/assets/cockpit/scss/cockpit.scss index 6a13c67ce..c1958a3f7 100644 --- a/www/assets/cockpit/scss/cockpit.scss +++ b/www/assets/cockpit/scss/cockpit.scss @@ -3101,4 +3101,9 @@ h1.driver-title { @-webkit-keyframes fadeIn { from { opacity: 0; } to { opacity: 1.0; } +} + +.support-side-chat-table { + height: 100%; + width: 100%; } \ No newline at end of file From 43340db38c3e4ab9b79cd840188c887798828a44 Mon Sep 17 00:00:00 2001 From: arzynik Date: Thu, 6 Nov 2014 12:47:16 -0800 Subject: [PATCH 2/9] added ability to just refresh --- www/assets/cockpit/js/controllers.tickets.js | 40 ++++++++++---------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/www/assets/cockpit/js/controllers.tickets.js b/www/assets/cockpit/js/controllers.tickets.js index 6ccbbd672..3059fcba1 100644 --- a/www/assets/cockpit/js/controllers.tickets.js +++ b/www/assets/cockpit/js/controllers.tickets.js @@ -44,7 +44,7 @@ NGApp.controller('SideTicketCtrl', function($scope, $rootScope, TicketService, T }; $rootScope.$on('triggerViewTicket', function(e, ticket) { - loadTicket(ticket); + loadTicket(ticket == 'refresh' ? TicketViewService.scope.ticket : ticket); }); $scope.send = TicketViewService.send; @@ -81,24 +81,22 @@ NGApp.factory('TicketViewService', function($rootScope, $resource, $routeParams, } }); - service.websocket = new WebSocket('wss://' + location.host + ':9000/test?_token=' + $.cookie('token')); +// service.websocket = new WebSocket('wss://' + location.host + ':9000/test?_token=' + $.cookie('token')); - service.websocket.onopen = function(ev) { - console.debug('Connected to chat server.'); - } - service.websocket.onerror = function(ev) { - console.error('Chat server error: ', ev.data); - }; - service.websocket.onclose = function(ev) { - console.debug('Chat server connection closed.'); - }; + service.socket = io('https://chat.cockpit.la'); + + service.socket.on('connect', function (data) { + console.debug('Connected to socket.io'); + service.socket.emit('token', $.cookie('token')); + service.socket.emit('event.subscribe', 'ticket.' + service.scope.viewTicket); + }); service.send = function(message) { var msg = { - type: 'ticket.message', - ticket: service.scope.viewTicket, - body: message, - _token: $.cookie('token') + url: '/api/tickets/' + service.scope.viewTicket + '/message', + data: { + body: message + } }; service.scope.ticket.messages.push({ @@ -108,8 +106,8 @@ NGApp.factory('TicketViewService', function($rootScope, $resource, $routeParams, }); service.scope.$apply(); service.scroll(); - - service.websocket.send(JSON.stringify(msg)); + + service.socket.emit('event.message', msg); service.isTyping = false; }; @@ -145,8 +143,8 @@ NGApp.factory('TicketViewService', function($rootScope, $resource, $routeParams, }, 5000); }; - service.websocket.onmessage = function(ev) { - var payload = JSON.parse(ev.data); + service.socket.on('ticket.message', function(payload) { + console.debug('Recieved chat message: ', payload); if (payload.type != 'ticket.message') { @@ -162,8 +160,8 @@ NGApp.factory('TicketViewService', function($rootScope, $resource, $routeParams, service.scope.ticket.messages.push(payload); service.scope.$apply(); service.scroll(); - }; - + }); + service.scroll = function() { $('.support-chat-contents-scroll').stop(true,false).animate({ scrollTop: $('.support-chat-contents-scroll')[0].scrollHeight From 5afbb032f52fd78cd9a20704f419f9855339db84 Mon Sep 17 00:00:00 2001 From: arzynik Date: Thu, 6 Nov 2014 12:47:30 -0800 Subject: [PATCH 3/9] progress on stackcripts --- stackscript/chat.sh | 46 +++++++++++++++++++++++++++++++++++++++++++++ stackscript/lamp.sh | 5 ++++- 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 stackscript/chat.sh diff --git a/stackscript/chat.sh b/stackscript/chat.sh new file mode 100644 index 000000000..e35dc3f85 --- /dev/null +++ b/stackscript/chat.sh @@ -0,0 +1,46 @@ +#!/bin/bash +# +# +# + +source +source + + +function install_cockpit { + apache_virtualhost $1 + + groupadd dev + useradd -m -s /bin/bash -G dev deploy + # echo "sup3rb4c0n" | passwd --stdin deploy + + setup_github + + chown deploy:dev /home + rm -Rf /home/${1} + + sudo -u deploy git clone git@github.com:crunchbutton/crunchbutton.git /home/${1} + mkdir /home/${1}/logs /home/${1}/cache + mkdir /home/${1}/cache/min /home/${1}/cache/thumb /home/${1}/data + chmod -R 0777 /home/${1}/cache + +} + +# set basic shit +set_hostname $MACHINENAME +set_timezone + +# update and install shit +system_update + +ssh_port $SSHPORT + +apache_install +apache_virtualhost $MACHINENAME +# mysql_install $MYSQLROOTPW +php_install +install_basics +install_cockpit $MACHINENAME + +# restart it +restart_services diff --git a/stackscript/lamp.sh b/stackscript/lamp.sh index dd018eca6..bdceee7ae 100644 --- a/stackscript/lamp.sh +++ b/stackscript/lamp.sh @@ -182,8 +182,11 @@ function mysql_grant_user { # install php from a 3rd party repo function php_install { # yum -y remove php-common - rpm -Uvh http://mirror.webtatic.com/yum/el6/latest.rpm + #rpm -Uvh http://mirror.webtatic.com/yum/el6/latest.rpm +rpm -Uvh https://mirror.webtatic.com/yum/el7/epel-release.rpm +rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm yum -y install php55w php55w-opcache php55w-xml php55w-mysql php55w-mbstring php55w-mcrypt php55w-pear + sed -i -e 's/^short_open_tag = Off$/short_open_tag = On/' /etc/php.ini } From 7e1247a7dc2e5e84687129a8f196c71256f50275 Mon Sep 17 00:00:00 2001 From: arzynik Date: Thu, 6 Nov 2014 12:47:59 -0800 Subject: [PATCH 4/9] added socket.io library --- include/views/default/cockpit2/bundle/js.phtml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/include/views/default/cockpit2/bundle/js.phtml b/include/views/default/cockpit2/bundle/js.phtml index db66942f5..024936998 100644 --- a/include/views/default/cockpit2/bundle/js.phtml +++ b/include/views/default/cockpit2/bundle/js.phtml @@ -4,16 +4,18 @@ --> - + + + From 0a3208ae947621062704c7b7ba5bf2bfb90f7044 Mon Sep 17 00:00:00 2001 From: arzynik Date: Thu, 6 Nov 2014 12:48:10 -0800 Subject: [PATCH 5/9] fixed class definition for support side --- .../default/cockpit2/frontend/tickets/tickets-side-view.phtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/views/default/cockpit2/frontend/tickets/tickets-side-view.phtml b/include/views/default/cockpit2/frontend/tickets/tickets-side-view.phtml index 573f74918..d51d4656d 100644 --- a/include/views/default/cockpit2/frontend/tickets/tickets-side-view.phtml +++ b/include/views/default/cockpit2/frontend/tickets/tickets-side-view.phtml @@ -1,6 +1,6 @@
- +
  Issues #{{ticket.id_support}} From 29640145375bfa9cbaad7259aaac1d8489e35b51 Mon Sep 17 00:00:00 2001 From: arzynik Date: Thu, 6 Nov 2014 12:48:24 -0800 Subject: [PATCH 6/9] added ability to post messages --- .../default/cockpit2/api/tickets/index.php | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/include/controllers/default/cockpit2/api/tickets/index.php b/include/controllers/default/cockpit2/api/tickets/index.php index effe6e5d8..52c350d49 100644 --- a/include/controllers/default/cockpit2/api/tickets/index.php +++ b/include/controllers/default/cockpit2/api/tickets/index.php @@ -3,9 +3,6 @@ class Controller_api_tickets extends Crunchbutton_Controller_RestAccount { public function init() { - if ($this->method() != 'get') { - exit; - } if (c::getPagePiece(2)) { $support = Support::o(c::getPagePiece(2)); @@ -17,9 +14,28 @@ class Controller_api_tickets extends Crunchbutton_Controller_RestAccount { if (get_class($support) != 'Crunchbutton_Support') { $support = $support->get(0); } + + if ($this->method() == 'get') { + echo $support->json(); + exit; + } + + if (c::getPagePiece(3) == 'message' && $this->method() == 'post') { + $message = $support->addAdminMessage([ + 'body' => $this->request()['body'], + 'phone' => c::admin()->phone, + 'id_admin' => c::admin()->id_admin + ]); + if ($message->id_support_message) { + $message->notify(); + } + echo $message->json(); + exit; + } - echo $support->json(); + header('HTTP/1.0 409 Conflict'); exit; + } $limit = $this->request()['limit'] ? c::db()->escape($this->request()['limit']) : 25; From dcb5e92e0996c3df437f332b67c9c4fc20095b7b Mon Sep 17 00:00:00 2001 From: arzynik Date: Thu, 6 Nov 2014 12:55:09 -0800 Subject: [PATCH 7/9] added generic chat server for forwarding events --- cli/chat.js | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 cli/chat.js diff --git a/cli/chat.js b/cli/chat.js new file mode 100644 index 000000000..2a7d6a2a3 --- /dev/null +++ b/cli/chat.js @@ -0,0 +1,113 @@ +// Setup basic express server +var express = require('express'); +var app = express(); +var server = require('http').createServer(app); +var io = require('socket.io')(server); +var port = process.env.PORT || 3000; +var http = require('http'); +var querystring = require('querystring'); + +server.listen(port, function () { + console.log('Server listening at port %d', port); +}); + +// Routing +app.use(express.static(__dirname + '/public')); + +io.on('connection', function (socket) { + var addedUser = false; + console.log('user connected...'); + + socket.events = {}; + + // from php + socket.on('event.broadcast', function (payload) { + console.log('recieved broadcast...', payload); + + if (payload.room) { + if (typeof payload.room != 'object') { + payload.room = [payload.room]; + } + + for (var x in payload.room) { + io.to(payload.room[x]).emit(payload.event, payload.data); + } + } + + if (payload.admin) { + if (typeof payload.admin != 'object') { + payload.admin = [payload.admin]; + } + + io.sockets.clients().forEach(function(socket) { + if (payload.admin.indexOf(socket.id_admin) > -1) { + socket.emit(payload.event, payload.data); + } + }); + + } + }); + + // from socket + socket.on('event.message', function (payload) { + console.log('recieved message...', payload); + + if (!payload.url) { + return; + } + + var post = querystring.stringify(payload.data); + + var options = { + host: 'beta.cockpit.la', + path: payload.url, + port: '80', + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Content-Length': post.length, + 'Cookie': 'token=' + socket.token + } + }; + + var complete = function(data) { + console.log('api response: ', data); + //io.to('ticket.' + data.id_support).emit('ticket.message', data); + }; + + var req = http.request(options, function(res) { + console.log("statusCode: ", res.statusCode); + console.log("headers: ", res.headers); + + res.setEncoding('utf8'); + var str = ''; + res.on('data', function (chunk) { + str += chunk; + console.log('chunk: ', chunk); + }); + res.on('end', function () { + complete(str); + }); + }); + + req.write(post); + req.end(); + }); + + // listen for events + socket.on('event.subscribe', function (event) { + console.log('subscribing to ', event); + socket.join(event); + }); + + // stop listening for events + socket.on('event.unsubscribe', function (event) { + console.log('unsubscribing to ', event); + socket.leave(event); + }); + + // set the token to be used for authentication + socket.on('token', function (token) { + socket.token = token; + }); +}); \ No newline at end of file From 1fc49f2c3d7583f38084937fc0ecbd666eb1c881 Mon Sep 17 00:00:00 2001 From: arzynik Date: Thu, 6 Nov 2014 12:57:13 -0800 Subject: [PATCH 8/9] added optional host --- cli/chat.js | 2 +- www/assets/cockpit/js/controllers.tickets.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/cli/chat.js b/cli/chat.js index 2a7d6a2a3..4136c5286 100644 --- a/cli/chat.js +++ b/cli/chat.js @@ -59,7 +59,7 @@ io.on('connection', function (socket) { var post = querystring.stringify(payload.data); var options = { - host: 'beta.cockpit.la', + host: payload.host || 'beta.cockpit.la', path: payload.url, port: '80', method: 'POST', diff --git a/www/assets/cockpit/js/controllers.tickets.js b/www/assets/cockpit/js/controllers.tickets.js index 3059fcba1..1418a07ca 100644 --- a/www/assets/cockpit/js/controllers.tickets.js +++ b/www/assets/cockpit/js/controllers.tickets.js @@ -94,6 +94,7 @@ NGApp.factory('TicketViewService', function($rootScope, $resource, $routeParams, service.send = function(message) { var msg = { url: '/api/tickets/' + service.scope.viewTicket + '/message', + host: location.host, data: { body: message } From ae4ca6149618349ead13c7a7a42bc3876e7ddf35 Mon Sep 17 00:00:00 2001 From: arzynik Date: Thu, 6 Nov 2014 12:57:56 -0800 Subject: [PATCH 9/9] added nginx chat config --- conf/chat.conf | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 conf/chat.conf diff --git a/conf/chat.conf b/conf/chat.conf new file mode 100644 index 000000000..40718c73c --- /dev/null +++ b/conf/chat.conf @@ -0,0 +1,44 @@ +map $http_upgrade $connection_upgrade { + default upgrade; + '' close; +} + +upstream websocket { + #least_conn; + server localhost:3000; + # fail_timeout=20s; +} + +server { + listen 80; + listen 443 ssl; + + server_name chat.cockpit.la; + + ssl_certificate /home/chat.cockpit.la/ssl/wild.sha-2.cockpit.la.crt; + ssl_certificate_key /home/chat.cockpit.la/ssl/wild.sha-2.cockpit.la.key.private; + + # Redirect all non-SSL traffic to SSL. + if ($ssl_protocol = "") { + rewrite ^ https://$host$request_uri? permanent; +} + +location / { + proxy_http_version 1.1; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-NginX-Proxy true; + proxy_set_header Host $http_host; + proxy_set_header Upgrade $http_upgrade; + proxy_redirect off; + proxy_pass http://websocket; + proxy_set_header Connection "upgrade"; +# proxy_cache_bypass $http_upgrade; +} + + # root /home/chat.cockpit.la/www; + # index index.html index.htm; + # location / { + # try_files $uri $uri/ index.html; + # } +}