Refuctor channel related db functions
This commit is contained in:
parent
db5dcf86f7
commit
fe00fb8c83
3 changed files with 320 additions and 535 deletions
|
|
@ -1,5 +1,5 @@
|
|||
var db = require("../database");
|
||||
var $util = require("../utilities");
|
||||
var valid = require("../utilities").isValidChannelName;
|
||||
|
||||
var blackHole = function () { };
|
||||
|
||||
|
|
@ -19,7 +19,7 @@ function createLibraryTable(name, callback) {
|
|||
db.query("CREATE TABLE `chan_" + name + "_library` (" +
|
||||
"`id` VARCHAR(255) NOT NULL," +
|
||||
"`title` VARCHAR(255) NOT NULL," +
|
||||
"`seconds` INT NOT NULL,"
|
||||
"`seconds` INT NOT NULL," +
|
||||
"`type` VARCHAR(2) NOT NULL," +
|
||||
"PRIMARY KEY (`id`))" +
|
||||
"CHARACTER SET utf8", callback);
|
||||
|
|
@ -36,6 +36,10 @@ function createBansTable(name, callback) {
|
|||
}
|
||||
|
||||
function initTables(name, owner, callback) {
|
||||
if (!valid(chan)) {
|
||||
callback("Invalid channel name", null);
|
||||
return;
|
||||
}
|
||||
createRanksTable(name, function (err) {
|
||||
if (err) {
|
||||
callback(err, null);
|
||||
|
|
@ -58,7 +62,7 @@ function initTables(name, owner, callback) {
|
|||
callback(err, null);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
callback(null, true);
|
||||
});
|
||||
});
|
||||
|
|
@ -87,6 +91,11 @@ module.exports = {
|
|||
return;
|
||||
}
|
||||
|
||||
if (!valid(chan)) {
|
||||
callback("Invalid channel name", null);
|
||||
return;
|
||||
}
|
||||
|
||||
dbutil.query("SELECT name FROM `channels` WHERE name=?",
|
||||
[name],
|
||||
function (err, rows) {
|
||||
|
|
@ -106,6 +115,11 @@ module.exports = {
|
|||
return;
|
||||
}
|
||||
|
||||
if (!valid(chan)) {
|
||||
callback("Invalid channel name", null);
|
||||
return;
|
||||
}
|
||||
|
||||
dbutil.query("SELECT * FROM `channels` WHERE name=?",
|
||||
[name],
|
||||
function (err, rows) {
|
||||
|
|
@ -149,7 +163,7 @@ module.exports = {
|
|||
return;
|
||||
}
|
||||
|
||||
if (!$util.isValidChannelName(name)) {
|
||||
if (!valid(name)) {
|
||||
callback("Invalid channel name. Channel names may consist of 1-30 " +
|
||||
"characters a-z, A-Z, 0-9, -, and _", null);
|
||||
return;
|
||||
|
|
@ -197,6 +211,11 @@ module.exports = {
|
|||
callback = blackHole;
|
||||
}
|
||||
|
||||
if (!valid(chan)) {
|
||||
callback("Invalid channel name", null);
|
||||
return;
|
||||
}
|
||||
|
||||
dropTable("chan_" + name + "_ranks", function (err) {
|
||||
dropTable("chan_" + name + "_bans", function (e2) {
|
||||
if (err && e2) {
|
||||
|
|
@ -221,7 +240,7 @@ module.exports = {
|
|||
}
|
||||
|
||||
callback(err, !Boolean(err));
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
@ -246,6 +265,68 @@ module.exports = {
|
|||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Loads the channel from the database
|
||||
*/
|
||||
load: function (chan, callback) {
|
||||
if (typeof callback !== "function") {
|
||||
callback = blackHole;
|
||||
}
|
||||
|
||||
if (!valid(chan.name)) {
|
||||
callback("Invalid channel name", null);
|
||||
return;
|
||||
}
|
||||
|
||||
db.query("SELECT * FROM `channels` WHERE name=?", chan.name, function (err, res) {
|
||||
if (err) {
|
||||
callback(err, null);
|
||||
return;
|
||||
}
|
||||
|
||||
if (res.length === 0) {
|
||||
callback("Channel is not registered", null);
|
||||
return;
|
||||
}
|
||||
|
||||
if (chan.dead) {
|
||||
callback("Channel is dead", null);
|
||||
return;
|
||||
}
|
||||
|
||||
// Note that before this line, chan.name might have a different capitalization
|
||||
// than the database has stored. Update accordingly.
|
||||
chan.name = res[0].name;
|
||||
chan.canonical_name = chan.name.toLowerCase();
|
||||
chan.registered = true;
|
||||
|
||||
// Load bans
|
||||
db.query("SELECT * FROM `chan_" + chan.name + "_bans`", function (err, rows) {
|
||||
if (chan.dead) {
|
||||
callback("Channel is dead", null);
|
||||
return;
|
||||
}
|
||||
|
||||
if (err) {
|
||||
callback(err, null);
|
||||
return;
|
||||
}
|
||||
|
||||
for (var i = 0; i < rows.length; i++) {
|
||||
var r = rows[i];
|
||||
if (r.ip === "*") {
|
||||
chan.namebans[r.name] = r;
|
||||
} else {
|
||||
chan.ipbans[r.ip] = r;
|
||||
}
|
||||
}
|
||||
|
||||
chan.logger.log("*** Loaded channel from database");
|
||||
callback(null, true);
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Looks up a user's rank
|
||||
*/
|
||||
|
|
@ -254,6 +335,11 @@ module.exports = {
|
|||
return;
|
||||
}
|
||||
|
||||
if (!valid(chan)) {
|
||||
callback("Invalid channel name", null);
|
||||
return;
|
||||
}
|
||||
|
||||
db.query("SELECT name,rank FROM `chan_" + chan + "_ranks` WHERE name=?",
|
||||
[name],
|
||||
function (err, rows) {
|
||||
|
|
@ -279,6 +365,11 @@ module.exports = {
|
|||
return;
|
||||
}
|
||||
|
||||
if (!valid(chan)) {
|
||||
callback("Invalid channel name", null);
|
||||
return;
|
||||
}
|
||||
|
||||
var replace = "(" + names.map(function () { return "?"; }).join(",") + ")";
|
||||
db.query("SELECT name,rank FROM `chan_" + chan + "_ranks` WHERE name IN " +
|
||||
replace,
|
||||
|
|
@ -291,4 +382,195 @@ module.exports = {
|
|||
callback(null, rows);
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Query all user ranks at once
|
||||
*/
|
||||
allRanks: function (chan, callback) {
|
||||
if (typeof callback !== "function") {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!valid(chan)) {
|
||||
callback("Invalid channel name", null);
|
||||
return;
|
||||
}
|
||||
|
||||
db.query("SELECT name,rank FROM `chan_" + chan + "_ranks` WHERE 1", callback);
|
||||
},
|
||||
|
||||
/**
|
||||
* Updates a user's rank
|
||||
*/
|
||||
setRank: function (chan, name, rank, callback) {
|
||||
if (typeof callback !== "function") {
|
||||
callback = blackHole;
|
||||
}
|
||||
|
||||
if (!valid(chan)) {
|
||||
callback("Invalid channel name", null);
|
||||
return;
|
||||
}
|
||||
|
||||
db.query("INSERT INTO `chan_" + chan + "_ranks` (name, rank) VALUES (?, ?) " +
|
||||
"ON DUPLICATE KEY UPDATE rank=?", [name, rank, rank], callback);
|
||||
},
|
||||
|
||||
/**
|
||||
* Inserts a new user rank entry without clobbering an existing one
|
||||
*/
|
||||
newRank: function (chan, name, rank, callback) {
|
||||
if (typeof callback !== "function") {
|
||||
callback = blackHole;
|
||||
}
|
||||
|
||||
if (!valid(chan)) {
|
||||
callback("Invalid channel name", null);
|
||||
return;
|
||||
}
|
||||
|
||||
db.query("INSERT INTO `chan_" + chan + "_ranks` (name, rank) VALUES (?, ?) " +
|
||||
"ON DUPLICATE KEY UPDATE rank=rank", [name, rank], callback);
|
||||
},
|
||||
|
||||
/**
|
||||
* Removes a user's rank entry
|
||||
*/
|
||||
deleteRank: function (chan, name, callback) {
|
||||
if (typeof callback !== "function") {
|
||||
callback = blackHole;
|
||||
}
|
||||
|
||||
if (!valid(chan)) {
|
||||
callback("Invalid channel name", null);
|
||||
return;
|
||||
}
|
||||
|
||||
db.query("DELETE FROM `chan_" + chan + "_ranks` WHERE name=?", [name], callback);
|
||||
},
|
||||
|
||||
/**
|
||||
* Adds a media item to the library
|
||||
*/
|
||||
addToLibrary: function (chan, media, callback) {
|
||||
if (typeof callback !== "function") {
|
||||
callback = blackHole;
|
||||
}
|
||||
|
||||
if (!valid(chan)) {
|
||||
callback("Invalid channel name", null);
|
||||
return;
|
||||
}
|
||||
|
||||
db.query("INSERT INTO `chan_" + chan + "_library` (id, title, seconds, type) " +
|
||||
"VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE id=id",
|
||||
[media.id, media.title, media.seconds, media.type], callback);
|
||||
},
|
||||
|
||||
/**
|
||||
* Retrieves a media item from the library by id
|
||||
*/
|
||||
getLibraryItem: function (chan, id, callback) {
|
||||
if (typeof callback !== "function") {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!valid(chan)) {
|
||||
callback("Invalid channel name", null);
|
||||
return;
|
||||
}
|
||||
|
||||
db.query("SELECT * FROM `chan_" + chan + "_library` WHERE id=?", [id],
|
||||
function (err, rows) {
|
||||
if (err) {
|
||||
callback(err, null);
|
||||
return;
|
||||
}
|
||||
|
||||
if (rows.length === 0) {
|
||||
callback("Item not in library", null);
|
||||
} else {
|
||||
callback(null, rows[0]);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Search the library by title
|
||||
*/
|
||||
searchLibrary: function (chan, search, callback) {
|
||||
if (typeof callback !== "function") {
|
||||
return;
|
||||
}
|
||||
|
||||
db.query("SELECT * FROM `chan_" + chan + "_library` WHERE title LIKE ?",
|
||||
["%" + search + "%"], callback);
|
||||
},
|
||||
|
||||
/**
|
||||
* Deletes a media item from the library
|
||||
*/
|
||||
deleteFromLibrary: function (chan, id, callback) {
|
||||
if (typeof callback !== "function") {
|
||||
callback = blackHole;
|
||||
}
|
||||
|
||||
if (!valid(chan)) {
|
||||
callback("Invalid channel name", null);
|
||||
return;
|
||||
}
|
||||
|
||||
db.query("DELETE FROM `chan_" + chan + "_library` WHERE id=?", [id], callback);
|
||||
},
|
||||
|
||||
/**
|
||||
* Add a ban to the banlist
|
||||
*/
|
||||
ban: function (chan, ip, name, note, bannedby, callback) {
|
||||
if (typeof callback !== "function") {
|
||||
callback = blackHole;
|
||||
}
|
||||
|
||||
if (!valid(chan)) {
|
||||
callback("Invalid channel name", null);
|
||||
return;
|
||||
}
|
||||
|
||||
db.query("INSERT INTO `chan_" + chan + "_bans` (ip, name, reason, bannedby) " +
|
||||
"VALUES (?, ?, ?, ?)", [ip, name, reason, bannedby], callback);
|
||||
},
|
||||
|
||||
/**
|
||||
* Removes a ban from the banlist
|
||||
*/
|
||||
unbanName: function (chan, name, callback) {
|
||||
if (typeof callback !== "function") {
|
||||
callback = blackHole;
|
||||
}
|
||||
|
||||
if (!valid(chan)) {
|
||||
callback("Invalid channel name", null);
|
||||
return;
|
||||
}
|
||||
|
||||
db.query("DELETE FROM `chan_" + chan + "_bans` WHERE ip='*' AND name=?",
|
||||
[name], callback);
|
||||
},
|
||||
|
||||
/**
|
||||
* Removes a ban from the banlist
|
||||
*/
|
||||
unbanIP: function (chan, ip, callback) {
|
||||
if (typeof callback !== "function") {
|
||||
callback = blackHole;
|
||||
}
|
||||
|
||||
if (!valid(chan)) {
|
||||
callback("Invalid channel name", null);
|
||||
return;
|
||||
}
|
||||
|
||||
db.query("DELETE FROM `chan_" + chan + "_bans` WHERE ip=?",
|
||||
[ip], callback);
|
||||
}
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue