1
0

6 Commits

Author SHA1 Message Date
fd183a7d4f Responive layout for demo.html 2017-03-16 20:36:28 +01:00
de0480b859 Fix scrolÃing and review breakÃpoints 2017-03-11 16:23:55 +01:00
236cae183a cleared unneeded dependencies 2017-03-11 14:06:54 +01:00
d131979c5d First edit for better readability 2017-03-10 21:31:57 +01:00
9c0c30c5c2 Signed-off-by: eorg_oz <eorg.vie@gmail.com> 2017-03-09 18:28:03 +01:00
462b2a0f9e Move debug to config 2017-03-08 16:20:51 +01:00
12 changed files with 5478 additions and 426 deletions

5
app.js
View File

@ -2,15 +2,16 @@ var server = require("./server");
var router = require("./route");
var requestHandlers = require("./requestHandlers");
var debug = false; // todo move this to configfile
var debug = server.debugMode();
var handle = {}
handle["/"] = requestHandlers.sendInterface;
handle["/interface"] = requestHandlers.sendInterface;
handle["/sprite/emoji.css"] = requestHandlers.sendEmojiCss;
handle["/sprite/emoji.png"] = requestHandlers.sendEmojiPng;
handle["/js/jquery-1.12.1.min"] = requestHandlers.sendJquery;
handle["/js/jquery-ui.js"] = requestHandlers.sendJqueryUI;
handle["/css/bootstrap.min.css"] = requestHandlers.sendBootstrap;
handle["/sprite/emoji.ttf"] = requestHandlers.sendEmojiTtf;
handle["/clear"] = requestHandlers.sendClear;
if(server.demoMode()){

View File

@ -1,179 +1,144 @@
<!DOCTYPE html>
<meta charset="UTF-8">
<html>
<head>
<title>SMS Board</title>
<link rel='stylesheet' href='sprite/emoji.css' >
<link rel="stylesheet" href="/css/bootstrap.min.css" />
<script src="/js/jquery-1.12.1.min"></script>
<script src="/js/jquery-ui.js"></script>
<script src="/socket.io/socket.io.js">
</script>
<style>
/* Sticky footer styles
-------------------------------------------------- */
@import url('https://fonts.googleapis.com/css?family=Noto+Sans');
@font-face {
font-family: 'Emoji';
src: url('/sprite/emoji.ttf') format('truetype');
}
html,
body {
height: 100%;
font-family: 'Noto Sans', sans-serif;
/* The html and body elements cannot have any padding or margin. */
}
/* Wrapper for page content to push down footer */
#wrap {
min-height: 100%;
height: auto;
/* Negative indent footer by its height */
margin: 0 auto -60px;
/* Pad bottom by footer height */
padding: 0 0 60px;
}
/* Set the fixed height of the footer here */
#footer {
height: 100px;
position: fixed;
bottom: 0;
width: 100%;
}
h1 {
font-family: 'Emoji', 'Noto Sans', sans-serif;
}
</style>
<script>
const toDisplay = 4; //define the number of messages to show
var iosocket;
var currentMessageCount = 0;
var newDiv;
var mynumber;
function getColor(num){
switch(num){
case 0:
return "#428bca"; //blue
break;
case 1:
return "#5cb85c"; //green
break;
case 2:
return "#5bc0de"; //lightblue
break;
case 3:
return "#f0ad4e"; //orange
break;
case 4:
return "#d9534f"; //red
break;
<meta charset="UTF-8">
<title>SMS Board</title>
<link rel='stylesheet' href='sprite/emoji.css' >
<link rel="stylesheet" href="/css/bootstrap.min.css" />
<script src="/js/jquery-1.12.1.min"></script>
<script src="/js/jquery-ui.js"></script>
<script src="/socket.io/socket.io.js"></script>
<style>
/* Sticky footer styles
-------------------------------------------------- */
html, body {
height: 100%;
/* The html and body elements cannot have any padding or margin. */
}
}
/* Wrapper for page content to push down footer */
#wrap {
min-height: 100%;
height: auto;
/* Negative indent footer by its height */
margin: 0 auto -60px;
/* Pad bottom by footer height */
padding: 0 0 60px;
}
/* Set the fixed height of the footer here */
#footer {
height: 100px;
position: fixed;
bottom: 0;
width: 100%;
}
</style>
<script>
const toDisplay = 4; //define the number of messages to show
var iosocket;
var currentMessageCount = 0;
var newDiv;
var mynumber;
function getColor(num){
switch(num){
case 0:
return "#428bca"; //blue
break;
case 1:
return "#5cb85c"; //green
break;
case 2:
return "#5bc0de"; //lightblue
break;
case 3:
return "#f0ad4e"; //orange
break;
case 4:
return "#d9534f"; //red
break;
}
}
function initSocketIO()
{
iosocket = io.connect();
function initSocketIO() {
iosocket = io.connect();
iosocket.on('clientrefresh', function() {
location.reload();
});
iosocket.on('clientrefresh', function() {
location.reload();
});
iosocket.on('connect', function() {
iosocket.on('debugMessage', function(message) {
alert(message);
});
iosocket.on('connect', function() {
iosocket.on('config', function(phonenumber) {
mynumber = phonenumber;
$( "span.number" ).html(mynumber);
});
iosocket.on('newMessage', function(time,number,message,color) {
var censoredNumber = number.substring(0,3) + "********" +number.substring(number.length - 3, number.length);
var messages = document.getElementById('messagesBody');
var newDiv = document.createElement('div');
var newH1 = document.createElement('h1');
var newP = document.createElement('p');
newH1.innerHTML = message;
newP.innerHTML = "by " + censoredNumber + " at " + time;
newDiv.style.backgroundColor = getColor(color); //need this on both for some browsers (especially safari) to recognize...
newDiv.style = "background-color:" + getColor(color) + " !important; padding:10px 0; margin:10px 0;";
newDiv.className = "jumbotron";
newDiv.appendChild(newH1);
newDiv.appendChild(newP);
currentMessageCount++;
iosocket.on('debugMessage', function(message) {
alert(message);
});
if(currentMessageCount > toDisplay) {
//Remove the top div
$('#messagesBody').find('div').first().slideUp(function() {
$(this).remove();
document.getElementById('messagesBody').appendChild(newDiv);
});
currentMessageCount--;
} else {
document.getElementById('messagesBody').appendChild(newDiv);
}
});
});
};
iosocket.on('config', function(phonenumber) {
mynumber = phonenumber;
$( "span.number" ).html(mynumber);
});
function initButton() {
$("#check").button();
};
window.onload = function() {
initSocketIO();
iosocket.emit('getLastMessages',toDisplay);
iosocket.emit('getConfig');
};
iosocket.on('newMessage', function(time,number,message,color) {
var censoredNumber = number.substring(0,3) + "********" +number.substring(number.length - 3, number.length);
var messages = document.getElementById('messagesBody');
newDiv = document.createElement('div');
var newH1 = document.createElement('h1');
var newP = document.createElement('p');
newH1.innerHTML = message;
newP.innerHTML = "by "+censoredNumber+" at "+time;
newDiv.style.backgroundColor = getColor(color); //need this on both for some browsers (especially safari) to recognize...
newDiv.style="background-color:"+getColor(color)+" !important; padding:10px 0; margin:10px 0;";
newDiv.className="jumbotron";
newDiv.appendChild(newH1);
newDiv.appendChild(newP);
currentMessageCount++;
if(currentMessageCount > toDisplay)
{
//Remove the top div
$('#messagesBody').find('div').first().slideUp(function() {
$(this).remove();
document.getElementById('messagesBody').appendChild(newDiv);
});
currentMessageCount--;
}else{
document.getElementById('messagesBody').appendChild(newDiv);
}
});
});
}
function initButton()
{
$("#check").button();
}
window.onload = function() {
initSocketIO();
iosocket.emit('getLastMessages',toDisplay);
iosocket.emit('getConfig');
};
$(document).ready(function() {
$(document).ready(function() {
$('#check').click(function() {
iosocket.emit('sendAT',toggleVal);
});
});
</script>
iosocket.emit('sendAT',toggleVal);
});
});
</script>
</head>
<body style="/*background-color: #D4D4D4;*/">
<div style="text-align:center;" >
<h2>Send an SMS with a message to <span class="number" style="color:#3399ff;"></span></h2>
<div id="wrap">
<div id="messagesBody">
</div>
<br>
<br>
<div style="display:none;" id="btnHolder">
<h2>Debug functions</h2>
<input type="checkbox" id="check" value="toggle"/><label for="check">Send AT</label>
<div id="debugOut"> </div>
</div>
</div>
<!-- <div id="footer">
<h2>Send an SMS with a message to <span class="number" style="color:#3399ff;"></span></h2>
</div>
-->
<div style="text-align:center;" >
<h2>Send an SMS with a message to <span class="number" style="color:#3399ff;"></span></h2>
<div id="wrap">
<div id="messagesBody"></div>
<br>
<br>
<div style="display:none;" id="btnHolder">
<h2>Debug functions</h2>
<input type="checkbox" id="check" value="toggle"/><label for="check">Send AT</label>
<div id="debugOut"> </div>
</div>
</div>
<div id="footer">
<h2 style="display: none;">Send an SMS with a message to <span class="number" style="color:#3399ff;"></span></h2>
</div>
</div>
</body>
</html>
</html>

