142 lines
4.1 KiB
JavaScript
142 lines
4.1 KiB
JavaScript
const commands = require('./commands')
|
|
const DB = require('@libs/database')
|
|
const api = require('@libs/api-action')
|
|
|
|
/**
|
|
* parse text message object
|
|
* @param {object} evt line message event object
|
|
*/
|
|
const textMessage = async (evt) => {
|
|
let {replyToken, source, message, type} = evt
|
|
if (type === 'leave' && 'groupId' in source && 'type' in source && source.type === 'group') {
|
|
try {
|
|
await leaveGroup(source.groupId)
|
|
} catch (err) {
|
|
console.log(err)
|
|
}
|
|
return
|
|
}
|
|
if (!source || !('type' in source) || source.type !== 'group') return
|
|
if (!message || message.type !== 'text') return
|
|
let {text} = message
|
|
if (typeof text !== 'string') return
|
|
text = text.trim()
|
|
if (text.length === 0) return
|
|
|
|
saveToLog(source, text).then(() => {}).catch(err => {
|
|
console.log(err)
|
|
})
|
|
|
|
let result = await commands(text, source)
|
|
if (result === null) return
|
|
if (typeof result === 'object' && 'reply' in result) {
|
|
console.log('reply message :::: ', result.reply)
|
|
await api.line.replyMessage(replyToken, result.reply)
|
|
}
|
|
}
|
|
|
|
const saveToLog = async (source, text = '') => {
|
|
if (!source || typeof source !== 'object') return null
|
|
if (typeof text !== 'string' || text.length === 0) return null
|
|
let {groupId, userId} = source
|
|
if (typeof groupId !== 'string' || groupId.length === 0) return null
|
|
if (typeof userId !== 'string' || userId.length === 0) return null
|
|
// connect database
|
|
let db = await DB.connect()
|
|
|
|
try {
|
|
let text = `select * from "public"."line_user" where "id" = $1`
|
|
let values = [userId]
|
|
let user = await db.query({text, values})
|
|
let data = null
|
|
if (user.rowCount === 0) {
|
|
data = api.line.getUserInfo(groupId, userId)
|
|
if (data === null) {
|
|
db.release()
|
|
return null
|
|
}
|
|
let text = `insert into "public"."line_user" ("id", "name") values ($1, $2)`
|
|
let values = [userId, data.displayName]
|
|
await db.query({text, values})
|
|
}
|
|
text = `insert into "public"."line_message_log" ("group", "user", "message") values ($1, $2, $3)`
|
|
values = [groupId, userId, text]
|
|
await db.query({text, values})
|
|
} catch (err) {
|
|
console.log('save log error :::: ', err)
|
|
}
|
|
|
|
db.release()
|
|
return null
|
|
}
|
|
|
|
const leaveGroup = async (group = '') => {
|
|
if (typeof group !== 'string' || group.trim().length === 0) return
|
|
let db = await DB.connect()
|
|
let gData = await db.query({
|
|
text: `select * from "public"."line_group" where "id" = $1`,
|
|
values: [group]
|
|
})
|
|
if (gData.rowCount === 0) {
|
|
db.release()
|
|
return
|
|
}
|
|
try {
|
|
await db.query({
|
|
text: `delete from "public"."commands" where "group" = $1`,
|
|
values: [group]
|
|
})
|
|
await db.query({
|
|
text: `delete from "public"."key_commands" where "group" = $1`,
|
|
values: [group]
|
|
})
|
|
await db.query({
|
|
text: `delete from "public"."line_fb_rt" where "line" = $1`,
|
|
values: [group]
|
|
})
|
|
await db.query({
|
|
text: `delete from "public"."line_twitch_rt" where "line" = $1`,
|
|
values: [group]
|
|
})
|
|
await db.query({
|
|
text: `delete from "public"."line_youtube_rt" where "line" = $1`,
|
|
values: [group]
|
|
})
|
|
await db.query({
|
|
text: `delete from "public"."twitch_channel" where "id" in (
|
|
select ch."id" from "public"."twitch_channel" ch
|
|
left join "line_twitch_rt" rt
|
|
on rt."twitch" = ch."id"
|
|
where rt."twitch" is null
|
|
)`
|
|
})
|
|
await db.query({
|
|
text: `delete from "public"."facebook_page" where "id" in (
|
|
select ch."id" from "public"."facebook_page" ch
|
|
left join "line_fb_rt" rt
|
|
on rt."twitch" = ch."id"
|
|
where rt."twitch" is null
|
|
)`
|
|
})
|
|
await db.query({
|
|
text: `delete from "public"."youtube_channel" where "id" in (
|
|
select ch."id" from "public"."youtube_channel" ch
|
|
left join "line_youtube_rt" rt
|
|
on rt."twitch" = ch."id"
|
|
where rt."twitch" is null
|
|
)`
|
|
})
|
|
await db.query({
|
|
text: `delete from "public"."line_group" where "id" = $1`,
|
|
values: [group]
|
|
})
|
|
} catch (err) {
|
|
console.log(err)
|
|
}
|
|
db.release()
|
|
}
|
|
|
|
module.exports = {
|
|
textMessage
|
|
}
|