| | 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 } |
| |
|