2014-02-17 21:00:31 +01:00
|
|
|
/**
|
|
|
|
* Module Name: Radio
|
|
|
|
* Description: Various icecast functionality.
|
|
|
|
*/
|
|
|
|
|
|
|
|
var _ = require('underscore')._,
|
|
|
|
icecast = require('icecast-stack');
|
|
|
|
|
|
|
|
var radio = function(dbot) {
|
|
|
|
this.listening = false;
|
|
|
|
this.data = false;
|
2014-02-17 21:31:20 +01:00
|
|
|
this.stream = false;
|
2014-02-17 21:00:31 +01:00
|
|
|
this.internalAPI = {
|
|
|
|
'startRadio': function() {
|
|
|
|
var stream = icecast.createReadStream(this.config.stream);
|
2014-02-17 21:31:20 +01:00
|
|
|
this.stream = stream;
|
2014-02-17 21:00:31 +01:00
|
|
|
|
|
|
|
stream.on('connect', function() {
|
|
|
|
this.listening = true;
|
|
|
|
}.bind(this));
|
|
|
|
|
|
|
|
stream.on('response', function(res) {
|
|
|
|
this.data = res.headers;
|
|
|
|
_.each(this.config.announce, function(a) {
|
|
|
|
dbot.say(a.server, a.name, dbot.t('now_online', {
|
|
|
|
'name': res.headers['icy-name'],
|
|
|
|
'desc': res.headers['icy-description'],
|
|
|
|
'url': res.headers['icy-url']
|
|
|
|
}));
|
|
|
|
});
|
|
|
|
}.bind(this));
|
|
|
|
|
|
|
|
stream.on('metadata', function(metadata) {
|
|
|
|
var title = icecast.parseMetadata(metadata).StreamTitle;
|
2014-07-19 21:58:22 +02:00
|
|
|
if(!_.isUndefined(title)) {
|
|
|
|
_.each(this.config.announce, function(a) {
|
|
|
|
dbot.say(a.server, a.name, dbot.t('now_playing', {
|
|
|
|
'name': this.data['icy-name'],
|
|
|
|
'song': title,
|
|
|
|
'url': this.data['icy-url']
|
|
|
|
}));
|
|
|
|
}, this);
|
|
|
|
}
|
2014-02-17 21:00:31 +01:00
|
|
|
}.bind(this));
|
2014-02-17 21:11:11 +01:00
|
|
|
|
|
|
|
stream.on('end', function() {
|
|
|
|
this.listening = false;
|
|
|
|
}.bind(this));
|
|
|
|
}.bind(this),
|
2014-02-17 21:00:31 +01:00
|
|
|
};
|
2014-02-20 21:10:45 +01:00
|
|
|
|
|
|
|
this.commands={
|
|
|
|
'~request': function(event){
|
|
|
|
var dj = this.data['icy-description'],
|
|
|
|
song = event.input[1];
|
2014-07-19 18:57:45 +02:00
|
|
|
|
|
|
|
dbot.api.users.resolveUser(event.server, dj, function(user) {
|
|
|
|
if(user) {
|
|
|
|
dbot.say(event.server, user.currentNick, dbot.t('radio_request',{
|
|
|
|
'user': event.user,
|
|
|
|
'song': song
|
|
|
|
}));
|
|
|
|
event.reply('Song request sent to DJ ' + user.currentNick + '!');
|
|
|
|
} else {
|
|
|
|
event.reply('Couldn\'t find DJ ' + dj + ' on IRC :(');
|
|
|
|
}
|
|
|
|
});
|
2014-02-20 21:10:45 +01:00
|
|
|
}
|
|
|
|
};
|
2014-07-19 21:58:22 +02:00
|
|
|
this.commands['~request'].regex = [/^request (.*)/, 2];
|
2014-02-18 17:17:39 +01:00
|
|
|
|
2014-02-17 21:00:31 +01:00
|
|
|
this.onLoad = function() {
|
2014-02-20 18:38:58 +01:00
|
|
|
this.internalAPI.startRadio();
|
|
|
|
dbot.api.timers.addTimer(20000, function() {
|
2014-07-19 21:58:22 +02:00
|
|
|
if(this.listening === false) {
|
2014-02-20 18:38:58 +01:00
|
|
|
this.internalAPI.startRadio();
|
|
|
|
}
|
|
|
|
}.bind(this));
|
2014-02-17 21:00:31 +01:00
|
|
|
}.bind(this);
|
2014-02-17 21:31:20 +01:00
|
|
|
this.onDestroy = function() {
|
2014-02-20 18:38:58 +01:00
|
|
|
this.stream.end();
|
|
|
|
this.stream.destroy();
|
2014-02-17 21:31:20 +01:00
|
|
|
}.bind(this);
|
2014-02-17 21:00:31 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
exports.fetch = function(dbot) {
|
|
|
|
return new radio(dbot);
|
|
|
|
};
|