· 8 years ago · Feb 07, 2018, 12:10 PM
1class UserManager {
2 constructor(db) {
3 this.db = db;
4 }
5
6 get(nick, callback) {
7 this.db.query('SELECT nick, money FROM selenagomez WHERE nick = ? LIMIT 1', [nick], (error, results) => {
8 if(error)
9 return callback(error, null);
10
11 if(results.length !== 1)
12 return callback(null, null);
13
14 callback(null, {
15 nick: results[0].nick,
16 money: results[0].money
17 });
18 });
19 }
20
21 put(nick, callback) {
22 this.db.query('INSERT INTO selenagomez ( id, nick, money ) VALUES ( NULL, ?, 500 )', [nick], (error, results) => {
23 if(error)
24 return callback(error, null);
25
26 callback(null, {
27 nick: nick,
28 money: 500
29 });
30 });
31 }
32
33 mod(nick, money, callback) {
34 this.db.query('UPDATE selenagomez SET money = money + ? WHERE nick = ?', [money, nick], (error, results) => {
35 if(error)
36 return callback(error, null);
37
38 if(!results || results.changedRows !== 1)
39 return callback(null, null);
40
41 this.get(nick, callback);
42 });
43 }
44}
45
46class TimeoutManager {
47 constructor() {
48 this.cooldowns = {};
49
50 this.beneCooldown = 60 * 30;
51 this.jailCooldown = 60 * 5;
52 }
53
54 now() {
55 return Math.floor(Date.now() / 1000);
56 }
57
58 get(nick) {
59 if(this.cooldowns.hasOwnProperty(nick))
60 return this.cooldowns[nick];
61 else
62 return { bene: 0, jail: 0 };
63 }
64
65 update(nick, bene, jail) {
66 if(this.cooldowns.hasOwnProperty(nick) === false)
67 this.cooldowns[nick] = { bene: 0, jail: 0 };
68
69 if(bene)
70 this.cooldowns[nick].bene = this.now();
71
72 if(jail)
73 this.cooldowns[nick].jail = this.now();
74 }
75
76 until(nick) {
77 var info = this.get(nick),
78 now = this.now();
79
80 return {
81 bene: info.bene - now + this.beneCooldown,
82 jail: info.jail - now + this.jailCooldown
83 };
84 }
85
86 canBene(nick) {
87 var info = this.get(nick),
88 now = this.now(),
89 then = info.bene;
90
91 return now - then > this.beneCooldown;
92 }
93
94 isJailed(nick) {
95 var info = this.get(nick),
96 now = this.now(),
97 then = info.jail;
98
99 return now - then < this.jailCooldown;
100 }
101}
102
103function SelenaGomez(network, settings, modules, db) {
104 db.query(`
105 CREATE TABLE IF NOT EXISTS selenagomez (
106 id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
107 nick VARCHAR(256) NOT NULL,
108 money INT NOT NULL
109 ) ENGINE = InnoDB;
110 `);
111
112 const UM = new UserManager(db);
113 const TM = new TimeoutManager();
114 const rand = ((min,max) => Math.floor(Math.random() * (max-min+1) + min));
115
116 return function(irc) {
117 irc.on('command', event => {
118 var cmd = event.command.tag,
119 args = event.command.args,
120 admin = event.command.admin,
121 target = event.command.target;
122
123 var nick = event.from;
124
125 function handleError(error) {
126 irc.notice(target, 'sorry mate this bodgy database threw an error');
127 console.log('Error', error);
128 }
129
130 if(cmd === '.help') {
131 irc.send(target, 'ay it based taylorswift - commands:');
132 irc.send(target, '.bene - .mug <nick> - .bet <amount> - .bank - .give <nick> <amount>');
133 return;
134 }
135
136 else if(cmd === '.bene') {
137 UM.get(nick, (error, user) => {
138 if(error)
139 return handleError(error);
140
141 if(!user) {
142 UM.put(nick, (error, user) => {
143 if(error)
144 return handleError(error);
145
146 TM.update(nick, true, false);
147
148 irc.send(target, 'winz just gave u $500. u now have $' + user.money + ' in ur shiny new account');
149 });
150 } else {
151 if(TM.canBene(nick) === false) {
152 irc.send(target, 'bro ur next payment is in ' + TM.until(nick).bene + ' seconds');
153 return;
154 }
155
156 UM.mod(nick, +500, (error, user) => {
157 if(error)
158 return handleError(error);
159
160 if(!user)
161 return handleError('cannot update field');
162
163 TM.update(nick, true, false);
164
165 irc.send(target, 'winz just gave u $500. u now have $' + user.money);
166 });
167 }
168 });
169 }
170
171 else if(cmd === '.pokies' || cmd === '.bet') {
172 if(args.length < 1) {
173 irc.send(target, 'ey mate thats not how u do it try .bet <amount>');
174 return;
175 }
176
177 var amount = args[0];
178 amount = parseInt(amount, 10);
179 if(!amount || !Number.isInteger(amount)) {
180 irc.send(target, 'hey that doesnt look like a valid amount');
181 return;
182 }
183
184 if(amount <= 1) {
185 irc.send(target, 'dont be a cheap cunt');
186 return;
187 }
188
189 UM.get(nick, (error, user) => {
190 if(error)
191 return handleError(error);
192
193 if(!user) {
194 irc.send(target, 'u dont even have an account');
195 return;
196 }
197
198 if(user.money < amount) {
199 irc.send(target, 'u dont have enuf money bro');
200 return;
201 }
202
203 var luck = rand(0, 10);
204
205 if(luck < 4) {
206 UM.mod(nick, +amount, (error, user) => {
207 if(error)
208 return handleError(error);
209
210 if(!user)
211 return handleError('cant update field');
212
213 irc.send(target, 'bro you won! wow $' + amount + ', thats heaps g! drinks on u ay');
214 });
215 } else {
216 UM.mod(nick, -amount, (error, user) => {
217 if(error)
218 return handleError(error);
219
220 if(!user)
221 return handleError('cant update field');
222
223 irc.send(target, 'shit man, u lost $' + amount + '. better not let the middy know');
224 });
225 }
226 });
227
228 }
229
230 else if(cmd === '.durry') {
231 UM.get(nick, (error, user) => {
232 if(error)
233 return handleError(error);
234
235 if(!user) {
236 irc.send(target, 'u gotta put coins in the machine mate');
237 return;
238 }
239
240 UM.mod(nick, -5, (error, user) => {
241 if(error)
242 return handleError(error);
243
244 if(!user)
245 return handleError('cant update field');
246
247 irc.send(target, ' (');
248 irc.send(target, ' _ ___________ ) u get a "cig" for $5');
249 irc.send(target, '[_[___________#');
250 });
251 });
252 }
253
254 else if(cmd === '.give') {
255 if(args.length < 2) {
256 irc.send(target, 'thats not how u do it, try .give <nick> <amount>');
257 return;
258 }
259
260 if(TM.isJailed(nick)) {
261 irc.send(target, 'ur in jail for another ' + TM.until(nick).jail + ' seconds. dont drop the soap!');
262 return;
263 }
264
265 var receiver = args[0],
266 quantity = args[1];
267
268 quantity = parseInt(quantity, 10);
269 if(!quantity || !Number.isInteger(quantity)) {
270 irc.send(target, 'hey that doesnt look like a valid amount');
271 return;
272 }
273
274 if(quantity <= 1 || nick == receiver) {
275 irc.send(target, 'cmon man help a brother out');
276 return;
277 }
278
279 UM.get(nick, (error, user) => {
280 if(error)
281 return handleError(error);
282
283 if(!user) {
284 irc.send(target, 'gday mate did you know u dont have an account');
285 return;
286 }
287
288 if(user.money < quantity) {
289 irc.send(target, 'u dont have enough money for that mate');
290 return;
291 }
292
293 UM.get(receiver, (error, receiver) => {
294 if(error)
295 return handleError(error);
296
297 if(!receiver) {
298 irc.send(target, 'sorry bro theyre with kiwibank');
299 return;
300 }
301
302 UM.mod(nick, -quantity, (error, user) => {
303 if(error)
304 return handleError(error);
305
306 if(!user)
307 return handleError('cant update field');
308
309 UM.mod(receiver.nick, +quantity, (error, receiver) => {
310 if(error)
311 return handleError(error);
312
313 if(!receiver)
314 return handleError('cant update field');
315
316 irc.send(target, 'you gave ' + receiver.nick + ' $' + quantity);
317 });
318 });
319 });
320 });
321 }
322
323 else if(cmd === '.mug') {
324 if(args.length < 1) {
325 irc.send(target, 'hey bro try .mug <nick>');
326 return;
327 }
328
329 if(TM.isJailed(nick)) {
330 irc.send(target, 'ur in jail for another ' + TM.until(nick).jail + ' seconds. dont drop the soap!');
331 return;
332 }
333
334 var victim = args[0];
335
336 UM.get(nick, (error, user) => {
337 if(error)
338 return handleError(error);
339
340 if(!user) {
341 irc.send('u dont even have an account');
342 return;
343 }
344
345 UM.get(victim, (error, uservictim) => {
346 if(error)
347 return handleError(error);
348
349 if(!uservictim) {
350 irc.send('sorry bro theyre with kiwibank');
351 return;
352 }
353
354 if(uservictim.money < 1) {
355 irc.send('they dont have any money to steal');
356 return;
357 }
358
359 var luck = rand(0, 10),
360 stolen = rand(0, uservictim.money / 2);
361
362 if(luck < 4) {
363 UM.mod(victim, -stolen, (error, uservictim) => {
364 if(error)
365 return handleError(error);
366
367 if(!uservictim)
368 return handleError('cant update victim');
369
370 UM.mod(nick, +stolen, (error, user) => {
371 if(error)
372 return handleError(error);
373
374 if(!user)
375 return handleError('cant update user');
376
377 irc.send(target, 'u manage to steal $' + stolen + ' off ' + victim);
378 });
379 });
380 } else {
381 irc.send(target, '\x034,4 \x032,2 \x030,1POLICE\x034,4 \x032,2 \x03 Its the police! looks like u got caught. thats five minutes the big house for you!');
382 TM.update(nick, false, true);
383 }
384 });
385 });
386 }
387
388 else if(cmd === '.money' || cmd === '.wallet' || cmd === '.balance' || cmd === '.bank') {
389 UM.get(nick, (error, user) => {
390 if(error)
391 return handleError(error);
392
393 if(!user) {
394 irc.send('u dont even have an account');
395 return;
396 }
397
398 irc.send(target, 'you currently have $' + user.money + ' in the bnz');
399 });
400 }
401 });
402 };
403}
404
405module.exports = SelenaGomez;