-
Notifications
You must be signed in to change notification settings - Fork 0
/
express.js
69 lines (62 loc) · 2.42 KB
/
express.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
const createApp = require('ringcentral-chatbot/dist/apps').default
const { Service } = require('ringcentral-chatbot/dist/models')
const axios = require('axios')
const findService = async (bot, group) => {
const service = await Service.findOne({ where: { name: 'GitHub', botId: bot.id, groupId: group.id } })
return service
}
const buildQueryString = obj => {
return Object.keys(obj).map(k => `${k}=${encodeURIComponent(obj[k])}`).join('&')
}
const sendAuthLink = async (bot, group) => {
await bot.sendMessage(group.id, {
text: `Please click [here](https://github.com/login/oauth/authorize?${buildQueryString({
client_id: process.env.GITHUB_CLIENT_ID,
redirect_uri: process.env.RINGCENTRAL_CHATBOT_SERVER + '/github/oauth',
scope: 'read:user',
state: `${group.id}:${bot.id}`
})}) to authorize me to access your GitHub data.`
})
}
const handle = async event => {
if (event.type === 'BotJoinGroup') {
const { bot, group } = event
await bot.sendMessage(group.id, { text: 'Hello there' })
await sendAuthLink(bot, group)
}
if (event.type === 'Message4Bot') {
const { text, group, bot } = event
const service = await findService(bot, group)
if (service === null) {
await sendAuthLink(bot, group)
return
}
if (text === 'profile') {
const r = await axios.get(`https://api.github.com/user?access_token=${service.data.accessToken}`)
await bot.sendMessage(group.id, { text: `Here is your GitHub profile: [code]${JSON.stringify(r.data, null, 2)}[/code]` })
} else {
await bot.sendMessage(group.id, { text: 'I am sorry but I don\'t get it' })
}
}
}
const app = createApp(handle)
app.get('/github/oauth', async (req, res) => {
const { code, state } = req.query
const [groupId, botId] = state.split(':')
const r = await axios.post('https://github.com/login/oauth/access_token', {
client_id: process.env.GITHUB_CLIENT_ID,
client_secret: process.env.GITHUB_CLIENT_SECRET,
code,
state,
redirect_uri: process.env.RINGCENTRAL_CHATBOT_SERVER + '/github/oauth'
})
const accessToken = r.data.split('&')[0].split('=')[1]
const service = await findService({ id: botId }, { id: groupId })
if (service === null) {
Service.create({ name: 'GitHub', groupId, botId, data: { accessToken } })
} else {
service.update({ data: { accessToken } })
}
res.send('Please close this page')
})
app.listen(process.env.RINGCENTRAL_CHATBOT_EXPRESS_PORT)