/
fightme.js
120 lines (103 loc) · 5.33 KB
/
fightme.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
'use strict'
// 3rdparty libraries
const _ = require('lodash')
const debug = require('debug')('game:fightme')
// bot libraries
const Game = require('./_interface')
/*
* !fightme [user] - challenge [user] to fight
*/
class FightMe extends Game {
constructor () {
const settings = {
cooldown: String(new Date()),
commands: [
'!fightme'
]
}
super({ settings })
global.configuration.register('fightmeTimeout', 'gambling.fightme.timeout', 'number', 10)
global.configuration.register('fightmeCooldown', 'gambling.cooldown.fightme', 'number', 0)
}
async main (opts) {
opts.sender['message-type'] = 'chat' // force responses to chat
var username
debug(opts)
try {
username = opts.parameters.trim().match(/^@?([\S]+)$/)[1].toLowerCase()
opts.sender.username = opts.sender.username.toLowerCase()
} catch (e) {
debug(e)
global.commons.sendMessage(global.translate('gambling.fightme.notEnoughOptions'), opts.sender)
return
}
if (opts.sender.username === username) {
debug('cannotFightWithYourself')
global.commons.sendMessage(global.translate('gambling.fightme.cannotFightWithYourself'), opts.sender)
return
}
// check if you are challenged by user
const challenge = await global.db.engine.findOne(this.collection.users, { key: '_users', user: username, challenging: opts.sender.username })
const isChallenged = !_.isEmpty(challenge)
if (isChallenged) {
let winner = _.random(0, 1, false)
let isMod = {
user: await global.commons.isMod(username),
sender: await global.commons.isMod(opts.sender)
}
// vs broadcaster
if (global.commons.isBroadcaster(opts.sender) || global.commons.isBroadcaster(username)) {
debug('vs broadcaster')
global.commons.sendMessage(
await global.commons.prepare('gambling.fightme.broadcaster', { winner: global.commons.isBroadcaster(opts.sender) ? opts.sender.username : username }),
opts.sender)
isMod = global.commons.isBroadcaster(opts.sender) ? isMod.user : isMod.sender
if (!isMod) global.commons.timeout(global.commons.isBroadcaster(opts.sender) ? username : opts.sender.username, null, await global.configuration.getValue('fightmeTimeout'))
global.db.engine.remove(this.collection.users, { _id: challenge._id.toString() })
return
}
// mod vs mod
if (isMod.user && isMod.sender) {
debug('mod vs mod')
global.commons.sendMessage(
await global.commons.prepare('gambling.fightme.bothModerators', { challenger: username }),
opts.sender)
global.db.engine.remove(this.collection.users, { _id: challenge._id.toString() })
return
}
// vs mod
if (isMod.user || isMod.sender) {
debug('vs mod')
global.commons.sendMessage(
await global.commons.prepare('gambling.fightme.oneModerator', { winner: isMod.sender ? opts.sender.username : username }),
opts.sender)
global.commons.timeout(isMod.sender ? username : opts.sender.username, null, await global.configuration.getValue('fightmeTimeout'))
global.db.engine.remove(this.collection.users, { _id: challenge._id.toString() })
return
}
debug('user vs user')
global.commons.timeout(winner ? opts.sender.username : username, null, await global.configuration.getValue('fightmeTimeout'))
global.commons.sendMessage(await global.commons.prepare('gambling.fightme.winner', { username, winner: winner ? username : opts.sender.username }), opts.sender)
global.db.engine.remove(this.collection.users, { _id: challenge._id.toString() })
} else {
// check if under gambling cooldown
const cooldown = await global.configuration.getValue('fightmeCooldown')
const isMod = await global.commons.isMod(opts.sender)
if (new Date().getTime() - new Date(await this.settings.cooldown).getTime() < cooldown * 1000 &&
!(await global.configuration.getValue('gamblingCooldownBypass') && (isMod || global.commons.isBroadcaster(opts.sender)))) {
debug('cooldown')
global.commons.sendMessage(global.translate('gambling.fightme.cooldown')
.replace(/\$cooldown/g, Math.round(((cooldown * 1000) - (new Date().getTime() - new Date(await this.settings.cooldown).getTime())) / 1000 / 60))
.replace(/\$minutesName/g, global.commons.getLocalizedName(Math.round(((cooldown * 1000) - (new Date().getTime() - new Date(await this.settings.cooldown).getTime())) / 1000 / 60), 'core.minutes')), opts.sender)
return
}
// save new timestamp if not bypassed
if (!(await global.configuration.getValue('gamblingCooldownBypass') && (isMod || global.commons.isBroadcaster(opts.sender)))) this.settings.cooldown = new Date()
const isAlreadyChallenged = !_.isEmpty(await global.db.engine.findOne(this.collection.users, { key: '_users', user: opts.sender.username, challenging: username }))
if (!isAlreadyChallenged) await global.db.engine.insert(this.collection.users, { key: '_users', user: opts.sender.username, challenging: username })
let message = await global.commons.prepare('gambling.fightme.challenge', { username: username, sender: opts.sender.username }); debug(message)
global.commons.sendMessage(message, opts.sender)
}
}
}
module.exports = new FightMe()