View File

@ -1,62 +1,54 @@
<!DOCTYPE html>
<meta charset="UTF-8">
<html>
<head>
<title>Clear Board</title>
<link rel="stylesheet" href="/css/bootstrap.min.css" />
<script src="/js/jquery-1.12.1.min"></script>
<script src="/js/jquery-ui.js"></script>
<script src="/socket.io/socket.io.js"></script>
<script>
var iosocket;
function initSocketIO()
{
iosocket = io.connect();
iosocket.on('connect', function() {
iosocket.on('debugMessage', function(message) {
alert(message);
});
});
}
window.onload = function() {
initSocketIO();
<html>
<head>
<meta charset="UTF-8">
<title>Clear Board</title>
<link rel='stylesheet' href='sprite/emoji.css' >
<link rel="stylesheet" href="/css/bootstrap.min.css" />
<script src="/js/jquery-1.12.1.min"></script>
<script src="/js/jquery-ui.js"></script>
<script src="/socket.io/socket.io.js"></script>
<script>
var iosocket;
function initSocketIO() {
iosocket = io.connect();
iosocket.on('connect', function() {
iosocket.on('debugMessage', function(message) {
alert(message);
});
});
};
window.onload = function() {
initSocketIO();
};
$(document).ready(function() {
$('#clear').click(function() {
var number = $('#number').val();
iosocket.emit('clear',number);
alert("cleared");
});
$('#refresh').click(function() {
iosocket.emit('refreshClients');
$(document).ready(function() {
$('#clear').click(function() {
var number = $('#number').val();
iosocket.emit('clear',number);
alert("cleared");
});
$('#refresh').click(function() {
iosocket.emit('refreshClients');
});
});
});
</script>
</head>
<body>
<div style="text-align:center;" >
<div id="wrap">
<div id="btnHolder">
<h2>Functions</h2>
<input type="number" id="number" value="1" min="1"/><label for="number">Number</label><br>
<input type="button" id="clear" value="clear"/>
<br>
<input type="button" id="refresh" value="refresh"/>
<div id="debugOut"> </div>
</div>
</div>
</body>
</html>
</script>
</head>
<body>
<div style="text-align:center;" >
<div id="wrap">
<div id="btnHolder">
<h2>Functions</h2>
<input type="number" id="number" value="1" min="1"/>
<label for="number">Number</label>
<br>
<input type="button" id="clear" value="clear"/>
<br>
<input type="button" id="refresh" value="refresh"/>
<div id="debugOut"></div>
</div>
</div>
</div>
</body>
</html>

413
demo.html
View File

@ -1,220 +1,245 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=320, initial-scale=1">
<title>Chat</title>
<script src="/js/jquery-1.12.1.min"></script>
<script src="/js/jquery-ui.js"></script>
<script src="/socket.io/socket.io.js"></script>
</head>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Chat</title>
<script src="/js/jquery-1.12.1.min"></script>
<script src="/js/jquery-ui.js"></script>
<script src="/socket.io/socket.io.js"></script>
<script type="text/javascript">
var iosocket;
<script type="text/javascript">
var iosocket;
function initSocketIO() {
iosocket = io.connect();
function initSocketIO()
{
iosocket = io.connect();
iosocket.on('connect', function() {
createSystemMessage('[Connected]');
console.log("connect");
iosocket.on('connect', function() {
createSystemMessage('[Connected]');
console.log("connect");
iosocket.on('debugMessage', function(message) {
alert(message);
});
iosocket.on('disconnect', function() {
createSystemMessage('[Disconnected]');
});
});
}
iosocket.on('debugMessage', function(message) {
alert(message);
});
iosocket.on('disconnect', function() {
createSystemMessage('[Disconnected]');
});
});
}
window.onload = function() {
initSocketIO();
window.onload = function() {
initSocketIO();
};
function createSystemMessage(message) {
var message = document.createTextNode(message);
function createSystemMessage(message) {
var message = document.createTextNode(message);
var messageBox = document.createElement('p');
messageBox.className = 'system';
var messageBox = document.createElement('p');
messageBox.className = 'system';
messageBox.appendChild(message);
messageBox.appendChild(message);
var chat = document.getElementById('chat_box');
chat.appendChild(messageBox);
}
var chat = document.getElementById('chat_box');
chat.appendChild(messageBox);
}
function createUserMessage(user, message) {
var user = document.createTextNode(user + ': ');
function createUserMessage(user, message) {
var user = document.createTextNode(user + ': ');
var userBox = document.createElement('span');
userBox.className = 'username';
userBox.appendChild(user);
var userBox = document.createElement('span');
userBox.className = 'username';
userBox.appendChild(user);
var message = document.createTextNode(message);
var message = document.createTextNode(message);
var messageBox = document.createElement('p');
messageBox.appendChild(userBox);
messageBox.appendChild(message);
var messageBox = document.createElement('p');
messageBox.appendChild(userBox);
messageBox.appendChild(message);
var chat = document.getElementById('chat_box');
chat.appendChild(messageBox);
}
var chat = document.getElementById('chat_box');
chat.appendChild(messageBox);
}
function sendMessage() {
var user = document.getElementById('user');
var message = document.getElementById('message');
var number = document.getElementById('number');
var currentDate = new Date();
var time = currentDate.toLocaleTimeString();
var date = currentDate.getDate()+"/"+currentDate.getMonth()+"/"+currentDate.getFullYear();
iosocket.emit('demoMessage',number.value.toString(),date,time,message.value);
createUserMessage(time,message.value);
message.value = "";
};
function sendMessage() {
var user = document.getElementById('user');
var message = document.getElementById('message');
var number = document.getElementById('number');
var currentDate = new Date();
var time = currentDate.toLocaleTimeString();
var date = currentDate.getDate()+"/"+currentDate.getMonth()+"/"+currentDate.getFullYear();
// added a little wrapper for enter submit
function submitEnter(e){
if (( e.keyCode == 13 )&&(e.shiftKey === false)) {
sendMessage();
}
}
</script>
<style type="text/css">
@import url('https://fonts.googleapis.com/css?family=Noto+Sans');
* {
font-family: "Noto Sans", sans-serif;
font-size: 24px;
}
iosocket.emit('demoMessage',number.value.toString(),date,time,message.value);
createUserMessage(time,message.value);
message.value = "";
};
html, body, #wrapper {
margin: 0;
padding: 0;
height: 100%;
}
// added a little wrapper for enter submit
function submitEnter(e){
if (( e.keyCode == 13 )&&(e.shiftKey === false)) {
sendMessage();
}
#wrapper {
background-color: #ecf0f1;
}
}
#chat_box {
box-sizing: border-box;
height: calc(100% - 50px);
overflow: auto;
padding-bottom: 50px;
}
#footer {
box-sizing: border-box;
position: fixed;
bottom: 0;
height: 50px;
width: 100%;
background-color: #2980b9;
}
</script>
#footer .content {
padding-top: 4px;
position: relative;
}
<body>
<div id="wrapper">
<div id="chat_box" class="content"></div>
#number {
width: 20%;
max-width: 240px;
}
#message {
width: calc(90% - 360px);
}
<div id="footer">
<div class="content">
<input type="text" id="number" value="+4301234567890" />
<input type="text" id="message" onkeypress="return submitEnter(event)" placeholder="Enter a Test Message! (Or emoji!, google if if you don't know how)" />
<input type="button" id="send_btn" value="Send" onclick="sendMessage()">
#send_btn {
width: 120px;
position: relative;
margin: 2px;
}
.content {
width: 70%;
margin: 0 auto;
}
input[type="text"],
input[type="button"] {
border: 0;
color: #fff;
}
input[type="text"] {
background-color: #146EA8;
padding: 3px 10px;
margin: 2px;
max-width: 92%;
}
input[type="button"] {
background-color: #f39c12;
border-right: 1px solid #e67e22;
border-bottom: 1px solid #e67e22;
min-width: 70px;
display: inline-block;
position: relative;
}
input[type="button"]:hover {
background-color: #e67e22;
border-right: 1px solid #f39c12;
border-bottom: 1px solid #f39c12;
cursor: pointer;
}
.system,
.username {
color: #aaa;
font-style: italic;
font-family: monospace;
font-size: 16px;
}
@media screen and (max-width: 1000px) {
.content { width: 90%; }
#send_btn {
position: relative;
}
}
@media screen and (max-width: 780px) {
#footer {
height: 91px;
}
#chat_box {
padding-bottom: 91px;
height: calc(100% - 91px);
}
#number {
width: 100%;
}
#message {
min-width: 60%;
}
#send_btn {
position: absolute;
right: 0;
bottom: 3px;
margin: 0;
width: 10%;
}
}
@media screen and (max-width: 400px) {
#footer {
height: 135px;
}
#chat_box {
padding-bottom: 135px;
height: calc(100% - 135px);
}
#number {
max-width: none;
width: 93%;
}
#message {
width: 93%;
}
#send_btn {
position: relative;
margin-top: 3px;
width: 100%;
}
}
</style>
</head>
<body>
<div id="wrapper">
<div id="chat_box" class="content"></div>
<div id="footer">
<div class="content">
<input type="text" id="number" value="+4301234567890" />
<input type="text" id="message" onkeypress="return submitEnter(event)" placeholder="Enter a Message" />
<input type="button" id="send_btn" value="Send" onclick="sendMessage()">
</div>
</div>
</div>
</div>
</div>
</body>
</html>
<style type="text/css">
* {
font-family: "Arial";
font-size: 24px;
}
html, body, #wrapper {
margin: 0;
padding: 0;
height: 100%;
}
#wrapper {
background-color: #ecf0f1;
}
#chat_box {
box-sizing: border-box;
height: 100%;
overflow: auto;
padding-bottom: 50px;
}
#footer {
box-sizing: border-box;
position: fixed;
bottom: 0;
height: 50px;
width: 100%;
background-color: #2980b9;
}
#footer .content {
padding-top: 4px;
position: relative;
}
#user { width: 20%; }
#message { width: 68%; }
#send_btn {
width: 10%;
position: absolute;
right: 0;
bottom: 0;
margin: 0;
}
.content {
width: 70%;
margin: 0 auto;
}
input[type="text"],
input[type="button"] {
border: 0;
color: #fff;
}
input[type="text"] {
background-color: #146EA8;
padding: 3px 10px;
}
input[type="button"] {
background-color: #f39c12;
border-right: 2px solid #e67e22;
border-bottom: 2px solid #e67e22;
min-width: 70px;
display: inline-block;
}
input[type="button"]:hover {
background-color: #e67e22;
border-right: 2px solid #f39c12;
border-bottom: 2px solid #f39c12;
cursor: pointer;
}
.system,
.username {
color: #aaa;
font-style: italic;
font-family: monospace;
font-size: 16px;
}
@media(max-width: 1000px) {
.content { width: 90%; }
}
@media(max-width: 780px) {
#footer { height: 91px; }
#chat_box { padding-bottom: 91px; }
#user { width: 100%; }
#message { width: 80%; }
}
@media(max-width: 400px) {
#footer { height: 135px; }
#chat_box { padding-bottom: 135px; }
#message { width: 100%; }
#send_btn {
position: relative;
margin-top: 3px;
width: 100%;
}
}
</style>
</body>
</html>

