Compare commits

..

15 Commits

Author SHA1 Message Date
Kayne Ruse 95d229c561 Bumped version number 2022-01-03 08:31:56 +00:00
Kayne Ruse 0b1456ebde Merge branch 'timestamps' 2022-01-03 08:30:23 +00:00
Kayne Ruse bd5b6e8233 Added async keyword 2022-01-03 08:30:03 +00:00
Keith Campbell 05eecf8bdd removed everything but lines 50-60 2022-01-02 18:35:50 -05:00
Keith Campbell 2aedb6e938 ready for PR/review 2022-01-02 18:00:16 -05:00
Keith Campbell ab73d05471 updated original code, using createdAt from log 2022-01-01 21:45:09 -05:00
Keith Campbell f72b0e5522 added timestamp to messages and logs, need to test 2022-01-01 17:11:11 -05:00
Kayne Ruse 900312752b Cleaning up tools 2021-12-23 14:00:47 +00:00
Kayne Ruse 1b2868d68f Updated README.md 2021-12-21 19:38:08 +00:00
Kayne Ruse 33157d48d3 Re-established a database relationship 2021-12-12 16:53:33 +00:00
Kayne Ruse e0b3193607 Preparing for Egg Trainer merge 2021-11-18 15:00:56 +00:00
Kayne Ruse 655c81174e Updated package-lock.json 2021-11-17 06:14:31 +00:00
Kayne Ruse 8c053e75aa Bumped node to version 16 LTS 2021-11-17 04:43:11 +00:00
Kayne Ruse 69aff6ec32 Updated package-lock.json 2021-11-15 22:40:16 +00:00
Kayne Ruse c42d84864e Updated documentation 2021-08-21 22:45:27 +01:00
10 changed files with 74 additions and 140 deletions
+2 -2
View File
@@ -1,9 +1,9 @@
FROM node:15 FROM node:16
WORKDIR "/app" WORKDIR "/app"
COPY package*.json ./ COPY package*.json ./
COPY . /app
RUN npm install --production RUN npm install --production
COPY . /app
EXPOSE 3300 EXPOSE 3300
USER node USER node
ENTRYPOINT ["bash", "-c"] ENTRYPOINT ["bash", "-c"]
+22 -1
View File
@@ -2,13 +2,34 @@
An API centric chat server. Uses Sequelize and mariaDB by default. An API centric chat server. Uses Sequelize and mariaDB by default.
This server is available via docker hub at krgamestudios/chat-server.
# Setup # Setup
There are multiple ways to run this app - it can run on it's own via `npm start` (for production) or `npm run dev` (for development). it can also run inside docker using `docker-compose up --build` - run `node configure-script.js` to generate docker-compose.yml and startup.sql. There are multiple ways to run this app - it can run on it's own via `npm start` (for production) or `npm run dev` (for development). it can also run inside docker using `docker-compose up --build` - run `node configure-script.js` to generate docker-compose.yml and startup.sql.
To generate an authorization token, use [auth-server](https://github.com/krgamestudios/auth-server). A public-facing development auth-server is available here (tokens are valid for 10 minutes):
```
POST https://dev-auth.krgamestudios.com/auth/login HTTP/1.1
Content-Type: application/json
{
"email": "kayneruse@gmail.com",
"password": "helloworld"
}
```
# API # API
This server uses socket.io for communication. Be aware that every chat message requires a valid JWT. See the [auth-server](https://github.com/krgamestudios/auth-server) for details. This server uses socket.io for communication. Be aware that every 'open chat', 'message' and 'report' signal requires a valid JWT, as part of the message:
```js
socket.emit('message', {
accessToken,
text: inputRef.current.value
});
```
The event types are as follows: The event types are as follows:
+2 -2
View File
@@ -33,7 +33,7 @@ const question = (prompt, def = null) => {
const appPort = await question('App Port', '3300'); const appPort = await question('App Port', '3300');
const appDBUser = await question('DB User', appName); const appDBUser = await question('DB User', appName);
const appDBPass = await question('DB Pass', uuid()); const appDBPass = await question('DB Pass', 'blastoise');
const dbRootPass = await question('DB Root Pass'); const dbRootPass = await question('DB Root Pass');
const appSecretAccess = await question('Access Token Secret', uuid(32)); const appSecretAccess = await question('Access Token Secret', uuid(32));
@@ -108,7 +108,7 @@ networks:
`; `;
const dockerfile = ` const dockerfile = `
FROM node:15 FROM node:16
WORKDIR "/app" WORKDIR "/app"
COPY package*.json ./ COPY package*.json ./
RUN npm install --production RUN npm install --production
+23 -112
View File
@@ -1,11 +1,12 @@
{ {
"name": "chat-server", "name": "chat-server",
"version": "1.0.1", "version": "1.2.5",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"version": "1.0.1", "name": "chat-server",
"version": "1.2.5",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"cors": "^2.8.5", "cors": "^2.8.5",
@@ -85,68 +86,18 @@
} }
}, },
"node_modules/ansi-align": { "node_modules/ansi-align": {
"version": "3.0.0", "version": "3.0.1",
"resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
"integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"string-width": "^3.0.0" "string-width": "^4.1.0"
}
},
"node_modules/ansi-align/node_modules/ansi-regex": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
"integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/ansi-align/node_modules/emoji-regex": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
"integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
"dev": true
},
"node_modules/ansi-align/node_modules/is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/ansi-align/node_modules/string-width": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
"integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
"dev": true,
"dependencies": {
"emoji-regex": "^7.0.1",
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^5.1.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/ansi-align/node_modules/strip-ansi": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"dev": true,
"dependencies": {
"ansi-regex": "^4.1.0"
},
"engines": {
"node": ">=6"
} }
}, },
"node_modules/ansi-regex": { "node_modules/ansi-regex": {
"version": "5.0.0", "version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": ">=8" "node": ">=8"
@@ -2224,9 +2175,9 @@
} }
}, },
"node_modules/validator": { "node_modules/validator": {
"version": "13.6.0", "version": "13.7.0",
"resolved": "https://registry.npmjs.org/validator/-/validator-13.6.0.tgz", "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz",
"integrity": "sha512-gVgKbdbHgtxpRyR8K0O6oFZPhhB5tT1jeEHZR0Znr9Svg03U0+r9DXWMrnRAB+HtCStDQKlaIZm42tVsVjqtjg==", "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==",
"engines": { "engines": {
"node": ">= 0.10" "node": ">= 0.10"
} }
@@ -2369,58 +2320,18 @@
} }
}, },
"ansi-align": { "ansi-align": {
"version": "3.0.0", "version": "3.0.1",
"resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
"integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
"dev": true, "dev": true,
"requires": { "requires": {
"string-width": "^3.0.0" "string-width": "^4.1.0"
},
"dependencies": {
"ansi-regex": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
"integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
"dev": true
},
"emoji-regex": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
"integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
"dev": true
},
"is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
"dev": true
},
"string-width": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
"integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
"dev": true,
"requires": {
"emoji-regex": "^7.0.1",
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^5.1.0"
}
},
"strip-ansi": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"dev": true,
"requires": {
"ansi-regex": "^4.1.0"
}
}
} }
}, },
"ansi-regex": { "ansi-regex": {
"version": "5.0.0", "version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true "dev": true
}, },
"ansi-styles": { "ansi-styles": {
@@ -4019,9 +3930,9 @@
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
}, },
"validator": { "validator": {
"version": "13.6.0", "version": "13.7.0",
"resolved": "https://registry.npmjs.org/validator/-/validator-13.6.0.tgz", "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz",
"integrity": "sha512-gVgKbdbHgtxpRyR8K0O6oFZPhhB5tT1jeEHZR0Znr9Svg03U0+r9DXWMrnRAB+HtCStDQKlaIZm42tVsVjqtjg==" "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw=="
}, },
"vary": { "vary": {
"version": "1.1.2", "version": "1.1.2",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "chat-server", "name": "chat-server",
"version": "1.2.1", "version": "1.2.5",
"description": "An API centric chat server. Uses Sequelize and mariaDB by default.", "description": "An API centric chat server. Uses Sequelize and mariaDB by default.",
"main": "server/server.js", "main": "server/server.js",
"scripts": { "scripts": {
+6 -6
View File
@@ -35,7 +35,7 @@ const chat = io => {
}); });
//from here, handles all normal messages //from here, handles all normal messages
socket.on('open chat', message => { socket.on('open chat', async message => {
//handle rooms - only in a room if you've opened chat //handle rooms - only in a room if you've opened chat
const newlyOpened = !socket.user.room; const newlyOpened = !socket.user.room;
socket.user.room = socket.user.room || 'general'; //default to general socket.user.room = socket.user.room || 'general'; //default to general
@@ -46,11 +46,8 @@ const chat = io => {
socket.join(socket.user.room); socket.join(socket.user.room);
//broadcast to this room
socket.broadcast.to(socket.user.room).emit('message', { emphasis: true, text: `${socket.user.username} entered chat` });
//log //log
chatlog.create({ const log = await chatlog.create({
notification: true, notification: true,
username: socket.user.username, username: socket.user.username,
text: `${socket.user.username} entered chat`, text: `${socket.user.username} entered chat`,
@@ -58,6 +55,9 @@ const chat = io => {
emphasis: true emphasis: true
}); });
//broadcast to this room
socket.broadcast.to(socket.user.room).emit('message', {timestamp: log.createdAt, emphasis: true, text: `${socket.user.username} entered chat` });
//send backlog to the user //send backlog to the user
chatlog.findAll({ chatlog.findAll({
where: { where: {
@@ -120,7 +120,7 @@ const chat = io => {
socket.broadcast.to(socket.user.room).emit('message', log); socket.broadcast.to(socket.user.room).emit('message', log);
}); });
socket.on('disconnect', reason => { socket.on('disconnect', async reason => {
//broadcast to this room //broadcast to this room
if (!socket.user) { if (!socket.user) {
return; return;
+10 -3
View File
@@ -1,5 +1,12 @@
const chatlog = require('./chatlog');
const mute = require('./mute');
const reports = require('./reports');
//relationships
reports.belongsTo(chatlog);
module.exports = { module.exports = {
chatlog: require('./chatlog'), chatlog,
mute: require('./mute'), mute,
reports: require('./reports') reports,
}; };
+1 -10
View File
@@ -1,9 +1,7 @@
const Sequelize = require('sequelize'); const Sequelize = require('sequelize');
const sequelize = require('..'); const sequelize = require('..');
const chatlog = require('./chatlog'); module.exports = sequelize.define('reports', {
const reports = sequelize.define('reports', {
index: { index: {
type: Sequelize.INTEGER(11), type: Sequelize.INTEGER(11),
allowNull: false, allowNull: false,
@@ -17,10 +15,3 @@ const reports = sequelize.define('reports', {
allowNull: false allowNull: false
}, },
}); });
chatlog.hasMany(reports, { foreignKey: 'chatlogIndex', foreignKeyConstraint: true });
reports.belongsTo(chatlog, { foreignKey: 'chatlogIndex' });
sequelize.sync();
module.exports = reports;
+4
View File
@@ -0,0 +1,4 @@
#use this while debugging
CREATE DATABASE IF NOT EXISTS chat;
CREATE USER IF NOT EXISTS 'chat'@'%' IDENTIFIED BY 'blastoise';
GRANT ALL PRIVILEGES ON chat.* TO 'chat'@'%';