diff --git a/README.md b/README.md index 94e00b5..b00e654 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,8 @@ This application requires [node.js](https://nodejs.org/) to be installed. 1. Install the dependencies `npm install` 2. Copy the configuration `cp client.config.example.toml client.config.toml` -3. Run the server `./teemant.js` +3. Build the project using `gulp` +4. Run the server `./teemant.js` The client will be accessible at http://localhost:8080/ diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000..a88a16c --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,279 @@ +'use strict'; + +const path = require('path'); + +const gulp = require('gulp'); +const sourcemaps = require('gulp-sourcemaps'); +const gutil = require('gulp-util'); +const gdata = require('gulp-data'); +const del = require('del'); +const gulpif = require('gulp-if'); +const plumber = require('gulp-plumber'); +const mergeStream = require('merge-stream'); +const lodash = require('lodash'); +const Sequence = require('run-sequence'); +const watch = require('gulp-watch'); +const realFavicon = require('gulp-real-favicon'); +const debug = require('gulp-debug'); +const filter = require('gulp-filter'); +const fs = require('fs'); + +const eslint = require('gulp-eslint'); +const webpack = require('webpack'); +const webpackConfig = require(path.join(__dirname, '/webpack.config')); + +const stylus = require('gulp-stylus'); +const nib = require('nib'); +const csso = require('gulp-csso'); + +const htmlmin = require('gulp-htmlmin'); + +const sequence = Sequence.use(gulp); + +let sources = { + // script: ['main.js', 'admin.coffee', 'popout.js', 'livestream.js'], + style: ['layout.styl', 'theme_default.styl', 'theme_night.styl'], + document: ['index.html'] +}; +let lintES = ['src/script/**/*.js', 'server/**/*.js', 'gulpfile.js', 'teemant.js', 'webpack.config.js']; + +let inProduction = process.env.NODE_ENV === 'production' || process.argv.indexOf('-p') !== -1; + +let eslintOpts = { + rules: { + quotes: [1, 'single'], + semi: [1, 'always'] + }, + parserOptions: { + ecmaVersion: 6, + sourceType: 'module', + ecmaFeatures: { + impliedStrict: true, + globalReturn: true + } + } +}; + +let stylusOpts = { + use: nib(), + compress: false +}; + +let cssoOpts = { + restructure: true +}; + +let htmlminOpts = { + collapseWhitespace: true, + removeComments: true, + removeAttributeQuotes: true, + collapseBooleanAttributes: true, + removeRedundantAttributes: true, + removeEmptyAttributes: true, + removeScriptTypeAttributes: true, + removeStyleLinkTypeAttributes: true +}; + +let watchOpts = { + readDelay: 500, + verbose: true +}; + +// File where the favicon markups are stored +let faviconDataFile = 'build/icons/favicon-data.json'; + +if (inProduction) { + webpackConfig.plugins.push(new webpack.optimize.DedupePlugin()); + webpackConfig.plugins.push(new webpack.optimize.OccurenceOrderPlugin(false)); + webpackConfig.plugins.push(new webpack.optimize.UglifyJsPlugin({ + compress: { + warnings: false, + screw_ie8: true + }, + comments: false, + mangle: { + screw_ie8: true + }, + screw_ie8: true, + sourceMap: false + })); +} + +let wpCompiler = webpack(lodash.assign({}, webpackConfig, { + cache: {}, + devtool: inProduction ? null : 'inline-source-map', + debug: !inProduction +})); + +function webpackTask (callback) { + // run webpack + wpCompiler.run(function (err, stats) { + if (err) throw new gutil.PluginError('webpack', err); + gutil.log('[script]', stats.toString({ + colors: true, + hash: false, + version: false, + chunks: false, + chunkModules: false + })); + if (typeof callback === 'function') callback(); + }); +} + +function styleTask () { + return gulp.src(sources.style.map(function (f) { return 'src/style/' + f; })) + .pipe(plumber()) + .pipe(gulpif(!inProduction, sourcemaps.init())) + .pipe(stylus(stylusOpts)) + .pipe(gulpif(inProduction, csso(cssoOpts))) + .pipe(gulpif(!inProduction, sourcemaps.write())) + .pipe(debug({title: '[style]'})) + .pipe(gulp.dest('build/style/')); +} + +function documentTask (p) { + let data = { + config: require('./server/config'), + env: process.env.NODE_ENV || 'development', + }; + return p + .pipe(plumber()) + .pipe(gdata(function () { return data; })) + .pipe(realFavicon.injectFaviconMarkups(JSON.parse(fs.readFileSync(faviconDataFile)).favicon.html_code)) + .pipe(gulpif(inProduction, htmlmin(htmlminOpts))) + .pipe(gulp.dest('build/document/')) + .pipe(debug({title: '[document]'})); +} + +// Cleanup tasks +gulp.task('clean', () => del('build')); +gulp.task('clean:quick', ['clean:script', 'clean:style'], (done) => { + done(); +}); +gulp.task('clean:script', () => { + return del('build/script'); +}); +gulp.task('clean:style', () => { + return del('build/style'); +}); +gulp.task('clean:icons', () => { + return del('build/icons'); +}); +gulp.task('clean:document', () => { + return del('build/document'); +}); + +// Main tasks +gulp.task('script', ['clean:script'], webpackTask); +gulp.task('watch:script', () => { + return watch(['src/script/**/*.js'], watchOpts, webpackTask); +}); + +gulp.task('style', ['clean:style'], styleTask); +gulp.task('watch:style', () => { + return watch('src/style/**/*.styl', watchOpts, styleTask); +}); + +// Generate the icons. This task takes a few seconds to complete. +// You should run it at least once to create the icons. Then, +// you should run it whenever RealFaviconGenerator updates its +// package (see the update-favicon task below). +gulp.task('generate-favicon', ['clean:icons'], (done) => { + realFavicon.generateFavicon({ + masterPicture: 'static/image/diamond.svg', + dest: 'build/icons/', + iconsPath: '/', + design: { + ios: { + masterPicture: 'static/image/diamond.svg', + pictureAspect: 'backgroundAndMargin', + backgroundColor: '#00c7e0', + margin: '0%', + appName: 'Teemant' + }, + desktopBrowser: {}, + windows: { + pictureAspect: 'noChange', + backgroundColor: '#00c7e0', + onConflict: 'override', + appName: 'Teemant' + }, + androidChrome: { + masterPicture: 'static/image/diamond.svg', + pictureAspect: 'noChange', + themeColor: '#00c7e0', + manifest: { + name: 'Teemant', + display: 'standalone', + orientation: 'notSet', + onConflict: 'override', + declared: true + } + }, + safariPinnedTab: { + pictureAspect: 'silhouette', + themeColor: '#00c7e0' + } + }, + settings: { + scalingAlgorithm: 'Lanczos', + errorOnImageTooSmall: false + }, + versioning: true, + markupFile: faviconDataFile + }, done); +}); + +gulp.task('update-favicon', (done) => { + let currentVersion; + try { + currentVersion = JSON.parse(fs.readFileSync(faviconDataFile)).version; + } catch (e) {} + + if (currentVersion) { + realFavicon.checkForUpdates(currentVersion, function (err) { + if (err) { + throw err; + } + done(); + }); + } else { + sequence('generate-favicon', done); + } +}); + +gulp.task('document', ['clean:document', 'update-favicon'], () => { + return documentTask(gulp.src(sources.document.map(function (f) { return 'src/document/' + f; }))); +}); + +gulp.task('watch:document', () => { + return documentTask( + watch(['src/document/**/*.html'], watchOpts) + .pipe(filter(sources.document.map(function (f) { return 'src/document/' + f; }))) + ); +}); + +gulp.task('lint', () => { + return mergeStream( + gulp.src(lintES).pipe(eslint(eslintOpts)) + .pipe(eslint.format()) + ); +}); +gulp.task('watch:lint', () => { + return mergeStream( + watch(lintES, watchOpts, function (file) { + gulp.src(file.path).pipe(eslint(eslintOpts)) + .pipe(eslint.format()); + }) + ); +}); + +// Default task +gulp.task('default', (done) => { + sequence('script', 'style', 'lint', 'document', done); +}); + +// Watch task +gulp.task('watch', (done) => { + sequence('default', ['watch:lint', 'watch:script', 'watch:style', 'watch:document'], done); +}); diff --git a/package.json b/package.json index a683fc1..f331e92 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,32 @@ "socketio": "^1.0.0", "toml": "^2.3.0" }, + "devDependencies": { + "gulp": "^3.9.1", + "lodash": "^4.17.2", + "webpack": "^1.13.3", + "del": "^2.2.2", + "gulp-csso": "^2.0.0", + "gulp-data": "^1.2.1", + "gulp-debug": "^3.0.0", + "gulp-eslint": "^3.0.1", + "gulp-filter": "^4.0.0", + "gulp-htmlmin": "^3.0.0", + "gulp-if": "^2.0.2", + "gulp-plumber": "^1.1.0", + "gulp-pug": "^3.2.0", + "gulp-real-favicon": "^0.2.1", + "gulp-sourcemaps": "^1.9.1", + "gulp-standard": "^8.0.2", + "gulp-stylus": "^2.6.0", + "gulp-util": "^3.0.7", + "gulp-watch": "^4.3.11", + "gulp-watch-pug": "^1.0.0", + "lazypipe": "^1.0.1", + "merge-stream": "^1.0.1", + "nib": "^1.1.2", + "run-sequence": "^1.2.2" + }, "repository": { "type": "git", "url": "git://github.com/DiamondtechDev/TeemantIRC.git" diff --git a/public/css/layout.css b/public/css/layout.css deleted file mode 100644 index ccd4c85..0000000 --- a/public/css/layout.css +++ /dev/null @@ -1,345 +0,0 @@ -body { - margin: 0; - padding: 0; - font-family: Open Sans, Everson Mono, Helvetica; -} -.grade1 { - margin-bottom: 0; - margin-top: 0; - display: block; - text-align: center; -} -.grade2 { - margin-bottom: 0; - margin-top: 20px; - display: block; - text-align: center; -} -.grade3 { - margin-bottom: 0; - margin-top: 20px; - display: block; - text-align: center; -} -.ircclient { - position: absolute; - width: 100%; - height: 100%; -} -.ircclient input[type=text], -.ircclient input[type=number], -.ircclient input[type=password] { - padding: 8px; - width: 300px; - border-radius: 5px; -} -.ircclient input[type="submit"] { - width: 318px; - padding: 12px; - margin-top: 20px; - display: block; - border-radius: 4px; - font-size: 120%; - font-weight: bold; - text-transform: uppercase; - cursor: pointer; -} -.ircclient .coverwindow { - position: absolute; - width: 100%; - height: 100%; -} -.ircclient .coverwindow#authdialog { - z-index: 100; -} -.ircclient .coverwindow .wrapper { - width: 320px; - margin: auto; - margin-top: 5%; - padding: 15px; -} -.ircclient .coverwindow .wrapper label { - display: block; - font-size: 80%; - margin-top: 5px; -} -.ircclient .coverwindow .wrapper label.autosize { - width: auto; - display: inline-block !important; - font-size: 90% !important; - margin-bottom: 10px; -} -.ircclient #chat { - overflow: hidden; -} -.ircclient #chat .ircwrapper { - position: absolute; - width: 100%; - height: 100%; -} -.ircclient #chat .ircwrapper .toolbar { - height: 56px; - position: relative; - z-index: 15; -} -.ircclient #chat .ircwrapper .toolbar .open_settings { - width: 36px; - height: 36px; - display: inline-block; - position: absolute; - right: 10px; - top: 10px; - cursor: pointer; - -webkit-transition: transform 0.2s linear; - -moz-transition: transform 0.2s linear; - -ms-transition: transform 0.2s linear; - -o-transition: transform 0.2s linear; - transition: transform 0.2s linear; -} -.ircclient #chat .ircwrapper .toolbar .open_settings:hover { - transform: rotateZ(-90deg); -} -.ircclient #chat .ircwrapper .toolbar .tabby { - display: inline-block; - height: 56px; - position: absolute; - right: 45px; - left: 0; - white-space: nowrap; - overflow-x: auto; - overflow-y: hidden; -} -.ircclient #chat .ircwrapper .toolbar .tabby .tab { - display: inline-block; - min-width: 60px; - height: 25px; - margin: 5px; - margin-right: 0; - padding: 10px; - line-height: 25px; - -webkit-transition: background-color 0.2s linear; - -moz-transition: background-color 0.2s linear; - -ms-transition: background-color 0.2s linear; - -o-transition: background-color 0.2s linear; - transition: background-color 0.2s linear; - border-radius: 5px; - cursor: pointer; - font-weight: 600; -} -.ircclient #chat .ircwrapper .toolbar .tabby .tab #unread { - display: inline-block; - min-width: 18px; - height: 18px; - text-align: center; - font-size: 12px; - margin: 0 5px; - line-height: 20px; - border-radius: 100%; -} -.ircclient #chat .ircwrapper .toolbar .tabby .tab #unread.none { - display: none; -} -.ircclient #chat .ircwrapper .toolbar .tabby .tab #close { - display: inline-block; - width: 12px; - text-align: center; - margin-left: 5px; -} -.ircclient #chat .ircwrapper .chatarea { - position: absolute; - top: 56px; - width: 100%; - bottom: 46px; -} -.ircclient #chat .ircwrapper .chatarea .smsc-nicklistbtn { - width: 46px; - height: 46px; - position: absolute; - top: 16px; - right: 16px; - border-radius: 100%; - display: none; - opacity: 0.5; - cursor: pointer; -} -.ircclient #chat .ircwrapper .chatarea .topicbar { - position: absolute; - top: 0; - height: 20px; - right: 0; - left: 0; - padding: 12px; - display: none; - overflow: hidden; - z-index: 10; -} -.ircclient #chat .ircwrapper .chatarea .topicbar:hover { - height: auto; - max-height: 100px; - overflow: auto; - word-wrap: break-word; -} -.ircclient #chat .ircwrapper .chatarea .letterbox { - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - overflow-y: auto; - white-space: pre-wrap; - word-wrap: break-word; - padding: 5px; -} -.ircclient #chat .ircwrapper .chatarea .nicklist { - width: 280px; - position: absolute; - right: 0; - padding: 10px; - top: 0; - bottom: 0; - display: none; - z-index: 11; - overflow: auto; -} -.ircclient #chat .ircwrapper .chatarea .nicklist .nick { - cursor: pointer; -} -.ircclient #chat .ircwrapper .chatarea .nicklist .nick .nickname { - font-size: 120%; -} -.ircclient #chat .ircwrapper .chatarea .nicklist .nick .prefix { - width: 16px; - height: 16px; - line-height: 16px; - padding: 2px; - display: inline-block; - border-radius: 4px; - text-align: center; - margin-right: 5px; - font-weight: bold; -} -.ircclient #chat .ircwrapper .chatarea .nicklist .nick .no-prefix { - width: 25px; - display: inline-block; -} -.ircclient #chat .ircwrapper .chatarea .applet_default { - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - padding: 20px; - width: 60%; - min-width: 360px; - margin: auto; - overflow: auto; -} -.ircclient #chat .ircwrapper .chatarea .applet_default .grade1, -.ircclient #chat .ircwrapper .chatarea .applet_default .grade2, -.ircclient #chat .ircwrapper .chatarea .applet_default .grade3 { - text-align: left; -} -.ircclient #chat .ircwrapper .chatarea .settings .theme_button { - width: 120px; - height: 140px; - border-radius: 5px; - display: inline-block; - margin: 5px; - cursor: pointer; -} -.ircclient #chat .ircwrapper .chatarea .settings .theme_button .sampler { - width: 90%; - height: 75%; - margin: 5px; -} -.ircclient #chat .ircwrapper .chatarea .settings .theme_button .sampler .s_toolbar { - width: 100%; - height: 40%; - display: block; -} -.ircclient #chat .ircwrapper .chatarea .settings .theme_button .name { - width: 100%; - text-align: center; - display: block; -} -.ircclient #chat .ircwrapper .chatarea.vnicks .nicklist { - display: block; -} -.ircclient #chat .ircwrapper .chatarea.vnicks .letterbox { - right: 301px; -} -.ircclient #chat .ircwrapper .chatarea.vnicks .topicbar { - right: 301px; -} -.ircclient #chat .ircwrapper .chatarea.vtopic .topicbar { - display: block; -} -.ircclient #chat .ircwrapper .chatarea.vtopic .letterbox { - top: 45px; -} -.ircclient #chat .ircwrapper .input { - position: absolute; - bottom: 0; - height: 46px; - width: 100%; -} -.ircclient #chat .ircwrapper .input .my_nickname { - margin: 5px; - padding: 7px; - border-top-left-radius: 10px; - border-bottom-left-radius: 10px; - padding-right: 20px; - margin-right: 0; - width: 183px; - overflow: hidden; -} -.ircclient #chat .ircwrapper .input .inputwrapper { - display: inline-block; - position: absolute; - margin: 5px 0; - left: 210px; - right: 55px; - top: 0; -} -.ircclient #chat .ircwrapper .input .inputwrapper input { - width: 100%; - padding: 6px; - font-size: 120%; - border-left: 0; -} -.ircclient #chat .ircwrapper .input .sendbutton { - width: 32px; - position: absolute; - height: 32px; - float: right; - top: 5px; - right: 5px; - cursor: pointer; -} -@media all and (max-width: 600px) { - .vnicks .nicklist { - display: none !important; - } - .vnicks .letterbox { - right: 0 !important; - } - .vnicks .topicbar { - right: 0 !important; - } - .vnicks.vopentrig .nicklist { - display: block !important; - } - .vnicks.vopentrig .topicbar { - right: 45px; - } - .vnicks .smsc-nicklistbtn { - z-index: 12; - display: block !important; - } - .my_nickname { - display: none; - } - .inputwrapper { - left: 38px !important; - } -} diff --git a/public/css/main.css b/public/css/main.css deleted file mode 100644 index 26f76f1..0000000 --- a/public/css/main.css +++ /dev/null @@ -1,707 +0,0 @@ -body { - margin: 0; - padding: 0; - font-family: Open Sans, Everson Mono, Helvetica; -} -.grade1 { - font-size: 200%; - margin-bottom: 0; - margin-top: 0; - display: block; - color: #00bcd4; - text-align: center; -} -.grade2 { - font-size: 150%; - margin-bottom: 0; - margin-top: 20px; - display: block; - color: #00bcd4; - text-align: center; -} -.grade3 { - font-size: 120%; - margin-bottom: 0; - margin-top: 20px; - display: block; - color: #00bcd4; - text-align: center; -} -.ircclient { - position: absolute; - width: 100%; - height: 100%; - background: #fff; - background: -moz-linear-gradient(top, #fff 0%, #e5e5e5 100%); - background: -webkit-linear-gradient(top, #fff 0%, #e5e5e5 100%); - background: linear-gradient(to bottom, #fff 0%, #e5e5e5 100%); -} -.ircclient .coverwindow { - position: absolute; - width: 100%; - height: 100%; -} -.ircclient .coverwindow#authdialog { - z-index: 100; -} -.ircclient .coverwindow .wrapper { - width: 320px; - margin: auto; - margin-top: 5%; - padding: 15px; - background-color: #f7f7f7; - border: 1px solid #dadada; - -webkit-box-shadow: 4px 4px 18px #d6d6d6; - -moz-box-shadow: 4px 4px 18px #d6d6d6; - box-shadow: 4px 4px 18px #d6d6d6; -} -.ircclient .coverwindow .wrapper .msg.error { - color: #f00; -} -.ircclient .coverwindow .wrapper label { - display: block; - font-size: 80%; - margin-top: 5px; - color: #2196f3; -} -.ircclient .coverwindow .wrapper label.autosize { - width: auto; - display: inline-block !important; - font-size: 90% !important; - margin-bottom: 10px; -} -.ircclient .coverwindow .wrapper input[type=text], -.ircclient .coverwindow .wrapper input[type=number], -.ircclient .coverwindow .wrapper input[type=password] { - padding: 8px; - width: 300px; - border-radius: 5px; - border: 1px solid #d2d2d2; - -webkit-box-shadow: inset 2px 2px 4px #dcdcdc; - -moz-box-shadow: inset 2px 2px 4px #dcdcdc; - box-shadow: inset 2px 2px 4px #dcdcdc; -} -.ircclient .coverwindow .wrapper input[type="submit"] { - width: 318px; - padding: 12px; - margin-top: 20px; - display: block; - background: #87e0fd; - background: -moz-linear-gradient(top, #87e0fd 0%, #53cbf1 40%, #05abe0 100%); - background: -webkit-linear-gradient(top, #87e0fd 0%, #53cbf1 40%, #05abe0 100%); - background: linear-gradient(to bottom, #87e0fd 0%, #53cbf1 40%, #05abe0 100%); - border: 1px solid #2196f3; - border-radius: 4px; - color: #fff; - font-size: 120%; - font-weight: bold; - text-transform: uppercase; - cursor: pointer; -} -.ircclient .coverwindow .wrapper input[type="submit"]:hover { - background: #c4effc; - background: -moz-linear-gradient(top, #c4effc 0%, #7fd5ef 40%, #39b7dd 100%); - background: -webkit-linear-gradient(top, #c4effc 0%, #7fd5ef 40%, #39b7dd 100%); - background: linear-gradient(to bottom, #c4effc 0%, #7fd5ef 40%, #39b7dd 100%); -} -.ircclient #chat { - overflow: hidden; -} -.ircclient #chat .ircwrapper { - position: absolute; - width: 100%; - height: 100%; -} -.ircclient #chat .ircwrapper .toolbar { - height: 56px; - background-color: #00c7e0; - position: relative; - z-index: 15; - -webkit-box-shadow: 2px 2px 4px #cecece; - -moz-box-shadow: 2px 2px 4px #cecece; - box-shadow: 2px 2px 4px #cecece; -} -.ircclient #chat .ircwrapper .toolbar .open_settings { - width: 36px; - height: 36px; - display: inline-block; - position: absolute; - right: 10px; - top: 10px; - cursor: pointer; - background-image: url("../image/settings.svg"); - background-repeat: no-repeat; - background-size: contain; - -webkit-transition: transform 0.2s linear; - -moz-transition: transform 0.2s linear; - -ms-transition: transform 0.2s linear; - -o-transition: transform 0.2s linear; - transition: transform 0.2s linear; -} -.ircclient #chat .ircwrapper .toolbar .open_settings:hover { - transform: rotateZ(-90deg); -} -.ircclient #chat .ircwrapper .toolbar .tabby { - display: inline-block; - height: 56px; - position: absolute; - right: 45px; - left: 0; - white-space: nowrap; - overflow-x: auto; - overflow-y: hidden; -} -.ircclient #chat .ircwrapper .toolbar .tabby .tab { - display: inline-block; - min-width: 60px; - height: 25px; - margin: 5px; - margin-right: 0; - padding: 10px; - line-height: 25px; - background-color: #29e1ff; - -webkit-transition: background-color 0.2s linear; - -moz-transition: background-color 0.2s linear; - -ms-transition: background-color 0.2s linear; - -o-transition: background-color 0.2s linear; - transition: background-color 0.2s linear; - border-radius: 5px; - border: 1px solid #00d0ea; - -webkit-box-shadow: inset 4px 4px 8px #44ebff; - -moz-box-shadow: inset 4px 4px 8px #44ebff; - box-shadow: inset 4px 4px 8px #44ebff; - color: #fff; - cursor: pointer; - font-weight: 600; -} -.ircclient #chat .ircwrapper .toolbar .tabby .tab #unread { - display: inline-block; - min-width: 18px; - height: 18px; - background-color: #bf0000; - border: 1px solid #b00; - -webkit-box-shadow: inset 2px 2px 3px #f00; - -moz-box-shadow: inset 2px 2px 3px #f00; - box-shadow: inset 2px 2px 3px #f00; - text-align: center; - font-size: 12px; - margin: 0 5px; - line-height: 20px; - border-radius: 100%; -} -.ircclient #chat .ircwrapper .toolbar .tabby .tab #unread.none { - display: none; -} -.ircclient #chat .ircwrapper .toolbar .tabby .tab #close { - display: inline-block; - width: 12px; - text-align: center; - color: #ff3d3d; - margin-left: 5px; -} -.ircclient #chat .ircwrapper .toolbar .tabby .tab:hover { - background-color: #63e9ff; - -webkit-box-shadow: inset 4px 4px 8px #86f2ff; - -moz-box-shadow: inset 4px 4px 8px #86f2ff; - box-shadow: inset 4px 4px 8px #86f2ff; -} -.ircclient #chat .ircwrapper .toolbar .tabby .tab.active { - background-color: #00b9d8; - border: 1px solid #009aad; - -webkit-box-shadow: inset 4px 4px 8px #009caf; - -moz-box-shadow: inset 4px 4px 8px #009caf; - box-shadow: inset 4px 4px 8px #009caf; - color: #fff; -} -.ircclient #chat .ircwrapper .toolbar .tabby .tab.active:hover { - background-color: #00c7e8; -} -.ircclient #chat .ircwrapper .chatarea { - position: absolute; - top: 56px; - width: 100%; - bottom: 46px; -} -.ircclient #chat .ircwrapper .chatarea .smsc-nicklistbtn { - background-image: url("../image/users.svg"); - background-repeat: no-repeat; - background-size: contain; - width: 46px; - height: 46px; - position: absolute; - top: 16px; - right: 16px; - background-color: #00bcd4; - border-radius: 100%; - border: 5px solid #389dbb; - display: none; - opacity: 0.5; - cursor: pointer; -} -.ircclient #chat .ircwrapper .chatarea .topicbar { - position: absolute; - top: 0; - height: 20px; - right: 0; - left: 0; - background-color: #fff; - border-bottom: 1px solid #ddd; - padding: 12px; - display: none; - overflow: hidden; - z-index: 10; -} -.ircclient #chat .ircwrapper .chatarea .topicbar:hover { - height: auto; - max-height: 100px; - overflow: auto; - word-wrap: break-word; -} -.ircclient #chat .ircwrapper .chatarea .letterbox { - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - overflow-y: auto; - white-space: pre-wrap; - word-wrap: break-word; - padding: 5px; -} -.ircclient #chat .ircwrapper .chatarea .nicklist { - width: 280px; - position: absolute; - right: 0; - border-left: 1px solid #ddd; - padding: 10px; - top: 0; - bottom: 0; - display: none; - z-index: 11; - background-color: #fff; - overflow: auto; -} -.ircclient #chat .ircwrapper .chatarea .nicklist .nick { - cursor: pointer; -} -.ircclient #chat .ircwrapper .chatarea .nicklist .nick:hover { - background-color: #aeebff; -} -.ircclient #chat .ircwrapper .chatarea .nicklist .nick .nickname { - font-size: 120%; -} -.ircclient #chat .ircwrapper .chatarea .nicklist .nick .prefix { - width: 16px; - height: 16px; - line-height: 16px; - padding: 2px; - display: inline-block; - background-color: #05abe0; - border-radius: 4px; - color: #fff; - text-align: center; - margin-right: 5px; - font-weight: bold; -} -.ircclient #chat .ircwrapper .chatarea .nicklist .nick .no-prefix { - width: 25px; - display: inline-block; -} -.ircclient #chat .ircwrapper .chatarea .settings { - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - padding: 20px; - width: 60%; - min-width: 360px; - margin: auto; - overflow: auto; -} -.ircclient #chat .ircwrapper .chatarea .settings .grade1, -.ircclient #chat .ircwrapper .chatarea .settings .grade2, -.ircclient #chat .ircwrapper .chatarea .settings .grade3 { - text-align: left; -} -.ircclient #chat .ircwrapper .chatarea.vnicks .nicklist { - display: block; -} -.ircclient #chat .ircwrapper .chatarea.vnicks .letterbox { - right: 301px; -} -.ircclient #chat .ircwrapper .chatarea.vnicks .topicbar { - right: 301px; -} -.ircclient #chat .ircwrapper .chatarea.vtopic .topicbar { - display: block; -} -.ircclient #chat .ircwrapper .chatarea.vtopic .letterbox { - top: 45px; -} -.ircclient #chat .ircwrapper .input { - position: absolute; - bottom: 0; - height: 46px; - width: 100%; - background-color: #00c7e0; -} -.ircclient #chat .ircwrapper .input .my_nickname { - background-color: #00efef; - margin: 5px; - padding: 7px; - border-top-left-radius: 10px; - border-bottom-left-radius: 10px; - padding-right: 20px; - margin-right: 0; - width: 183px; - overflow: hidden; -} -.ircclient #chat .ircwrapper .input .inputwrapper { - display: inline-block; - position: absolute; - margin: 5px 0; - left: 210px; - right: 55px; - top: 0; -} -.ircclient #chat .ircwrapper .input .inputwrapper input { - width: 100%; - padding: 6px; - font-size: 120%; - border: 1px solid #929292; - border-left: 0; - -webkit-box-shadow: inset 4px 4px 8px #d8d8d8; - -moz-box-shadow: inset 4px 4px 8px #d8d8d8; - box-shadow: inset 4px 4px 8px #d8d8d8; -} -.ircclient #chat .ircwrapper .input .sendbutton { - background-image: url("../image/send.svg"); - background-repeat: no-repeat; - background-size: contain; - width: 32px; - position: absolute; - height: 32px; - float: right; - top: 5px; - right: 5px; - cursor: pointer; -} -.message.type_simple.mentioned { - background-color: #aeebff; -} -.message.type_simple .timestamp { - color: #696969; -} -.message.type_simple .timestamp:before { - color: #607d8b; - content: "["; -} -.message.type_simple .timestamp:after { - color: #607d8b; - content: "]"; -} -.message.type_simple .sender { - color: #3f51b5; -} -.message.type_simple .sender:before { - content: "<"; -} -.message.type_simple .sender:after { - content: ">"; -} -.message.type_simple .arrowin, -.message.type_simple .arrowout { - font-weight: bolder; -} -.message.type_simple .channel { - font-weight: bold; - color: #a0a0a0; -} -.message.type_simple .m_listentry .channel { - min-width: 120px; - display: inline-block; -} -.message.type_simple .m_listentry .usercount { - display: inline-block; - min-width: 45px; - text-align: center; -} -.message .reason:before, -.message .hostmask:before { - content: "("; -} -.message .reason:after, -.message .hostmask:after { - content: ")"; -} -.message .reason:before, -.message .hostmask:before, -.message .reason:after, -.message .hostmask:after { - color: #009606; - font-weight: bold; -} -.message .reason { - color: #bf0000; -} -.message .hostmask { - color: #004c88; -} -.message .arrowin { - color: #00ab00; -} -.message .arrowout { - color: #dc0f00; -} -.message.m_quit, -.message.m_part, -.message.m_kick { - color: #f00; -} -.message.m_join { - color: #008000; -} -.message.m_topic .content, -.message.m_names .content { - color: #03a9f4; - font-weight: bold; -} -.message.m_motd .content { - font-family: monospace; -} -.message.m_nick .content, -.message.m_notice .content { - color: #ff9800; - font-weight: bold; -} -.message.m_action .actionee { - color: #3f51b5; -} -.message.m_action .asterisk { - color: #e4c000; -} -.message.m_mode .content { - font-style: italic; -} -.message.m_mode .mode { - color: #008000; -} -.message.m_mode .asterisk { - color: #05abe0; -} -.message.m_error .content { - color: #f00; - font-weight: bold; -} -.message.m_help .content { - color: #008000; - font-weight: bold; -} -.message .irc-bg00, -.topicbar .irc-bg00, -.message .irc-bg0, -.topicbar .irc-bg0 { - background-color: #fff; -} -.message .irc-bg01, -.topicbar .irc-bg01, -.message .irc-bg1, -.topicbar .irc-bg1 { - background-color: #000; -} -.message .irc-bg02, -.topicbar .irc-bg02, -.message .irc-bg2, -.topicbar .irc-bg2 { - background-color: #000080; -} -.message .irc-bg03, -.topicbar .irc-bg03, -.message .irc-bg3, -.topicbar .irc-bg3 { - background-color: #008000; -} -.message .irc-bg04, -.topicbar .irc-bg04, -.message .irc-bg4, -.topicbar .irc-bg4 { - background-color: #f00; -} -.message .irc-bg05, -.topicbar .irc-bg05, -.message .irc-bg5, -.topicbar .irc-bg5 { - background-color: #a52a2a; -} -.message .irc-bg06, -.topicbar .irc-bg06, -.message .irc-bg6, -.topicbar .irc-bg6 { - background-color: #800080; -} -.message .irc-bg07, -.topicbar .irc-bg07, -.message .irc-bg7, -.topicbar .irc-bg7 { - background-color: #ffa500; -} -.message .irc-bg08, -.topicbar .irc-bg08, -.message .irc-bg8, -.topicbar .irc-bg8 { - background-color: #ff0; -} -.message .irc-bg09, -.topicbar .irc-bg09, -.message .irc-bg9, -.topicbar .irc-bg9 { - background-color: #0f0; -} -.message .irc-bg10, -.topicbar .irc-bg10 { - background-color: #008080; -} -.message .irc-bg11, -.topicbar .irc-bg11 { - background-color: #0ff; -} -.message .irc-bg12, -.topicbar .irc-bg12 { - background-color: #00f; -} -.message .irc-bg13, -.topicbar .irc-bg13 { - background-color: #ffc0cb; -} -.message .irc-bg14, -.topicbar .irc-bg14 { - background-color: #808080; -} -.message .irc-bg15, -.topicbar .irc-bg15 { - background-color: #d3d3d3; -} -.message .irc-fg00, -.topicbar .irc-fg00, -.message .irc-fg0, -.topicbar .irc-fg0 { - color: #fff; -} -.message .irc-fg01, -.topicbar .irc-fg01, -.message .irc-fg1, -.topicbar .irc-fg1 { - color: #000; -} -.message .irc-fg02, -.topicbar .irc-fg02, -.message .irc-fg2, -.topicbar .irc-fg2 { - color: #000080; -} -.message .irc-fg03, -.topicbar .irc-fg03, -.message .irc-fg3, -.topicbar .irc-fg3 { - color: #008000; -} -.message .irc-fg04, -.topicbar .irc-fg04, -.message .irc-fg4, -.topicbar .irc-fg4 { - color: #f00; -} -.message .irc-fg05, -.topicbar .irc-fg05, -.message .irc-fg5, -.topicbar .irc-fg5 { - color: #a52a2a; -} -.message .irc-fg06, -.topicbar .irc-fg06, -.message .irc-fg6, -.topicbar .irc-fg6 { - color: #800080; -} -.message .irc-fg07, -.topicbar .irc-fg07, -.message .irc-fg7, -.topicbar .irc-fg7 { - color: #ffa500; -} -.message .irc-fg08, -.topicbar .irc-fg08, -.message .irc-fg8, -.topicbar .irc-fg8 { - color: #dcdc00; -} -.message .irc-fg09, -.topicbar .irc-fg09, -.message .irc-fg9, -.topicbar .irc-fg9 { - color: #00e600; -} -.message .irc-fg10, -.topicbar .irc-fg10 { - color: #008080; -} -.message .irc-fg11, -.topicbar .irc-fg11 { - color: #00d2d2; -} -.message .irc-fg12, -.topicbar .irc-fg12 { - color: #00f; -} -.message .irc-fg13, -.topicbar .irc-fg13 { - color: #ffc0cb; -} -.message .irc-fg14, -.topicbar .irc-fg14 { - color: #808080; -} -.message .irc-fg15, -.topicbar .irc-fg15 { - color: #d3d3d3; -} -.message .irc-bold, -.topicbar .irc-bold { - font-weight: bold; -} -.message .irc-italic, -.topicbar .irc-italic { - font-style: italic; -} -.message .irc-underline, -.topicbar .irc-underline { - text-decoration: underline; -} -@media all and (max-width: 600px) { - .vnicks .nicklist { - display: none !important; - } - .vnicks .letterbox { - right: 0 !important; - } - .vnicks .topicbar { - right: 0 !important; - } - .vnicks.vopentrig .nicklist { - display: block !important; - } - .vnicks.vopentrig .topicbar { - right: 45px; - } - .vnicks .smsc-nicklistbtn { - z-index: 12; - display: block !important; - } - .my_nickname { - display: none; - } - .inputwrapper { - left: 38px !important; - } -} diff --git a/public/css/theme_default.css b/public/css/theme_default.css deleted file mode 100644 index fbec803..0000000 --- a/public/css/theme_default.css +++ /dev/null @@ -1,482 +0,0 @@ -.grade1 { - font-size: 200%; - color: #00bcd4; -} -.grade2 { - font-size: 150%; - color: #00bcd4; -} -.grade3 { - font-size: 120%; - color: #00bcd4; -} -.ircclient { - background: #fff; - background: -moz-linear-gradient(top, #fff 0%, #e5e5e5 100%); - background: -webkit-linear-gradient(top, #fff 0%, #e5e5e5 100%); - background: linear-gradient(to bottom, #fff 0%, #e5e5e5 100%); -} -.ircclient input[type=text], -.ircclient input[type=number], -.ircclient input[type=password] { - padding: 8px; - width: 300px; - border-radius: 5px; - border: 1px solid #d2d2d2; - -webkit-box-shadow: inset 2px 2px 4px #dcdcdc; - -moz-box-shadow: inset 2px 2px 4px #dcdcdc; - box-shadow: inset 2px 2px 4px #dcdcdc; -} -.ircclient input[type="submit"] { - background: #87e0fd; - background: -moz-linear-gradient(top, #87e0fd 0%, #53cbf1 40%, #05abe0 100%); - background: -webkit-linear-gradient(top, #87e0fd 0%, #53cbf1 40%, #05abe0 100%); - background: linear-gradient(to bottom, #87e0fd 0%, #53cbf1 40%, #05abe0 100%); - border: 1px solid #2196f3; - color: #fff; - font-size: 120%; -} -.ircclient input[type="submit"]:hover { - background: #c4effc; - background: -moz-linear-gradient(top, #c4effc 0%, #7fd5ef 40%, #39b7dd 100%); - background: -webkit-linear-gradient(top, #c4effc 0%, #7fd5ef 40%, #39b7dd 100%); - background: linear-gradient(to bottom, #c4effc 0%, #7fd5ef 40%, #39b7dd 100%); -} -.ircclient .coverwindow .wrapper { - background-color: #f7f7f7; - border: 1px solid #dadada; - -webkit-box-shadow: 4px 4px 18px #d6d6d6; - -moz-box-shadow: 4px 4px 18px #d6d6d6; - box-shadow: 4px 4px 18px #d6d6d6; -} -.ircclient .coverwindow .wrapper .msg.error { - color: #f00; -} -.ircclient .coverwindow .wrapper label { - font-size: 80%; - color: #2196f3; -} -.ircclient .coverwindow .wrapper label.autosize { - font-size: 90% !important; -} -.ircclient #chat .ircwrapper .toolbar { - background-color: #00c7e0; - -webkit-box-shadow: 2px 2px 4px #cecece; - -moz-box-shadow: 2px 2px 4px #cecece; - box-shadow: 2px 2px 4px #cecece; -} -.ircclient #chat .ircwrapper .toolbar .open_settings { - background-image: url("../image/settings.svg"); - background-repeat: no-repeat; - background-size: contain; -} -.ircclient #chat .ircwrapper .toolbar .tabby .tab { - background-color: #29e1ff; - border: 1px solid #00d0ea; - -webkit-box-shadow: inset 4px 4px 8px #44ebff; - -moz-box-shadow: inset 4px 4px 8px #44ebff; - box-shadow: inset 4px 4px 8px #44ebff; - color: #fff; -} -.ircclient #chat .ircwrapper .toolbar .tabby .tab #unread { - background-color: #bf0000; - border: 1px solid #b00; - -webkit-box-shadow: inset 2px 2px 3px #f00; - -moz-box-shadow: inset 2px 2px 3px #f00; - box-shadow: inset 2px 2px 3px #f00; -} -.ircclient #chat .ircwrapper .toolbar .tabby .tab #close { - color: #ff3d3d; -} -.ircclient #chat .ircwrapper .toolbar .tabby .tab:hover { - background-color: #63e9ff; - -webkit-box-shadow: inset 4px 4px 8px #86f2ff; - -moz-box-shadow: inset 4px 4px 8px #86f2ff; - box-shadow: inset 4px 4px 8px #86f2ff; -} -.ircclient #chat .ircwrapper .toolbar .tabby .tab.active { - background-color: #00b9d8; - border: 1px solid #009aad; - -webkit-box-shadow: inset 4px 4px 8px #009caf; - -moz-box-shadow: inset 4px 4px 8px #009caf; - box-shadow: inset 4px 4px 8px #009caf; - color: #fff; -} -.ircclient #chat .ircwrapper .toolbar .tabby .tab.active:hover { - background-color: #00c7e8; -} -.ircclient #chat .ircwrapper .chatarea .smsc-nicklistbtn { - background-image: url("../image/users.svg"); - background-repeat: no-repeat; - background-size: contain; - background-color: #00bcd4; - border: 5px solid #389dbb; -} -.ircclient #chat .ircwrapper .chatarea .topicbar { - background-color: #fff; - border-bottom: 1px solid #ddd; -} -.ircclient #chat .ircwrapper .chatarea .topicbar:hover { - height: auto; - max-height: 100px; - overflow: auto; - word-wrap: break-word; -} -.ircclient #chat .ircwrapper .chatarea .nicklist { - border-left: 1px solid #ddd; - background-color: #fff; -} -.ircclient #chat .ircwrapper .chatarea .nicklist .nick:hover { - background-color: #aeebff; -} -.ircclient #chat .ircwrapper .chatarea .nicklist .nick .prefix { - background-color: #05abe0; - color: #fff; -} -.ircclient #chat .ircwrapper .chatarea .settings .theme_button { - background-color: #e0e0e0; - border: 1px solid #a7a7a7; -} -.ircclient #chat .ircwrapper .chatarea .settings .theme_button:hover { - background-color: #efefef; -} -.ircclient #chat .ircwrapper .chatarea .settings .theme_button.selected { - border: 2px solid #00a0b5 !important; -} -.ircclient #chat .ircwrapper .input { - background-color: #00c7e0; -} -.ircclient #chat .ircwrapper .input .my_nickname { - background-color: #00efef; -} -.ircclient #chat .ircwrapper .input .inputwrapper input { - border: 1px solid #929292; - -webkit-box-shadow: inset 4px 4px 8px #d8d8d8; - -moz-box-shadow: inset 4px 4px 8px #d8d8d8; - box-shadow: inset 4px 4px 8px #d8d8d8; -} -.ircclient #chat .ircwrapper .input .sendbutton { - background-image: url("../image/send.svg"); - background-repeat: no-repeat; - background-size: contain; -} -.message.type_simple.mentioned { - background-color: #aeebff; -} -.message.type_simple .timestamp { - color: #696969; -} -.message.type_simple .timestamp:before { - color: #607d8b; - content: "["; -} -.message.type_simple .timestamp:after { - color: #607d8b; - content: "]"; -} -.message.type_simple .sender { - color: #3f51b5; -} -.message.type_simple .sender:before { - content: "<"; -} -.message.type_simple .sender:after { - content: ">"; -} -.message.type_simple .arrowin, -.message.type_simple .arrowout { - font-weight: bolder; -} -.message.type_simple .channel { - font-weight: bold; - color: #a0a0a0; -} -.message.type_simple .m_listentry .channel { - min-width: 120px; - display: inline-block; -} -.message.type_simple .m_listentry .usercount { - display: inline-block; - min-width: 45px; - text-align: center; -} -.message .reason:before, -.message .hostmask:before { - content: "("; -} -.message .reason:after, -.message .hostmask:after { - content: ")"; -} -.message .reason:before, -.message .hostmask:before, -.message .reason:after, -.message .hostmask:after { - color: #009606; - font-weight: bold; -} -.message .reason { - color: #bf0000; -} -.message .hostmask { - color: #004c88; -} -.message .arrowin { - color: #00ab00; -} -.message .arrowout { - color: #dc0f00; -} -.message.m_ctcp_response, -.message.m_ctcp_request { - color: #39b7dd; - font-weight: bold; -} -.message.m_ctcp_response .asterisk, -.message.m_ctcp_request .asterisk { - color: #05abe0; -} -.message.m_quit, -.message.m_part, -.message.m_kick { - color: #f00; -} -.message.m_join { - color: #008000; -} -.message.m_topic .content, -.message.m_names .content { - color: #03a9f4; - font-weight: bold; -} -.message.m_motd .content { - font-family: monospace; -} -.message.m_nick .content, -.message.m_notice .content { - color: #ff9800; - font-weight: bold; -} -.message.m_action .actionee { - color: #3f51b5; -} -.message.m_action .asterisk { - color: #e4c000; -} -.message.m_mode .content { - font-style: italic; -} -.message.m_mode .mode { - color: #008000; -} -.message.m_mode .asterisk { - color: #05abe0; -} -.message.m_error .content { - color: #f00; - font-weight: bold; -} -.message.m_help .content { - color: #008000; - font-weight: bold; -} -.message .irc-bg00, -.topicbar .irc-bg00, -.message .irc-bg0, -.topicbar .irc-bg0 { - background-color: #fff; -} -.message .irc-bg01, -.topicbar .irc-bg01, -.message .irc-bg1, -.topicbar .irc-bg1 { - background-color: #000; -} -.message .irc-bg02, -.topicbar .irc-bg02, -.message .irc-bg2, -.topicbar .irc-bg2 { - background-color: #000080; -} -.message .irc-bg03, -.topicbar .irc-bg03, -.message .irc-bg3, -.topicbar .irc-bg3 { - background-color: #008000; -} -.message .irc-bg04, -.topicbar .irc-bg04, -.message .irc-bg4, -.topicbar .irc-bg4 { - background-color: #f00; -} -.message .irc-bg05, -.topicbar .irc-bg05, -.message .irc-bg5, -.topicbar .irc-bg5 { - background-color: #a52a2a; -} -.message .irc-bg06, -.topicbar .irc-bg06, -.message .irc-bg6, -.topicbar .irc-bg6 { - background-color: #800080; -} -.message .irc-bg07, -.topicbar .irc-bg07, -.message .irc-bg7, -.topicbar .irc-bg7 { - background-color: #ffa500; -} -.message .irc-bg08, -.topicbar .irc-bg08, -.message .irc-bg8, -.topicbar .irc-bg8 { - background-color: #ff0; -} -.message .irc-bg09, -.topicbar .irc-bg09, -.message .irc-bg9, -.topicbar .irc-bg9 { - background-color: #0f0; -} -.message .irc-bg10, -.topicbar .irc-bg10 { - background-color: #008080; -} -.message .irc-bg11, -.topicbar .irc-bg11 { - background-color: #0ff; -} -.message .irc-bg12, -.topicbar .irc-bg12 { - background-color: #00f; -} -.message .irc-bg13, -.topicbar .irc-bg13 { - background-color: #ffc0cb; -} -.message .irc-bg14, -.topicbar .irc-bg14 { - background-color: #808080; -} -.message .irc-bg15, -.topicbar .irc-bg15 { - background-color: #d3d3d3; -} -.message .irc-fg00, -.topicbar .irc-fg00, -.message .irc-fg0, -.topicbar .irc-fg0 { - color: #fff; -} -.message .irc-fg01, -.topicbar .irc-fg01, -.message .irc-fg1, -.topicbar .irc-fg1 { - color: #000; -} -.message .irc-fg02, -.topicbar .irc-fg02, -.message .irc-fg2, -.topicbar .irc-fg2 { - color: #000080; -} -.message .irc-fg03, -.topicbar .irc-fg03, -.message .irc-fg3, -.topicbar .irc-fg3 { - color: #008000; -} -.message .irc-fg04, -.topicbar .irc-fg04, -.message .irc-fg4, -.topicbar .irc-fg4 { - color: #f00; -} -.message .irc-fg05, -.topicbar .irc-fg05, -.message .irc-fg5, -.topicbar .irc-fg5 { - color: #a52a2a; -} -.message .irc-fg06, -.topicbar .irc-fg06, -.message .irc-fg6, -.topicbar .irc-fg6 { - color: #800080; -} -.message .irc-fg07, -.topicbar .irc-fg07, -.message .irc-fg7, -.topicbar .irc-fg7 { - color: #ffa500; -} -.message .irc-fg08, -.topicbar .irc-fg08, -.message .irc-fg8, -.topicbar .irc-fg8 { - color: #dcdc00; -} -.message .irc-fg09, -.topicbar .irc-fg09, -.message .irc-fg9, -.topicbar .irc-fg9 { - color: #00e600; -} -.message .irc-fg10, -.topicbar .irc-fg10 { - color: #008080; -} -.message .irc-fg11, -.topicbar .irc-fg11 { - color: #00d2d2; -} -.message .irc-fg12, -.topicbar .irc-fg12 { - color: #00f; -} -.message .irc-fg13, -.topicbar .irc-fg13 { - color: #ffc0cb; -} -.message .irc-fg14, -.topicbar .irc-fg14 { - color: #808080; -} -.message .irc-fg15, -.topicbar .irc-fg15 { - color: #d3d3d3; -} -.message .irc-bold, -.topicbar .irc-bold { - font-weight: bold; -} -.message .irc-italic, -.topicbar .irc-italic { - font-style: italic; -} -.message .irc-underline, -.topicbar .irc-underline { - text-decoration: underline; -} -@-moz-keyframes hotTab { - 50% { - background-color: #6eebff; - } -} -@-webkit-keyframes hotTab { - 50% { - background-color: #6eebff; - } -} -@-o-keyframes hotTab { - 50% { - background-color: #6eebff; - } -} -@keyframes hotTab { - 50% { - background-color: #6eebff; - } -} diff --git a/public/css/theme_night.css b/public/css/theme_night.css deleted file mode 100644 index 3a5974e..0000000 --- a/public/css/theme_night.css +++ /dev/null @@ -1,500 +0,0 @@ -.grade1 { - font-size: 200%; - color: #00bcd4; -} -.grade2 { - font-size: 150%; - color: #00bcd4; -} -.grade3 { - font-size: 120%; - color: #00bcd4; -} -a { - color: #23e7ff; -} -a:hover { - color: #5dedff; -} -.ircclient { - background: #1d1d1d; -} -.ircclient input[type=text], -.ircclient input[type=number], -.ircclient input[type=password] { - padding: 8px; - width: 300px; - border-radius: 5px; - border: 1px solid #d2d2d2; - -webkit-box-shadow: inset 2px 2px 4px #dcdcdc; - -moz-box-shadow: inset 2px 2px 4px #dcdcdc; - box-shadow: inset 2px 2px 4px #dcdcdc; -} -.ircclient input[type="submit"] { - background: #87e0fd; - background: -moz-linear-gradient(top, #87e0fd 0%, #53cbf1 40%, #05abe0 100%); - background: -webkit-linear-gradient(top, #87e0fd 0%, #53cbf1 40%, #05abe0 100%); - background: linear-gradient(to bottom, #87e0fd 0%, #53cbf1 40%, #05abe0 100%); - border: 1px solid #2196f3; - color: #fff; - font-size: 120%; -} -.ircclient input[type="submit"]:hover { - background: #c4effc; - background: -moz-linear-gradient(top, #c4effc 0%, #7fd5ef 40%, #39b7dd 100%); - background: -webkit-linear-gradient(top, #c4effc 0%, #7fd5ef 40%, #39b7dd 100%); - background: linear-gradient(to bottom, #c4effc 0%, #7fd5ef 40%, #39b7dd 100%); -} -.ircclient .coverwindow .wrapper { - background-color: #3e3e3e; - border: 1px solid #171717; - -webkit-box-shadow: 4px 4px 18px #383838; - -moz-box-shadow: 4px 4px 18px #383838; - box-shadow: 4px 4px 18px #383838; - color: #fff; -} -.ircclient .coverwindow .wrapper .msg.error { - color: #f00; -} -.ircclient .coverwindow .wrapper label { - font-size: 80%; - color: #67bcff; -} -.ircclient .coverwindow .wrapper label.autosize { - font-size: 90% !important; -} -.ircclient #chat .ircwrapper .toolbar { - background-color: #008e8e; - -webkit-box-shadow: 2px 2px 4px #585858; - -moz-box-shadow: 2px 2px 4px #585858; - box-shadow: 2px 2px 4px #585858; -} -.ircclient #chat .ircwrapper .toolbar .open_settings { - background-image: url("../image/settings.svg"); - background-repeat: no-repeat; - background-size: contain; -} -.ircclient #chat .ircwrapper .toolbar .tabby .tab { - background-color: #00bfde; - border: 1px solid #0092a5; - -webkit-box-shadow: inset 4px 4px 8px #00d1ea; - -moz-box-shadow: inset 4px 4px 8px #00d1ea; - box-shadow: inset 4px 4px 8px #00d1ea; - color: #fff; -} -.ircclient #chat .ircwrapper .toolbar .tabby .tab.hot { - animation: hotTab 1s linear infinite; -} -.ircclient #chat .ircwrapper .toolbar .tabby .tab #unread { - background-color: #bf0000; - border: 1px solid #b00; - -webkit-box-shadow: inset 2px 2px 3px #f00; - -moz-box-shadow: inset 2px 2px 3px #f00; - box-shadow: inset 2px 2px 3px #f00; -} -.ircclient #chat .ircwrapper .toolbar .tabby .tab #close { - color: #ff3d3d; -} -.ircclient #chat .ircwrapper .toolbar .tabby .tab:hover { - background-color: #00dbff; - -webkit-box-shadow: inset 4px 4px 8px #23e7ff; - -moz-box-shadow: inset 4px 4px 8px #23e7ff; - box-shadow: inset 4px 4px 8px #23e7ff; -} -.ircclient #chat .ircwrapper .toolbar .tabby .tab.active { - background-color: #006a7b; - border: 1px solid #006a77; - -webkit-box-shadow: inset 4px 4px 8px #003940; - -moz-box-shadow: inset 4px 4px 8px #003940; - box-shadow: inset 4px 4px 8px #003940; - color: #fff; -} -.ircclient #chat .ircwrapper .toolbar .tabby .tab.active:hover { - background-color: #00859a; -} -.ircclient #chat .ircwrapper .chatarea .smsc-nicklistbtn { - background-image: url("../image/users.svg"); - background-repeat: no-repeat; - background-size: contain; - background-color: #00bcd4; - border: 5px solid #389dbb; -} -.ircclient #chat .ircwrapper .chatarea .topicbar { - background-color: #2d2d2d; - border-bottom: 1px solid #000; - color: #fff; -} -.ircclient #chat .ircwrapper .chatarea .topicbar:hover { - height: auto; - max-height: 100px; - overflow: auto; - word-wrap: break-word; -} -.ircclient #chat .ircwrapper .chatarea .nicklist { - background-color: #2d2d2d; - border-left: 1px solid #000; - color: #fff; -} -.ircclient #chat .ircwrapper .chatarea .nicklist .nick:hover { - background-color: #006282; -} -.ircclient #chat .ircwrapper .chatarea .nicklist .nick .prefix { - background-color: #05abe0; - color: #fff; -} -.ircclient #chat .ircwrapper .chatarea .settings { - color: #fff; -} -.ircclient #chat .ircwrapper .chatarea .settings .theme_button { - background-color: #424242; - border: 1px solid #444; -} -.ircclient #chat .ircwrapper .chatarea .settings .theme_button:hover { - background-color: #545454; -} -.ircclient #chat .ircwrapper .chatarea .settings .theme_button.selected { - border: 2px solid #00e2ff !important; -} -.ircclient #chat .ircwrapper .input { - background-color: #005a5a; -} -.ircclient #chat .ircwrapper .input .my_nickname { - background-color: #009494; - color: #fff; -} -.ircclient #chat .ircwrapper .input .inputwrapper input { - -webkit-box-shadow: inset 4px 4px 8px #001419; - -moz-box-shadow: inset 4px 4px 8px #001419; - box-shadow: inset 4px 4px 8px #001419; - background-color: #002b36; - border: 1px solid #008e8e; - color: #fff; -} -.ircclient #chat .ircwrapper .input .sendbutton { - background-image: url("../image/send.svg"); - background-repeat: no-repeat; - background-size: contain; -} -.message { - color: #fff; -} -.message.type_simple.mentioned { - background-color: #006282; -} -.message.type_simple .timestamp { - color: #afafaf; -} -.message.type_simple .timestamp:before { - color: #607d8b; - content: "["; -} -.message.type_simple .timestamp:after { - color: #607d8b; - content: "]"; -} -.message.type_simple .sender { - color: #3f51b5; -} -.message.type_simple .sender:before { - content: "<"; -} -.message.type_simple .sender:after { - content: ">"; -} -.message.type_simple .arrowin, -.message.type_simple .arrowout { - font-weight: bolder; -} -.message.type_simple .channel { - font-weight: bold; - color: #a0a0a0; -} -.message.type_simple .m_listentry .channel { - min-width: 120px; - display: inline-block; -} -.message.type_simple .m_listentry .usercount { - display: inline-block; - min-width: 45px; - text-align: center; -} -.message .reason:before, -.message .hostmask:before { - content: "("; -} -.message .reason:after, -.message .hostmask:after { - content: ")"; -} -.message .reason:before, -.message .hostmask:before, -.message .reason:after, -.message .hostmask:after { - color: #009606; - font-weight: bold; -} -.message .reason { - color: #bf0000; -} -.message .hostmask { - color: #1999ff; -} -.message .arrowin { - color: #00ab00; -} -.message .arrowout { - color: #dc0f00; -} -.message.m_ctcp_response, -.message.m_ctcp_request { - color: #39b7dd; - font-weight: bold; -} -.message.m_ctcp_response .asterisk, -.message.m_ctcp_request .asterisk { - color: #05abe0; -} -.message.m_quit, -.message.m_part, -.message.m_kick { - color: #f00; -} -.message.m_join { - color: #008000; -} -.message.m_topic .content, -.message.m_names .content { - color: #03a9f4; - font-weight: bold; -} -.message.m_motd .content { - font-family: monospace; -} -.message.m_nick .content, -.message.m_notice .content { - color: #ff9800; - font-weight: bold; -} -.message.m_action .actionee { - color: #3f51b5; -} -.message.m_action .asterisk { - color: #e4c000; -} -.message.m_mode .content { - font-style: italic; -} -.message.m_mode .mode { - color: #0f0; -} -.message.m_mode .asterisk { - color: #05abe0; -} -.message.m_error .content { - color: #f00; - font-weight: bold; -} -.message.m_help .content { - color: #0f0; - font-weight: bold; -} -.message .irc-bg00, -.topicbar .irc-bg00, -.message .irc-bg0, -.topicbar .irc-bg0 { - background-color: #fff; -} -.message .irc-bg01, -.topicbar .irc-bg01, -.message .irc-bg1, -.topicbar .irc-bg1 { - background-color: #000; -} -.message .irc-bg02, -.topicbar .irc-bg02, -.message .irc-bg2, -.topicbar .irc-bg2 { - background-color: #000080; -} -.message .irc-bg03, -.topicbar .irc-bg03, -.message .irc-bg3, -.topicbar .irc-bg3 { - background-color: #008000; -} -.message .irc-bg04, -.topicbar .irc-bg04, -.message .irc-bg4, -.topicbar .irc-bg4 { - background-color: #f00; -} -.message .irc-bg05, -.topicbar .irc-bg05, -.message .irc-bg5, -.topicbar .irc-bg5 { - background-color: #a52a2a; -} -.message .irc-bg06, -.topicbar .irc-bg06, -.message .irc-bg6, -.topicbar .irc-bg6 { - background-color: #800080; -} -.message .irc-bg07, -.topicbar .irc-bg07, -.message .irc-bg7, -.topicbar .irc-bg7 { - background-color: #ffa500; -} -.message .irc-bg08, -.topicbar .irc-bg08, -.message .irc-bg8, -.topicbar .irc-bg8 { - background-color: #ff0; -} -.message .irc-bg09, -.topicbar .irc-bg09, -.message .irc-bg9, -.topicbar .irc-bg9 { - background-color: #0f0; -} -.message .irc-bg10, -.topicbar .irc-bg10 { - background-color: #008080; -} -.message .irc-bg11, -.topicbar .irc-bg11 { - background-color: #00d2d2; -} -.message .irc-bg12, -.topicbar .irc-bg12 { - background-color: #004aff; -} -.message .irc-bg13, -.topicbar .irc-bg13 { - background-color: #ffc0cb; -} -.message .irc-bg14, -.topicbar .irc-bg14 { - background-color: #808080; -} -.message .irc-bg15, -.topicbar .irc-bg15 { - background-color: #d3d3d3; -} -.message .irc-fg00, -.topicbar .irc-fg00, -.message .irc-fg0, -.topicbar .irc-fg0 { - color: #fff; -} -.message .irc-fg01, -.topicbar .irc-fg01, -.message .irc-fg1, -.topicbar .irc-fg1 { - color: #000; -} -.message .irc-fg02, -.topicbar .irc-fg02, -.message .irc-fg2, -.topicbar .irc-fg2 { - color: #000080; -} -.message .irc-fg03, -.topicbar .irc-fg03, -.message .irc-fg3, -.topicbar .irc-fg3 { - color: #008000; -} -.message .irc-fg04, -.topicbar .irc-fg04, -.message .irc-fg4, -.topicbar .irc-fg4 { - color: #f00; -} -.message .irc-fg05, -.topicbar .irc-fg05, -.message .irc-fg5, -.topicbar .irc-fg5 { - color: #a52a2a; -} -.message .irc-fg06, -.topicbar .irc-fg06, -.message .irc-fg6, -.topicbar .irc-fg6 { - color: #800080; -} -.message .irc-fg07, -.topicbar .irc-fg07, -.message .irc-fg7, -.topicbar .irc-fg7 { - color: #ffa500; -} -.message .irc-fg08, -.topicbar .irc-fg08, -.message .irc-fg8, -.topicbar .irc-fg8 { - color: #dcdc00; -} -.message .irc-fg09, -.topicbar .irc-fg09, -.message .irc-fg9, -.topicbar .irc-fg9 { - color: #00e600; -} -.message .irc-fg10, -.topicbar .irc-fg10 { - color: #008080; -} -.message .irc-fg11, -.topicbar .irc-fg11 { - color: #00d2d2; -} -.message .irc-fg12, -.topicbar .irc-fg12 { - color: #004aff; -} -.message .irc-fg13, -.topicbar .irc-fg13 { - color: #ffc0cb; -} -.message .irc-fg14, -.topicbar .irc-fg14 { - color: #808080; -} -.message .irc-fg15, -.topicbar .irc-fg15 { - color: #d3d3d3; -} -.message .irc-bold, -.topicbar .irc-bold { - font-weight: bold; -} -.message .irc-italic, -.topicbar .irc-italic { - font-style: italic; -} -.message .irc-underline, -.topicbar .irc-underline { - text-decoration: underline; -} -@-moz-keyframes hotTab { - 50% { - background-color: #3ee4ff; - } -} -@-webkit-keyframes hotTab { - 50% { - background-color: #3ee4ff; - } -} -@-o-keyframes hotTab { - 50% { - background-color: #3ee4ff; - } -} -@keyframes hotTab { - 50% { - background-color: #3ee4ff; - } -} diff --git a/public/main.styl b/public/main.styl deleted file mode 100644 index ab996c4..0000000 --- a/public/main.styl +++ /dev/null @@ -1,278 +0,0 @@ -// Run `stylus -w styl -o css` to compile -props(prop, args) - -webkit-{prop} args - -moz-{prop} args - -ms-{prop} args - -o-{prop} args - {prop} args - -transition() - props('transition', arguments) - -body - margin: 0 - padding: 0 - font-family: Open Sans, Everson Mono, Helvetica - -.grade1 - margin-bottom: 0 - margin-top: 0 - display: block - text-align: center - -.grade2 - margin-bottom: 0 - margin-top: 20px - display: block - text-align: center - -.grade3 - margin-bottom: 0 - margin-top: 20px - display: block - text-align: center - -.ircclient - position: absolute - width: 100% - height: 100% - .coverwindow - position: absolute - width: 100% - height: 100% - &#authdialog - z-index: 100 - .wrapper - width: 320px - margin: auto - margin-top: 5% - padding: 15px - label - display: block - font-size: 80% - margin-top: 5px - &.autosize - width: auto - display: inline-block !important - font-size: 90% !important - margin-bottom: 10px - input[type=text], input[type=number], input[type=password] - padding: 8px; - width: 300px; - border-radius: 5px; - input[type="submit"] - width: 318px; - padding: 12px; - margin-top: 20px; - display: block; - border-radius: 4px; - font-size: 120%; - font-weight: bold; - text-transform: uppercase; - cursor: pointer - #chat - overflow: hidden; - .ircwrapper - position: absolute - width: 100% - height: 100% - .toolbar - height: 56px - position: relative - z-index: 15 - .open_settings - width: 36px; - height: 36px; - display: inline-block; - position: absolute; - right: 10px; - top: 10px; - cursor: pointer; - transition transform 0.2s linear - &:hover - transform: rotateZ(-90deg); - .tabby - display: inline-block - height: 56px - position: absolute - right: 45px - left: 0 - white-space: nowrap - overflow-x: auto - overflow-y: hidden - .tab - display: inline-block; - min-width: 60px; - height: 25px; - margin: 5px; - margin-right: 0; - padding: 10px; - line-height: 25px; - transition background-color 0.2s linear - border-radius: 5px; - cursor: pointer; - font-weight: 600; - #unread - display: inline-block; - min-width: 18px; - height: 18px; - text-align: center; - font-size: 12px; - margin: 0 5px; - line-height: 20px; - border-radius: 100%; - &.none - display: none; - #close - display: inline-block; - width: 12px; - text-align: center; - margin-left: 5px - - .chatarea - position: absolute; - top: 56px; - width: 100%; - bottom: 46px; - .smsc-nicklistbtn - width: 46px; - height: 46px; - position: absolute; - top: 16px; - right: 16px; - border-radius: 100%; - display: none; - opacity: 0.5; - cursor: pointer; - .topicbar - position: absolute; - top: 0; - height: 20px; - right: 0; - left: 0; - padding: 12px; - display: none; - overflow: hidden; - z-index: 10 - &:hover - height: auto - max-height: 100px - overflow: auto - word-wrap: break-word - .letterbox - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - overflow-y: auto; - white-space: pre-wrap; - word-wrap: break-word; - padding: 5px; - .nicklist - width: 280px; - position: absolute; - right: 0; - padding: 10px; - top: 0; - bottom: 0; - display: none; - z-index: 11; - overflow: auto; - .nick - cursor: pointer; - .nickname - font-size: 120%; - .prefix - width: 16px; - height: 16px; - line-height: 16px; - padding: 2px; - display: inline-block; - border-radius: 4px; - text-align: center; - margin-right: 5px; - font-weight: bold; - .no-prefix - width: 25px; - display: inline-block; - .settings - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - padding: 20px; - width: 60%; - min-width: 360px; - margin: auto; - overflow: auto; - .grade1, .grade2, .grade3 - text-align: left; - &.vnicks - .nicklist - display: block; - .letterbox - right: 301px; - .topicbar - right: 301px; - &.vtopic - .topicbar - display: block; - .letterbox - top: 45px; - .input - position: absolute; - bottom: 0; - height: 46px; - width: 100%; - .my_nickname - margin: 5px; - padding: 7px; - border-top-left-radius: 10px; - border-bottom-left-radius: 10px; - padding-right: 20px; - margin-right: 0; - width: 183px; - overflow: hidden; - .inputwrapper - display: inline-block - position: absolute - margin: 5px 0 - left: 210px - right: 55px - top: 0 - input - width: 100% - padding: 6px - font-size: 120% - border-left: 0 - .sendbutton - width: 32px; - position: absolute; - height: 32px; - float: right; - top: 5px; - right: 5px; - cursor: pointer; - -@media all and (max-width: 600px) - .vnicks - .nicklist - display: none !important; - .letterbox - right: 0 !important; - .topicbar - right: 0 !important; - &.vopentrig - .nicklist - display: block !important; - .topicbar - right: 45px; - .smsc-nicklistbtn - z-index: 12; - display: block !important; - .my_nickname - display: none; - .inputwrapper - left: 38px !important; diff --git a/server/logger.js b/server/logger.js index 83683f9..4e3d020 100644 --- a/server/logger.js +++ b/server/logger.js @@ -1,15 +1,15 @@ -const util = require("util"), - config = require(__dirname+'/config'); +const util = require('util'); +const config = require(__dirname+'/config'); module.exports.log = function() { console.log.apply(null, arguments); -} +}; module.exports.debugLog = function() { if(!config.server.debug) return; console.log.apply(null, arguments); -} +}; module.exports.errorLog = function(errObj, specify) { if(specify) @@ -19,8 +19,7 @@ module.exports.errorLog = function(errObj, specify) { if(errObj.stack) console.error(errObj.stack); -} - +}; module.exports.printRuntimeStats = function(runtime_stats, connections) { if(!config.server.printStats) return; @@ -35,7 +34,7 @@ module.exports.printRuntimeStats = function(runtime_stats, connections) { users += 1; for(let snam in ca) { if(!snam) continue; - if(snam == "host") continue; + if(snam == 'host') continue; servers += 1; } } @@ -43,9 +42,9 @@ module.exports.printRuntimeStats = function(runtime_stats, connections) { if(users != 0) // Don't divide by zero lmao serversPerUser = servers/users; - console.log(date+": Currently connected users: "+users+";", - "IRC server connections: "+servers+";", - "Average servers per user: "+serversPerUser+";", - "Total connections made: "+runtime_stats.connectionsMade+";", - "Uptime: "+process.uptime()+"s;"); -} + console.log(date+': Currently connected users: {0};' + + 'IRC server connections: {1};' + + 'Average servers per user: {2};' + + 'Total connections made: {3};' + + 'Uptime: {4}s;'.format(users, servers, serversPerUser, runtime_stats.connectionsMade, process.uptime())); +}; diff --git a/server/teemant_irc/index.js b/server/teemant_irc/index.js index 908fcf2..49f1ee4 100644 --- a/server/teemant_irc/index.js +++ b/server/teemant_irc/index.js @@ -4,4 +4,4 @@ let parser = require(__dirname+'/parser.js'); module.exports = { IRCConnection: connector, Parser: parser -} +}; diff --git a/server/teemant_irc/irc.js b/server/teemant_irc/irc.js index a5f848b..3898553 100644 --- a/server/teemant_irc/irc.js +++ b/server/teemant_irc/irc.js @@ -1,16 +1,7 @@ -const EventEmitter = require('events').EventEmitter, - net = require('net'), - tls = require('tls'), - parse = require(__dirname+"/parser"); - -if (!String.prototype.format) { - String.prototype.format = function() { - var args = arguments; - return this.replace(/{(\d+)}/g, function(match, number) { - return typeof args[number] != undefined ? args[number] : match; - }); - }; -} +const EventEmitter = require('events').EventEmitter; +const net = require('net'); +const tls = require('tls'); +const parse = require(__dirname+'/parser'); class IRCConnectionHandler { constructor(connection) { @@ -19,40 +10,40 @@ class IRCConnectionHandler { handleUserLine(data) { switch(data.command) { - case "topic": + case 'topic': this.conn.write(('{0} {1}'+(data.message != '' ? ' :'+data.message : '')).format(data.command.toUpperCase(), data.arguments[0])); break; - case "kick": + case 'kick': this.conn.write('{0} {1} :{2}'.format(data.command.toUpperCase(), data.arguments.join(' '), data.message)); break; - case "part": + case 'part': this.conn.write('{0} {1} :{2}'.format(data.command.toUpperCase(), data.arguments[0], data.message)); break; - case "nick": - case "whois": - case "who": - case "names": - case "join": + case 'nick': + case 'whois': + case 'who': + case 'names': + case 'join': this.conn.write('{0} {1}'.format(data.command.toUpperCase(), data.arguments[0])); break; - case "quit": + case 'quit': this.conn.write('{0} :{1}'.format(data.command.toUpperCase(), (data.message == '' ? this.conn.globalConfig.default_quit_msg : data.message))); break; - case "privmsg": + case 'privmsg': this.conn.write('PRIVMSG {0} :{1}'.format(data.arguments[0], data.message)); - this.conn.emit('pass_to_client', {type: "message", messageType: "privmsg", to: data.arguments[0], + this.conn.emit('pass_to_client', {type: 'message', messageType: 'privmsg', to: data.arguments[0], user: {nickname: this.conn.config.nickname}, message: data.message, server: data.server}); break; - case "notice": + case 'notice': this.conn.write('NOTICE {0} :{1}'.format(data.arguments[0], data.message)); - this.conn.emit('pass_to_client', {type: "message", messageType: "notice", to: data.arguments[0], + this.conn.emit('pass_to_client', {type: 'message', messageType: 'notice', to: data.arguments[0], user: {nickname: this.conn.config.nickname}, message: data.message, server: data.server}); break; - case "list": + case 'list': this.conn.write(data.command.toUpperCase()); break; - case "ctcp": + case 'ctcp': let ctcpmsg = ''; if(data.arguments[1].toLowerCase() == 'ping') @@ -61,15 +52,15 @@ class IRCConnectionHandler { ctcpmsg = data.message; this.conn.write('PRIVMSG {0} :\x01{1}\x01'.format(data.arguments[0], ctcpmsg)); - this.conn.emit('pass_to_client', {type: "message", messageType: "ctcp_request", to: this.conn.config.nickname, + this.conn.emit('pass_to_client', {type: 'message', messageType: 'ctcp_request', to: this.conn.config.nickname, user: {nickname: data.arguments[0]}, message: ctcpmsg, server: data.server}); break; default: this.conn.write(data.command.toUpperCase()+' '+data.message); } - if(data.targetType == "channel" || data.targetType == "message") { + if(data.targetType == 'channel' || data.targetType == 'message') { this.conn.write('PRIVMSG {0} :{1}'.format(data.target, data.message)); - this.conn.emit('pass_to_client', {type: "message", messageType: "privmsg", to: data.target, + this.conn.emit('pass_to_client', {type: 'message', messageType: 'privmsg', to: data.target, user: {nickname: this.conn.config.nickname}, message: data.message, server: data.server}); } } @@ -91,12 +82,12 @@ class IRCConnectionHandler { if(!line[0]) return; line[0] = line[0].toUpperCase(); - let resp = "\x01"+line[0]+" {0}\x01"; + let resp = '\x01'+line[0]+' {0}\x01'; - if(line[0] == "PING" && line[1] != null && line[1] != '') { + if(line[0] == 'PING' && line[1] != null && line[1] != '') { resp = resp.format(line.slice(1).join(' ')); - } else if(line[0] == "CLIENTINFO") { - resp = resp.format("CLIENTINFO PING "+Object.keys(this.conn.extras.ctcps).join(" ")); + } else if(line[0] == 'CLIENTINFO') { + resp = resp.format('CLIENTINFO PING '+Object.keys(this.conn.extras.ctcps).join(' ')); } else if(this.conn.extras.ctcps && this.conn.extras.ctcps[line[0]] != null) { resp = resp.format(this.conn.extras.ctcps[line[0]](data, this.conn)); } else { @@ -104,15 +95,15 @@ class IRCConnectionHandler { } if (resp != null) - this.conn.write("NOTICE {0} :{1}".format(data.user.nickname, resp)); + this.conn.write('NOTICE {0} :{1}'.format(data.user.nickname, resp)); return resp != null; } handleServerLine(line) { - if(this.conn.queue["supportsmsg"] && line.command != "005") { + if(this.conn.queue['supportsmsg'] && line.command != '005') { - delete this.conn.queue["supportsmsg"]; + delete this.conn.queue['supportsmsg']; if(this.conn.config.autojoin.length > 0) for(let t in this.conn.config.autojoin) @@ -128,15 +119,15 @@ class IRCConnectionHandler { let list = null; switch(line.command) { - case "error": - this.conn.emit("connerror", {type: "irc_error", raw: line.raw}); + case 'error': + this.conn.emit('connerror', {type: 'irc_error', raw: line.raw}); break; - case "001": + case '001': this.conn.data.actualServer = line.user.hostname; - break - case "005": - if(!this.conn.queue["supportsmsg"]) - this.conn.queue["supportsmsg"] = true; + break; + case '005': + if(!this.conn.queue['supportsmsg']) + this.conn.queue['supportsmsg'] = true; this.conn.authenticated = true; @@ -163,129 +154,129 @@ class IRCConnectionHandler { } } break; - case "JOIN": + case 'JOIN': if(line.trailing) { - this.conn.emit('pass_to_client', {type: "event_join_channel", user: line.user, channel: line.trailing, server: serverName }); + this.conn.emit('pass_to_client', {type: 'event_join_channel', user: line.user, channel: line.trailing, server: serverName }); } else { for(let i in line.arguments) { - this.conn.emit('pass_to_client', {type: "event_join_channel", user: line.user, channel: line.arguments[i], server: serverName }); + this.conn.emit('pass_to_client', {type: 'event_join_channel', user: line.user, channel: line.arguments[i], server: serverName }); } } break; - case "PART": - this.conn.emit('pass_to_client', {type: "event_part_channel", user: line.user, channel: line.arguments[0], reason: line.trailing, server: serverName }); + case 'PART': + this.conn.emit('pass_to_client', {type: 'event_part_channel', user: line.user, channel: line.arguments[0], reason: line.trailing, server: serverName }); break; - case "QUIT": - this.conn.emit('pass_to_client', {type: "event_quit", user: line.user, reason: line.trailing, server: serverName }); + case 'QUIT': + this.conn.emit('pass_to_client', {type: 'event_quit', user: line.user, reason: line.trailing, server: serverName }); break; - case "353": - if(!this.conn.queue["names"]) + case '353': + if(!this.conn.queue['names']) this.conn.queue['names'] = {}; let splittrail = line.trailing.split(' '); for(let a in splittrail) { let nick = splittrail[a]; - if(nick.trim() == "") continue; - if(this.conn.queue["names"][line.arguments[2]]) - this.conn.queue["names"][line.arguments[2]].push(nick); + if(nick.trim() == '') continue; + if(this.conn.queue['names'][line.arguments[2]]) + this.conn.queue['names'][line.arguments[2]].push(nick); else - this.conn.queue["names"][line.arguments[2]] = [nick]; + this.conn.queue['names'][line.arguments[2]] = [nick]; } break; - case "366": - if(!this.conn.queue["names"]) break; - if(this.conn.queue["names"][line.arguments[1]]) { - this.conn.emit('pass_to_client', {type: "channel_nicks", channel: line.arguments[1], nicks: this.conn.queue["names"][line.arguments[1]], server: serverName}); - delete this.conn.queue["names"][line.arguments[1]]; + case '366': + if(!this.conn.queue['names']) break; + if(this.conn.queue['names'][line.arguments[1]]) { + this.conn.emit('pass_to_client', {type: 'channel_nicks', channel: line.arguments[1], nicks: this.conn.queue['names'][line.arguments[1]], server: serverName}); + delete this.conn.queue['names'][line.arguments[1]]; } - if(Object.keys(this.conn.queue["names"]).length == 0) - delete this.conn.queue["names"]; + if(Object.keys(this.conn.queue['names']).length == 0) + delete this.conn.queue['names']; break; - case "PRIVMSG": + case 'PRIVMSG': if(line.trailing.indexOf('\x01') == 0 && line.trailing.indexOf('\x01ACTION') != 0) return this.ctcpManage(line); - if(line.user.nickname != "") - this.conn.emit('pass_to_client', {type: "message", messageType: "privmsg", to: line.arguments[0], + if(line.user.nickname != '') + this.conn.emit('pass_to_client', {type: 'message', messageType: 'privmsg', to: line.arguments[0], user: line.user, message: line.trailing, server: serverName}); else - this.conn.emit('pass_to_client', {type: "server_message", messageType: "privmsg", message: line.trailing, server: serverName, from: realServerName}); + this.conn.emit('pass_to_client', {type: 'server_message', messageType: 'privmsg', message: line.trailing, server: serverName, from: realServerName}); break; - case "NOTICE": + case 'NOTICE': if(line.trailing.indexOf('\x01') == 0 && line.trailing.indexOf('\x01ACTION') != 0) { - let composethis = line.trailing.replace(/\x01/g,'').trim().split(" "); + let composethis = line.trailing.replace(/\x01/g,'').trim().split(' '); composethis[0] = composethis[0].toUpperCase(); - let message = composethis.join(" "); + let message = composethis.join(' '); if(composethis[0] == 'PING') - message = Math.floor(Date.now()/1000) - composethis[1]+"s"; + message = Math.floor(Date.now()/1000) - composethis[1]+'s'; - this.conn.emit('pass_to_client', {type: "message", messageType: "ctcp_response", to: line.arguments[0], + this.conn.emit('pass_to_client', {type: 'message', messageType: 'ctcp_response', to: line.arguments[0], user: line.user, message: message, server: serverName}); return; } - if(line.user.nickname != "") - this.conn.emit('pass_to_client', {type: "message", messageType: "notice", to: line.arguments[0], + if(line.user.nickname != '') + this.conn.emit('pass_to_client', {type: 'message', messageType: 'notice', to: line.arguments[0], user: line.user, message: line.trailing, server: serverName}); else - this.conn.emit('pass_to_client', {type: "server_message", messageType: "notice", message: line.trailing, server: serverName, from: realServerName}); + this.conn.emit('pass_to_client', {type: 'server_message', messageType: 'notice', message: line.trailing, server: serverName, from: realServerName}); break; - case "NICK": + case 'NICK': if(line.user.nickname == this.conn.config.nickname) this.conn.config.nickname = line.arguments[0]; - this.conn.emit('pass_to_client', {type: "nick_change", nick: line.user.nickname, newNick: line.arguments[0], server: serverName}); + this.conn.emit('pass_to_client', {type: 'nick_change', nick: line.user.nickname, newNick: line.arguments[0], server: serverName}); break; - case "KICK": - this.conn.emit('pass_to_client', {type: "event_kick_channel", user: line.user, channel: line.arguments[0], reason: line.trailing, kickee: line.arguments[1], server: serverName}); + case 'KICK': + this.conn.emit('pass_to_client', {type: 'event_kick_channel', user: line.user, channel: line.arguments[0], reason: line.trailing, kickee: line.arguments[1], server: serverName}); break; - case "TOPIC": - this.conn.emit('pass_to_client', {type: "channel_topic", channel: line.arguments[0], set_by: line.user.nickname, topic: line.trailing, server: serverName}); + case 'TOPIC': + this.conn.emit('pass_to_client', {type: 'channel_topic', channel: line.arguments[0], set_by: line.user.nickname, topic: line.trailing, server: serverName}); break; - case "332": - this.conn.emit('pass_to_client', {type: "channel_topic", channel: line.arguments[1], topic: line.trailing, server: serverName}); + case '332': + this.conn.emit('pass_to_client', {type: 'channel_topic', channel: line.arguments[1], topic: line.trailing, server: serverName}); break; - case "333": - this.conn.emit('pass_to_client', {type: "channel_topic", channel: line.arguments[1], set_by: line.arguments[2], time: line.arguments[3], server: serverName}); + case '333': + this.conn.emit('pass_to_client', {type: 'channel_topic', channel: line.arguments[1], set_by: line.arguments[2], time: line.arguments[3], server: serverName}); break; - case "375": - case "372": - case "376": - this.conn.emit('pass_to_client', {type: "server_message", messageType: "motd", message: line.trailing, server: serverName, from: realServerName}); + case '375': + case '372': + case '376': + this.conn.emit('pass_to_client', {type: 'server_message', messageType: 'motd', message: line.trailing, server: serverName, from: realServerName}); break; - case "006": - case "007": - case "251": - case "255": - case "270": - case "290": - case "292": - case "323": - case "351": - case "381": - this.conn.emit('pass_to_client', {type: "server_message", messageType: "regular", message: line.trailing, server: serverName, from: realServerName}); + case '006': + case '007': + case '251': + case '255': + case '270': + case '290': + case '292': + case '323': + case '351': + case '381': + this.conn.emit('pass_to_client', {type: 'server_message', messageType: 'regular', message: line.trailing, server: serverName, from: realServerName}); break; - case "252": - case "254": - case "396": - case "042": - this.conn.emit('pass_to_client', {type: "server_message", messageType: "regular", message: line.arguments[1] +" "+ line.trailing, server: serverName, from: realServerName}); + case '252': + case '254': + case '396': + case '042': + this.conn.emit('pass_to_client', {type: 'server_message', messageType: 'regular', message: line.arguments[1] +' '+ line.trailing, server: serverName, from: realServerName}); break; - case "501": - case "401": - case "402": - case "421": - case "482": - case "331": - case "432": - this.conn.emit('pass_to_client', {type: "message", to: null, message: line.arguments[1]+': '+line.trailing, - server: serverName, user: {nickname: realServerName}, messageType: "error"}); + case '501': + case '401': + case '402': + case '421': + case '482': + case '331': + case '432': + this.conn.emit('pass_to_client', {type: 'message', to: null, message: line.arguments[1]+': '+line.trailing, + server: serverName, user: {nickname: realServerName}, messageType: 'error'}); break; - case "MODE": + case 'MODE': let isChannelMode = false; let method = '+'; if(line.arguments[0].indexOf('#') != -1) @@ -308,7 +299,7 @@ class IRCConnectionHandler { for(let i in modes) { let mode = modes[i]; if(this.conn.data.supportedModes[mode]) - this.conn.emit('pass_to_client', {type: "mode_"+(method=='+'?'add':'del'), target: line.arguments[0], mode: mode, + this.conn.emit('pass_to_client', {type: 'mode_'+(method=='+'?'add':'del'), target: line.arguments[0], mode: mode, modeTarget: line.arguments[2+parseInt(i)], server: serverName, user: {nickname: sender}}); else pass.push(mode); @@ -318,106 +309,106 @@ class IRCConnectionHandler { } if(pass.length > 0) - this.conn.emit('pass_to_client', {type: "mode", target: line.arguments[0], message: method+pass.join(''), + this.conn.emit('pass_to_client', {type: 'mode', target: line.arguments[0], message: method+pass.join(''), server: serverName, user: {nickname: sender}}); break; - case "433": - let newNick = this.conn.config.nickname + "_"; + case '433': + let newNick = this.conn.config.nickname + '_'; this.conn.write('NICK '+newNick); this.conn.config.nickname = newNick; break; - case "311": + case '311': // start whois queue list = { nickname: line.arguments[1], - hostmask: "{0}!{1}@{2}".format(line.arguments[1], line.arguments[2], line.arguments[3]), - realname: line.trailing || "" + hostmask: '{0}!{1}@{2}'.format(line.arguments[1], line.arguments[2], line.arguments[3]), + realname: line.trailing || '' }; this.whoisManage(line.arguments[1], list); break; - case "319": + case '319': // whois: channels list = { - channels: line.trailing.split(" "), + channels: line.trailing.split(' '), }; this.whoisManage(line.arguments[1], list); break; - case "378": + case '378': list = { connectingFrom: line.trailing, }; this.whoisManage(line.arguments[1], list); break; - case "379": + case '379': list = { usingModes: line.trailing, }; this.whoisManage(line.arguments[1], list); break; - case "312": + case '312': list = { server: line.arguments[2], - server_name: line.trailing || "" - } + server_name: line.trailing || '' + }; this.whoisManage(line.arguments[1], list); break; - case "313": + case '313': list = { title: line.trailing - } + }; this.whoisManage(line.arguments[1], list); break; - case "330": + case '330': list = { loggedIn: line.trailing+' '+line.arguments[2] - } + }; this.whoisManage(line.arguments[1], list); break; - case "335": + case '335': list = { bot: true - } + }; this.whoisManage(line.arguments[1], list); break; - case "307": + case '307': list = { registered: line.trailing - } + }; this.whoisManage(line.arguments[1], list); break; - case "671": + case '671': list = { secure: true - } + }; this.whoisManage(line.arguments[1], list); break; - case "317": + case '317': list = { signonTime: line.arguments[3], idleSeconds: line.arguments[2] - } + }; this.whoisManage(line.arguments[1], list); break; - case "318": + case '318': if(!this.conn.queue.whois || !this.conn.queue.whois[line.arguments[1]]) return; - this.conn.emit('pass_to_client', {type: "whoisResponse", whois: this.conn.queue.whois[line.arguments[1]], + this.conn.emit('pass_to_client', {type: 'whoisResponse', whois: this.conn.queue.whois[line.arguments[1]], server: serverName, from: realServerName}); delete this.conn.queue.whois[line.arguments[1]]; break; - case "321": - this.conn.emit('pass_to_client', {type: "listedchan", channel: "Channel", users: "Users", topic: "Topic", + case '321': + this.conn.emit('pass_to_client', {type: 'listedchan', channel: 'Channel', users: 'Users', topic: 'Topic', server: serverName, from: realServerName}); break; - case "322": - this.conn.emit('pass_to_client', {type: "listedchan", channel: line.arguments[1], users: line.arguments[2], topic: line.trailing, + case '322': + this.conn.emit('pass_to_client', {type: 'listedchan', channel: line.arguments[1], users: line.arguments[2], topic: line.trailing, server: serverName, from: realServerName}); break; - case "CAP": + case 'CAP': // might come in the future, who knows - this.conn.write("CAP END"); + this.conn.write('CAP END'); break; } } @@ -430,15 +421,15 @@ class IRCConnection extends EventEmitter { this.globalConfig = globalConfig; this.extras = extras || { authenticationSteps: [], ctcps: {} }; this.config = { - nickname: "teemant", + nickname: 'teemant', username: globalConfig.username, realname: globalConfig.realname, - server: "localhost", + server: 'localhost', port: 6667, autojoin: [], secure: globalConfig.secure_by_default, - password: "", - address: "0.0.0.0", + password: '', + address: '0.0.0.0', rejectUnauthorized: globalConfig.rejectUnauthorizedCertificates }; @@ -464,7 +455,7 @@ class IRCConnection extends EventEmitter { } on(...args) { - return super.on(...args) + return super.on(...args); } emit(...args) { @@ -482,19 +473,19 @@ class IRCConnection extends EventEmitter { this.socket.setTimeout(this.globalConfig.timeout); this.socket.on('error', (data) => { - this.emit('connerror', {type: "sock_error", message: "A socket error occured.", raw: data}); + this.emit('connerror', {type: 'sock_error', message: 'A socket error occured.', raw: data}); }); this.socket.on('lookup', (err, address, family, host) => { if(err) { - this.emit('connerror', {type: "resolve_error", message: "Failed to resolve host."}); + this.emit('connerror', {type: 'resolve_error', message: 'Failed to resolve host.'}); } else { this.emit('lookup', {address: address, family: address, host: host}); this.config.address = address; } }); - let buffer = ""; + let buffer = ''; this.socket.on('data', (chunk) => { buffer += chunk; let data = buffer.split('\r\n'); @@ -502,7 +493,7 @@ class IRCConnection extends EventEmitter { data.forEach((line) => { if(line.indexOf('PING') === 0) { this.socket.write('PONG'+line.substring(4)+'\r\n'); - return + return; } this.emit('raw', line); let parsed = parse(line); @@ -513,11 +504,11 @@ class IRCConnection extends EventEmitter { this.socket.on('close', (data) => { if(!this.queue['close']) - this.emit('closed', {type: "sock_closed", raw: data, message: "Connection closed."}); + this.emit('closed', {type: 'sock_closed', raw: data, message: 'Connection closed.'}); this.connected = false; this.authenticated = false; - }) + }); } authenticate() { @@ -537,7 +528,7 @@ class IRCConnection extends EventEmitter { disconnect(message) { if(!this.connected) { - this.emit('connerror', {type: "sock_closed", message: "Connection already closed."}); + this.emit('connerror', {type: 'sock_closed', message: 'Connection already closed.'}); return; } @@ -547,7 +538,7 @@ class IRCConnection extends EventEmitter { write(message) { if(!this.connected) { - this.emit('connerror', {type: "sock_closed", message: "Connection is closed."}); + this.emit('connerror', {type: 'sock_closed', message: 'Connection is closed.'}); return; } this.socket.write(message+'\r\n'); diff --git a/server/teemant_irc/parser.js b/server/teemant_irc/parser.js index 827e5d4..5dd528c 100644 --- a/server/teemant_irc/parser.js +++ b/server/teemant_irc/parser.js @@ -5,14 +5,14 @@ function parseERROR(line) { let final = { - user: { nickname: "", username: "", hostname: "" }, - command: "ERROR", - message: "", - raw: line.join(" ") - } + user: { nickname: '', username: '', hostname: '' }, + command: 'ERROR', + message: '', + raw: line.join(' ') + }; - let pass1 = line.slice(1).join(" "); - if(pass1.indexOf(":") == 0) + let pass1 = line.slice(1).join(' '); + if(pass1.indexOf(':') == 0) pass1 = pass1.substring(1); final.message = pass1; @@ -23,21 +23,21 @@ function parseERROR(line) { module.exports = function(rawline) { let final = { user: { - nickname: "", - username: "", - hostname: "" + nickname: '', + username: '', + hostname: '' }, - command: "", + command: '', arguments: [], - trailing: "", + trailing: '', raw: rawline - } + }; - let pass1 = (rawline.indexOf(':') == 0 ? rawline.substring(1).split(" ") : rawline.split(" ")); - if (pass1[0] === "ERROR") + let pass1 = (rawline.indexOf(':') == 0 ? rawline.substring(1).split(' ') : rawline.split(' ')); + if (pass1[0] === 'ERROR') return parseERROR(pass1); - if(pass1[0].indexOf("!") != -1) { + if(pass1[0].indexOf('!') != -1) { let nickuser = pass1[0].split('!'); final.user.nickname = nickuser[0]; let userhost = nickuser[1].split('@'); @@ -49,13 +49,13 @@ module.exports = function(rawline) { final.command = pass1[1]; - let pass2 = pass1.slice(2).join(" "); - if(pass2.indexOf(":") != -1) { - final.arguments = pass2.substring(0, pass2.indexOf(' :')).split(" "); + let pass2 = pass1.slice(2).join(' '); + if(pass2.indexOf(':') != -1) { + final.arguments = pass2.substring(0, pass2.indexOf(' :')).split(' '); final.trailing = pass2.substring(pass2.indexOf(':')+1); } else { - final.arguments = pass2.split(" "); + final.arguments = pass2.split(' '); } return final; -} +}; diff --git a/server/webirc.js b/server/webirc.js index 4060474..15948af 100644 --- a/server/webirc.js +++ b/server/webirc.js @@ -1,9 +1,9 @@ -const dns = require("dns"), - fs = require("fs"), - path = require("path"), - config = require(__dirname+'/config'), - logger = require(__dirname+'/logger'), - webirc_data_path = path.resolve(__dirname+'/../webirc.data.json'); +const dns = require('dns'); +const fs = require('fs'); +const path = require('path'); +const config = require(__dirname+'/config'); +const logger = require(__dirname+'/logger'); +const webirc_data_path = path.resolve(__dirname+'/../webirc.data.json'); let webirc_data = {}; let timeouts = {}; @@ -16,11 +16,11 @@ function timeoutRefresh(address, seconds) { if(timeouts[address]) clearTimeout(timeouts[address]); - timeouts[address] = setTimeout(()=>{resolveAddress(address)}, seconds*1000); + timeouts[address] = setTimeout(()=>{resolveAddress(address);}, seconds*1000); } function resolveAddress(address, force) { - logger.debugLog("** WEBIRC ** Attempting to update IP for "+address); + logger.debugLog('** WEBIRC ** Attempting to update IP for '+address); let obj = webirc_data[address]; if(!obj) return; @@ -28,7 +28,7 @@ function resolveAddress(address, force) { if((Date.now() - obj.last_update)/1000 < config.webirc.resolveInterval && !force) { let nextTime = (config.webirc.resolveInterval - (Date.now() - obj.last_update)/1000); - logger.debugLog("** WEBIRC ** "+address+" IP is "+obj.cached_ip+", refresh in "+nextTime+" seconds"); + logger.debugLog('** WEBIRC ** {0} IP is {1}, refresh in {2} seconds'.format(address, obj.cached_ip, Math.floor(nextTime))); return timeoutRefresh(address, nextTime); } @@ -40,11 +40,11 @@ function resolveAddress(address, force) { if(ip) { resolve(ip); } else { - reject(new Error("no ips")); + reject(new Error('no ips')); } }); }).then((data) => { - logger.debugLog("** WEBIRC ** Updated DNS for "+address+"; IP is now "+data); + logger.debugLog('** WEBIRC ** Updated DNS for {0}; IP is now {1}'.format(address, data)); webirc_data[address].last_update = Date.now(); webirc_data[address].cached_ip = data; @@ -52,7 +52,7 @@ function resolveAddress(address, force) { writeToFile(); timeoutRefresh(address, config.webirc.resolveInterval); }, (err) => { - logger.debugLog("** WEBIRC ** Failed to updated DNS for "+address+"; IP is still "+webirc_data[address].cached_ip); + logger.debugLog('** WEBIRC ** Failed to updated DNS for {0}; IP is still {1}'.format(address, webirc_data[address].cached_ip)); timeoutRefresh(address, (config.webirc.resolveInterval+60)); }); @@ -96,8 +96,8 @@ class WebIRCAuthenticator { authenticate(connection) { let serverpass = get_password(connection.config.address); if(serverpass) - connection.socket.write('WEBIRC '+serverpass.password+' '+connection.config.username+ - ' '+this.userInfo.hostname+' '+this.userInfo.ipaddr+'\r\n'); + connection.socket.write('WEBIRC {0} {1} {2} {3}\r\n'.format(serverpass.password, connection.config.username, + this.userInfo.hostname, this.userInfo.ipaddr)); } } @@ -109,7 +109,7 @@ module.exports = { }; process.on('SIGUSR1', () => { - logger.log("\n!!! Received SIGUSR1; Reloading webirc data.. !!!\n"); + logger.log('\n!!! Received SIGUSR1; Reloading webirc data.. !!!\n'); reload(true); }); diff --git a/public/index.html b/src/document/index.html similarity index 92% rename from public/index.html rename to src/document/index.html index bbccfb8..153cdbd 100644 --- a/public/index.html +++ b/src/document/index.html @@ -9,13 +9,11 @@ - - - + - - + + diff --git a/public/js/colorparser.js b/src/script/colorparser.js similarity index 58% rename from public/js/colorparser.js rename to src/script/colorparser.js index 40b0047..f2c9706 100644 --- a/public/js/colorparser.js +++ b/src/script/colorparser.js @@ -2,33 +2,35 @@ // Lol, I just gave credit, didn't I.. // Dammit, well, there's that. -let styleCheck_Re = /[\x00-\x1F]/, back_re = /^(\d{1,2})(,(\d{1,2}))?/, - colourKey = "\x03", colour_re = /\x03/g, - styleBreak = "\x0F"; // breaks all open styles ^O (\x0F) +const styleCheck_Re = /[\x00-\x1F]/; +const back_re = /^(\d{1,2})(,(\d{1,2}))?/; +const colourKey = '\x03'; +const colour_re = /\x03/g; +const styleBreak = '\x0F'; // breaks all open styles ^O (\x0F) let styles = [ - ["normal", "\x00", ""], ["underline", "\x1F"], - ["bold", "\x02"], ["italic", "\x1D"] + ['normal', '\x00', ''], ['underline', '\x1F'], + ['bold', '\x02'], ['italic', '\x1D'] ].map(function(style) { - var escaped = encodeURI(style[1]).replace("%", "\\x"); + var escaped = encodeURI(style[1]).replace('%', '\\x'); return { name: style[0], - style: style[2] != null ? style[2] : "irc-" + style[0], + style: style[2] != null ? style[2] : 'irc-' + style[0], key: style[1], - keyregex: new RegExp(escaped + "(.*?)(" + escaped + "|$)") + keyregex: new RegExp(escaped + '(.*?)(' + escaped + '|$)') }; }); //http://www.mirc.com/colors.html let colors = [ - "white", "black", "navy", "green", "red", "brown", - "purple", "olive", "yellow", "lightgreen", "teal", - "cyan", "blue", "pink", "gray", "lightgrey" + 'white', 'black', 'navy', 'green', 'red', 'brown', + 'purple', 'olive', 'yellow', 'lightgreen', 'teal', + 'cyan', 'blue', 'pink', 'gray', 'lightgrey' ].reduce(function(memo, name, index) { memo[index] = { name: name, - fore: "irc-fg" + index, - back: "irc-bg" + index, + fore: 'irc-fg' + index, + back: 'irc-bg' + index, key: index }; return memo; @@ -40,29 +42,29 @@ function stylize(line) { // split up by the irc style break character ^O if (line.indexOf(styleBreak) >= 0) { - return line.split(styleBreak).map(stylize).join(""); + return line.split(styleBreak).map(stylize).join(''); } var result = line; var parseArr = result.split(colourKey); - var text, match, colour, background = ""; + var text, match, colour, background = ''; for (var i = 0; i < parseArr.length; i++) { text = parseArr[i]; match = text.match(back_re); colour = match && colors[+match[1]]; if (!match || !colour) { // ^C (no colour) ending. Escape current colour and carry on - background = ""; + background = ''; continue; } // set the background colour // we don't overide the background local var to support nesting if (colors[+match[3]]) { - background = " " + colors[+match[3]].back; + background = ' ' + colors[+match[3]].back; } // update the parsed text result result = result.replace(colourKey + text, - "{1}".format(colour.fore + background, text.slice(match[0].length))); + '{1}'.format(colour.fore + background, text.slice(match[0].length))); } // Matching styles (italics/bold/underline) @@ -70,12 +72,12 @@ function stylize(line) { styles.forEach(function(style) { if (result.indexOf(style.key) < 0) return; result = result.replace(style.keyregex, function(match, text) { - return "{1}".format(style.style, text) + return '{1}'.format(style.style, text); }); }); //replace the reminent colour terminations and be done with it - return result.replace(colour_re, ""); + return result.replace(colour_re, ''); } -window.colorizer.stylize = stylize; +module.exports = stylize; diff --git a/public/js/main.js b/src/script/main.js similarity index 63% rename from public/js/main.js rename to src/script/main.js index 0a6293e..6cfcde0 100644 --- a/public/js/main.js +++ b/src/script/main.js @@ -1,3 +1,6 @@ +const themes = require('./theme.js'); +const stylize = require('./colorparser.js'); + window.irc = { socketUp: false, primaryFrame: null, @@ -5,24 +8,24 @@ window.irc = { colors: true, sharedInput: false, timestamps: true, - timestampFormat: "HH:mm:ss", + timestampFormat: 'HH:mm:ss', colorNicknames: true, colorNicklist: false, scrollOnResize: true, scrollOnFocus: true, - theme: "default" + theme: 'default' }, serverData: {}, serverChatQueue: {}, - chatType: "simple", - documentTitle: "TeemantIRC", + chatType: 'simple', + documentTitle: 'TeemantIRC', }; -window.clientdom = {connector: {}, settings: {}}; +const clientdom = {connector: {}, settings: {}}; -window.colorizer = { +const colorizer = { get_random_color: function(nickname) { - let themefunc = window.themes.available[irc.config.theme].nick_pallete; + let themefunc = themes.available[irc.config.theme].nick_pallete; Math.seedrandom(nickname); let h = rand(themefunc.H[0], themefunc.H[1]); @@ -33,7 +36,7 @@ window.colorizer = { strip: function(message) { return message.replace(/(\x03\d{0,2}(,\d{0,2})?)/g, '').replace(/[\x0F\x02\x16\x1F]/g, ''); } -} +}; let urlParams = {}; @@ -43,9 +46,9 @@ let urlParams = {}; |** **| \*********************/ -window.validators = {}; +const validators = {}; -window.validators.iporhost = function(str) { +validators.iporhost = function(str) { let valid = false; if(str.match(/^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/i)) { @@ -55,94 +58,94 @@ window.validators.iporhost = function(str) { } return valid; -} +}; -window.validators.nickname = function(str) { +validators.nickname = function(str) { if(str.match(/[a-z_\-\[\]\\^{}|`][a-z0-9_\-\[\]\\^{}|`]*/i)) { return true; } return false; -} +}; -window.validators.escapeHTML = function(str) { +validators.escapeHTML = function(str) { return str.replace(/\/, '>'); -} +}; Date.prototype.format = function (format, utc){ var date = this; - var MMMM = ["\x00", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; - var MMM = ["\x01", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; - var dddd = ["\x02", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; - var ddd = ["\x03", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; - function ii(i, len) { var s = i + ""; len = len || 2; while (s.length < len) s = "0" + s; return s; } + var MMMM = ['\x00', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; + var MMM = ['\x01', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; + var dddd = ['\x02', 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; + var ddd = ['\x03', 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; + function ii(i, len) { var s = i + ''; len = len || 2; while (s.length < len) s = '0' + s; return s; } var y = utc ? date.getUTCFullYear() : date.getFullYear(); - format = format.replace(/(^|[^\\])yyyy+/g, "$1" + y); - format = format.replace(/(^|[^\\])yy/g, "$1" + y.toString().substr(2, 2)); - format = format.replace(/(^|[^\\])y/g, "$1" + y); + format = format.replace(/(^|[^\\])yyyy+/g, '$1' + y); + format = format.replace(/(^|[^\\])yy/g, '$1' + y.toString().substr(2, 2)); + format = format.replace(/(^|[^\\])y/g, '$1' + y); var M = (utc ? date.getUTCMonth() : date.getMonth()) + 1; - format = format.replace(/(^|[^\\])MMMM+/g, "$1" + MMMM[0]); - format = format.replace(/(^|[^\\])MMM/g, "$1" + MMM[0]); - format = format.replace(/(^|[^\\])MM/g, "$1" + ii(M)); - format = format.replace(/(^|[^\\])M/g, "$1" + M); + format = format.replace(/(^|[^\\])MMMM+/g, '$1' + MMMM[0]); + format = format.replace(/(^|[^\\])MMM/g, '$1' + MMM[0]); + format = format.replace(/(^|[^\\])MM/g, '$1' + ii(M)); + format = format.replace(/(^|[^\\])M/g, '$1' + M); var d = utc ? date.getUTCDate() : date.getDate(); - format = format.replace(/(^|[^\\])dddd+/g, "$1" + dddd[0]); - format = format.replace(/(^|[^\\])ddd/g, "$1" + ddd[0]); - format = format.replace(/(^|[^\\])dd/g, "$1" + ii(d)); - format = format.replace(/(^|[^\\])d/g, "$1" + d); + format = format.replace(/(^|[^\\])dddd+/g, '$1' + dddd[0]); + format = format.replace(/(^|[^\\])ddd/g, '$1' + ddd[0]); + format = format.replace(/(^|[^\\])dd/g, '$1' + ii(d)); + format = format.replace(/(^|[^\\])d/g, '$1' + d); var H = utc ? date.getUTCHours() : date.getHours(); - format = format.replace(/(^|[^\\])HH+/g, "$1" + ii(H)); - format = format.replace(/(^|[^\\])H/g, "$1" + H); + format = format.replace(/(^|[^\\])HH+/g, '$1' + ii(H)); + format = format.replace(/(^|[^\\])H/g, '$1' + H); var h = H > 12 ? H - 12 : H == 0 ? 12 : H; - format = format.replace(/(^|[^\\])hh+/g, "$1" + ii(h)); - format = format.replace(/(^|[^\\])h/g, "$1" + h); + format = format.replace(/(^|[^\\])hh+/g, '$1' + ii(h)); + format = format.replace(/(^|[^\\])h/g, '$1' + h); var m = utc ? date.getUTCMinutes() : date.getMinutes(); - format = format.replace(/(^|[^\\])mm+/g, "$1" + ii(m)); - format = format.replace(/(^|[^\\])m/g, "$1" + m); + format = format.replace(/(^|[^\\])mm+/g, '$1' + ii(m)); + format = format.replace(/(^|[^\\])m/g, '$1' + m); var s = utc ? date.getUTCSeconds() : date.getSeconds(); - format = format.replace(/(^|[^\\])ss+/g, "$1" + ii(s)); - format = format.replace(/(^|[^\\])s/g, "$1" + s); + format = format.replace(/(^|[^\\])ss+/g, '$1' + ii(s)); + format = format.replace(/(^|[^\\])s/g, '$1' + s); var f = utc ? date.getUTCMilliseconds() : date.getMilliseconds(); - format = format.replace(/(^|[^\\])fff+/g, "$1" + ii(f, 3)); + format = format.replace(/(^|[^\\])fff+/g, '$1' + ii(f, 3)); f = Math.round(f / 10); - format = format.replace(/(^|[^\\])ff/g, "$1" + ii(f)); + format = format.replace(/(^|[^\\])ff/g, '$1' + ii(f)); f = Math.round(f / 10); - format = format.replace(/(^|[^\\])f/g, "$1" + f); + format = format.replace(/(^|[^\\])f/g, '$1' + f); - var T = H < 12 ? "AM" : "PM"; - format = format.replace(/(^|[^\\])TT+/g, "$1" + T); - format = format.replace(/(^|[^\\])T/g, "$1" + T.charAt(0)); + var T = H < 12 ? 'AM' : 'PM'; + format = format.replace(/(^|[^\\])TT+/g, '$1' + T); + format = format.replace(/(^|[^\\])T/g, '$1' + T.charAt(0)); var t = T.toLowerCase(); - format = format.replace(/(^|[^\\])tt+/g, "$1" + t); - format = format.replace(/(^|[^\\])t/g, "$1" + t.charAt(0)); + format = format.replace(/(^|[^\\])tt+/g, '$1' + t); + format = format.replace(/(^|[^\\])t/g, '$1' + t.charAt(0)); var tz = -date.getTimezoneOffset(); - var K = utc || !tz ? "Z" : tz > 0 ? "+" : "-"; + var K = utc || !tz ? 'Z' : tz > 0 ? '+' : '-'; if (!utc) { tz = Math.abs(tz); var tzHrs = Math.floor(tz / 60); var tzMin = tz % 60; - K += ii(tzHrs) + ":" + ii(tzMin); + K += ii(tzHrs) + ':' + ii(tzMin); } - format = format.replace(/(^|[^\\])K/g, "$1" + K); + format = format.replace(/(^|[^\\])K/g, '$1' + K); var day = (utc ? date.getUTCDay() : date.getDay()) + 1; - format = format.replace(new RegExp(dddd[0], "g"), dddd[day]); - format = format.replace(new RegExp(ddd[0], "g"), ddd[day]); + format = format.replace(new RegExp(dddd[0], 'g'), dddd[day]); + format = format.replace(new RegExp(ddd[0], 'g'), ddd[day]); - format = format.replace(new RegExp(MMMM[0], "g"), MMMM[M]); - format = format.replace(new RegExp(MMM[0], "g"), MMM[M]); + format = format.replace(new RegExp(MMMM[0], 'g'), MMMM[M]); + format = format.replace(new RegExp(MMM[0], 'g'), MMM[M]); - format = format.replace(/\\(.)/g, "$1"); + format = format.replace(/\\(.)/g, '$1'); return format; }; @@ -151,43 +154,43 @@ function whoisMessage(whoisData, buffer) { let messages = []; for(let key in whoisData) { switch(key) { - case "hostmask": - messages.push(""+whoisData[key]+": "+validators.escapeHTML(whoisData['realname'])); + case 'hostmask': + messages.push(''+whoisData[key]+': '+validators.escapeHTML(whoisData['realname'])); break; - case "idleSeconds": - let msgs = "is idle for "+whoisData[key]+" seconds"; + case 'idleSeconds': + let msgs = 'is idle for '+whoisData[key]+' seconds'; if(whoisData['signonTime']) - msgs += ", signed on at "+new Date(parseInt(whoisData['signonTime'])*1000); + msgs += ', signed on at '+new Date(parseInt(whoisData['signonTime'])*1000); messages.push(msgs); break; - case "loggedIn": - case "registered": - case "connectingFrom": - case "usingModes": - case "title": + case 'loggedIn': + case 'registered': + case 'connectingFrom': + case 'usingModes': + case 'title': messages.push(validators.escapeHTML(whoisData[key])); break; - case "channels": - messages.push(whoisData[key].join(" ")); + case 'channels': + messages.push(whoisData[key].join(' ')); break; - case "server": - let adfd = "is on "+whoisData[key]+""; + case 'server': + let adfd = 'is on '+whoisData[key]+''; if(whoisData['server_name']) - adfd += " "+validators.escapeHTML(whoisData['server_name'])+""; + adfd += ' '+validators.escapeHTML(whoisData['server_name'])+''; messages.push(adfd); break; - case "secure": - messages.push("is using a secure connection."); + case 'secure': + messages.push('is using a secure connection.'); break; - case "bot": - messages.push("is a bot on "+irc.serverData[buffer.server].network); + case 'bot': + messages.push('is a bot on '+irc.serverData[buffer.server].network); break; } } for(let i in messages) { - let mesg = "["+whoisData.nickname+"] "+messages[i]; - buffer.addMessage(mesg, null, "whois"); + let mesg = '['+whoisData.nickname+'] '+messages[i]; + buffer.addMessage(mesg, null, 'whois'); } } @@ -238,7 +241,7 @@ function match(word, array) { function linkify(text) { // see http://daringfireball.net/2010/07/improved_regex_for_matching_urls - let re = /\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/gi; + let re = /\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:''.,<>?«»“”‘’]))/gi; let parsed = text.replace(re, function(url) { // turn into a link let href = url; @@ -254,32 +257,32 @@ function serialize(obj) { let str = []; for(let p in obj) if (obj.hasOwnProperty(p)) { - str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])); + str.push(encodeURIComponent(p) + '=' + encodeURIComponent(obj[p])); } - return str.join("&"); + return str.join('&'); } function removeClass(element, cl) { - let classList = element.className.split(" "); + let classList = element.className.split(' '); if(classList.indexOf(cl) != -1) classList.splice(classList.indexOf(cl), 1); - element.className = classList.join(" "); + element.className = classList.join(' '); } function addClass(element, cl) { - let classList = element.className.split(" "); + let classList = element.className.split(' '); if(classList.indexOf(cl) != -1) return; classList.push(cl); - element.className = classList.join(" "); + element.className = classList.join(' '); } function toggleClass(element, cl) { - let classList = element.className.split(" "); + let classList = element.className.split(' '); if(classList.indexOf(cl) != -1) removeClass(element, cl); else @@ -299,51 +302,51 @@ let composer = { message: { simple: function(time, sender, message, type) { let element = document.createElement('div'); - element.className = "message type_simple m_"+type; + element.className = 'message type_simple m_'+type; if(irc.config.timestamps) - element.innerHTML += ""+time.format(irc.config.timestampFormat)+" "; + element.innerHTML += ''+time.format(irc.config.timestampFormat)+' '; if(irc.config.colors) - message = colorizer.stylize(message); + message = stylize(message); else message = colorizer.strip(message); message = linkify(message); switch(type) { - case "mode": - element.innerHTML += " "+sender+" "; - element.innerHTML += ""+message+""; + case 'mode': + element.innerHTML += ' '+sender+' '; + element.innerHTML += ''+message+''; break; - case "action": - element.innerHTML += " "+sender+" "; - element.innerHTML += ""+message+""; + case 'action': + element.innerHTML += ' '+sender+' '; + element.innerHTML += ''+message+''; break; - case "part": - case "quit": - case "kick": - element.innerHTML += " "+sender+""; - element.innerHTML += " "+message+""; + case 'part': + case 'quit': + case 'kick': + element.innerHTML += ' '+sender+''; + element.innerHTML += ' '+message+''; break; - case "join": - element.innerHTML += " "+sender+""; - element.innerHTML += " "+message+""; + case 'join': + element.innerHTML += ' '+sender+''; + element.innerHTML += ' '+message+''; break; - case "ctcp_response": - element.innerHTML += " CTCP response from "+sender+" "; - element.innerHTML += ""+message+""; + case 'ctcp_response': + element.innerHTML += ' CTCP response from '+sender+' '; + element.innerHTML += ''+message+''; break; - case "ctcp_request": - element.innerHTML += " CTCP request to "+sender+" "; - element.innerHTML += ""+message+""; + case 'ctcp_request': + element.innerHTML += ' CTCP request to '+sender+' '; + element.innerHTML += ''+message+''; break; default: if(sender) { - element.innerHTML += ""+sender+" "+message+""; + element.innerHTML += ''+sender+' '+message+''; } else { - element.innerHTML += ""+message+""; - addClass(element, "no_sender"); + element.innerHTML += ''+message+''; + addClass(element, 'no_sender'); } break; } @@ -366,15 +369,15 @@ let composer = { }, theme_selection: function(name, theme) { let btn = document.createElement('div'); - btn.className = "theme_button theme_"+theme.type; + btn.className = 'theme_button theme_'+theme.type; let sampler = document.createElement('div'); - sampler.className = "sampler"; + sampler.className = 'sampler'; sampler.style['background-color'] = theme.colorSamples.background; let toolbar = document.createElement('span'); - toolbar.className = "s_toolbar"; + toolbar.className = 's_toolbar'; toolbar.style['background-color'] = theme.colorSamples.toolbar; let nameb = document.createElement('span'); - nameb.className = "name"; + nameb.className = 'name'; nameb.innerHTML = theme['name']; sampler.appendChild(toolbar); btn.appendChild(sampler); @@ -384,12 +387,12 @@ let composer = { return btn; }, embedURL: function(server, port, defaultNick, useSSL, hideServerData, channels) { - let builder = window.location.origin + "/"; + let builder = window.location.origin + '/'; let params = {}; let final_channels = []; if(server) - builder += server + "/"; + builder += server + '/'; if(channels) channels = channels.trim(); @@ -407,16 +410,16 @@ let composer = { params.server_data = 0; if(Object.keys(params).length > 0) - builder += "?" + serialize(params); + builder += '?' + serialize(params); if(channels) { - if(channels.indexOf(",")) { + if(channels.indexOf(',')) { let tmp = channels.split(','); for(let i in tmp) { tmp[i] = tmp[i].trim(); if(tmp[i].indexOf('#') != 0) - tmp[i] = "#"+tmp[i]; + tmp[i] = '#'+tmp[i]; final_channels.push(tmp[i]); } @@ -431,7 +434,7 @@ let composer = { return builder; } -} +}; /*****************************\ |** **| @@ -439,95 +442,95 @@ let composer = { |** **| \*****************************/ -// commandName: {execute: function(buffer, handler, command, message, listargs) {}, description: ""} +// commandName: {execute: function(buffer, handler, command, message, listargs) {}, description: ''} let commands = { embed: {execute: function(buffer, handler, command, message, listargs) { let data = irc.auther.getDataFromForm(); - let url = "Couldn't compose URL!"; + let url = 'Couldn\'t compose URL!'; if(data) url = composer.embedURL(data.server, data.port, data.nickname, data.secure, true, data.autojoin.join(',')); - buffer.addMessage(url, null, "help"); - }, description: "- Embed URL for the current connection"}, + buffer.addMessage(url, null, 'help'); + }, description: '- Embed URL for the current connection'}, join: {execute: function(buffer, handler, command, message, listargs) { if (!listargs[1]) { if(!buffer.alive) { - irc.socket.emit("userinput", {command: "join", server: buffer.server, message: "", arguments: [buffer.name]}); + irc.socket.emit('userinput', {command: 'join', server: buffer.server, message: '', arguments: [buffer.name]}); } else { handler.commandError(buffer, listargs[0].toUpperCase()+': Missing parameters!'); } } else { - irc.socket.emit("userinput", {command: "join", server: buffer.server, message: "", arguments: [listargs[1]]}); + irc.socket.emit('userinput', {command: 'join', server: buffer.server, message: '', arguments: [listargs[1]]}); } - }, description: " - Join a channel"}, + }, description: ' - Join a channel'}, part: {execute: function(buffer, handler, command, message, listargs) { - if (!listargs[1] && buffer.type == "channel") { - irc.socket.emit("userinput", {command: "part", server: buffer.server, message: "", arguments: [buffer.name]}); - } else if(buffer.type != "channel") { + if (!listargs[1] && buffer.type == 'channel') { + irc.socket.emit('userinput', {command: 'part', server: buffer.server, message: '', arguments: [buffer.name]}); + } else if(buffer.type != 'channel') { handler.commandError(buffer, listargs[0].toUpperCase()+': Buffer is not a channel.'); } else if(listargs[1]) { if(listargs[1].indexOf('#') != -1) { - let msg = ""; + let msg = ''; if(listargs[2]) - msg = listargs.slice(2).join(" "); - irc.socket.emit("userinput", {command: "part", server: buffer.server, message: msg, arguments: [listargs[1]]}); + msg = listargs.slice(2).join(' '); + irc.socket.emit('userinput', {command: 'part', server: buffer.server, message: msg, arguments: [listargs[1]]}); } else { - if(buffer.type == "channel") { - irc.socket.emit("userinput", {command: "part", server: buffer.server, message: listargs.slice(1).join(" "), arguments: [buffer.name]}); + if(buffer.type == 'channel') { + irc.socket.emit('userinput', {command: 'part', server: buffer.server, message: listargs.slice(1).join(' '), arguments: [buffer.name]}); } else { handler.commandError(buffer, listargs[0].toUpperCase()+': Buffer is not a channel.'); } } } - }, description: "[<#channel>|] [message] - Leave the channel. If no channel specified, leave the current buffer.", aliases: ['leave']}, + }, description: '[<#channel>|] [message] - Leave the channel. If no channel specified, leave the current buffer.', aliases: ['leave']}, topic: {execute: function(buffer, handler, command, message, listargs) { - if (!listargs[1] && buffer.type == "channel") { - irc.socket.emit("userinput", {command: "topic", server: buffer.server, message: "", arguments: [buffer.name]}); - } else if(buffer.type != "channel") { + if (!listargs[1] && buffer.type == 'channel') { + irc.socket.emit('userinput', {command: 'topic', server: buffer.server, message: '', arguments: [buffer.name]}); + } else if(buffer.type != 'channel') { handler.commandError(buffer, listargs[0].toUpperCase()+': Buffer is not a channel.'); } else if(listargs[1]) { if(listargs[1].indexOf('#') != -1) { - let msg = ""; + let msg = ''; if(listargs[2]) - msg = listargs.slice(2).join(" "); - irc.socket.emit("userinput", {command: "topic", server: buffer.server, message: msg, arguments: [listargs[1]]}); + msg = listargs.slice(2).join(' '); + irc.socket.emit('userinput', {command: 'topic', server: buffer.server, message: msg, arguments: [listargs[1]]}); } else { - if(buffer.type == "channel") { - irc.socket.emit("userinput", {command: "topic", server: buffer.server, message: listargs.slice(1).join(" "), arguments: [buffer.name]}); + if(buffer.type == 'channel') { + irc.socket.emit('userinput', {command: 'topic', server: buffer.server, message: listargs.slice(1).join(' '), arguments: [buffer.name]}); } else { handler.commandError(buffer, listargs[0].toUpperCase()+': Buffer is not a channel.'); } } } - }, description: "[<#channel>|] [topic] - Sets/prints the current topic of the channel.", aliases: ['t']}, + }, description: '[<#channel>|] [topic] - Sets/prints the current topic of the channel.', aliases: ['t']}, kick: {execute: function(buffer, handler, command, message, listargs) { - if(buffer.type != "channel") + if(buffer.type != 'channel') return handler.commandError(buffer, listargs[0].toUpperCase()+': Buffer is not a channel!'); if(!listargs[1]) return handler.commandError(buffer, listargs[0].toUpperCase()+': Missing parameter !'); - irc.socket.emit("userinput", {command: "kick", server: buffer.server, message: listargs.slice(2).join(" "), arguments: [buffer.name, listargs[1]]}); - }, description: " - Kick the following user from the channel."}, + irc.socket.emit('userinput', {command: 'kick', server: buffer.server, message: listargs.slice(2).join(' '), arguments: [buffer.name, listargs[1]]}); + }, description: ' - Kick the following user from the channel.'}, quit: {execute: function(buffer, handler, command, message, listargs) { - irc.socket.emit("userinput", {command: "quit", server: buffer.server, message: listargs.slice(1).join(" "), arguments: []}); - }, description: "[] - Quit the current server with message.", aliases: ['exit']}, + irc.socket.emit('userinput', {command: 'quit', server: buffer.server, message: listargs.slice(1).join(' '), arguments: []}); + }, description: '[] - Quit the current server with message.', aliases: ['exit']}, mode: {execute: function(buffer, handler, command, message, listargs) { - irc.socket.emit("userinput", {command: "mode", server: buffer.server, message: listargs.slice(1).join(" "), arguments: []}); - }, description: "[target] [mode] - Set/remove mode of target."}, + irc.socket.emit('userinput', {command: 'mode', server: buffer.server, message: listargs.slice(1).join(' '), arguments: []}); + }, description: '[target] [mode] - Set/remove mode of target.'}, msg: {execute: function(buffer, handler, command, message, listargs) { if(!listargs[1] || !listargs[2]) return handler.commandError(buffer, listargs[0].toUpperCase()+': Missing parameters!'); if(listargs[1] == '*') listargs[1] = buffer.name; - irc.socket.emit("userinput", {command: "privmsg", server: buffer.server, message: listargs.slice(2).join(" "), arguments: [listargs[1]]}); - }, description: " - Sends a message to target.", aliases: ['privmsg', 'q', 'query', 'say']}, + irc.socket.emit('userinput', {command: 'privmsg', server: buffer.server, message: listargs.slice(2).join(' '), arguments: [listargs[1]]}); + }, description: ' - Sends a message to target.', aliases: ['privmsg', 'q', 'query', 'say']}, ctcp: {execute: function(buffer, handler, command, message, listargs) { if(!listargs[1] || !listargs[2]) @@ -537,38 +540,38 @@ let commands = { listargs[2] = listargs[2].toUpperCase(); - irc.socket.emit("userinput", {command: "ctcp", server: buffer.server, message: listargs.slice(2).join(" "), arguments: listargs.slice(1)}); - }, description: " [arguments] - Sends a CTCP request to target."}, + irc.socket.emit('userinput', {command: 'ctcp', server: buffer.server, message: listargs.slice(2).join(' '), arguments: listargs.slice(1)}); + }, description: ' [arguments] - Sends a CTCP request to target.'}, notice: {execute: function(buffer, handler, command, message, listargs) { if(!listargs[1] || !listargs[2]) return handler.commandError(buffer, listargs[0].toUpperCase()+': Missing parameters!'); if(listargs[1] == '*') listargs[1] = buffer.name; - irc.socket.emit("userinput", {command: "notice", server: buffer.server, message: listargs.slice(2).join(" "), arguments: [listargs[1]]}); - }, description: " - Sends a NOTICE to target."}, + irc.socket.emit('userinput', {command: 'notice', server: buffer.server, message: listargs.slice(2).join(' '), arguments: [listargs[1]]}); + }, description: ' - Sends a NOTICE to target.'}, action: {execute: function(buffer, handler, command, message, listargs) { - irc.socket.emit("userinput", {command: "privmsg", server: buffer.server, message: "\x01ACTION "+message.substring(command.length+2)+"\x01", arguments: [buffer.name]}); - }, description: " - 'act' as yourself", aliases: ['me']}, + irc.socket.emit('userinput', {command: 'privmsg', server: buffer.server, message: '\x01ACTION '+message.substring(command.length+2)+'\x01', arguments: [buffer.name]}); + }, description: ' - act as yourself', aliases: ['me']}, list: {execute: function(buffer, handler, command, message, listargs) { - irc.socket.emit("userinput", {command: "list", server: buffer.server, message: "", arguments: listargs.splice(1)}); - }, description: "- List all channels on the current server."}, + irc.socket.emit('userinput', {command: 'list', server: buffer.server, message: '', arguments: listargs.splice(1)}); + }, description: '- List all channels on the current server.'}, nick: {execute: function(buffer, handler, command, message, listargs) { if(!listargs[1]) { if(buffer.server != '') { let mynick = irc.serverData[buffer.server].my_nick; - buffer.addMessage("Your nickname is: "+mynick+"", null, "help"); + buffer.addMessage('Your nickname is: '+mynick+'', null, 'help'); } return; } - irc.socket.emit("userinput", {command: "nick", server: buffer.server, message: "", arguments: listargs.splice(1)}); - }, description: "- List all channels on the current server.", aliases: ['nickname']}, + irc.socket.emit('userinput', {command: 'nick', server: buffer.server, message: '', arguments: listargs.splice(1)}); + }, description: '- List all channels on the current server.', aliases: ['nickname']}, names: {execute: function(buffer, handler, command, message, listargs) { - let channel = ""; + let channel = ''; if(!listargs[1]) { if(buffer.type == 'channel') channel = buffer.name; @@ -579,25 +582,25 @@ let commands = { } else { return handler.commandError(buffer, '/'+cmd.toUpperCase()+': Invalid channel name!'); } - irc.socket.emit("userinput", {command: "names", server: buffer.server, message: "", arguments: [channel]}); - }, description: "- List all users on the current channel.", aliases: ['nicknames']}, + irc.socket.emit('userinput', {command: 'names', server: buffer.server, message: '', arguments: [channel]}); + }, description: '- List all users on the current channel.', aliases: ['nicknames']}, quote: {execute: function(buffer, handler, command, message, listargs) { - irc.socket.emit("userinput", {command: listargs[1], server: buffer.server, message: listargs.slice(2).join(" "), arguments: listargs.splice(2)}); - }, description: " [args] - Send a raw command to the server.", aliases: ['raw']}, + irc.socket.emit('userinput', {command: listargs[1], server: buffer.server, message: listargs.slice(2).join(' '), arguments: listargs.splice(2)}); + }, description: ' [args] - Send a raw command to the server.', aliases: ['raw']}, whois: {execute: function(buffer, handler, command, message, listargs) { if(!listargs[1]) return handler.commandError(buffer, listargs[0].toUpperCase()+': Missing parameters!'); - irc.socket.emit("userinput", {command: "whois", server: buffer.server, message: "", arguments: [listargs[1]]}); - }, description: " - Display information about a user."}, + irc.socket.emit('userinput', {command: 'whois', server: buffer.server, message: '', arguments: [listargs[1]]}); + }, description: ' - Display information about a user.'}, connect: {execute: function(buffer, handler, command, message, listargs) { - clientdom.connector.frame.style.display = "block"; - irc.auther.authMessage("Create a new connection", false); + clientdom.connector.frame.style.display = 'block'; + irc.auther.authMessage('Create a new connection', false); irc.auther.canClose = true; - }, description: "- Create a new connection."}, + }, description: '- Create a new connection.'}, help: {execute: function(buffer, handler, command, message, listargs) { if(!listargs[1]) @@ -608,11 +611,11 @@ let commands = { cmd = cmd.substring(1); if(cmd in commands) { - if("description" in commands[cmd]) - buffer.addMessage("/"+cmd.toUpperCase()+" "+ - validators.escapeHTML(commands[cmd].description), null, "help"); + if('description' in commands[cmd]) + buffer.addMessage('/'+cmd.toUpperCase()+' '+ + validators.escapeHTML(commands[cmd].description), null, 'help'); else - buffer.addMessage("/"+cmd.toUpperCase()+" - No description provided", null, "help"); + buffer.addMessage('/'+cmd.toUpperCase()+' - No description provided', null, 'help'); } else { let foundAliased = null; for(let cmd2 in commands) { @@ -620,21 +623,21 @@ let commands = { if(commands[cmd2].aliases.indexOf(cmd) != -1) foundAliased = cmd2; } if(foundAliased) { - if("description" in commands[foundAliased]) - buffer.addMessage("/"+cmd.toUpperCase()+" "+ - validators.escapeHTML(commands[foundAliased].description), null, "help"); + if('description' in commands[foundAliased]) + buffer.addMessage('/'+cmd.toUpperCase()+' '+ + validators.escapeHTML(commands[foundAliased].description), null, 'help'); else - buffer.addMessage("/"+cmd.toUpperCase()+" - No description provided", null, "help"); + buffer.addMessage('/'+cmd.toUpperCase()+' - No description provided', null, 'help'); } else { handler.commandError(buffer, '/'+cmd.toUpperCase()+': Unknown command!'); } } - }, description: " - Display help for command"}, + }, description: ' - Display help for command'}, clear: {execute: function(buffer, handler, command, message, listargs) { buffer.clearMessages(); - }, description: "- Clears the current buffer."} -} + }, description: '- Clears the current buffer.'} +}; /*********************\ |** **| @@ -650,7 +653,7 @@ class Nicklist { } sort() { - let spfx = irc.serverData[this.buffer.server].supportedPrefixes + let spfx = irc.serverData[this.buffer.server].supportedPrefixes; this.nicks.sort(function (a,b) { let rex = new RegExp('^['+spfx+']'); let nicks = [a.prefix.replace(rex,'').toLowerCase(), b.prefix.replace(rex,'').toLowerCase()]; @@ -671,20 +674,20 @@ class Nicklist { appendToList(nick) { if(!this.buffer.active) return; - let str = document.createElement("div"); - str.className = "nick"; + let str = document.createElement('div'); + str.className = 'nick'; str.setAttribute('id', 'nick-'+nick.nickname); - let construct = ""; + let construct = ''; - if(nick.prefix != "") - construct += ""+nick.prefix+""; + if(nick.prefix != '') + construct += ''+nick.prefix+''; else - construct += " "; + construct += ' '; if(irc.config.colorNicklist) - construct += ""+nick.nickname+""; + construct += ''+nick.nickname+''; else - construct += ""+nick.nickname+""; + construct += ''+nick.nickname+''; str.innerHTML = construct; clientdom.nicklist.appendChild(str); @@ -692,7 +695,7 @@ class Nicklist { render() { if(!this.buffer.active) return; - clientdom.nicklist.innerHTML = ""; + clientdom.nicklist.innerHTML = ''; this.simplifiedNicksList = []; this.sort(); @@ -706,7 +709,7 @@ class Nicklist { } nickAdd(nickname) { - let newbie = { nickname: nickname, prefix: "", modes: [] } + let newbie = { nickname: nickname, prefix: '', modes: [] }; if(this.getNickIndex(nickname) != null) return; this.nicks.push(newbie); this.render(); @@ -797,7 +800,7 @@ class Nicklist { remove_str(nick.modes, oldMode); - let currentLowest = ""; + let currentLowest = ''; for(let n in nick.modes) { let mode = nick.modes[n]; @@ -828,16 +831,16 @@ class Tab { // Create a tab element renderTab() { - let internals = ""+ this.buffer.title +""; + let internals = ''+ this.buffer.title +''; let ttt = document.createElement('div'); ttt.innerHTML = internals; - ttt.className = "tab"; + ttt.className = 'tab'; ttt.setAttribute('id', 'tab-'+this.buffer.name); clientdom.tabby.appendChild(ttt); this.element = ttt; - ttt.innerHTML += "x" + ttt.innerHTML += 'x'; ttt.querySelector('#close').addEventListener('click', () => { this.close(); }, false); @@ -854,9 +857,9 @@ class Tab { setActive(active) { if(this.element) { - this.element.className = "tab"; + this.element.className = 'tab'; if(active) { - addClass(this.element, "active"); + addClass(this.element, 'active'); } } } @@ -864,9 +867,9 @@ class Tab { setHot(hot) { if(this.element) { if(hot) - addClass(this.element, "hot"); + addClass(this.element, 'hot'); else - removeClass(this.element, "hot"); + removeClass(this.element, 'hot'); } } @@ -874,10 +877,10 @@ class Tab { if(this.element) { let counter = this.element.querySelector('#unread'); if(count == 0) { - counter.className = "none"; + counter.className = 'none'; } else { counter.innerHTML = count; - counter.className = ""; + counter.className = ''; } } } @@ -890,16 +893,16 @@ class Tab { close() { this.closeRequested = true; - this.buffer.closeBuffer(); + this.buffer.closeChatBuffer(); } } -class Buffer { +class ChatBuffer { constructor(servername, buffername, tabname, type) { this.messages = []; this.nicklist = null; this.topic = null; - this.input = ""; + this.input = ''; this.lastscroll = 0; this.wasAtBottom = false; this.unreadCount = 0; @@ -912,12 +915,12 @@ class Buffer { this.alive = true; this.hot = false; - if(type != "applet") { + if(type != 'applet') { this.tab = new Tab(this); this.tab.renderTab(); } - if(type == "channel") + if(type == 'channel') this.nicklist = new Nicklist(this, clientdom.nicklist); } @@ -927,9 +930,9 @@ class Buffer { this.unreadCount = 0; this.tab.setUnreadCount(0); - clientdom.chat.className = "chatarea"; - clientdom.nicklist.innerHTML = ""; - clientdom.topicbar.innerHTML = ""; + clientdom.chat.className = 'chatarea'; + clientdom.nicklist.innerHTML = ''; + clientdom.topicbar.innerHTML = ''; if(!irc.config.sharedInput) clientdom.input.value = this.input; @@ -942,10 +945,10 @@ class Buffer { if(this.hot) this.setHotStatus(false); - if(this.topic != null && this.topic != "") { + if(this.topic != null && this.topic != '') { addClass(clientdom.chat, 'vtopic'); if(irc.config.colors) - clientdom.topicbar.innerHTML = linkify(colorizer.stylize(this.topic)); + clientdom.topicbar.innerHTML = linkify(stylize(this.topic)); else clientdom.topicbar.innerHTML = linkify(colorizer.strip(this.topic)); } @@ -958,13 +961,13 @@ class Buffer { clientdom.currentNickname.innerHTML = irc.serverData[this.server].my_nick; - irc.chat.changeTitle("TeemantIRC - "+this.title); + irc.chat.changeTitle('TeemantIRC - '+this.title); } renderMessages() { if(!this.active) return; - clientdom.letterbox.innerHTML = ""; + clientdom.letterbox.innerHTML = ''; for(let t in this.messages) { let mesg = this.messages[t]; @@ -976,7 +979,7 @@ class Buffer { this.messages = []; if(this.active) - clientdom.letterbox.innerHTML = ""; + clientdom.letterbox.innerHTML = ''; } setHotStatus(hot) { @@ -990,14 +993,14 @@ class Buffer { if(irc.serverData[this.server]) { let mynick = irc.serverData[this.server].my_nick; - if((meta.type == "privmsg" || meta.type == "notice" || meta.type == "action") && + if((meta.type == 'privmsg' || meta.type == 'notice' || meta.type == 'action') && meta.message.toLowerCase().indexOf(mynick.toLowerCase()) != -1 && meta.sender != mynick) - addClass(mesgConstr, "mentioned"); + addClass(mesgConstr, 'mentioned'); } clientdom.letterbox.appendChild(mesgConstr); - let lFactor = clientdom.letterbox.offsetHeight + clientdom.letterbox.scrollTop + let lFactor = clientdom.letterbox.offsetHeight + clientdom.letterbox.scrollTop; if(lFactor > clientdom.letterbox.scrollHeight - 100) clientdom.letterbox.scrollTop = clientdom.letterbox.scrollHeight; } @@ -1005,18 +1008,18 @@ class Buffer { topicChange(topic) { if(this.active) { if(irc.config.colors) - clientdom.topicbar.innerHTML = linkify(colorizer.stylize(topic)); + clientdom.topicbar.innerHTML = linkify(stylize(topic)); else clientdom.topicbar.innerHTML = linkify(colorizer.strip(topic)); if(this.topic == null) - addClass(clientdom.chat, "vtopic"); + addClass(clientdom.chat, 'vtopic'); } this.topic = topic; } addMessage(message, sender, type, time) { - let mesg = {message: message, sender: sender, type: type, time: time || new Date()} + let mesg = {message: message, sender: sender, type: type, time: time || new Date()}; this.messages.push(mesg); if(this.active) { @@ -1025,7 +1028,7 @@ class Buffer { this.unreadCount += 1; if(irc.serverData[this.server]) { let mynick = irc.serverData[this.server].my_nick; - if((type == "privmsg" || type == "notice" || type == "action") && + if((type == 'privmsg' || type == 'notice' || type == 'action') && message.toLowerCase().indexOf(mynick.toLowerCase()) != -1 && sender != mynick) { // TODO: notify user of mentioned @@ -1041,7 +1044,7 @@ class Buffer { switchOff() { irc.chat.input_handler.searchNicknames = []; - let lFactor = clientdom.letterbox.offsetHeight + clientdom.letterbox.scrollTop + let lFactor = clientdom.letterbox.offsetHeight + clientdom.letterbox.scrollTop; if(lFactor > clientdom.letterbox.scrollHeight - 100) this.wasAtBottom = true; else @@ -1063,8 +1066,8 @@ class Buffer { this.tab.setTitle('('+this.title+')'); } - closeBuffer() { - irc.chat.closeBuffer(this); + closeChatBuffer() { + irc.chat.closeChatBuffer(this); } } @@ -1081,9 +1084,9 @@ class ThemeSelector { if(all[a] && all[a]['className']) { let elem = all[a]; if(elem.getAttribute('id') == 'theme-'+name) { - addClass(elem, "selected"); + addClass(elem, 'selected'); } else { - removeClass(elem, "selected"); + removeClass(elem, 'selected'); } } } @@ -1094,14 +1097,14 @@ class ThemeSelector { button.onclick = (e) => { this.settings.themeSelection = theme; this.set_active_selection(theme); - } + }; } render() { - clientdom.settings.available_themes.innerHTML = ""; + clientdom.settings.available_themes.innerHTML = ''; - for(let n in window.themes.available) { - let theme = window.themes.available[n]; + for(let n in themes.available) { + let theme = themes.available[n]; let button = composer.theme_selection(n, theme); clientdom.settings.available_themes.appendChild(button); @@ -1111,17 +1114,17 @@ class ThemeSelector { } } -class AppletBuffer extends Buffer { +class AppletChatBuffer extends ChatBuffer { constructor(appletName, title, frame) { - super("", appletName, title, "applet"); + super('', appletName, title, 'applet'); this.tab = null; this.isOpen = false; this.timeout = null; this.frame = frame; } - closeBuffer() { - irc.chat.closeBuffer(this); + closeChatBuffer() { + irc.chat.closeChatBuffer(this); this.tab = null; this.isOpen = false; } @@ -1147,37 +1150,37 @@ class AppletBuffer extends Buffer { switchOff() { this.active = false; this.tab.setActive(false); - this.frame.style.display = "none"; + this.frame.style.display = 'none'; } render() { this.active = true; this.tab.setActive(true); - this.frame.style.display = "block"; + this.frame.style.display = 'block'; } } -class Settings extends AppletBuffer { +class Settings extends AppletChatBuffer { constructor() { - super("settings", "Settings", clientdom.settings.frame); + super('settings', 'Settings', clientdom.settings.frame); - this.themeSelection = ""; + this.themeSelection = ''; this.themeSelector = new ThemeSelector(this); this.themeSelector.render(); clientdom.settings.save.onclick = (e) => { this.saveSpecified(); - } + }; clientdom.settings.open.onclick = (e) => { this.open(); - } + }; } switch_theme() { if(this.themeSelection != '') { - window.themes.change_theme(this.themeSelection); + themes.change_theme(this.themeSelection); irc.config.theme = this.themeSelection; this.themeSelector.set_active_selection(this.themeSelection); } @@ -1194,25 +1197,25 @@ class Settings extends AppletBuffer { let type = typeof(value); if(clientdom.settings[key]) { - if(type == "boolean") + if(type == 'boolean') irc.config[key] = clientdom.settings[key].checked; else irc.config[key] = clientdom.settings[key].value; } } - clientdom.settings.saveStatus.innerHTML = "Settings saved!"; + clientdom.settings.saveStatus.innerHTML = 'Settings saved!'; - if("localStorage" in window) { + if('localStorage' in window) { window.localStorage['teemant_settings'] = JSON.stringify(irc.config); } this.timeout = setTimeout(function() { - clientdom.settings.saveStatus.innerHTML = ""; + clientdom.settings.saveStatus.innerHTML = ''; }, 3000); } setInitialValues() { - if("localStorage" in window) { + if('localStorage' in window) { if(window.localStorage['teemant_settings']) { try { let settings = JSON.parse(window.localStorage.teemant_settings); @@ -1226,7 +1229,7 @@ class Settings extends AppletBuffer { continue; } - if(type == "boolean") + if(type == 'boolean') clientdom.settings[key].checked = settings[key]; else clientdom.settings[key].value = settings[key]; @@ -1243,7 +1246,7 @@ class Settings extends AppletBuffer { let type = typeof(value); if(clientdom.settings[key]) { - if(type == "boolean") + if(type == 'boolean') clientdom.settings[key].checked = value; else clientdom.settings[key].value = value; @@ -1253,11 +1256,11 @@ class Settings extends AppletBuffer { render() { super.render(); - clientdom.chat.className = "chatarea"; - clientdom.nicklist.innerHTML = ""; - clientdom.topicbar.innerHTML = ""; - clientdom.letterbox.innerHTML = ""; - irc.chat.changeTitle("TeemantIRC - Settings"); + clientdom.chat.className = 'chatarea'; + clientdom.nicklist.innerHTML = ''; + clientdom.topicbar.innerHTML = ''; + clientdom.letterbox.innerHTML = ''; + irc.chat.changeTitle('TeemantIRC - Settings'); } } @@ -1275,17 +1278,17 @@ class IRCConnector { this.formLocked = true; this.validateForm(e); - } + }; clientdom.connector.onkeyup = (e) => { let key = evt.keyCode || evt.which || evt.charCode || 0; if(key === 27 && this.canClose) this.authComplete(); - } + }; clientdom.connector.pwtrigger.onclick = (e) => { this.togglePassword(); - } + }; } fillFormFromURI() { @@ -1293,35 +1296,35 @@ class IRCConnector { let value = urlParams[param]; switch(param) { - case "nick": - case "nickname": - if (window.validators.nickname(value)) + case 'nick': + case 'nickname': + if (validators.nickname(value)) clientdom.connector.nickname.value = value.replace(/\?/g, rand(10000, 99999)); break; - case "secure": - case "ssl": - if(value == "true" || value == "1") + case 'secure': + case 'ssl': + if(value == 'true' || value == '1') clientdom.connector.secure.checked = true; break; - case "password": - if(value == "true" || value == "1") { + case 'password': + if(value == 'true' || value == '1') { clientdom.connector.pwtrigger.checked = true; this.togglePassword(); } break; - case "server": - case "host": - if(window.validators.iporhost(value)) + case 'server': + case 'host': + if(validators.iporhost(value)) clientdom.connector.server.value = value; break; - case "server_data": - case "extra": - case "extras": - case "connection": - if(value == "false" || value == "0") - clientdom.connector.server_data.style.display = "none"; + case 'server_data': + case 'extra': + case 'extras': + case 'connection': + if(value == 'false' || value == '0') + clientdom.connector.server_data.style.display = 'none'; break; - case "port": + case 'port': try { let ppp = parseInt(value); clientdom.connector.port.value = ppp; @@ -1334,16 +1337,16 @@ class IRCConnector { if(window.location.pathname.length > 4) { let t1 = window.location.pathname.substring(1, window.location.pathname.length-1); - let proposed = ""; + let proposed = ''; if(t1.indexOf('/') != -1) { proposed = t1.split('/'); - proposed = proposed[proposed.length-1] + proposed = proposed[proposed.length-1]; } else { proposed = t1; } - if(window.validators.iporhost(proposed)) + if(validators.iporhost(proposed)) clientdom.connector.server.value = proposed; } } @@ -1355,59 +1358,59 @@ class IRCConnector { let server = clientdom.connector.server.value; let port = clientdom.connector.port.value; - if (!window.validators.nickname(nickname)) { - this.authMessage("Erroneous nickname!", true); + if (!validators.nickname(nickname)) { + this.authMessage('Erroneous nickname!', true); return false; } - if (channel.indexOf(",") !== -1) { - channel = channel.trim().split(","); + if (channel.indexOf(',') !== -1) { + channel = channel.trim().split(','); for (let t in channel) { let chan = channel[t]; channel[t] = chan.trim(); - if (chan.indexOf("#") != 0) { - channel[t] = "#"+chan; + if (chan.indexOf('#') != 0) { + channel[t] = '#'+chan; } } - } else if(channel != "") { + } else if(channel != '') { channel = channel.trim(); - if (channel.indexOf("#") != 0) { - channel = "#"+channel; + if (channel.indexOf('#') != 0) { + channel = '#'+channel; } channel = [channel]; } else { channel = []; } - if(!window.validators.iporhost(server)) { - this.authMessage("Erroneous server address!", true); + if(!validators.iporhost(server)) { + this.authMessage('Erroneous server address!', true); return false; } try { port = parseInt(port); } catch(e) { - this.authMessage("Erroneous port!", true); + this.authMessage('Erroneous port!', true); return false; } if(port < 10 || port > 65535) { - this.authMessage("Erroneous port!", true); + this.authMessage('Erroneous port!', true); return false; } if(!clientdom.connector.pwtrigger.checked) - password = ""; + password = ''; return {nickname: nickname, - autojoin: channel, - server: server, - port: port, - password: password, - secure: clientdom.connector.secure.checked } + autojoin: channel, + server: server, + port: port, + password: password, + secure: clientdom.connector.secure.checked }; } validateForm(event) { @@ -1421,20 +1424,20 @@ class IRCConnector { } authMessage(message, error) { - clientdom.connector.messenger.innerHTML = ""+message+""; + clientdom.connector.messenger.innerHTML = ''+message+''; if(error) this.formLocked = false; } togglePassword() { if(clientdom.connector.pwtrigger.checked) - clientdom.connector.pwbox.style.display = "block"; + clientdom.connector.pwbox.style.display = 'block'; else - clientdom.connector.pwbox.style.display = "none"; + clientdom.connector.pwbox.style.display = 'none'; } authComplete() { - clientdom.connector.frame.style.display = "none"; + clientdom.connector.frame.style.display = 'none'; this.formLocked = false; } } @@ -1447,7 +1450,7 @@ class InputHandler { this.index = -1; this.words = []; - this.last = ""; + this.last = ''; clientdom.input.onkeyup = (evt) => { let key = evt.keyCode || evt.which || evt.charCode || 0; @@ -1457,7 +1460,7 @@ class InputHandler { } this.keyUpHandle(evt, key); - } + }; clientdom.input.onkeydown = (e) => { let key = e.keyCode || e.which || e.charCode || 0; @@ -1466,16 +1469,16 @@ class InputHandler { } this.keyDownHandle(e, key); - } + }; clientdom.input.onfocus = (e) => { if(irc.config.scrollOnFocus) clientdom.letterbox.scrollTop = clientdom.letterbox.scrollHeight; - } + }; clientdom.send.onclick = (e) => { this.handleInput(); - } + }; } keyUpHandle(e, key) { @@ -1495,7 +1498,7 @@ class InputHandler { this.tabWords = match(word, this.searchNicknames); if(input.indexOf(word) == 0) for(let n in this.tabWords) - this.tabWords[n] += ": "; + this.tabWords[n] += ': '; } } @@ -1523,7 +1526,7 @@ class InputHandler { this.historyCaret += 1; } - let selection = this.history[this.historyCaret] + let selection = this.history[this.historyCaret]; if(!this.history[this.historyCaret]) selection = ''; @@ -1564,16 +1567,16 @@ class InputHandler { tabCompleteReset() { this.index = -1; - this.lastWord = ""; + this.lastWord = ''; this.tabWords = []; } handleInput() { let message = clientdom.input.value; - let buffer = irc.chat.getActiveBuffer(); + let buffer = irc.chat.getActiveChatBuffer(); if(!buffer) return; - if(message.trim() == "") return; + if(message.trim() == '') return; let listargs = message.split(' '); @@ -1581,7 +1584,7 @@ class InputHandler { let command = listargs[0].substring(1).toLowerCase(); if(command.toLowerCase() in commands) { let cmd = commands[command]; - if("execute" in cmd) + if('execute' in cmd) cmd.execute(buffer, this, command, message, listargs); } else { let foundAliased = null; @@ -1596,16 +1599,16 @@ class InputHandler { } } else { - irc.socket.emit("userinput", {command: "privmsg", server: buffer.server, message: message, arguments: [buffer.name]}); + irc.socket.emit('userinput', {command: 'privmsg', server: buffer.server, message: message, arguments: [buffer.name]}); } this.history.push(message); this.historyCaret = this.history.length; - clientdom.input.value = ""; + clientdom.input.value = ''; } commandError(buffer, message) { - buffer.addMessage(message, null, "error"); + buffer.addMessage(message, null, 'error'); return true; } } @@ -1614,53 +1617,53 @@ class IRCChatWindow { constructor() { this.buffers = []; this.firstServer = true; - this.currentBuffer = null; + this.currentChatBuffer = null; this.input_handler = new InputHandler(); - clientdom.frame.style.display = "none"; + clientdom.frame.style.display = 'none'; clientdom.smsctrig.onclick = (e) => { - toggleClass(clientdom.chat, "vopentrig"); - } + toggleClass(clientdom.chat, 'vopentrig'); + }; } - destroyAllBuffers() { + destroyAllChatBuffers() { // Wipe all server data irc.serverData = {}; irc.serverChatQueue = {}; this.buffers = []; // Clear tabs - clientdom.tabby.innerHTML = ""; + clientdom.tabby.innerHTML = ''; // Reset to the defaults - irc.auther.authMessage("Disconnected", true); - clientdom.frame.style.display = "none"; + irc.auther.authMessage('Disconnected', true); + clientdom.frame.style.display = 'none'; this.firstServer = true; window.onbeforeunload = null; } - getBufferByName(buffername) { + getChatBufferByName(buffername) { let result = null; for (let t in this.buffers) { let buf = this.buffers[t]; if(buf.name.toLowerCase() == buffername.toLowerCase()) - result = buf + result = buf; } return result; } - getActiveBuffer() { + getActiveChatBuffer() { let result = null; for (let t in this.buffers) { let buf = this.buffers[t]; if(buf.active == true) - result = buf + result = buf; } return result; } - getServerBuffer(server) { + getServerChatBuffer(server) { let result = null; for (let t in this.buffers) { let buf = this.buffers[t]; @@ -1670,7 +1673,7 @@ class IRCChatWindow { return result; } - getBuffersByServer(server) { + getChatBuffersByServer(server) { let result = []; for (let t in this.buffers) { let buf = this.buffers[t]; @@ -1680,7 +1683,7 @@ class IRCChatWindow { return result; } - getBufferByServerName(server, channel) { + getChatBufferByServerName(server, channel) { let result = null; for (let t in this.buffers) { let buf = this.buffers[t]; @@ -1690,7 +1693,7 @@ class IRCChatWindow { return result; } - getBuffersByType(type) { + getChatBuffersByType(type) { let result = []; for (let t in this.buffers) { let buf = this.buffers[t]; @@ -1700,15 +1703,15 @@ class IRCChatWindow { return result; } - newServerBuffer(serverinfo) { + newServerChatBuffer(serverinfo) { if(this.firstServer) { - clientdom.frame.style.display = "block"; + clientdom.frame.style.display = 'block'; window.onbeforeunload = function(e) { return 'IRC will disconnect.'; - } + }; } - let prefixes = ""; + let prefixes = ''; for(let v in serverinfo.supportedModes) { prefixes += serverinfo.supportedModes[v]; @@ -1720,9 +1723,9 @@ class IRCChatWindow { network: serverinfo.network, my_nick: serverinfo.nickname, max_channel_length: serverinfo.max_channel_length - } + }; - let newServer = new Buffer(serverinfo.address, serverinfo.address, serverinfo.network, "server"); + let newServer = new ChatBuffer(serverinfo.address, serverinfo.address, serverinfo.network, 'server'); this.buffers.push(newServer); this.render(newServer); this.firstServer = false; @@ -1737,15 +1740,15 @@ class IRCChatWindow { } - createBuffer(server, name, type, autoswitch) { - let buf = this.getBufferByServerName(server, name); + createChatBuffer(server, name, type, autoswitch) { + let buf = this.getChatBufferByServerName(server, name); if(buf) { if(autoswitch) this.render(buf); return buf; } - buf = new Buffer(server, name, name, type); + buf = new ChatBuffer(server, name, name, type); this.buffers.push(buf); if(autoswitch) @@ -1754,11 +1757,11 @@ class IRCChatWindow { return buf; } - closeBuffer(buffer) { - if(buffer.type == "server") - irc.socket.emit("userinput", {command: "quit", server: buffer.server, message: "Server tab closed", arguments: []}); - else if(buffer.type == "channel" && buffer.alive) - irc.socket.emit("userinput", {command: "part", server: buffer.server, message: "Tab closed", arguments: [buffer.name]}); + closeChatBuffer(buffer) { + if(buffer.type == 'server') + irc.socket.emit('userinput', {command: 'quit', server: buffer.server, message: 'Server tab closed', arguments: []}); + else if(buffer.type == 'channel' && buffer.alive) + irc.socket.emit('userinput', {command: 'part', server: buffer.server, message: 'Tab closed', arguments: [buffer.name]}); let bufIndex = this.buffers.indexOf(buffer); @@ -1775,30 +1778,30 @@ class IRCChatWindow { buffer.tab.element.remove(); this.buffers.splice(bufIndex, 1); - if(this.buffers.length == 0 || (this.buffers.length == 1 && this.buffers[0].type == "applet")) { - irc.chat.destroyAllBuffers(); - irc.auther.authMessage("Create a new connection", false); + if(this.buffers.length == 0 || (this.buffers.length == 1 && this.buffers[0].type == 'applet')) { + irc.chat.destroyAllChatBuffers(); + irc.auther.authMessage('Create a new connection', false); irc.auther.canClose = false; - clientdom.connector.frame.style.display = "block"; + clientdom.connector.frame.style.display = 'block'; } } - messageBuffer(name, server, message) { - let buf = this.getBufferByServerName(server, name); + messageChatBuffer(name, server, message) { + let buf = this.getChatBufferByServerName(server, name); if(buf == null) - buf = this.createBuffer(server, name, "message", false); + buf = this.createChatBuffer(server, name, 'message', false); - if(message.type == "privmsg" && message.message.indexOf('\x01ACTION') == 0) { + if(message.type == 'privmsg' && message.message.indexOf('\x01ACTION') == 0) { message.message = message.message.substring(8); - message.type = "action"; + message.type = 'action'; } buf.addMessage(message.message, message.from, message.type); } buildNicklist(channel, server, nicks) { - let buf = this.getBufferByServerName(server, channel); + let buf = this.getChatBufferByServerName(server, channel); if(buf == null) return; @@ -1806,34 +1809,34 @@ class IRCChatWindow { let channelSendNicks = []; for(let n in nicks) { - let nick = {nickname: "", prefix: "", modes: []}; + let nick = {nickname: '', prefix: '', modes: []}; if(irc.serverData[buf.server].supportedPrefixes.split('').indexOf(nicks[n].substring(0, 1)) != -1) { nick.prefix = nicks[n].substring(0, 1); nick.nickname = nicks[n].substring(1); nick.modes = [objectGetKey(irc.serverData[buf.server].modeTranslation, nick.prefix)]; - channelSendNicks.push("{0}{1}".format(nick.prefix, nick.nickname)); + channelSendNicks.push('{0}{1}'.format(nick.prefix, nick.nickname)); } else { nick.nickname = nicks[n]; - channelSendNicks.push("{1}".format(nick.prefix, nick.nickname)); + channelSendNicks.push('{1}'.format(nick.prefix, nick.nickname)); } buf.nicklist.nickAddObject(nick); } - buf.addMessage("Nicks {0}: {1}".format(channel, channelSendNicks.join(', ')), null, "names"); + buf.addMessage('Nicks {0}: {1}'.format(channel, channelSendNicks.join(', ')), null, 'names'); if(buf.active) buf.nicklist.render(); } nickChange(server, oldNick, newNick) { - let buffers = this.getBuffersByServer(server); + let buffers = this.getChatBuffersByServer(server); if(irc.serverData[server].my_nick == oldNick) { irc.serverData[server].my_nick = newNick; - let activeBuf = this.getActiveBuffer(); + let activeBuf = this.getActiveChatBuffer(); if(activeBuf.server == server) { clientdom.currentNickname.innerHTML = newNick; @@ -1843,44 +1846,44 @@ class IRCChatWindow { for(let i in buffers) { let buffer = buffers[i]; - if(buffer.type != "channel") continue; + if(buffer.type != 'channel') continue; if(buffer.nicklist.getNickIndex(oldNick) == null) continue; buffer.nicklist.nickChange(oldNick, newNick); - buffer.addMessage("{0} is now known as {1}".format(oldNick, newNick), null, "nick"); + buffer.addMessage('{0} is now known as {1}'.format(oldNick, newNick), null, 'nick'); } } topicChange(channel, server, topic, changer) { - let buf = this.getBufferByServerName(server, channel); + let buf = this.getChatBufferByServerName(server, channel); if (!buf) return; buf.topicChange(topic); if(changer) - buf.addMessage("{0} has changed the topic of {1} to \"{2}\"".format(changer, channel, topic), - null, "topic"); + buf.addMessage('{0} has changed the topic of {1} to \'{2}\''.format(changer, channel, topic), + null, 'topic'); else - buf.addMessage("Topic of {0} is \"{1}\"".format(channel, topic), null, "topic"); + buf.addMessage('Topic of {0} is \'{1}\''.format(channel, topic), null, 'topic'); } handleQuit(server, user, reason) { - let buffers = this.getBuffersByServer(server); + let buffers = this.getChatBuffersByServer(server); for(let i in buffers) { let buffer = buffers[i]; - if(buffer.type != "channel") continue; + if(buffer.type != 'channel') continue; if(buffer.nicklist.getNickIndex(user.nickname) == null) continue; buffer.nicklist.nickRemove(user.nickname); - buffer.addMessage("{0}@{1} has quit {2}".format(user.username, - user.hostname, reason), user.nickname, "quit"); + buffer.addMessage('{0}@{1} has quit {2}'.format(user.username, + user.hostname, reason), user.nickname, 'quit'); } } handleJoin(server, user, channel) { - let buffer = this.getBufferByServerName(server, channel); + let buffer = this.getChatBufferByServerName(server, channel); if(!buffer) return; @@ -1889,12 +1892,12 @@ class IRCChatWindow { else buffer.nicklist.nickAdd(user.nickname); - buffer.addMessage("{0}@{1} has joined {2}".format(user.username, - user.hostname, channel), user.nickname, "join"); + buffer.addMessage('{0}@{1} has joined {2}'.format(user.username, + user.hostname, channel), user.nickname, 'join'); } handleLeave(server, user, channel, reason, kicker) { - let buffer = this.getBufferByServerName(server, channel); + let buffer = this.getChatBufferByServerName(server, channel); if(!buffer) return; @@ -1907,10 +1910,10 @@ class IRCChatWindow { } if(kicker) - buffer.addMessage("has kicked {0} {1}".format(user, reason), kicker.nickname, "part"); + buffer.addMessage('has kicked {0} {1}'.format(user, reason), kicker.nickname, 'part'); else - buffer.addMessage("{0}@{1} has left {2}{3}".format(user.username, - user.hostname, (reason != null ? " "+reason+"" : "")), user.nickname, "part"); + buffer.addMessage('{0}@{1} has left {2}{3}'.format(user.username, + user.hostname, (reason != null ? ' '+reason+'' : '')), user.nickname, 'part'); if(kicker) buffer.nicklist.nickRemove(user); else @@ -1920,50 +1923,50 @@ class IRCChatWindow { handleMode(data) { let buf = null; if(data.target == irc.serverData[data.server].my_nick) - buf = this.getServerBuffer(data.server); + buf = this.getServerChatBuffer(data.server); else - buf = this.getBufferByServerName(data.server, data.target); + buf = this.getChatBufferByServerName(data.server, data.target); if(!buf) return; - if(data.type == "mode_add") { + if(data.type == 'mode_add') { buf.nicklist.modeAdded(data.modeTarget, data.mode); - buf.addMessage("set mode {0} +{1} {2}".format(data.target, - data.mode, data.modeTarget), data.user.nickname, "mode"); - } else if(data.type == "mode_del") { + buf.addMessage('set mode {0} +{1} {2}'.format(data.target, + data.mode, data.modeTarget), data.user.nickname, 'mode'); + } else if(data.type == 'mode_del') { buf.nicklist.modeRemoved(data.modeTarget, data.mode); - buf.addMessage("set mode {0} -{1} {2}".format(data.target, - data.mode, data.modeTarget), data.user.nickname, "mode"); + buf.addMessage('set mode {0} -{1} {2}'.format(data.target, + data.mode, data.modeTarget), data.user.nickname, 'mode'); } else { - buf.addMessage("set mode {0} {1}".format(data.target, - data.message), data.user.nickname, "mode"); + buf.addMessage('set mode {0} {1}'.format(data.target, + data.message), data.user.nickname, 'mode'); } } joinChannels(server, channel) { - if (channel.indexOf(",") !== -1) { - channel = channel.trim().split(","); + if (channel.indexOf(',') !== -1) { + channel = channel.trim().split(','); for (let t in channel) { let chan = channel[t]; channel[t] = chan.trim(); - if (chan.indexOf("#") != 0) { - channel[t] = "#"+chan; + if (chan.indexOf('#') != 0) { + channel[t] = '#'+chan; } } - } else if(channel != "") { + } else if(channel != '') { channel = channel.trim(); - if (channel.indexOf("#") != 0) { - channel = "#"+channel; + if (channel.indexOf('#') != 0) { + channel = '#'+channel; } channel = [channel]; } else { channel = []; } - irc.socket.emit("userinput", {command: "join", server: server, message: "", arguments: channel}); + irc.socket.emit('userinput', {command: 'join', server: server, message: '', arguments: channel}); } changeTitle(title) { @@ -1973,7 +1976,7 @@ class IRCChatWindow { } render(buffer) { - let activeNow = this.getActiveBuffer(); + let activeNow = this.getActiveChatBuffer(); this.input_handler.tabCompleteReset(); if(activeNow) @@ -1993,7 +1996,7 @@ function parseURL() { let match, pl = /\+/g, // Regex for replacing addition symbol with a space search = /([^&=]+)=?([^&]*)/g, - decode = function (s) { return decodeURIComponent(s.replace(pl, " ")); }, + decode = function (s) { return decodeURIComponent(s.replace(pl, ' ')); }, query = window.location.search.substring(1); urlParams = {}; @@ -2013,7 +2016,7 @@ window.onpopstate = parseURL; window.onresize = function() { if(irc.config.scrollOnResize) clientdom.letterbox.scrollTop = clientdom.letterbox.scrollHeight; -} +}; window.onload = function() { irc.primaryFrame = document.querySelector('.ircclient'); @@ -2039,7 +2042,7 @@ window.onload = function() { clientdom.connector['server'] = clientdom.connector.form.querySelector('#server'); clientdom.connector['port'] = clientdom.connector.form.querySelector('#port'); clientdom.connector['secure'] = clientdom.connector.form.querySelector('#secure'); - clientdom['tabby'] = irc.primaryFrame.querySelector('.tabby') + clientdom['tabby'] = irc.primaryFrame.querySelector('.tabby'); clientdom['frame'] = irc.primaryFrame.querySelector('#chat'); clientdom['letterbox'] = clientdom.frame.querySelector('.letterbox'); clientdom['nicklist'] = clientdom.frame.querySelector('.nicklist'); @@ -2066,8 +2069,8 @@ window.onload = function() { irc.socket.on('disconnect', function (data) { irc.socketUp = false; - irc.chat.destroyAllBuffers(); - clientdom.connector.frame.style.display = "block"; + irc.chat.destroyAllChatBuffers(); + clientdom.connector.frame.style.display = 'block'; }); // Does everything @@ -2078,29 +2081,29 @@ window.onload = function() { data.reason = validators.escapeHTML(data.reason); switch(data.type) { - case "event_connect": + case 'event_connect': irc.auther.authComplete(); - irc.chat.newServerBuffer(data); + irc.chat.newServerChatBuffer(data); break; - case "event_join_channel": + case 'event_join_channel': if(data.user.nickname == irc.serverData[data.server].my_nick) - irc.chat.createBuffer(data.server, data.channel, "channel", true); + irc.chat.createChatBuffer(data.server, data.channel, 'channel', true); irc.chat.handleJoin(data.server, data.user, data.channel); break; - case "event_kick_channel": + case 'event_kick_channel': irc.chat.handleLeave(data.server, data.kickee, data.channel, data.reason, data.user); break; - case "event_part_channel": + case 'event_part_channel': irc.chat.handleLeave(data.server, data.user, data.channel, data.reason); break; - case "event_quit": + case 'event_quit': irc.chat.handleQuit(data.server, data.user, data.reason); break; - case "event_server_quit": - let serverz = irc.chat.getBuffersByServer(data.server); + case 'event_server_quit': + let serverz = irc.chat.getChatBuffersByServer(data.server); for(let a in serverz) { let serv = serverz[a]; - serv.addMessage("You are no longer talking on this server.", null, "error"); + serv.addMessage('You are no longer talking on this server.', null, 'error'); serv.setAliveStatus(false); } @@ -2108,61 +2111,61 @@ window.onload = function() { delete irc.serverData[data.server]; stopWarnings(); break; - case "message": + case 'message': if(data.to == irc.serverData[data.server].my_nick) { - irc.chat.messageBuffer(data.user.nickname, data.server, {message: data.message, type: data.messageType, from: data.user.nickname}); + irc.chat.messageChatBuffer(data.user.nickname, data.server, {message: data.message, type: data.messageType, from: data.user.nickname}); } else if(data.to == null) { - let atest = irc.chat.getActiveBuffer(); + let atest = irc.chat.getActiveChatBuffer(); if(atest.server != data.server) - atest = irc.chat.getServerBuffer(data.server); + atest = irc.chat.getServerChatBuffer(data.server); atest.addMessage(data.message, data.user.nickname, data.messageType); } else { - irc.chat.messageBuffer(data.to, data.server, {message: data.message, type: data.messageType, from: data.user.nickname}); + irc.chat.messageChatBuffer(data.to, data.server, {message: data.message, type: data.messageType, from: data.user.nickname}); } break; - case "channel_nicks": + case 'channel_nicks': irc.chat.buildNicklist(data.channel, data.server, data.nicks); break; - case "channel_topic": + case 'channel_topic': if(data['topic'] && data['set_by']) irc.chat.topicChange(data.channel, data.server, data.topic, data['set_by']); else if(data['topic']) irc.chat.topicChange(data.channel, data.server, data.topic, null); else if(data['set_by']) - irc.chat.messageBuffer(data.channel, data.server, {message: "Topic set by "+data.set_by+" on "+new Date(data.time*1000), type: "topic", from: null}); + irc.chat.messageChatBuffer(data.channel, data.server, {message: 'Topic set by '+data.set_by+' on '+new Date(data.time*1000), type: 'topic', from: null}); break; - case "nick_change": + case 'nick_change': irc.chat.nickChange(data.server, data.nick, data.newNick); break; - case "mode_add": - case "mode_del": - case "mode": + case 'mode_add': + case 'mode_del': + case 'mode': irc.chat.handleMode(data); break; - case "server_message": - if(data['error']) data.messageType = "error"; - if(irc.chat.getServerBuffer(data.server) == null) { + case 'server_message': + if(data['error']) data.messageType = 'error'; + if(irc.chat.getServerChatBuffer(data.server) == null) { if(!irc.serverChatQueue[data.server]) { irc.serverChatQueue[data.server] = []; } else { irc.serverChatQueue[data.server].push({type: data.messageType, message: data.message, from: data.from || null, time: new Date()}); } } else { - irc.chat.messageBuffer(data.server, data.server, {message: data.message, type: data.messageType, from: data.from || null}); + irc.chat.messageChatBuffer(data.server, data.server, {message: data.message, type: data.messageType, from: data.from || null}); } break; - case "connect_message": + case 'connect_message': irc.auther.authMessage(data.message, data.error); break; - case "whoisResponse": - whoisMessage(data.whois, irc.chat.getActiveBuffer()); + case 'whoisResponse': + whoisMessage(data.whois, irc.chat.getActiveChatBuffer()); break; - case "listedchan": - irc.chat.messageBuffer(data.server, data.server, {message: ""+data.channel+""+ - " "+data.users+" "+data.topic+"", - type: "listentry", from: data.from}); + case 'listedchan': + irc.chat.messageChatBuffer(data.server, data.server, {message: ''+data.channel+''+ + ' '+data.users+' '+data.topic+'', + type: 'listentry', from: data.from}); break; } }); diff --git a/public/js/theme.js b/src/script/theme.js similarity index 56% rename from public/js/theme.js rename to src/script/theme.js index 7768f91..f2414c2 100644 --- a/public/js/theme.js +++ b/src/script/theme.js @@ -1,38 +1,38 @@ function swapSheet(name) { - document.querySelector("#theme_stylesheet").setAttribute('href', "css/"+name+".css"); + document.querySelector('#theme_stylesheet').setAttribute('href', 'style/'+name+'.css'); } -window.themes = { +const themes = module.exports = { available: { default: { - name: "Default", - type: "bright", + name: 'Default', + type: 'bright', nick_pallete: { H: [1, 360], S: [30, 100], L: [30, 70] }, - stylesheet: "theme_default", + stylesheet: 'theme_default', default: true, colorSamples: { - toolbar: "#00c7e0", - background: "#f5f5f5" + toolbar: '#00c7e0', + background: '#f5f5f5' } }, night: { - name: "Night", - type: "dark", + name: 'Night', + type: 'dark', nick_pallete: { H: [1, 360], S: [30, 100], L: [50, 100] }, - stylesheet: "theme_night", + stylesheet: 'theme_night', default: false, colorSamples: { - toolbar: "#008e8e", - background: "#1d1d1d" + toolbar: '#008e8e', + background: '#1d1d1d' } } }, @@ -43,4 +43,4 @@ window.themes = { window.irc.config.theme = name; } } -} +}; diff --git a/public/stylus/layout.styl b/src/style/layout.styl similarity index 100% rename from public/stylus/layout.styl rename to src/style/layout.styl diff --git a/public/stylus/theme_default.styl b/src/style/theme_default.styl similarity index 100% rename from public/stylus/theme_default.styl rename to src/style/theme_default.styl diff --git a/public/stylus/theme_night.styl b/src/style/theme_night.styl similarity index 100% rename from public/stylus/theme_night.styl rename to src/style/theme_night.styl diff --git a/static/image/diamond.svg b/static/image/diamond.svg new file mode 100644 index 0000000..ff7f277 --- /dev/null +++ b/static/image/diamond.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + diff --git a/public/image/send.svg b/static/image/send.svg similarity index 100% rename from public/image/send.svg rename to static/image/send.svg diff --git a/public/image/settings.svg b/static/image/settings.svg similarity index 100% rename from public/image/settings.svg rename to static/image/settings.svg diff --git a/public/image/users.svg b/static/image/users.svg similarity index 100% rename from public/image/users.svg rename to static/image/users.svg diff --git a/teemant.js b/teemant.js index 76b7a1f..91a063b 100755 --- a/teemant.js +++ b/teemant.js @@ -1,19 +1,28 @@ #!/usr/bin/env node 'use strict'; -const express = require("express"), - path = require("path"), - sockio = require("socket.io"), - dns = require("dns"), - app = express(), - router = express.Router(), +const express = require('express'); +const path = require('path'); +const sockio = require('socket.io'); +const dns = require('dns'); +const app = express(); +const router = express.Router(); - pubdir = path.join(__dirname, "public"), - pkg = require(__dirname+"/package.json"), +const pubdir = path.join(__dirname, 'build'); +const pkg = require(__dirname+'/package.json'); - config = require(__dirname+'/server/config'), - logger = require(__dirname+'/server/logger'), +const config = require(__dirname+'/server/config'); +const logger = require(__dirname+'/server/logger'); - port = config.server.port || 8080; +const port = config.server.port || 8080; + +if (!String.prototype.format) { + String.prototype.format = function() { + var args = arguments; + return this.replace(/{(\d+)}/g, function(match, number) { + return typeof args[number] != undefined ? args[number] : match; + }); + }; +} let irclib = require(__dirname+'/server/teemant_irc'); let webirc = require(__dirname+'/server/webirc'); @@ -26,29 +35,36 @@ let connections = {}; let customCTCPs = { VERSION: function(data, connection) { - return "TeemantIRC ver. "+pkg.version+" - "+pkg.description+" - https://teemant.icynet.ml/"; + return 'TeemantIRC ver. {0} - {1} - https://teemant.icynet.ml/'.format(pkg.version, pkg.description); }, SOURCE: function(data, connection) { - return "https://github.com/DiamondtechDev/TeemantIRC"; + return 'https://github.com/DiamondtechDev/TeemantIRC'; } -} +}; process.stdin.resume(); -router.get("/", function(req, res){ - res.sendFile(pubdir+"/index.html"); +router.get('/', function(req, res){ + res.sendFile(pubdir+'/document/index.html'); }); -router.get("/:server", function(req, res){ - res.sendFile(pubdir+"/index.html"); +router.get('/:server', function(req, res){ + res.sendFile(pubdir+'/document/index.html'); }); app.use('/', express.static(pubdir, { maxAge: 365*24*60*60*1000 })); app.use('/:server', express.static(pubdir, { maxAge: 365*24*60*60*1000 })); + +app.use('/', express.static(pubdir+'/icons', { maxAge: 365*24*60*60*1000 })); +app.use('/:server', express.static(pubdir+'/icons', { maxAge: 365*24*60*60*1000 })); + +app.use('/', express.static(__dirname+'/static', { maxAge: 365*24*60*60*1000 })); +app.use('/:server', express.static(pubdir+'/static', { maxAge: 365*24*60*60*1000 })); + app.use('/', router); const io = sockio.listen(app.listen(port, function() { - logger.log("*** Listening on http://localhost:" + port + "/"); + logger.log('*** Listening on http://localhost:{0}/'.format(port)); setInterval(() => { logger.printRuntimeStats(runtime_stats, connections); @@ -67,12 +83,12 @@ function resolveHostname(ipaddr) { io.sockets.on('connection', function (socket) { let userip = socket.handshake.headers['x-real-ip'] || socket.handshake.headers['x-forwarded-for'] || - socket.request.connection._peername.address || "127.0.0.1"; + socket.request.connection._peername.address || '127.0.0.1'; if(userip.indexOf('::ffff:') == 0) userip = userip.substring(7); - logger.debugLog('clientID: '+socket.id+' from: ', userip); + logger.debugLog('clientID: {0} from: {1}'.format(socket.id, userip)); // New object for connections connections[socket.id] = { @@ -80,7 +96,7 @@ io.sockets.on('connection', function (socket) { ipaddr: userip, hostname: userip } - } + }; // Get the hostname of the connecting user let hostQuery = resolveHostname(userip); @@ -88,10 +104,10 @@ io.sockets.on('connection', function (socket) { if(arr.length > 0) connections[socket.id].host.hostname = arr[0]; }).catch((err) => { - logger.debugLog("Host resolve for "+socket.id+" failed: ", err); + logger.debugLog('Host resolve for {0} failed: {1}'.format(socket.id, err)); }); - logger.debugLog("Hostname of "+socket.id+" was determined to be "+connections[socket.id].host.hostname); + logger.debugLog('Hostname of {0} was determined to be {1}'.format(socket.id, connections[socket.id].host.hostname)); socket.on('disconnect', function() { for (let d in connections[socket.id]) { @@ -102,11 +118,11 @@ io.sockets.on('connection', function (socket) { delete connections[socket.id]; - logger.debugLog('clientID: '+socket.id+' disconnect'); + logger.debugLog('clientID: {0} disconnect'.format(socket.id)); }); socket.on('error', (e) => { - logger.errorLog(e, "Socket error"); + logger.errorLog(e, 'Socket error'); }); socket.on('userinput', (data) => { @@ -114,15 +130,15 @@ io.sockets.on('connection', function (socket) { if(!serv) return; if(serv.authenticated == false) return; - logger.debugLog("["+socket.id+"] ->", data); + logger.debugLog('['+socket.id+'] ->', data); serv.handler.handleUserLine(data); - }) + }); socket.on('irc_create', function(connectiondata) { - logger.debugLog(socket.id+" created irc connection: ", connectiondata); + logger.debugLog(socket.id+' created irc connection: ', connectiondata); - socket.emit('act_client', {type: 'connect_message', message: "Connecting to server..", error: false}); + socket.emit('act_client', {type: 'connect_message', message: 'Connecting to server..', error: false}); let newConnection = new irclib.IRCConnection(connectiondata, config.client, { @@ -137,7 +153,7 @@ io.sockets.on('connection', function (socket) { connections[socket.id][connectiondata.server] = newConnection; newConnection.on('authenticated', () => { - socket.emit('act_client', {type: "event_connect", address: connectiondata.server, network: newConnection.data.network, + socket.emit('act_client', {type: 'event_connect', address: connectiondata.server, network: newConnection.data.network, supportedModes: newConnection.data.supportedModes, nickname: newConnection.config.nickname, max_channel_length: newConnection.data.max_channel_length}); @@ -146,11 +162,11 @@ io.sockets.on('connection', function (socket) { if(config.server.debug) { newConnection.on('line', function(line) { - logger.debugLog("["+socket.id+"] <-", line); + logger.debugLog('['+socket.id+'] <-', line); }); newConnection.on('debug_log', function(data) { - logger.debugLog("["+socket.id+"] <-", data); + logger.debugLog('['+socket.id+'] <-', data); }); } @@ -159,7 +175,7 @@ io.sockets.on('connection', function (socket) { if(newConnection.authenticated == false) socket.emit('act_client', {type: 'connect_message', server: connectiondata.server, - message: "Failed to connect to the server!", error: true}); + message: 'Failed to connect to the server!', error: true}); }); newConnection.on('pass_to_client', (data) => { @@ -171,7 +187,7 @@ io.sockets.on('connection', function (socket) { if(newConnection.authenticated == false) socket.emit('act_client', {type: 'connect_message', server: connectiondata.server, - message: "Failed to connect to the server!", error: true}); + message: 'Failed to connect to the server!', error: true}); else socket.emit('act_client', {type: 'event_server_quit', server: connectiondata.server}); }); diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..f2ddcc9 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,49 @@ +'use strict'; + +const webpack = require('webpack'); +const path = require('path'); + +let inProduction = process.env.NODE_ENV === 'production' || process.argv.indexOf('-p') !== -1; + +module.exports = { + entry: { + main: ['./src/script/main'] + }, + output: { + path: __dirname, + filename: './build/script/[name].js', + chunkFilename: './build/script/[id].js' + }, + module: { + preLoaders: [ + // { test: /\.js$/, loader: 'eslint-loader', exclude: /node_modules/ }, + // { test: /\.coffee$/, loader: 'coffeelint-loader', exclude: /node_modules/ }, + ], + loaders: [ + // { test: /\.mustache$/, loader: 'mustache', exclude: /node_modules/ } + ], + noParse: [ + /node_modules/ + ] + }, + + resolve: { + extensions: ['', '.js', '.json'], + root: [path.join(__dirname, '/src/script')], + + alias: { + 'underscore': 'lodash' + } + }, + + plugins: [ + + new webpack.ProvidePlugin({ + // Detect and inject + _: 'underscore', + }) + ], + + devtool: 'inline-source-map', + debug: true +};