add twitch stream notify

This commit is contained in:
Jay
2018-06-28 17:37:33 +08:00
parent e2eeef9d82
commit 171df6193b
13 changed files with 552 additions and 116 deletions
+7
View File
@@ -0,0 +1,7 @@
const twitch = require('./twitch')
const line = require('./line')
module.exports = {
twitch,
line
}
+56
View File
@@ -0,0 +1,56 @@
const axios = require('axios')
const config = require('../../config')
const client = axios.create({
baseURL: 'https://api.line.me/v2/bot',
headers: {
Authorization: `Bearer ${config.line.access}`
}
})
const pushMessage = async (target, message = '') => {
if (typeof target !== 'string' || target.trim().length === 0) return
if (typeof message !== 'string' || message.trim().length === 0) return
let data = {
to: target,
messages: [
{
type: 'text',
text: message
}
]
}
let opts = {
method: 'post',
url: '/message/push',
data
}
await client(opts)
}
const replyMessage = async (replyToken, message) => {
let url = '/message/reply'
let opts = {
method: 'post',
url,
data: {
replyToken,
messages: [
{
type: 'text',
text: message
}
]
}
}
await client(opts)
}
module.exports = {
pushMessage,
replyMessage
}
+98
View File
@@ -0,0 +1,98 @@
const axios = require('axios')
const config = require('../../config')
const client = axios.create({
baseURL: 'https://api.twitch.tv/helix',
headers: {
'Client-ID': config.twitch.clientid
}
})
const querystring = require('querystring')
/**
* get twitch user id by login name
* @param {string} name login name
*/
const getUserIDByName = async (name = '') => {
if (typeof name !== 'string' || name.trim().length === 0) return null
name = name.trim()
let url = '/users'
let params = {
login: name
}
let res = await client({
url,
method: 'get',
params
})
if (!('data' in res) || !('data' in res.data) || !Array.isArray(res.data.data) || res.data.data.length === 0) return null
let userInfo = res.data.data[0]
if (!('id' in userInfo) || !('login' in userInfo)) return null
return {
id: userInfo.id,
login: userInfo.login
}
}
const registerWebHook = async (uid = '', type = null) => {
if (!typeof uid === 'string' || uid.trim().length === 0) return null
uid = uid.trim()
let topic = null
switch (type) {
case 'live':
topic = `https://api.twitch.tv/helix/streams?user_id=${encodeURIComponent(uid)}`
break
}
if (topic === null) return null
let url = '/webhooks/hub'
let data = {
'hub.mode': 'subscribe',
'hub.topic': topic,
'hub.callback': `${config.url.replace(/\/$/, '')}/twitch/webhook?uid=${encodeURIComponent(uid)}&type=${encodeURIComponent(type)}`,
'hub.lease_seconds': 864000,
'hub.secret': config.twitch.subsecret
}
try {
await client({
method: 'post',
data,
url
})
} catch (err) {
console.log(err)
}
return null
}
const getUserStream = async (uids = []) => {
if (!uids || !Array.isArray(uids) || uids.length === 0) return null
let res = []
while (uids.length > 0) {
let tmp = uids.splice(0, 50)
let url = '/streams'
let params = {
user_id: [...tmp]
}
try {
let result = await client({
method: 'get',
url,
params,
paramsSerializer: function (params) {
return querystring.stringify(params)
}
})
if (!('data' in result) || !('data' in result.data)) continue
res = [...result.data.data]
} catch (err) {
console.log(err)
}
}
return res
}
module.exports = {
registerWebHook,
getUserIDByName,
getUserStream
}
+6 -1
View File
@@ -70,9 +70,14 @@ const getLastPost = async (pageid = '') => {
if (m !== null && m.length > 1) {
id = m[1]
}
} else if (/\/videos\/(\d+)/.test(link)) {
let m = link.match(/\/videos\/(\d+)/)
if (m !== null && m.length > 1) {
id = m[1]
}
}
}
console.log(time, link, txt, id)
// console.log(time, link, txt, id)
if (!time || !link || !id) return null
let tmp = {
txt,
+163 -2
View File
@@ -1,3 +1,4 @@
const api = require('../../api-action')
/**
* add group to database
* @param {string} txt command body format => groupName notifyEnable(0,1)
@@ -45,7 +46,7 @@ const addPage = async (txt, source = {}, db) => {
if (!('type' in source) || !('groupId' in source) || !('userId' in source)) return null
let {groupId, userId} = source
let arr = txt.split(' ')
if (arr.length < 3) return null
if (arr.length < 2) return null
let page = arr[0]
let tmpl = arr.slice(1).join(' ')
let text = `select "id","owner" from "public"."line_group" where "id" = $1`
@@ -113,7 +114,167 @@ const addPage = async (txt, source = {}, db) => {
return { reply }
}
/**
* del facebook page notify from group
* @param {string} txt command body format => pageid tmpl
* @param {object} source
* @param {object} db
*/
const delPage = async (txt = '', source = {}, db) => {
if (!db) return null
if (!('type' in source) || !('groupId' in source) || !('userId' in source)) return null
let {groupId, userId} = source
let arr = txt.split(' ')
if (arr.length < 1) return null
let page = arr[0]
let text = `select "id","owner" from "public"."line_group" where "id" = $1`
let values = [groupId]
let result = await db.query({
text,
values
})
if (result.rowCount === 0) {
let reply = 'group not register'
return { reply }
}
if (result.rows[0].owner !== userId) {
let reply = 'not owner'
return { reply }
}
text = `select count(rt.*) as c from "public"."line_fb_rt" rt
left join "public"."facebook_page" fb
on fb."id" = rt."facebook"
where
fb."id" = $1`
values = [page]
let count = await db.query({
text,
values
})
if (count.rowCount === 0 || count.rows[0].c === 0) return null
text = `select rt.* as c from "public"."line_fb_rt" rt
left join "public"."facebook_page" fb
on fb."id" = rt."facebook"
where
fb."id" = $1
and rt."line" = $2`
values = [page, groupId]
let rt = await db.query({
text,
values
})
if (rt.rowCount === 0) return null
if (rt.rowCount == 1 && count.rows[0].c == 1) { // eslint-disable-line
let text = `delete from "public"."facebook_page" where "id" = $1`
let values = [page]
await db.query({
text,
values
})
} else {
let text = `delete from "public"."line_fb_rt" where "line" = $1 and "facebook" = $2`
let values = [groupId, page]
await db.query({
text,
values
})
}
return {
reply: 'delete page notify success'
}
}
const addTwitch = async (txt = '', source = {}, db) => {
if (!db) return null
if (!('type' in source) || !('groupId' in source) || !('userId' in source)) return null
let {groupId, userId} = source
let arr = txt.split(' ')
if (arr.length < 3) return null
let name = arr[0]
let type = arr[1]
let tmpl = arr.slice(2).join(' ')
if (['live'].indexOf(type) < 0) return null
let text = `select "id","owner" from "public"."line_group" where "id" = $1`
let values = [groupId]
let result = await db.query({
text,
values
})
if (result.rowCount === 0) {
let reply = 'group not register'
return { reply }
}
if (result.rows[0].owner !== userId) {
let reply = 'not owner'
return { reply }
}
let twitchUser = await api.twitch.getUserIDByName(name)
if (twitchUser === null) return null
// check channel count
text = `select "id" from "public"."twitch_channel" where "id" = $1`
values = [twitchUser.id]
let twch = await db.query({
text,
values
})
if (twch.rowCount === 0) {
let text = `insert into "public"."twitch_channel" ("id", "name", "ctime", "mtime") values
($1, $2, now(), now())`
let values = [twitchUser.id, twitchUser.login]
await db.query({
text,
values
})
text = `insert into "public"."line_twitch_rt" ("line", "twitch", "tmpl", "type") values
($1, $2, $3, $4)`
values = [groupId, twitchUser.id, tmpl, type]
await db.query({
text,
values
})
} else {
let text = `select rt.* from "public"."line_twitch_rt" rt
left join "public"."twitch_channel" twitch
on twitch."id" = rt."twitch"
left join "public"."line_group" line
on line."id" = rt."line"
where
line."id" = $1
and twitch."id" = $2
and rt."type" = $3`
let values = [groupId, twitchUser.id, type]
let rt = await db.query({
text,
values
})
if (rt.rowCount === 0) {
let text = `insert into "public"."line_twitch_rt" ("line", "twitch", "tmpl", "type") values
($1, $2, $3, $4)`
let values = [groupId, twitchUser.id, tmpl, type]
await db.query({
text,
values
})
}
}
// api.twitch.registerWebHook(twitchUser.id, type)
return {
reply: 'add channel success'
}
}
module.exports = {
addgroup: addGroup,
addpage: addPage
addpage: addPage,
delpage: delPage,
addtwitch: addTwitch
}
+3 -50
View File
@@ -1,39 +1,7 @@
const axios = require('axios')
const config = require('../../config')
const commands = require('./commands')
const client = axios.create({
baseURL: 'https://api.line.me/v2/bot',
headers: {
Authorization: `Bearer ${config.line.access}`
}
})
const pushMessage = async (target, message = '') => {
if (typeof target !== 'string' || target.trim().length === 0) return
if (typeof message !== 'string' || message.trim().length === 0) return
let data = {
to: target,
messages: [
{
type: 'text',
text: message
}
]
}
let opts = {
method: 'post',
url: '/message/push',
data
}
await client(opts)
}
const api = require('../api-action')
const textMessage = async (evt) => {
let url = '/message/reply'
let {replyToken, source, message} = evt
if (!source || !('type' in source) || source.type !== 'group') return
if (!message || message.type !== 'text') return
@@ -45,25 +13,10 @@ const textMessage = async (evt) => {
let result = await commands(text, source)
if (result === null) return
if (typeof result === 'object' && 'reply' in result) {
let opts = {
method: 'post',
url,
data: {
replyToken,
messages: [
{
type: 'text',
text: result.reply
}
]
}
}
await client(opts)
await api.line.replyMessage(replyToken, result.reply)
}
}
module.exports = {
textMessage,
pushMessage
textMessage
}