translate tg.js, add percentage in task content, add one more button to copy
This commit is contained in:
parent
e9e37d1d03
commit
45c995526e
|
@ -12,7 +12,7 @@ const { AUTH, RETRY_LIMIT, PARALLEL_LIMIT, TIMEOUT_BASE, TIMEOUT_MAX, LOG_DELAY,
|
||||||
const { db } = require('../db')
|
const { db } = require('../db')
|
||||||
const { make_table, make_tg_table, make_html, summary } = require('./summary')
|
const { make_table, make_tg_table, make_html, summary } = require('./summary')
|
||||||
|
|
||||||
const FILE_EXCEED_MSG = '您的团队盘文件数已超限(40万),停止复制'
|
const FILE_EXCEED_MSG = '您的小組雲端硬碟文件數量已超過限制(40萬),停止複製'
|
||||||
const FOLDER_TYPE = 'application/vnd.google-apps.folder'
|
const FOLDER_TYPE = 'application/vnd.google-apps.folder'
|
||||||
const { https_proxy } = process.env
|
const { https_proxy } = process.env
|
||||||
const axins = axios.create(https_proxy ? { httpsAgent: new HttpsProxyAgent(https_proxy) } : {})
|
const axins = axios.create(https_proxy ? { httpsAgent: new HttpsProxyAgent(https_proxy) } : {})
|
||||||
|
|
92
src/tg.js
92
src/tg.js
|
@ -9,7 +9,7 @@ const { AUTH, DEFAULT_TARGET } = require('../config')
|
||||||
const { tg_token } = AUTH
|
const { tg_token } = AUTH
|
||||||
const gen_link = (fid, text) => `<a href="https://drive.google.com/drive/folders/${fid}">${text || fid}</a>`
|
const gen_link = (fid, text) => `<a href="https://drive.google.com/drive/folders/${fid}">${text || fid}</a>`
|
||||||
|
|
||||||
if (!tg_token) throw new Error('请先在auth.js里设置tg_token')
|
if (!tg_token) throw new Error('請先在auth.js中設定tg_token')
|
||||||
const { https_proxy } = process.env
|
const { https_proxy } = process.env
|
||||||
const axins = axios.create(https_proxy ? { httpsAgent: new HttpsProxyAgent(https_proxy) } : {})
|
const axins = axios.create(https_proxy ? { httpsAgent: new HttpsProxyAgent(https_proxy) } : {})
|
||||||
|
|
||||||
|
@ -25,16 +25,17 @@ async function get_folder_name (fid) {
|
||||||
module.exports = { send_count, send_help, sm, extract_fid, reply_cb_query, send_choice, send_task_info, send_all_tasks, tg_copy, extract_from_text }
|
module.exports = { send_count, send_help, sm, extract_fid, reply_cb_query, send_choice, send_task_info, send_all_tasks, tg_copy, extract_from_text }
|
||||||
|
|
||||||
function send_help (chat_id) {
|
function send_help (chat_id) {
|
||||||
const text = `<pre>[使用帮助]
|
const text = `<pre>[使用說明]
|
||||||
命令 | 说明
|
***不支持單檔分享***
|
||||||
|
命令 | 說明
|
||||||
|
|
||||||
/help | 返回本条使用说明
|
/help | 返回本使用說明
|
||||||
|
|
||||||
/count shareID [-u] | 返回sourceID的文件统计信息, sourceID可以是google drive分享网址本身,也可以是分享ID。如果命令最后加上 -u,则无视之前的记录强制从线上获取,适合一段时候后才更新完毕的分享链接。
|
/count sourceID [-u] | 返回sourceID的文件統計資訊, sourceID可以是共享網址本身,也可以是共享ID。如果命令最后加上 -u,則無視快取記錄強制從線上獲取,適合一段時候後才更新完畢的分享連結。
|
||||||
|
|
||||||
/copy sourceID targetID [-u] | 将sourceID的文件复制到targetID里(会新建一个文件夹),若不填targetID,则会复制到默认位置(在config.js里设置)。如果命令最后加上 -u,则无视本地缓存强制从线上获取源文件夹信息。返回拷贝任务的taskID
|
/copy sourceID targetID(選填) [-u] | 將sourceID的文件複製到targetID裡(會新建一個資料夾),若無targetID,則會複製到預設位置(config.js中的DEFAULT_TARGET)。如果命令最後加上 -u,則無視快取記錄強制從線上獲取源資料夾資訊。返回拷貝任務的taskID
|
||||||
|
|
||||||
/task taskID | 返回对应任务的进度信息,若不填则返回所有正在运行的任务进度,若填 all 则返回所有任务列表
|
/task taskID(選填) | 返回對應任務的進度信息,若不填taskID則返回所有正在運行的任務進度,若填 all 則返回所有任務列表(歷史紀錄)
|
||||||
</pre>`
|
</pre>`
|
||||||
return sm({ chat_id, text, parse_mode: 'HTML' })
|
return sm({ chat_id, text, parse_mode: 'HTML' })
|
||||||
}
|
}
|
||||||
|
@ -42,12 +43,15 @@ function send_help (chat_id) {
|
||||||
function send_choice ({ fid, chat_id }) {
|
function send_choice ({ fid, chat_id }) {
|
||||||
return sm({
|
return sm({
|
||||||
chat_id,
|
chat_id,
|
||||||
text: `识别出分享ID ${fid},请选择动作`,
|
text: `辨識到分享ID ${fid},請選擇動作`,
|
||||||
reply_markup: {
|
reply_markup: {
|
||||||
inline_keyboard: [
|
inline_keyboard: [
|
||||||
[
|
[
|
||||||
{ text: '文件统计', callback_data: `count ${fid}` },
|
{ text: '文件統計', callback_data: `count ${fid}` }
|
||||||
{ text: '开始复制', callback_data: `copy ${fid}` }
|
],
|
||||||
|
[
|
||||||
|
{ text: '開始複製(預設)', callback_data: `copy ${fid}` },
|
||||||
|
{ text: '開始複製(discord)', callback_data: `disCopy ${fid}` }
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -56,7 +60,7 @@ function send_choice ({ fid, chat_id }) {
|
||||||
|
|
||||||
async function send_all_tasks (chat_id) {
|
async function send_all_tasks (chat_id) {
|
||||||
let records = db.prepare('select id, status, ctime from task').all()
|
let records = db.prepare('select id, status, ctime from task').all()
|
||||||
if (!records.length) return sm({ chat_id, text: '数据库中没有任务记录' })
|
if (!records.length) return sm({ chat_id, text: '資料庫中沒有任務記錄' })
|
||||||
const tb = new Table({ style: { head: [], border: [] } })
|
const tb = new Table({ style: { head: [], border: [] } })
|
||||||
const headers = ['ID', 'status', 'ctime']
|
const headers = ['ID', 'status', 'ctime']
|
||||||
records = records.map(v => {
|
records = records.map(v => {
|
||||||
|
@ -69,13 +73,13 @@ async function send_all_tasks (chat_id) {
|
||||||
return axins.post(url, {
|
return axins.post(url, {
|
||||||
chat_id,
|
chat_id,
|
||||||
parse_mode: 'HTML',
|
parse_mode: 'HTML',
|
||||||
text: `所有拷贝任务:\n<pre>${text}</pre>`
|
text: `所有拷貝任務:\n<pre>${text}</pre>`
|
||||||
}).catch(err => {
|
}).catch(err => {
|
||||||
// const description = err.response && err.response.data && err.response.data.description
|
// const description = err.response && err.response.data && err.response.data.description
|
||||||
// if (description && description.includes('message is too long')) {
|
// if (description && description.includes('message is too long')) {
|
||||||
if (true) {
|
if (true) {
|
||||||
const text = [headers].concat(records).map(v => v.join('\t')).join('\n')
|
const text = [headers].concat(records).map(v => v.join('\t')).join('\n')
|
||||||
return sm({ chat_id, parse_mode: 'HTML', text: `所有拷贝任务:\n<pre>${text}</pre>` })
|
return sm({ chat_id, parse_mode: 'HTML', text: `所有拷貝任務:\n<pre>${text}</pre>` })
|
||||||
}
|
}
|
||||||
console.error(err)
|
console.error(err)
|
||||||
})
|
})
|
||||||
|
@ -91,24 +95,28 @@ async function get_task_info (task_id) {
|
||||||
const { file_count, folder_count, total_size } = summary ? JSON.parse(summary) : {}
|
const { file_count, folder_count, total_size } = summary ? JSON.parse(summary) : {}
|
||||||
const copied_files = copied ? copied.trim().split('\n').length : 0
|
const copied_files = copied ? copied.trim().split('\n').length : 0
|
||||||
const copied_folders = folder_mapping ? (folder_mapping.length - 1) : 0
|
const copied_folders = folder_mapping ? (folder_mapping.length - 1) : 0
|
||||||
let text = '任务编号:' + task_id + '\n'
|
let text = '任務ID:' + task_id + '\n'
|
||||||
const folder_name = await get_folder_name(source)
|
const folder_name = await get_folder_name(source)
|
||||||
text += '源文件夹:' + gen_link(source, folder_name) + '\n'
|
text += '源資料夾:' + gen_link(source, folder_name) + '\n'
|
||||||
text += '目的位置:' + gen_link(target) + '\n'
|
text += '目的位置:' + gen_link(target) + '\n'
|
||||||
text += '新文件夹:' + (new_folder ? gen_link(new_folder) : '暂未创建') + '\n'
|
text += '新資料夾:' + (new_folder ? gen_link(new_folder) : '尚未創建') + '\n'
|
||||||
text += '任务状态:' + status + '\n'
|
text += '任務狀態:' + status + '\n'
|
||||||
text += '创建时间:' + dayjs(ctime).format('YYYY-MM-DD HH:mm:ss') + '\n'
|
text += '創建時間:' + dayjs(ctime).format('YYYY-MM-DD HH:mm:ss') + '\n'
|
||||||
text += '完成时间:' + (ftime ? dayjs(ftime).format('YYYY-MM-DD HH:mm:ss') : '未完成') + '\n'
|
text += '完成時間:' + (ftime ? dayjs(ftime).format('YYYY-MM-DD HH:mm:ss') : '未完成') + '\n'
|
||||||
text += '目录进度:' + copied_folders + '/' + (folder_count === undefined ? '未知数量' : folder_count) + '\n'
|
var pct = copied_folders/(folder_count === undefined ? '未知數量' : folder_count)*100
|
||||||
text += '文件进度:' + copied_files + '/' + (file_count === undefined ? '未知数量' : file_count) + '\n'
|
pct = pct.toFixed(2);
|
||||||
text += '合计大小:' + (total_size || '未知大小')
|
text += '目錄進度:' + copied_folders + '/' + (folder_count === undefined ? '未知數量' : folder_count) + ' - ' + pct + '%\n'
|
||||||
|
pct = copied_files/(file_count === undefined ? '未知數量' : file_count)*100
|
||||||
|
pct = pct.toFixed(2);
|
||||||
|
text += '文件進度:' + copied_files + '/' + (file_count === undefined ? '未知數量' : file_count) + ' - ' + pct + '%\n'
|
||||||
|
text += '合計大小:' + (total_size || '未知大小')
|
||||||
const total_count = (folder_count || 0) + (file_count || 0)
|
const total_count = (folder_count || 0) + (file_count || 0)
|
||||||
return { text, status, total_count }
|
return { text, status, total_count }
|
||||||
}
|
}
|
||||||
|
|
||||||
async function send_task_info ({ task_id, chat_id }) {
|
async function send_task_info ({ task_id, chat_id }) {
|
||||||
const { text, status, total_count } = await get_task_info(task_id)
|
const { text, status, total_count } = await get_task_info(task_id)
|
||||||
if (!text) return sm({ chat_id, text: '数据库不存在此任务ID:' + task_id })
|
if (!text) return sm({ chat_id, text: '資料庫查無此任務ID:' + task_id })
|
||||||
const url = `https://api.telegram.org/bot${tg_token}/sendMessage`
|
const url = `https://api.telegram.org/bot${tg_token}/sendMessage`
|
||||||
let message_id
|
let message_id
|
||||||
try {
|
try {
|
||||||
|
@ -130,17 +138,17 @@ async function send_task_info ({ task_id, chat_id }) {
|
||||||
async function tg_copy ({ fid, target, chat_id, update }) { // return task_id
|
async function tg_copy ({ fid, target, chat_id, update }) { // return task_id
|
||||||
target = target || DEFAULT_TARGET
|
target = target || DEFAULT_TARGET
|
||||||
if (!target) {
|
if (!target) {
|
||||||
sm({ chat_id, text: '请输入目的地ID或先在config.js里设置默认复制目的地ID(DEFAULT_TARGET)' })
|
sm({ chat_id, text: '請輸入目的地ID或先在config.js中設定預設複製的目的地ID(DEFAULT_TARGET)' })
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
let record = db.prepare('select id, status from task where source=? and target=?').get(fid, target)
|
let record = db.prepare('select id, status from task where source=? and target=?').get(fid, target)
|
||||||
if (record) {
|
if (record) {
|
||||||
if (record.status === 'copying') {
|
if (record.status === 'copying') {
|
||||||
sm({ chat_id, text: '已有相同源ID和目的ID的任务正在进行,查询进度可输入 /task ' + record.id })
|
sm({ chat_id, text: '已有相同源ID和目的ID的任務正在進行,查詢進度可輸入 /task ' + record.id })
|
||||||
return
|
return
|
||||||
} else if (record.status === 'finished') {
|
} else if (record.status === 'finished') {
|
||||||
sm({ chat_id, text: `检测到已存在的任务 ${record.id},开始继续拷贝` })
|
sm({ chat_id, text: `檢測到已存在的任務 ${record.id},開始繼續拷貝` })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -156,18 +164,18 @@ async function tg_copy ({ fid, target, chat_id, update }) { // return task_id
|
||||||
const copied_files = copied ? copied.trim().split('\n').length : 0
|
const copied_files = copied ? copied.trim().split('\n').length : 0
|
||||||
const copied_folders = mapping ? (mapping.trim().split('\n').length - 1) : 0
|
const copied_folders = mapping ? (mapping.trim().split('\n').length - 1) : 0
|
||||||
|
|
||||||
let text = `任务 ${task_id} 复制完成\n`
|
let text = `任務 ${task_id} 完成\n`
|
||||||
const name = await get_folder_name(source)
|
const name = await get_folder_name(source)
|
||||||
text += '源文件夹:' + gen_link(source, name) + '\n'
|
text += '源資料夾:' + gen_link(source, name) + '\n'
|
||||||
text += '目录完成数:' + copied_folders + '/' + folder_count + '\n'
|
text += '目錄完成數:' + copied_folders + '/' + folder_count + '\n'
|
||||||
text += '文件完成数:' + copied_files + '/' + file_count + '\n'
|
text += '文件完成數:' + copied_files + '/' + file_count + '\n'
|
||||||
sm({ chat_id, text, parse_mode: 'HTML' })
|
sm({ chat_id, text, parse_mode: 'HTML' })
|
||||||
})
|
})
|
||||||
.catch(err => {
|
.catch(err => {
|
||||||
if (!record) record = {}
|
if (!record) record = {}
|
||||||
console.error('复制失败', fid, '-->', target)
|
console.error('複製失敗', fid, '-->', target)
|
||||||
console.error(err)
|
console.error(err)
|
||||||
sm({ chat_id, text: '复制失败,失败消息:' + err.message })
|
sm({ chat_id, text: '複製失敗,失敗訊息:' + err.message })
|
||||||
})
|
})
|
||||||
|
|
||||||
while (!record) {
|
while (!record) {
|
||||||
|
@ -187,21 +195,21 @@ function reply_cb_query ({ id, data }) {
|
||||||
const url = `https://api.telegram.org/bot${tg_token}/answerCallbackQuery`
|
const url = `https://api.telegram.org/bot${tg_token}/answerCallbackQuery`
|
||||||
return axins.post(url, {
|
return axins.post(url, {
|
||||||
callback_query_id: id,
|
callback_query_id: id,
|
||||||
text: '开始执行 ' + data
|
text: '開始執行 ' + data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
async function send_count ({ fid, chat_id, update }) {
|
async function send_count ({ fid, chat_id, update }) {
|
||||||
const table = await gen_count_body({ fid, update, type: 'tg', service_account: true })
|
const table = await gen_count_body({ fid, update, type: 'tg', service_account: true })
|
||||||
if (!table) return sm({ chat_id, parse_mode: 'HTML', text: gen_link(fid) + ' 信息获取失败' })
|
if (!table) return sm({ chat_id, parse_mode: 'HTML', text: gen_link(fid) + ' 資訊獲取失敗' })
|
||||||
const url = `https://api.telegram.org/bot${tg_token}/sendMessage`
|
const url = `https://api.telegram.org/bot${tg_token}/sendMessage`
|
||||||
const gd_link = `https://drive.google.com/drive/folders/${fid}`
|
const gd_link = `https://drive.google.com/drive/folders/${fid}`
|
||||||
const name = await get_folder_name(fid)
|
const name = await get_folder_name(fid)
|
||||||
return axins.post(url, {
|
return axins.post(url, {
|
||||||
chat_id,
|
chat_id,
|
||||||
parse_mode: 'HTML',
|
parse_mode: 'HTML',
|
||||||
text: `<pre>源文件夹名称:${name}
|
text: `<pre>源資料夾名稱:${name}
|
||||||
源链接:${gd_link}
|
源連結:${gd_link}
|
||||||
${table}</pre>`
|
${table}</pre>`
|
||||||
}).catch(async err => {
|
}).catch(async err => {
|
||||||
// const description = err.response && err.response.data && err.response.data.description
|
// const description = err.response && err.response.data && err.response.data.description
|
||||||
|
@ -213,12 +221,12 @@ ${table}</pre>`
|
||||||
return sm({
|
return sm({
|
||||||
chat_id,
|
chat_id,
|
||||||
parse_mode: 'HTML',
|
parse_mode: 'HTML',
|
||||||
text: `链接:<a href="https://drive.google.com/drive/folders/${fid}">${fid}</a>\n<pre>
|
text: `連結:<a href="https://drive.google.com/drive/folders/${fid}">${fid}</a>\n<pre>
|
||||||
表格太长超出telegram消息限制,只显示概要:
|
表格太長超出telegram訊息限制,僅顯示概要:
|
||||||
目录名称:${name}
|
目錄名稱:${name}
|
||||||
文件总数:${file_count}
|
文件總數:${file_count}
|
||||||
目录总数:${folder_count}
|
目錄總數:${folder_count}
|
||||||
合计大小:${total_size}
|
合計大小:${total_size}
|
||||||
</pre>`
|
</pre>`
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue