| const express = require('express'); | |
| const axios = require('axios'); | |
| const app = express(); | |
| const WEBHOOK = process.env.WHOOK; | |
| let lastSnap = '', lastMinute = -1, lastSent = ''; | |
| const seedOrder = [ | |
| 'Carrot', 'Strawberry', 'Blueberry', 'Orange Tulip', 'Tomato', 'Corn', 'Daffodil', | |
| 'Watermelon', 'Pumpkin', 'Apple', 'Bamboo', 'Coconut', 'Cactus', 'Dragon Fruit', | |
| 'Mango', 'Grape', 'Mushroom', 'Pepper', 'Cacao', 'Beanstalk', 'Ember Lily', 'Sugar Apple' | |
| ]; | |
| const gearOrder = [ | |
| 'Watering Can', 'Trowel', 'Recall Wrench', 'Basic Sprinkler', 'Advanced Sprinkler', | |
| 'Godly Sprinkler', 'Lightning Rod', 'Master Sprinkler', 'Cleaning Spray', | |
| 'Favorite Tool', 'Harvest Tool', 'Friendship Pot' | |
| ]; | |
| const sortList = (arr, order) => | |
| arr | |
| .filter(i => i?.value) | |
| .sort((a, b) => order.indexOf(a.name) - order.indexOf(b.name)) | |
| .map(i => `${i.name} **x${i.value}**`); | |
| const build = (seeds, gears, eggs) => { | |
| const snap = JSON.stringify([seeds, gears, eggs]); | |
| if (snap === lastSnap) return; | |
| lastSnap = snap; | |
| const desc = [ | |
| `**SEEDS STOCK**`, | |
| ...seeds, | |
| '', | |
| `**GEAR STOCK**`, | |
| ...gears, | |
| '', | |
| eggs.length ? `**EGG STOCK**\n${eggs.map(e => `${e.name} **x${e.value}**`).join('\n')}` : '' | |
| ].join('\n'); | |
| const pingItems = ['Godly Sprinkler', 'Cactus', 'Lightning Rod', 'Master Sprinkler', 'Beanstalk', 'Ember Lily', 'Sugar Apple', 'Legendary Egg', 'Mythical Egg', 'Bug Egg']; | |
| const ping = pingItems.some(item => desc.includes(item)); | |
| return { | |
| content: ping ? '@everyone' : undefined, | |
| embeds: [{ | |
| description: desc.trim(), | |
| color: 0x5865F2, | |
| timestamp: new Date().toISOString() | |
| }] | |
| }; | |
| }; | |
| setInterval(() => { | |
| const now = new Date(), m = now.getMinutes(); | |
| if (m % 5 !== 0 || m === lastMinute) return; | |
| lastMinute = m; | |
| setTimeout(async () => { | |
| try { | |
| const { data } = await axios.get('https://fast72-stock.hf.space/'); | |
| if (!data?.seeds || !data?.gears) return; | |
| const seeds = sortList(data.seeds, seedOrder); | |
| const gears = sortList(data.gears, gearOrder); | |
| const eggs = data.eggs?.filter(e => e?.value) || []; | |
| const payload = build(seeds, gears, eggs); | |
| if (!payload) return; | |
| await axios.post(WEBHOOK, payload); | |
| const time = new Date().toLocaleString('en-US', { timeZone: 'Asia/Jakarta' }); | |
| lastSent = new Date(time).toLocaleTimeString('id-ID', { hour12: false }); | |
| } catch (e) { | |
| console.error('[ERROR]', e.message); | |
| } | |
| }, 5000); | |
| }, 3000); | |
| app.get('/', (_, res) => res.send(`Sent at ${lastSent || '-'}`)); | |
| app.listen(7860); |