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 }