-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchatter.js
96 lines (80 loc) · 3.11 KB
/
chatter.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
const Markov = require('markov')
const slug = require('slug')
const emojiRegex = require('emoji-regex')
const emojiMap = require('emoji-unicode-map')
const fs = require('fs')
const { randomInt } = require('./util')
const emojiPattern = emojiRegex()
module.exports = function (client, done) {
const data = 'data.log'
const dataStream = fs.createWriteStream(data, { flags: 'a' })
const model = Markov(1, (s) => {
// replace emoji with its name
// replace discord emoji with its name
// tag punctuation
return s.toLowerCase()
.replace(emojiPattern, (m) => {
return emojiMap.get(m) || 'unknown'
})
.replace(/<:(\S+):\S+>/g, '$1')
.replace(/(\s|^)([\u2000-\u206F\u2E00-\u2E7F¯ツ\\'!"#$%&()*+,\-./:;<=>?@[\]^_`´{|}~]+)(?!\S)/gi, '$1«p:$2»')
.replace(/([\u00C0-\u00FF\w\u2000-\u206F\u2E00-\u2E7F¯ツ\\'!"#$%&()*+,\-./:;<=>?@[\]^_`´{|}~]+)(?![^«»]*»)/gi, (_, p1) => {
const s = slug(p1, '_')
return `«w:${s}»`
})
}, (s) => s.split(/\s+/))
client.chatter = { model, dataStream }
client.chatter.format = (message) => message.trim().replace(/\s+/g, ' ')
client.chatter.save = (message, done) => {
if (message.split(/\s+/).length > 2) {
client.logger.log('appending new data')
client.chatter.model.seed(message)
dataStream.write(message + '\n', done)
} else {
(done instanceof Function) && done(true, null)
}
}
client.chatter.chat = async (content, message) => {
const response = client.chatter.model.respond(content, message.settings.sentence)
if (response.length === 0) {
let squawks = randomInt(1, 6)
return client.chatter.type(`*${new Array(squawks).fill('squawk').join(' ')}*`, message).catch((err) => client.logger.err(err.message))
}
const filtered = response.join(' ')
.replace(/@(everyone|here)/g, '@\u200b$1')
.replace(/<@!?[0-9]+>/g, (input) => {
const id = input.replace(/<|!|>|@/g, '')
const member = message.channel.guild.members.get(id)
if (member) {
if (member.nickname) return `@\u200b${member.nickname}`
return `@\u200b${member.user.username}`
} else {
const user = message.client.users.get(id)
if (user) return `@\u200b${user.username}`
return input
}
})
.replace(/<@&[0-9]+>/g, (input) => {
const role = message.guild.roles.get(input.replace(/<|@|>|&/g, ''))
if (role) return `@\u200b${role.name}`
return input
})
return client.chatter.type(filtered, message).catch((err) => client.logger.err(err.message))
}
client.chatter.type = async (text, message) => {
const typingDuration = Math.min(text.length * 50, 5000)
message.channel.startTyping()
return new Promise((resolve, reject) => {
client.setTimeout(() => {
message.channel.stopTyping(true)
try {
resolve(message.channel.send(text))
} catch (err) {
client.logger.err(err.message, err.stack)
reject(err)
}
}, typingDuration)
})
}
client.chatter.model.seed(fs.createReadStream(data), done)
}