Hej alle!
Jeg skrev denne IRC bot for et stykke tid siden, da jeg gerne ville have en desktop notification hver gang, der var nogen der skrev i vores IRC servers #feed kanal.
Den har virket fint indtil videre for mig, dog er det irriterende at åbne for appen hver gang, i stedet for at det kører som en Chrome extension.
Grunden til at det kører som en Chrome App og ikke extension, er fordi du kun kan give rettigheder til sockets (ikke websockets) i Chrome Apps. Jeg havde tænkt mig at sætte en simpel Python server op, der havde en helt normal IRC bot på, men som man kunne forbinde til via websockets. På den måde, kan man nemlig lave det i en extension og have den til at køre i baggrunden hele tiden. Tiden løb sgu fra mig, så har ikke tid til at lave det nu.
Nyttigt information
Hvis du skal sætte denne bot til andre IRC servere, skal du finde en anden port en IRCs default 6667 port. Du får i hvert fald (i Chrome) denne fejl:
Kode:
Uncaught DOMException: Failed to construct 'WebSocket': The port 6667 is not allowed
Og det gør man med mange, mange andre porte også. Lidt synd, men sådan er det vel.
Hvis du selv vil bruge dette til irc.shellsec.pw serveren, er den perfekt til det formål. Dog ville jeg have lavet en ordentlig "parser" (eller hvad man vil kalde det), som passer lidt bedre til IRCs måde at vise beskeder på. Dog smed jeg det bare ind så det virkede.
Skal du bruge den til en anden server, skal du nok også liiiige lave ping pong ordentligt. Lige nu svarer den bare med "PONG :irc.shellsec.pw", da det er det eneste man modtager som PING.
Jeg har valideret den umiddelbart, så man ikke bare kan lave en ny tråd der hedder 'alert(123);' og det så bliver executed.. Mener jeg. Who knows. Det virkede ikke for mig, men prøv gerne.
manifest.json
{
"name": "IRC bot til ShellSec",
"description": "Denne app laver desktop notifikationer fra IRCens #feed kanal",
"manifest_version": 2,
"version": "1.0",
"icons": {
"128": "icon.png"
},
"sockets": {
"tcp": {
"connect": "irc.shellsec.pw:7994"
},
"tcpServer": {
"connect": "irc.shellsec.pw:7994"
}
},
"permissions": [
"app.window",
"notifications"
],
"app": {
"background": {
"scripts": ["background.js"]
}
}
}
background.js
var host = "irc.shellsec.pw";
var nick = "AshBOT";
var ident = nick;
var channel = "feed";
var socketId;
document.addEventListener('DOMContentLoaded', function () {
if (Notification.permission !== "granted") Notification.requestPermission();
});
function notify(name, message) {
if(name == "Shellsec") {
var url = "http://shellsec.pw/";
try {
var array = message.split(":");
url = array[array.length - 2] + ":" + array[array.length - 1];
} catch(err) {
console.log("URL Error: " + err);
}
if (!Notification) {
console.log('Desktop notifications not available in your browser.');
return;
}
if (Notification.permission !== "granted") Notification.requestPermission();
else {
var notification = new Notification('Ny besked fra ' + name, {
icon: 'https://cdn.shellsec.pw/images/fb-thumb.png',
body: message
});
notification.onclick = function () {
window.open(url);
notification.close();
};
}
}
}
//Credit to whoever created this arraybuffer to string method
function ab2str(buffer) {
return String.fromCharCode.apply(null, new Uint8Array(buffer));
}
//Credit to whoever created this string to arraybuffer
function str2ab(str) {
var buf = new ArrayBuffer(str.length);
var bufView = new Uint8Array(buf);
for (var i = 0, strLen = str.length; i < strLen; i++) {
bufView[i] = str.charCodeAt(i);
}
return buf;
}
function send(message) {
message = unescape(encodeURIComponent(message));
chrome.sockets.tcp.send(socketId, str2ab(message + "\r\n"), function (info) {
return info;
});
}
chrome.sockets.tcp.create({}, function (createInfo) {
socketId = createInfo.socketId;
var commands = ["USER " + ident + " " + ident + " " + ident + " " + ident, "NICK " + nick, "JOIN #" + channel];
chrome.sockets.tcp.connect(socketId, "irc.shellsec.pw", 7994, function (callback) {
setTimeout(function () {
for (i = 0; i < commands.length; i++) {
console.log(JSON.stringify(send(commands[i])));
}
}, 1000);
});
chrome.sockets.tcp.onReceive.addListener(function (info) {
var message = decodeURIComponent(escape(ab2str(info.data)));
if (message.indexOf("PRIVMSG") >= 1) {
console.log("Message received!");
var name = /:(.*?)!/.exec(message)[1];
var message = (new RegExp("PRIVMSG #" + channel + " :(.*)")).exec(message)[1];
notify(name, message);
}
if (info.socketId != socketId) {
return;
}
if (message.trim() == "PING :irc.shellsec.pw") {
send("PONG :irc.shellsec.pw");
console.log("PONG SENT");
}
});
});
icon.png
http://i.imgur.com/sCWrQyo.png
icon.png er bare et random billede jeg fandt. Erstat den gerne.
Hvis I har brug for mere information, så kan I bare spørge. Skal med glæde svare og hjælpe jer med det her.
Oh og installation foregår simpelt nok:
Smid alle 3 filer ind i en mappe. Navndøb dem som der står skrevet. Pak derefter MAPPEN ind i en zip-fil. Åbn chrome://extensions/ og slå developer mode til, så burde du kunne dragge zip-filen derind.