|
|
const fetch = require('node-fetch') |
|
|
const axios = require('axios') |
|
|
const cfonts = require('cfonts') |
|
|
const spin = require('spinnies') |
|
|
const Crypto = require('crypto') |
|
|
|
|
|
const wait = async (media) => new Promise(async (resolve, reject) => { |
|
|
const attachmentData = `data:image/jpeg;base64,${media.toString('base64')}` |
|
|
const response = await fetch("https://trace.moe/api/search",{method: "POST",body: JSON.stringify({ image: attachmentData }),headers: { "Content-Type": "application/json" }}); |
|
|
if (!response.ok) reject(`Gambar tidak ditemukan!`); |
|
|
const result = await response.json() |
|
|
try { |
|
|
const { is_adult, title, title_chinese, title_romaji, title_english, episode, season, similarity, filename, at, tokenthumb, anilist_id } = result.docs[0] |
|
|
let belief = () => similarity < 0.89 ? "Saya memiliki keyakinan rendah dalam hal ini : " : "" |
|
|
let ecch = () => is_adult ? "Iya" : "Tidak" |
|
|
resolve({video: await getBuffer(`https://media.trace.moe/video/${anilist_id}/${encodeURIComponent(filename)}?t=${at}&token=${tokenthumb}`), teks: `${belief()} |
|
|
~> Ecchi : *${ecch()}* |
|
|
~> Judul Jepang : *${title}* |
|
|
~> Ejaan Judul : *${title_romaji}* |
|
|
~> Judul Inggris : *${title_english}* |
|
|
~> Episode : *${episode}* |
|
|
~> Season : *${season}*`}); |
|
|
} catch (e) { |
|
|
console.log(e) |
|
|
reject(`Saya tidak tau ini anime apa`) |
|
|
} |
|
|
}) |
|
|
|
|
|
const simih = async (text) => { |
|
|
try { |
|
|
const sami = await fetch(`https://simsumi.herokuapp.com/api?text=${text}`, {method: 'GET'}) |
|
|
const res = await sami.json() |
|
|
return res.success |
|
|
} catch { |
|
|
return 'Simi ga tau apa yang anda ngomong, bahasa alien yah kak?' |
|
|
} |
|
|
} |
|
|
|
|
|
const h2k = (number) => { |
|
|
var SI_POSTFIXES = ["", " K", " M", " G", " T", " P", " E"] |
|
|
var tier = Math.log10(Math.abs(number)) / 3 | 0 |
|
|
if(tier == 0) return number |
|
|
var postfix = SI_POSTFIXES[tier] |
|
|
var scale = Math.pow(10, tier * 3) |
|
|
var scaled = number / scale |
|
|
var formatted = scaled.toFixed(1) + '' |
|
|
if (/\.0$/.test(formatted)) |
|
|
formatted = formatted.substr(0, formatted.length - 2) |
|
|
return formatted + postfix |
|
|
} |
|
|
|
|
|
const getBuffer = async (url, options) => { |
|
|
try { |
|
|
options ? options : {} |
|
|
const res = await axios({ |
|
|
method: "get", |
|
|
url, |
|
|
headers: { |
|
|
'DNT': 1, |
|
|
'Upgrade-Insecure-Request': 1 |
|
|
}, |
|
|
...options, |
|
|
responseType: 'arraybuffer' |
|
|
}) |
|
|
return res.data |
|
|
} catch (e) { |
|
|
console.log(`Error : ${e}`) |
|
|
} |
|
|
} |
|
|
|
|
|
const randomBytes = (length) => { |
|
|
return Crypto.randomBytes(length) |
|
|
} |
|
|
|
|
|
const generateMessageID = () => { |
|
|
return randomBytes(10).toString('hex').toUpperCase() |
|
|
} |
|
|
|
|
|
const getGroupAdmins = (participants) => { |
|
|
admins = [] |
|
|
for (let i of participants) { |
|
|
i.isAdmin ? admins.push(i.jid) : '' |
|
|
} |
|
|
return admins |
|
|
} |
|
|
|
|
|
const getRandom = (ext) => { |
|
|
return `${Math.floor(Math.random() * 10000)}${ext}` |
|
|
} |
|
|
|
|
|
function pickRandom(list) { |
|
|
return list[Math.floor(Math.random() * list.length)] |
|
|
} |
|
|
|
|
|
const spinner = { |
|
|
"interval": 120, |
|
|
"frames": [ |
|
|
"π", |
|
|
"π", |
|
|
"π", |
|
|
"π", |
|
|
"π", |
|
|
"π", |
|
|
"π", |
|
|
"π", |
|
|
"π", |
|
|
"π", |
|
|
"π", |
|
|
"π" |
|
|
]} |
|
|
|
|
|
let globalSpinner; |
|
|
|
|
|
|
|
|
const getGlobalSpinner = (disableSpins = false) => { |
|
|
if(!globalSpinner) globalSpinner = new spin({ color: 'blue', succeedColor: 'green', spinner, disableSpins}); |
|
|
return globalSpinner; |
|
|
} |
|
|
|
|
|
spins = getGlobalSpinner(false) |
|
|
|
|
|
const start = (id, text) => { |
|
|
spins.add(id, {text: text}) |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
const info = (id, text) => { |
|
|
spins.update(id, {text: text}) |
|
|
} |
|
|
const success = (id, text) => { |
|
|
spins.succeed(id, {text: text}) |
|
|
|
|
|
} |
|
|
|
|
|
const close = (id, text) => { |
|
|
spins.fail(id, {text: text}) |
|
|
} |
|
|
|
|
|
const banner = cfonts.render(('LOADING...'), { |
|
|
font: 'chrome', |
|
|
color: 'candy', |
|
|
align: 'center', |
|
|
gradient: ["red","yellow"], |
|
|
lineHeight: 3 |
|
|
}); |
|
|
|
|
|
|
|
|
module.exports = { wait, simih, getBuffer, h2k, generateMessageID, getGroupAdmins, getRandom, start, info, success, banner, close, pickRandom } |
|
|
|