This commit is contained in:
Daniel Camargo 2014-11-06 19:35:14 -02:00
commit d2cc2a960e
9 changed files with 256 additions and 28 deletions

113
cli/chat.js Normal file
View File

@ -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: payload.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;
});
});

44
conf/chat.conf Normal file
View File

@ -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;
# }
}

View File

@ -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;

View File

@ -4,16 +4,18 @@
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.0/angular-resource.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.0/angular-animate.min.js"></script>
-->
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.18/angular.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.18/angular.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.18/angular-route.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.18/angular-resource.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.18/angular-animate.min.js"></script>
<script src="//cdn.socket.io/socket.io-1.2.0.js"></script>
<!-- Payment stuff -->
<script src="https://js.stripe.com/v2/"></script>
<script src="https://js.balancedpayments.com/1.1/balanced.js"></script>
<script src="/assets/js/snap.js"></script>
<script src="/assets/js/date.js"></script>
<script src="/assets/js/jquery.totalstorage.js"></script>

View File

@ -1,6 +1,6 @@
<div ng-controller="SideTicketCtrl" class="support-side-chat">
<table style="height: 100%">
<table class="support-side-chat-table">
<tr><td class="support-chat-header">
<a class="support-chat-header-back" ng-click="setViewTicket(0)">&nbsp;<i class="fa fa-chevron-left"></i> Issues</a>
<a class="support-chat-header-issue" href="/ticket/{{ticket.id_support}}">#{{ticket.id_support}}</a>

46
stackscript/chat.sh Normal file
View File

@ -0,0 +1,46 @@
#!/bin/bash
# <udf name="machinename" label="Hostname" example="somedomain.com"/>
# <udf name="mysqlrootpw" label="MySQL root password" example="password"/>
# <udf name="sshport" label="Port for SSH" example="22" default="22"/>
source <ssinclude StackScriptID="8646">
source <ssinclude StackScriptID="8649">
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

View File

@ -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
}

View File

@ -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,23 @@ 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',
host: location.host,
data: {
body: message
}
};
service.scope.ticket.messages.push({
@ -108,8 +107,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 +144,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 +161,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

View File

@ -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%;
}