View File

@ -4,7 +4,7 @@
"description": "A SMS Messageboard built using node and express",
"main": "app.js",
"dependencies": {
"async": "^2.0.0-rc.6",
"emojize": "^0.2.0",
"lowdb": "^0.12.5",
"serialport": "^4.0.5",
"socket.io": "^1.4.8"

View File

@ -12,6 +12,20 @@ function sendInterface(response) {
response.end(html);
}
function sendEmojiCss(response) {
console.log("Request handler 'Emojicss' was called.");
response.writeHead(200, {"Content-Type": "text/css"});
var html = fs.readFileSync(__dirname + "/served/emoji.css")
response.end(html);
}
function sendEmojiPng(response) {
console.log("Request handler 'Emojipng' was called.");
response.writeHead(200, {"Content-Type": "image/png"});
var html = fs.readFileSync(__dirname + "/served/emoji.png")
response.end(html);
}
function sendBootstrap(response) {
console.log("Request handler 'css' was called.");
response.writeHead(200, {"Content-Type": "text/css"});
@ -47,19 +61,13 @@ function sendDemo(response) {
response.end(html);
}
function sendEmojiTtf(response) {
console.log("Request handler 'EmojiTtf' was called.");
response.writeHead(200, {"Content-Type": "font/ttf"});
var html = fs.readFileSync(__dirname + "/served/NotoColorEmoji.ttf")
response.end(html);
}
exports.sendClear = sendClear;
exports.sendDemo = sendDemo;
exports.sendEmojiTtf = sendEmojiTtf;
exports.sendBootstrap = sendBootstrap;
exports.sendJqueryUI = sendJqueryUI;
exports.sendJquery = sendJquery;
exports.sendEmojiPng = sendEmojiPng;
exports.sendEmojiCss = sendEmojiCss;
exports.sendInterface = sendInterface;

View File

@ -21,6 +21,10 @@
{
"param": "demoMode",
"value": true
},
{
"param": "debugMode",
"value": false
}
]
}

