var utils = require('./../public/src/utils.js'), RDB = require('./redis.js'), async = require('async'), path = require('path'), fs = require('fs'); (function(Meta) { Meta.config = { get: function(callback) { RDB.hgetall('config', function(err, config) { if (!err) { config.status = 'ok'; callback(config); } else { callback({ status: 'error' }); } }); }, set: function(field, value, callback) { RDB.hset('config', field, value, function(err, res) { callback(err); }); }, remove: function(field) { RDB.hdel('config', field); } } Meta.themes = { get: function(callback) { var themePath = path.join(__dirname, '../', 'public/themes'); fs.readdir(themePath, function(err, files) { var themeArr = []; async.each(files, function(file, next) { fs.lstat(path.join(themePath, file), function(err, stats) { if(stats.isDirectory()) { var themeDir = file, themeConfPath = path.join(themePath, themeDir, 'theme.json'); fs.exists(themeConfPath, function(exists) { if (exists) { fs.readFile(themeConfPath, function(err, conf) { conf = JSON.parse(conf); conf.src = global.nconf.get('url') + 'themes/' + themeDir + '/' + conf.src; if (conf.screenshot) conf.screenshot = global.nconf.get('url') + 'themes/' + themeDir + '/' + conf.screenshot; else conf.screenshot = global.nconf.get('url') + 'images/themes/default.png'; themeArr.push(conf); next(); }); } }); } else next(); }); }, function(err) { callback(err, themeArr); }); }); }, saveViaGithub: function(repo_url, callback) { // ... } } Meta.build_title = function(title, current_user, callback) { var user = require('./user'); if (!title) title = global.config.title || 'NodeBB'; else title += ' | ' + global.config.title || 'NodeBB'; // Grab the number of unread notifications user.notifications.getUnreadCount(current_user, function(err, count) { if (!err && count > 0) title = '(' + count + ') ' + title; callback(err, title); }); } }(exports));