Browse Source

Modularity back-end; Save danmaku opacity in localStorage

DIYgod 9 years ago
parent
commit
4294e80643
9 changed files with 232 additions and 265 deletions
  1. 7 263
      nodejs/index.js
  2. 14 0
      nodejs/models/danmaku.js
  3. 12 0
      nodejs/routes/all.js
  4. 32 0
      nodejs/routes/get.js
  5. 17 0
      nodejs/routes/list.js
  6. 115 0
      nodejs/routes/post.js
  7. 20 0
      nodejs/tools/logger.js
  8. 11 0
      nodejs/tools/mongodb.js
  9. 4 2
      src/DPlayer.js

+ 7 - 263
nodejs/index.js

@@ -1,268 +1,12 @@
-var url = require('url');
-var fs = require('fs');
-var mongoose = require('mongoose');
 var express = require('express');
-var app = express();
+var logger = require('./tools/logger');
+require('./tools/mongodb');
 
-var log4js = require('log4js');
-log4js.configure({
-    appenders: [
-        {
-            type: "file",
-            filename: 'DPlayer.log',
-            maxLogSize: 20480,
-            backups: 3,
-            category: [ 'DPlayer','console' ]
-        },
-        {
-            type: "console"
-        }
-    ],
-    replaceConsole: true
-});
-var logger = log4js.getLogger('DPlayer');
-logger.setLevel('INFO');
 logger.info(`🍻 DPlayer start! Cheers!`);
 
