AnshorFalahi

chatbot+reminder

May 13th, 2025
19
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const { Component } = require('@neoxr/wb');
  2. const { Function: Func } = new Component();
  3. const { watermark } = require('../../lib/canvas');
  4. const { Utils, Chatbot } = require('../../lib/gemini');
  5. const ffmpeg = require('fluent-ffmpeg');
  6. const path = require('path');
  7. const fs = require('fs');
  8. const bytes = require('bytes');
  9.  
  10. // Load instruction
  11. const instruction = fs.readFileSync(path.join(process.cwd(), 'media/txt/prompt-id.txt'), 'utf-8');
  12.  
  13. // Inisialisasi database pengingat
  14. global.db.reminders = global.db.reminders || [];
  15.  
  16. // Fungsi parsing waktu pengingat
  17. function parseReminderTime(text) {
  18.    const match = text.match(/(\d+)\s*(menit|jam|detik|hari)/i);
  19.    if (!match) return null;
  20.  
  21.    const value = parseInt(match[1]);
  22.    const unit = match[2].toLowerCase();
  23.  
  24.    const timeMap = {
  25.       detik: 1000,
  26.       menit: 60 * 1000,
  27.       jam: 60 * 60 * 1000,
  28.       hari: 24 * 60 * 60 * 1000
  29.    };
  30.  
  31.    return Date.now() + (timeMap[unit] || 0) * value;
  32. }
  33.  
  34. // Periksa pengingat yang waktunya telah tiba
  35. async function checkReminders(client) {
  36.    const now = Date.now();
  37.    const dueReminders = global.db.reminders.filter(r => r.time <= now);
  38.  
  39.    for (const reminder of dueReminders) {
  40.       try {
  41.          await client.sendMessage(reminder.chatId, {
  42.             text: `⏰ [PENGINGAT] ${reminder.text}`
  43.          });
  44.          global.db.reminders = global.db.reminders.filter(r =>
  45.             !(r.jid === reminder.jid && r.time === reminder.time && r.text === reminder.text)
  46.          );
  47.       } catch (e) {
  48.          console.error('Gagal mengirim pengingat:', e);
  49.       }
  50.    }
  51. }
  52.  
  53. let reminderInterval;
  54.  
  55. exports.run = {
  56.    async: async (m, { client, body, users, setting, env, Func }) => {
  57.       try {
  58.          // Mulai interval pengecekan pengingat
  59.          if (!reminderInterval) {
  60.             reminderInterval = setInterval(() => checkReminders(client), 30000);
  61.          }
  62.  
  63.          // Perintah pengingat
  64.          if (/ingatkan\s+saya/i.test(body)) {
  65.             const timeMatch = body.match(/(\d+)\s*(menit|jam|detik|hari)/i);
  66.             const reminderText = body.replace(/ingatkan\s+saya\s+\d+\s*(menit|jam|detik|hari)\s+kedepan\s+untuk/i, '')
  67.                .replace(/^[,\s]+|[,\s]+$/g, '').trim();
  68.  
  69.             if (!timeMatch || !reminderText) {
  70.                return client.reply(m.chat, Func.texted('bold', 'Format salah. Contoh: "ingatkan saya 5 menit kedepan untuk mengangkat jemuran"'), m);
  71.             }
  72.  
  73.             const reminderTime = parseReminderTime(body);
  74.             if (!reminderTime) {
  75.                return client.reply(m.chat, Func.texted('bold', 'Format waktu tidak valid. Gunakan menit/jam/detik/hari'), m);
  76.             }
  77.  
  78.             global.db.reminders.push({
  79.                jid: m.sender,
  80.                time: reminderTime,
  81.                text: reminderText,
  82.                chatId: m.chat
  83.             });
  84.  
  85.             return client.reply(
  86.                m.chat,
  87.                Func.texted('bold', `⏰ Saya akan mengingatkan Anda dalam ${timeMatch[1]} ${timeMatch[2]} untuk:\n"${reminderText}"`),
  88.                m
  89.             );
  90.          }
  91.  
  92.          // Auto AI
  93.          global.db.autoai = global.db.autoai || [];
  94.          let session = global.db.autoai.find(v => v.jid === m.sender);
  95.  
  96.          if (!session) {
  97.             global.db.autoai.push({ jid: m.sender, history: [] });
  98.             session = global.db.autoai.find(v => v.jid === m.sender);
  99.          }
  100.  
  101.          if (
  102.             m.sender !== client.decodeJid(client.user.id) &&
  103.             /conversation|extended|video|image|audio/.test(m.mtype) &&
  104.             !global.db.menfess?.find(v => v.from === m.sender || v.receiver === m.sender)?.state &&
  105.             !Func.socmed(body)
  106.          ) {
  107.             if (setting.chatbot && !env.evaluate_chars.some(v => body.startsWith(v))) {
  108.                const isTag = (m.mentionedJid || []).includes(client.decodeJid(client.user.id));
  109.                const isAI = m?.quoted?.id && /AI-/i.test(m?.quoted?.id);
  110.                const q = m.quoted || m;
  111.                const mime = (q.msg || q).mimetype;
  112.                const maxSize = '5MB';
  113.                const content = (m.quoted ? (body && typeof body === 'string' ? body : '') + ' ' + m.quoted?.text : body)?.trim();
  114.                const isBody = content.replace(new RegExp(`@${client.decodeJid(client.user.id).replace(/@.+/, '')}`, 'g'), '');
  115.  
  116.                const useAI = (m.isGroup && (isTag || isAI)) || (!m.isGroup && !isTag);
  117.                if (!useAI || !isBody || typeof isBody !== 'string') return;
  118.  
  119.                if (users.limit < 1) return client.reply(m.chat, Func.texted('bold', '🚩 Batas penggunaan anda habis.'), m);
  120.                if (/video|image\/(jpe?g|png)|audio|document/.test(mime) && (q.msg || q).fileLength.low >= bytes(maxSize)) {
  121.                   return client.reply(m.chat, Func.texted('bold', `🚩 Maksimal ukuran file adalah ${maxSize}.`), m);
  122.                }
  123.  
  124.                let buffer, cdn;
  125.                if (mime) {
  126.                   buffer = await q.download();
  127.                   cdn = await Utils.upload(buffer);
  128.                   if (!cdn.status) return;
  129.                }
  130.  
  131.                const json = await Chatbot(isBody, cdn?.data?.url || null, session.history, instruction);
  132.                if (!json.status) return client.reply(m.chat, Func.texted('bold', `❌ ${json.msg}`), m);
  133.  
  134.                const chat = await Utils.logic(json.data.message);
  135.                if (!chat.status) return client.reply(m.chat, Func.texted('bold', `❌ ${chat.msg}`), m);
  136.  
  137.                await wrapper(m, {
  138.                   client,
  139.                   metadata: chat.data,
  140.                   session,
  141.                   users,
  142.                   history: json.data.history,
  143.                   params: cdn?.data?.url ? { url: cdn.data.url } : {}
  144.                });
  145.             }
  146.          }
  147.       } catch (e) {
  148.          console.error(e);
  149.       }
  150.    },
  151.    error: false,
  152.    cache: true,
  153.    location: __filename
  154. };
  155.  
  156. // Wrapper handler
  157. const wrapper = (m, { client, metadata, session, users, history, params = {} }) => new Promise(async resolve => {
  158.    try {
  159.       const { context, command, argument, message } = metadata;
  160.       const send = m.isGroup ? client.reply : client.sendFromAI;
  161.  
  162.       if (context === 'NONE' || context === 'EMOTION') {
  163.          if (message) await send(m.chat, message, m, { isAI: true });
  164.          if (context === 'EMOTION') {
  165.             const buffer = await Func.fetchBuffer(`./media/sticker/${command.replace('stc_', '')}.webp`);
  166.             await client.sendSticker(m.chat, buffer, null, {
  167.                packname: global.db?.setting?.sk_pack || '',
  168.                author: global.db?.setting?.sk_author || ''
  169.             });
  170.          }
  171.          session.history = history;
  172.          users.limit -= 1;
  173.          return;
  174.       }
  175.  
  176.       if (context === 'REQUEST') {
  177.          if (message) m.reply(message);
  178.  
  179.          const Api = require('../../lib/api');
  180.          const handleResponse = async (resHandler) => {
  181.             try {
  182.                const json = await resHandler();
  183.                if (!json.status) throw new Error(json.msg);
  184.                return json;
  185.             } catch (e) {
  186.                m.reply(Func.texted('bold', `❌ ${e.message}`));
  187.                throw e;
  188.             }
  189.          };
  190.  
  191.          switch (command) {
  192.             case 'cmd_play': {
  193.                const json = await handleResponse(() => Api.neoxr('/play', { q: argument }));
  194.                await client.sendFile(m.chat, json.data.url, json.data.filename, '', m, {
  195.                   APIC: await Func.fetchBuffer(json.thumbnail),
  196.                   isAI: true
  197.                });
  198.                break;
  199.             }
  200.  
  201.             case 'cmd_genimg': {
  202.                const json = await handleResponse(() => Api.neoxr('/flux', { q: argument }));
  203.                const contents = await Promise.all(
  204.                   json.data.images.map(async (img) => {
  205.                      const image = await Func.fetchBuffer(img.url);
  206.                      const output = await watermark(image, fs.readFileSync('./media/image/watermark.png'));
  207.                      return { type: 'image', url: output.buffer };
  208.                   })
  209.                );
  210.                await client.sendAlbumMessage(m.chat, contents, m, { isAI: true });
  211.                break;
  212.             }
  213.  
  214.             case 'cmd_edit': {
  215.                if (!params.url) return m.reply('Mohon kirimkan gambar.');
  216.                const json = await handleResponse(() => Api.neoxr('/photo-editor', { image: params.url, q: argument }));
  217.                const image = await Func.fetchBuffer(json.data.url);
  218.                const output = await watermark(image, fs.readFileSync('./media/image/watermark.png'));
  219.                await client.sendFile(m.chat, output.buffer, '', '', m, { isAI: true });
  220.                break;
  221.             }
  222.  
  223.             case 'cmd_pin': {
  224.                const json = await handleResponse(() => Api.neoxr('/pinterest', { q: argument }));
  225.                const imgUrl = Func.random(json.data);
  226.                await client.sendFile(m.chat, imgUrl, '', '', m, { isAI: true });
  227.                break;
  228.             }
  229.  
  230.             case 'cmd_pinimg':
  231.             case 'cmd_pinvid': {
  232.                const json = await handleResponse(() =>
  233.                   Api.neoxr('/pinterest-v2', {
  234.                      q: argument,
  235.                      show: 20,
  236.                      type: command === 'cmd_pinimg' ? 'image' : 'video'
  237.                   })
  238.                );
  239.  
  240.                const result = Func.shuffle(json.data).slice(0, 1);
  241.                for (const v of result) {
  242.                   const url = v.content[0].url;
  243.                   if (command === 'cmd_pinvid' && /m3u8/.test(url)) {
  244.                      const output = './temp/' + Func.filename('mp4');
  245.                      ffmpeg(url)
  246.                         .on('error', () => m.reply(Func.texted('bold', '🚩 Konversi gagal!')))
  247.                         .on('end', () => client.sendFile(m.chat, output, '', '', m))
  248.                         .outputOptions(['-c copy', '-bsf:a aac_adtstoasc'])
  249.                         .output(output)
  250.                         .run();
  251.                   } else {
  252.                      await client.sendFile(m.chat, url, '', '', m, { isAI: true });
  253.                   }
  254.                }
  255.                break;
  256.             }
  257.  
  258.             default:
  259.                await client.reply(m.chat, message, m, { isAI: true });
  260.          }
  261.       }
  262.    } catch (e) {
  263.       console.error(e);
  264.       m.reply(e.message);
  265.    }
  266. });
  267.  
Add Comment
Please, Sign In to add comment