Binary file not shown.

Binary file not shown.

5051
served/emoji.css Normal file

File diff suppressed because it is too large Load Diff

BIN
served/emoji.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 MiB

View File

@ -7,6 +7,7 @@ low = require('lowdb'),
storage = require('lowdb/file-async'),
db = low('db.json', { storage });
var convert = require('emojize').emojize;
var config = low('config.json', { storage });
var socketServer;
var port = config('mainConfig').chain().find({ param: 'port' }).value()['value'];
@ -22,6 +23,11 @@ module.exports.demoMode = function () {
return config('debug').chain().find({ param: 'demoMode' }).value()['value'];
};
module.exports.debugMode = function () {
return config('debug').chain().find({ param: 'debugMode' }).value()['value'];
};
// utility function for ucs2 decode
function ucs2Parse(ucs2){
codeArray = ucs2.match(/.{1,4}/g);
@ -114,7 +120,7 @@ function initSocketIO(httpServer,debug)
var colors = db('messages').chain().takeRight(number).map('color').value();
for(var i = 0; i < messages.length; i++){
socket.emit('newMessage',times[i],numbers[i],messages[i],colors[i]);
socket.emit('newMessage',times[i],numbers[i],convert(messages[i]),colors[i]);
}
});
@ -131,7 +137,7 @@ function initSocketIO(httpServer,debug)
var messageRecieved = escapeHtml(message);
db('messages').push({ numberString: numberStringRecieved,number: numberRecieved, time: timeRecieved, message: messageRecieved,color: color });
//add a new message to the board directly
socketServer.emit('newMessage', timeRecieved, numberRecieved, messageRecieved,color);
socketServer.emit('newMessage', timeRecieved, numberRecieved, convert(messageRecieved),color);
numberStringRecieved = null;
numberRecieved = null;
timeRecieved = null;
@ -186,7 +192,7 @@ function serialListener(debug)
var messageRecieved = escapeHtml(ucs2Parse(data));
db('messages').push({ numberString: numberStringRecieved,number: numberRecieved, time: timeRecieved, message: messageRecieved,color: color });
//add a new message to the board directly
socketServer.emit('newMessage', timeRecieved, numberRecieved, messageRecieved,color);
socketServer.emit('newMessage', timeRecieved, numberRecieved, convert(messageRecieved),color);
numberStringRecieved = null;
numberRecieved = null;
timeRecieved = null;