-function htmlEncode(str) {
-    return str.replace(/&/g, "&")
-        .replace(/</g, "&lt;")
-        .replace(/>/g, "&gt;")
-        .replace(/"/g, "&quot;")
-        .replace(/'/g, "&#x27;")
-        .replace(/\//g, "&#x2f;");
-}
-
-var postIP = [];
-
-var mongodbUrl;
-if (process.env.MONGODB_USERNAME && process.env.MONGODB_PASSWORD && process.env.MONGODB_PORT_27017_TCP_ADDR && process.env.MONGODB_PORT_27017_TCP_PORT && process.env.MONGODB_INSTANCE_NAME) {
-    mongodbUrl = 'mongodb://' + process.env.MONGODB_USERNAME + ':' + process.env.MONGODB_PASSWORD + '@' + process.env.MONGODB_PORT_27017_TCP_ADDR + ':' + process.env.MONGODB_PORT_27017_TCP_PORT + '/' + process.env.MONGODB_INSTANCE_NAME;
-}
-else {
-    mongodbUrl = 'mongodb://localhost:27017/danmaku';
-}
-
-var danmakuSchema = new mongoose.Schema({
-    player: {
-        type: [String], index: true
-    },
-    author: String,
-    time: Number,
-    text: String,
-    color: String,
-    type: String
-});
-var danmaku = mongoose.model('dan', danmakuSchema);
-
-app.all('*', function(req, res, next) {
-    res.header('Access-Control-Allow-Origin', '*');
-    res.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild');
-    res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
-
-    if (req.method == 'OPTIONS') {
-        res.send(200);
-    }
-    else {
-        next();
-    }
-});
-
-app.get('/', function (req, res) {
-    var ip = req.headers['x-forwarded-for'] ||
-             req.connection.remoteAddress ||
-             req.socket.remoteAddress ||
-             req.connection.socket.remoteAddress;
-    logger.info(`GET form IP: ${ip}`);
-
-    mongoose.connect(mongodbUrl);
-    var db = mongoose.connection;
-    db.on('error', errorListener);
-
-    var query = url.parse(req.url,true).query;
-    var id = query.id;
-    var max = query.max;
-    var length;
-    db.once('open', function() {
-        cleanListener();
-        danmaku.find({player: id}, function (err, data) {
-            if (err) {
-                logger.error(err);
-            }
-
-            var json = `{"code": 1,"danmaku":[`;
-            length = max ? Math.min(data.length, max) : data.length;
-            for (var i = 0; i < length; i++) {
-                json += JSON.stringify(data[i]);
-                if (i !== length - 1) {
-                    json += `,`;
-                }
-            }
-            json += `]}`;
-            res.send(json);
-            db.close();
-        })
-    });
-
-    function errorListener (err) {
-        cleanListener();
-        logger.error(err);
-        res.send(`{"code": 0, "msg": "Error happens, please contact system administrator."}`);
-    }
-
-    function cleanListener () {
-        db.removeListener('error', errorListener);
-    }
-});
-
-app.post('/', function (req, res) {
-    var body = '';
-    var jsonStr;
-    var db;
-    var ip = req.headers['x-forwarded-for'] ||
-             req.connection.remoteAddress ||
-             req.socket.remoteAddress ||
-             req.connection.socket.remoteAddress;
-
-    // check black ip
-    var blanklist = fs.readFileSync('blacklist').toString().split('\n');
-    if (blanklist.indexOf(ip.split(',')[0]) !== -1) {
-        logger.info(`Reject POST form ${ip} for black ip.`);
-        res.send(`{"code": -1, "msg": "Rejected for black ip."}`);
-        return;
-    }
-
-    // frequency limitation
-    if (postIP.indexOf(ip) !== -1) {
-        logger.info(`Reject POST form ${ip} for frequent operation.`);
-        res.send(`{"code": -2, "msg": "Rejected for frequent operation."}`);
-        return;
-    }
-    else {
-        postIP.push(ip);
-        setTimeout(function () {
-            postIP.splice(0, 1);
-        }, 1000);
-    }
-
-    req.on('data', dataListener);
-    req.on('end', endListener);
-
-    function dataListener (chunk) {
-        body += chunk;
-    }
-    function endListener () {
-        cleanListener();
-        try {
-            jsonStr = JSON.parse(body);
-        } catch (err) {
-            jsonStr = null;
-        }
-
-        // check data
-        if (jsonStr.player === undefined
-            || jsonStr.author === undefined
-            || jsonStr.time === undefined
-            || jsonStr.text === undefined
-            || jsonStr.color === undefined
-            || jsonStr.type === undefined
-            || jsonStr.text.length >= 30) {
-            logger.info(`Reject POST form ${ip} for illegal data: ${JSON.stringify(jsonStr)}`);
-            res.send(`{"code": -3, "msg": "Rejected for illegal data"}`);
-            return;
-        }
-        
-        // check token: set it yourself
-        function checkToken (token) {
-            return true;
-        }
-        if (!checkToken(jsonStr.token)) {
-            logger.info(`Rejected POST form ${ip} for illegal token: ${jsonStr.token}`);
-            res.send(`{"code": -4, "msg": "Rejected for illegal token: ${jsonStr.token}"}`);
-            return;
-        }
-
-        // check black username
-        if (blanklist.indexOf(jsonStr.author) !== -1) {
-            logger.info(`Reject POST form ${jsonStr.author} for black user.`);
-            res.send(`{"code": -5, "msg": "Rejected for black user."}`);
-            return;
-        }
-
-        logger.info(`POST form ${ip}, data: ${JSON.stringify(jsonStr)}`);
-
-        mongoose.connect(mongodbUrl);
-        db = mongoose.connection;
-        db.on('error', errorListener);
-        db.once('open', function() {
-            cleandbListener();
-
-            var dan = new danmaku({
-                player: htmlEncode(jsonStr.player),
-                author: htmlEncode(jsonStr.author),
-                time: jsonStr.time,
-                text: htmlEncode(jsonStr.text),
-                color: htmlEncode(jsonStr.color),
-                type: htmlEncode(jsonStr.type)
-            });
-            dan.save(function (err, d) {
-                if (err) {
-                    logger.error(err);
-                    res.send(`{"code": 0, "msg": "Error happens, please contact system administrator."}`);
-                }
-                else {
-                    res.send(`{"code": 1, "data": ${JSON.stringify(d)}}`);
-                }
-                db.close();
-            });
-        });
-    }
-
-    function errorListener (err) {
-        cleandbListener();
-        logger.error(err);
-        res.send(`{"code": 0, "msg": "Error happens, please contact system administrator."}`);
-    }
-
-    function cleandbListener () {
-        db.removeListener('error', errorListener);
-    }
-    function cleanListener () {
-        req.removeListener('data', dataListener);
-        req.removeListener('end', endListener);
-    }
-});
-
-app.get('/list', function (req, res) {
-    mongoose.connect(mongodbUrl);
-    var db = mongoose.connection;
-    db.on('error', errorListener);
-
-    db.once('open', function() {
-        cleanListener();
-        danmaku.distinct('player', function (err, data) {
-            if (err) {
-                logger.error(err);
-            }
-
-            var json = ``;
-            for (var i = 0; i < data.length; i++) {
-                json += data[i] + `<br>`;
-            }
-            res.send(json);
-            db.close();
-        })
-    });
-
-    function errorListener (err) {
-        cleanListener();
-        logger.error(err);
-        res.send(`{"code": 0, "msg": "Error happens, please contact system administrator."}`);
-    }
-
-    function cleanListener () {
-        db.removeListener('error', errorListener);
-    }
-});
-
+var app = express();
+app.all('*', require('./routes/all'));
+app.get('/', require('./routes/get'));
+app.post('/', require('./routes/post'));
+app.get('/list', require('./routes/list'));
 app.listen(1207);

+ 14 - 0
nodejs/models/danmaku.js

@@ -0,0 +1,14 @@
+var mongoose = require('../tools/mongodb');
+var danmakuSchema = new mongoose.Schema({
+    player: {
+        type: [String], index: true
+    },
+    author: String,
+    time: Number,
+    text: String,
+    color: String,
+    type: String
+});
+var danmaku = mongoose.model('dan', danmakuSchema);
+
+module.exports = danmaku;

+ 12 - 0
nodejs/routes/all.js

@@ -0,0 +1,12 @@
+module.exports = function(req, res, next) {
+    res.header('Access-Control-Allow-Origin', '*');
+    res.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild');
+    res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
+
+    if (req.method == 'OPTIONS') {
+        res.send(200);
+    }
+    else {
+        next();
+    }
+};

+ 32 - 0
nodejs/routes/get.js

@@ -0,0 +1,32 @@
+var url = require('url');
+var logger = require('../tools/logger');
+var danmaku = require('../models/danmaku');
+
+module.exports = function (req, res) {
+    var ip = req.headers['x-forwarded-for'] ||
+        req.connection.remoteAddress ||
+        req.socket.remoteAddress ||
+        req.connection.socket.remoteAddress;
+    logger.info(`GET form IP: ${ip}`);
+
+    var query = url.parse(req.url,true).query;
+    var id = query.id;
+    var max = query.max;
+    var length;
+    danmaku.find({player: id}, function (err, data) {
+        if (err) {
+            logger.error(err);
+        }
+
+        var json = `{"code": 1,"danmaku":[`;
+        length = max ? Math.min(data.length, max) : data.length;
+        for (var i = 0; i < length; i++) {
+            json += JSON.stringify(data[i]);
+            if (i !== length - 1) {
+                json += `,`;
+            }
+        }
+        json += `]}`;
+        res.send(json);
+    })
+};

+ 17 - 0
nodejs/routes/list.js

@@ -0,0 +1,17 @@
+var url = require('url');
+var logger = require('../tools/logger');
+var danmaku = require('../models/danmaku');
+
+module.exports = function (req, res) {
+    danmaku.distinct('player', function (err, data) {
+        if (err) {
+            logger.error(err);
+        }
+
+        var json = ``;
+        for (var i = 0; i < data.length; i++) {
+            json += data[i] + `<br>`;
+        }
+        res.send(json);
+    })
+};

+ 115 - 0
nodejs/routes/post.js

@@ -0,0 +1,115 @@
+var url = require('url');
+var fs = require('fs');
+var logger = require('../tools/logger');
+var danmaku = require('../models/danmaku');
+
+function htmlEncode(str) {
+    return str.replace(/&/g, "&amp;")
+        .replace(/</g, "&lt;")
+        .replace(/>/g, "&gt;")
+        .replace(/"/g, "&quot;")
+        .replace(/'/g, "&#x27;")
+        .replace(/\//g, "&#x2f;");
+}
+
+var postIP = [];
+
+module.exports = function (req, res) {
+    var body = '';
+    var jsonStr;
+    var ip = req.headers['x-forwarded-for'] ||
+        req.connection.remoteAddress ||
+        req.socket.remoteAddress ||
+        req.connection.socket.remoteAddress;
+
+    // check black ip
+    var blanklist = fs.readFileSync('blacklist').toString().split('\n');
+    if (blanklist.indexOf(ip.split(',')[0]) !== -1) {
+        logger.info(`Reject POST form ${ip} for black ip.`);
+        res.send(`{"code": -1, "msg": "Rejected for black ip."}`);
+        return;
+    }
+
+    // frequency limitation
+    if (postIP.indexOf(ip) !== -1) {
+        logger.info(`Reject POST form ${ip} for frequent operation.`);
+        res.send(`{"code": -2, "msg": "Rejected for frequent operation."}`);
+        return;
+    }
+    else {
+        postIP.push(ip);
+        setTimeout(function () {
+            postIP.splice(0, 1);
+        }, 1000);
+    }
+
+    req.on('data', dataListener);
+    req.on('end', endListener);
+
+    function dataListener (chunk) {
+        body += chunk;
+    }
+    function endListener () {
+        cleanListener();
+        try {
+            jsonStr = JSON.parse(body);
+        } catch (err) {
+            jsonStr = null;
+        }
+
+        // check data
+        if (jsonStr.player === undefined
+            || jsonStr.author === undefined
+            || jsonStr.time === undefined
+            || jsonStr.text === undefined
+            || jsonStr.color === undefined
+            || jsonStr.type === undefined
+            || jsonStr.text.length >= 30) {
+            logger.info(`Reject POST form ${ip} for illegal data: ${JSON.stringify(jsonStr)}`);
+            res.send(`{"code": -3, "msg": "Rejected for illegal data"}`);
+            return;
+        }
+
+        // check token: set it yourself
+        function checkToken (token) {
+            return true;
+        }
+        if (!checkToken(jsonStr.token)) {
+            logger.info(`Rejected POST form ${ip} for illegal token: ${jsonStr.token}`);
+            res.send(`{"code": -4, "msg": "Rejected for illegal token: ${jsonStr.token}"}`);
+            return;
+        }
+
+        // check black username
+        if (blanklist.indexOf(jsonStr.author) !== -1) {
+            logger.info(`Reject POST form ${jsonStr.author} for black user.`);
+            res.send(`{"code": -5, "msg": "Rejected for black user."}`);
+            return;
+        }
+
+        logger.info(`POST form ${ip}, data: ${JSON.stringify(jsonStr)}`);
+
+        var dan = new danmaku({
+            player: htmlEncode(jsonStr.player),
+            author: htmlEncode(jsonStr.author),
+            time: jsonStr.time,
+            text: htmlEncode(jsonStr.text),
+            color: htmlEncode(jsonStr.color),
+            type: htmlEncode(jsonStr.type)
+        });
+        dan.save(function (err, d) {
+            if (err) {
+                logger.error(err);
+                res.send(`{"code": 0, "msg": "Error happens, please contact system administrator."}`);
+            }
+            else {
+                res.send(`{"code": 1, "data": ${JSON.stringify(d)}}`);
+            }
+        });
+    }
+
+    function cleanListener () {
+        req.removeListener('data', dataListener);
+        req.removeListener('end', endListener);
+    }
+};

+ 20 - 0
nodejs/tools/logger.js

@@ -0,0 +1,20 @@
+var log4js = require('log4js');
+log4js.configure({
+    appenders: [
+        {
+            type: "file",
+            filename: 'DPlayer.log',
+            maxLogSize: 20480,
+            backups: 3,
+            category: [ 'DPlayer','console' ]
+        },
+        {
+            type: "console"
+        }
+    ],
+    replaceConsole: true
+});
+var logger = log4js.getLogger('DPlayer');
+logger.setLevel('INFO');
+
+module.exports = logger;

+ 11 - 0
nodejs/tools/mongodb.js

@@ -0,0 +1,11 @@
+var mongoose = require('mongoose');
+var mongodbUrl;
+if (process.env.MONGODB_USERNAME && process.env.MONGODB_PASSWORD && process.env.MONGODB_PORT_27017_TCP_ADDR && process.env.MONGODB_PORT_27017_TCP_PORT && process.env.MONGODB_INSTANCE_NAME) {
+    mongodbUrl = 'mongodb://' + process.env.MONGODB_USERNAME + ':' + process.env.MONGODB_PASSWORD + '@' + process.env.MONGODB_PORT_27017_TCP_ADDR + ':' + process.env.MONGODB_PORT_27017_TCP_PORT + '/' + process.env.MONGODB_INSTANCE_NAME;
+}
+else {
+    mongodbUrl = 'mongodb://localhost:27017/danmaku';
+}
+mongoose.connect(mongodbUrl);
+
+module.exports = mongoose;

+ 4 - 2
src/DPlayer.js

@@ -570,7 +570,7 @@ class DPlayer {
         /***
          * setting
          */
-        this.danOpacity = 0.7;
+        this.danOpacity = localStorage.getItem('DPlayer-opacity') || 0.7;
         const settingHTML = {
             'original': `
                     <div class="dplayer-setting-item dplayer-setting-speed">
@@ -747,6 +747,7 @@ class DPlayer {
                         items[i].style.opacity = percentage;
                     }
                     this.danOpacity = percentage;
+                    localStorage.setItem('DPlayer-opacity', this.danOpacity);
                 };
                 const danmakuUp = () => {
                     document.removeEventListener('mouseup', danmakuUp);
@@ -765,6 +766,7 @@ class DPlayer {
                         items[i].style.opacity = percentage;
                     }
                     this.danOpacity = percentage;
+                    localStorage.setItem('DPlayer-opacity', this.danOpacity);
                 });
                 danmakuBarWrapWrap.addEventListener('mousedown', () => {
                     document.addEventListener('mousemove', danmakuMove);
@@ -1227,7 +1229,7 @@ class DPlayer {
                 canvas.getContext('2d').drawImage(this.audio, 0, 0, canvas.width, canvas.height);
 
                 camareIcon.href = canvas.toDataURL();
-                camareIcon.download = "Screenshot_from_DPlayer.png";
+                camareIcon.download = "DPlayer.png";
             });
         }
     }