-
Notifications
You must be signed in to change notification settings - Fork 3
/
credentials.js
82 lines (68 loc) · 2.14 KB
/
credentials.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
const addr = require('email-addresses')
const randomWords = require('random-words')
const generator = require('generate-password')
const botUserPostfix = 'bot'
/**
* Using class for submitted details allows the credentials instance to be
* accumulated from a sequence of prompts, performing field validation and even
* returning specific errors from the class in conversation.
* @todo check username exists on server (error message response => branch loop)
* @todo check room exists on server (error message response => branch loop)
*/
class Credentials {
constructor () {
this.user = {}
this.bot = {}
this.room = {}
}
setEmail (address) {
this.user.email = address
this.bot.email = address
return this
}
setUsername (name) {
this.user.username = name + Math.random().toString(36).substring(4, 7)
this.bot.username = this.user.username + botUserPostfix
return this
}
setPassword (password) {
this.user.password = password
this.bot.password = password
return this
}
setFramework (framework) {
this.user.framework = framework
this.bot.framework = framework
return this
}
setRoom (name) {
this.room.name = name
return this
}
generateUsername () {
if (!this.user.email) throw new Error('username generation requires email')
return this.setUsername(addr.parseOneAddress(this.user.email).local)
}
generatePassword () {
return this.setPassword(generator.generate({ length: 10, numbers: true }))
}
generateRoom () {
return this.setRoom(randomWords({ exactly: 2, maxLength: 6, join: '-' }))
}
toObject () {
const { user, bot, room } = this
return { user, bot, room }
}
toJSON () {
return JSON.stringify(this.toObject())
}
}
/** Store the collection of gathered credentials by the user's ID */
const collection = {}
/** Get a credential from the collection by ID if exists, otherwise create */
module.exports = (userId) => {
if (userId === 'RESET') Object.keys(collection).forEach((i) => delete collection[i])
if (collection[userId]) return collection[userId]
collection[userId] = new Credentials()
return collection[userId]
}