mirror of https://github.com/calzoneman/sync.git
Work on channel db stuff
This commit is contained in:
parent
8822fc5206
commit
a112700600
199
database.js
199
database.js
|
@ -281,4 +281,203 @@ Database.prototype.clearGlobalIPBan = function (ip, callback) {
|
||||||
|
|
||||||
/* END REGION */
|
/* END REGION */
|
||||||
|
|
||||||
|
/* REGION channels */
|
||||||
|
Database.prototype.registerChannel = function (name, owner, callback) {
|
||||||
|
if(typeof callback !== "function")
|
||||||
|
callback = function () { }
|
||||||
|
|
||||||
|
if(!name.match(/^[\w-_]+$/)) {
|
||||||
|
callback("Invalid channel name", null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
// I'm tempted to add a promise library to the dependencies
|
||||||
|
// just to solve this mess
|
||||||
|
|
||||||
|
var query = "SELECT * FROM channels WHERE name=?";
|
||||||
|
self.query(query, [name], function (err, res) {
|
||||||
|
if(!err && res.length > 0) {
|
||||||
|
callback("Channel already exists", null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Library table
|
||||||
|
query = ["CREATE TABLE `chan_" + name + "_library` (",
|
||||||
|
"`id` VARCHAR(255) NOT NULL,",
|
||||||
|
"`title` VARCHAR(255) NOT NULL,",
|
||||||
|
"`seconds` INT NOT NULL,",
|
||||||
|
"`type` VARCHAR(2) NOT NULL,",
|
||||||
|
"PRIMARY KEY (`id`))",
|
||||||
|
"ENGINE = MyISAM;"].join("");
|
||||||
|
self.query(query, function (err, res) {
|
||||||
|
if(err) {
|
||||||
|
callback(err, null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rank table
|
||||||
|
query = ["CREATE TABLE `chan_" + name + "_ranks` (",
|
||||||
|
"`name` VARCHAR(32) NOT NULL,",
|
||||||
|
"`rank` INT NOT NULL,",
|
||||||
|
"UNIQUE (`name`))",
|
||||||
|
"ENGINE = MyISAM;"].join("");
|
||||||
|
|
||||||
|
self.query(query, function (err, res) {
|
||||||
|
if(err) {
|
||||||
|
callback(err, null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ban table
|
||||||
|
query = ["CREATE TABLE `chan_" + name + "_bans` (",
|
||||||
|
"`ip` VARCHAR(15) NOT NULL,",
|
||||||
|
"`name` VARCHAR(32) NOT NULL,",
|
||||||
|
"`banner` VARCHAR(32) NOT NULL,",
|
||||||
|
"PRIMARY KEY (`ip`))",
|
||||||
|
"ENGINE = MyISAM;"].join("");
|
||||||
|
|
||||||
|
self.query(query, function (err, res) {
|
||||||
|
if(err) {
|
||||||
|
callback(err, null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
query = "INSERT INTO channels VALUES (NULL, ?, ?)";
|
||||||
|
self.query(query, [name, owner], function (err, res) {
|
||||||
|
callback(err, res);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
Database.prototype.loadChannelData = function (chan, callback) {
|
||||||
|
if(!chan.name.match(/^[\w-_]+$/)) {
|
||||||
|
callback("Invalid channel name", null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var self = this;
|
||||||
|
var query = "SELECT * FROM channels WHERE name=?";
|
||||||
|
|
||||||
|
self.query(query, [chan.name], function (err, res) {
|
||||||
|
if(err) {
|
||||||
|
callback(err, null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(res.length == 0) {
|
||||||
|
callback("Channel is unregistered", null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(res[0].name != chan.name)
|
||||||
|
chan.name = rows[0].name;
|
||||||
|
chan.registered = true;
|
||||||
|
|
||||||
|
// Load bans
|
||||||
|
query = "SELECT * FROM `chan_" + chan.name + "_bans`";
|
||||||
|
self.query(query, function (err, res) {
|
||||||
|
if(err) {
|
||||||
|
callback(err, null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(var i in res) {
|
||||||
|
var r = res[i];
|
||||||
|
if(r.ip === "*")
|
||||||
|
chan.namebans[r.name] = r.banner;
|
||||||
|
else
|
||||||
|
chan.ipbans[r.ip] = [r.name, r.banner];
|
||||||
|
}
|
||||||
|
|
||||||
|
chan.logger.log("*** Loaded channel from database");
|
||||||
|
callback(null, true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
Database.prototype.dropChannel = function (name, callback) {
|
||||||
|
if(!name.match(/^[\w-_]+$/)) {
|
||||||
|
callback("Invalid channel name", null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var self = this;
|
||||||
|
var query = "DROP TABLE `chan_?_bans`,`chan_?_ranks`,`chan_?_library`"
|
||||||
|
.replace(/\?/g, name);
|
||||||
|
|
||||||
|
self.query(query, function (err, res) {
|
||||||
|
if(err) {
|
||||||
|
Logger.errlog.log("! Failed to drop channel tables for "+name);
|
||||||
|
callback(err, null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
query = "DELETE FROM channels WHERE name=?";
|
||||||
|
self.query(query, [name], function (err, res) {
|
||||||
|
callback(err, res);
|
||||||
|
if(err) {
|
||||||
|
Logger.errlog.log("! Failed to delete channel "+name);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
Database.prototype.getChannelRank = function (channame, names, callback) {
|
||||||
|
if(typeof names === "string")
|
||||||
|
names = [names];
|
||||||
|
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
// Build the query template (?, ?, ?, ?, ...)
|
||||||
|
var nlist = [];
|
||||||
|
for(var i in names)
|
||||||
|
nlist.push("?");
|
||||||
|
nlist = "(" + nlist.join(",") + ")";
|
||||||
|
|
||||||
|
var query = "SELECT name, rank FROM `chan_" + channame + "_ranks`" +
|
||||||
|
"WHERE name IN " + nlist;
|
||||||
|
|
||||||
|
self.query(query, names, function (err, res) {
|
||||||
|
if(err) {
|
||||||
|
Logger.errlog.log("! Failed to lookup " + channame + " ranks");
|
||||||
|
if(names.length == 1)
|
||||||
|
callback(err, 0);
|
||||||
|
else
|
||||||
|
callback(err, []);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(names.length == 1) {
|
||||||
|
if(res.length == 0)
|
||||||
|
callback(null, 0);
|
||||||
|
else
|
||||||
|
callback(null, res[0].rank);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
callback(null, res);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
Database.prototype.setChannelRank = function (channame, name, rank, callback) {
|
||||||
|
if(!channame.match(/^[\w-_]+$/)) {
|
||||||
|
callback("Invalid channel name", null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var self = this;
|
||||||
|
var query = "INSERT INTO `chan_" + channame + "_ranks` " +
|
||||||
|
"(name, rank) VALUES (?, ?) " +
|
||||||
|
"ON DUPLICATE KEY UPDATE rank=?";
|
||||||
|
|
||||||
|
self.query(query, [name, rank, rank], function (err, res) {
|
||||||
|
callback(err, res);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
module.exports = Database;
|
module.exports = Database;
|
||||||
|
|
Loading…
Reference in New Issue