1 /* this bot has some privileged commands. in order to authenticate to the bot,
2 send the command ",op" once you brought it online for the first time.
3 it will then write your hostmask into the json savefile and will from then
4 on only accept privileged commands from your hostmask.
5 note: that means you should use a registered account so your hostmask
10 var connected
= false;
13 var settings
= (function() {
14 var tmp
= readsettings() ||
15 '{"chans":{"#reaver":{"autojoin":true}},"doAuth":false,"nickservpass":"p4ssw0rd"}';
16 return JSON
.parse(tmp
);
18 function part(chan
) {send("PART " + chan
);}
19 function join(chan
) {send("JOIN " + chan
);}
20 function init_chan_settings(chan
) {
21 if(!(chan
in settings
.chans
)) settings
.chans
[chan
] = {};
23 function get_chan_setting(chan
, setting
) {
24 init_chan_settings(chan
);
25 return settings
.chans
[chan
][setting
];
27 /* this function is the first function called after the bot is
28 * connected. use it to load settings, auth, join channels, etc */
31 for(var chan
in settings
.chans
) {
32 if(get_chan_setting(chan
, "autojoin")) join(chan
);
36 function save_settings() {writesettings(JSON
.stringify(settings
, null, "\t"));}
38 function set_global(key
, value
) {
39 settings
[key
] = value
;
42 function set_chan(chan
, key
, value
) {
43 init_chan_settings(chan
);
44 settings
.chans
[chan
][key
] = value
;
48 function add_note(chan
, mask
, rcp
, msg
) {
49 init_chan_settings(chan
);
50 if(!("notes" in settings
.chans
[chan
]))
51 settings
.chans
[chan
]["notes"] = [];
52 settings
.chans
[chan
]["notes"].push(
53 {"sender":nick_from_mask(mask
), "recipient": rcp
, "message":msg
});
57 function dispatch_note(chan
, index
) {
58 var note
= settings
.chans
[chan
]["notes"].splice(index
,1)[0];
59 privmsg(chan
, note
.recipient
+ ": " + note
.sender
+ " left the following note for you: " + note
.message
);
62 function check_notes(chan
, usr
) {
63 if("notes" in settings
.chans
[chan
]) {
64 for (var i
= 0; i
< settings
.chans
[chan
]["notes"].length
;) {
65 var note
= settings
.chans
[chan
]["notes"][i
];
66 if(note
.recipient
=== usr
) dispatch_note(chan
, i
);
72 function botnick(nick
) {
75 function selfjoin(chan
, nick
) {
76 // privmsg(settings.master, "selfjoin chan " + chan + ", nick "+ nick);
79 if(get_chan_setting(chan
, "dogreet")) privmsg(chan
, "hi " + chan
);
81 function has_status_sign(name
) {
82 return (name
.charAt(0) === '@' || name
.charAt(0) === '+');
84 function nameshandler(chan
, namelist
) {
85 if(typeof names
=== 'undefined') names
= {};
86 var nameblock
= namelist
.split(" ");
87 if(!(chan
in names
)) names
[chan
] = nameblock
;
88 else names
[chan
] = names
[chan
].concat(nameblock
);
90 // remove operator and voice signs
91 for(var i
=0; i
<names
[chan
].length
;i
++) {
92 if(has_status_sign(names
[chan
][i
]))
93 names
[chan
][i
] = names
[chan
][i
].substring(1);
96 function add_name(chan
, name
) {
97 names
[chan
].push(name
);
99 function remove_name(chan
, name
) {
100 for(var i
= 0; i
< names
[chan
].length
; i
++)
101 if(names
[chan
][i
] === name
) {
102 names
[chan
].splice(i
,1);
106 function change_name(chan
, name
, newname
) {
107 for(var i
= 0; i
< names
[chan
].length
; i
++)
108 if(names
[chan
][i
] === name
) {
109 names
[chan
][i
] = newname
;
113 function remove_name_global(name
) {
114 for(var chan
in names
) {
115 remove_name(chan
, name
);
118 function nickchange(oldnick
, newnick
) {
119 //privmsg(settings.master, "nickchange " + oldnick + " -> " + newnick);
120 for(var chan
in names
) {
121 change_name(chan
, oldnick
, newnick
);
124 function quithandler(nick
, mask
, msg
) {
125 if(get_chan_setting(lastchan
, "dogreet"))
126 privmsg(lastchan
, "hmm. " + nick
+ " didn't like it here (" + msg
+ ")");
127 remove_name_global(nick
);
129 function joinhandler(chan
, nick
, mask
) {
131 if(nick
!== botname
) {
132 if(get_chan_setting(chan
, "dogreet"))
133 privmsg(chan
, "Hello "+nick
+". I am " + settings
.master
+ "'s bot. If you want to talk to him, please be patient and wait here.");
134 add_name(chan
, nick
);
135 check_notes(chan
, nick
);
138 function parthandler(chan
, nick
, mask
, msg
) {
140 if(get_chan_setting(chan
, "dogreet"))
141 privmsg(chan
, "oh, "+nick
+" left :/ (reason: " + msg
+ ")");
142 remove_name(chan
, nick
);
144 function kickhandler(nick
, mask
, whom
, chan
, msg
) {
145 privmsg(chan
, "WOOT! " + nick
+ " kicked " + whom
+ "because of " + msg
);
148 function nick_from_mask(mask
) {
149 return(mask
.substring(0, mask
.indexOf('!')));
152 function hex2bin(input
) {
153 var hextab
= "0123456789abcdef";
155 for(var i
= 0; i
< input
.length
; i
+=2) {
156 var h1
= hextab
.indexOf(input
.charAt(i
));
157 var h2
= hextab
.indexOf(input
.charAt(i
+1));
158 out
= out
+ String
.fromCharCode((h1
<< 4) | h2
);
163 function sanitize_value(v
) {
164 if(v
=== "false" || v
=== "0") return false;
165 if(v
=== "true" || v
=== "1") return true;
169 function runcmd(chan
, mask
, cmd
, args
) {
170 var isop
= settings
.opmask
? mask
.match(RegExp(settings
.opmask
)) : false;
172 } else if(cmd
=== 'op' && !settings
.opmask
) {
173 var a
= mask
.split("!");
174 settings
.opmask
= ".*!" + a
[1];
175 settings
.master
= a
[0];
177 privmsg(chan
, "opmask assigned");
178 } else if(cmd
=== "reload" && isop
) {
179 if(!reload()) privmsg(chan
, "oops. reload failed.");
180 else privmsg(chan
, "reload OK.");
181 } else if(cmd
=== 'say') {
183 } else if(cmd
=== 'nick') {
184 privmsg(chan
, nick_from_mask(mask
));
185 } else if(cmd
=== 'eval' && isop
) {
186 privmsg(chan
, eval(args
));
187 } else if(cmd
=== 'disconnect' && isop
) {
191 } else if(cmd
=== 'join' && isop
) {
193 } else if(cmd
== 'note' && isop
) {
194 var x
= args
.indexOf(' ');
196 privmsg(chan
, "syntax: note recipient message");
199 var rcp
= args
.substring(0,x
);
200 var msg
= args
.substring(x
+1);
201 if(add_note(chan
, mask
, rcp
, msg
))
202 privmsg(chan
, "your note to " + rcp
+ " was saved, " + nick_from_mask(mask
));
203 } else if((cmd
== 'setg' || cmd
== 'setc') && isop
) {
204 var x
= args
.indexOf(' ');
206 privmsg(chan
, "invalid command");
209 var k
= args
.substring(0,x
);
210 var v
= sanitize_value(args
.substring(x
+1));
211 if(cmd
== 'setg') set_global(k
,v
);
212 else set_chan(chan
, k
, v
);
213 } else if(cmd
== 'leave' && isop
) {
215 } else if(cmd
== 'settings' && isop
) {
216 privmsg(chan
, JSON
.stringify(settings
));
217 } else if(cmd
== 'hex' && isop
) {
218 // attention, this can be abused to make the bot send raw commands
219 // for example with 0a51554954
220 privmsg(chan
, hex2bin(args
));
224 function noticehandler(dest
, nick
, mask
, msg
) {
226 if(connected && lastchan && dest.charAt(0) !== '*')
227 privmsg(master, nick + " noticed " + dest + " of " + msg);
231 function msghandler(chan
, nick
, mask
, msg
) {
234 if(chan
.charAt(0) !== '#') {
239 if(nick
== botname
) return;
240 if(msg
.charAt(0) == ',') {
241 var x
= msg
.indexOf(' ');
242 if(x
== -1) x
= msg
.length
;
243 var cmd
= msg
.substring(1,x
);
244 var args
= msg
.substring(x
+1);
245 runcmd(chan
, mask
, cmd
, args
);