111dhruvil111/EntrysakibotPublic · Bot Template

AIThis TBL bot implements a private crypto community access flow called RED EYE. It stores user Telegram profiles, enforces entry requirements such as minimum crypto net worth and deal volume, and offers inline buttons for applying, checking application status, and contacting support. Admin commands are protected by an owner/admin registry, log actions to an audit trail, and route callback-driven menus. A global webhook worker retries failed notifications, and the wildcard handler collects multi-step form input such as asset names.

Socialcryptoprivate-communityaccess-applicationadmin-panelaudit-lognotifications
ProfileTelegram
7 commands0 envUpdated 20d agoCreated Aug 17, 2026
Back to folder

commands/_workers.js

javascript · 45 lines

Raw
1/**#command2name: /workers3answer: 4keyboard: 5parse_mode: markdown6aliases: 7allow_only_group: false8need_reply: false9is_web: 010#command**/11 12/**#command13name: /worker14answer:15keyboard:16parse_mode: markdown17aliases:18allow_only_group: false19need_reply: 020case_insensitive: true21is_web: 022#command**/23 24// RED EYE signed Global-Webhook worker.25// This command is not shown to normal users. Call only through Webhook.getGlobalUrl().26let workerSettings=await db.bot.get("system_settings",{});if(!workerSettings||typeof workerSettings!=="object")workerSettings={};27let workerOwner=Number(workerSettings.owner_id||771142220),workerNow=Date.now();28 29async function workerAudit(action,target,details){let a=await db.bot.get("audit_logs",[]);if(!Array.isArray(a))a=[];a.push({id:"AUD-"+Date.now()+"-"+Math.floor(Math.random()*100000),action:String(action||"worker"),target_user_id:Number(target||0)||undefined,details:details||{},by:0,at:Date.now()});await db.bot.set("audit_logs",a.slice(-1000));}30async function workerSafeNotify(payload,kind,target){try{let r=await Api.sendMessage(payload);if(r&&r.ok===false)throw new Error(String(r.description||"send_failed"));return true;}catch(e){let q=await db.bot.get("notification_retry_queue",[]);if(!Array.isArray(q))q=[];q.push({id:"NQ-"+Date.now()+"-"+Math.floor(Math.random()*100000),payload:payload,kind:String(kind||"notification"),target_user_id:Number(target||payload.chat_id||0),attempts:0,next_retry_at:Date.now()+5*60000,created_at:Date.now()});await db.bot.set("notification_retry_queue",q.slice(-500));return false;}}31async function workerRetryNotifications(){let q=await db.bot.get("notification_retry_queue",[]);if(!Array.isArray(q)||!q.length)return {sent:0,pending:0,dropped:0};let now=Date.now(),out=[],sent=0,dropped=0;for(let n of q){if(!n||!n.payload)continue;if(Number(n.next_retry_at||0)>now){out.push(n);continue;}try{let r=await Api.sendMessage(n.payload);if(r&&r.ok===false)throw new Error("send_failed");sent++;}catch(e){n.attempts=Number(n.attempts||0)+1;if(n.attempts>=5){dropped++;await workerAudit("notification_retry_exhausted",n.target_user_id,{kind:n.kind,attempts:n.attempts});}else{n.next_retry_at=now+Math.min(60,5*Math.pow(2,n.attempts-1))*60000;out.push(n);}}}await db.bot.set("notification_retry_queue",out.slice(-500));return {sent:sent,pending:out.length,dropped:dropped};}32function workerEvm(a){return /^0x[a-fA-F0-9]{40}$/.test(String(a||"").trim());}33async function workerPrice(asset){asset=String(asset||"").toUpperCase();let pap={BTC:"btc-bitcoin",ETH:"eth-ethereum",SOL:"sol-solana",TON:"ton-toncoin",USDT:"usdt-tether"},geo={BTC:"bitcoin",ETH:"ethereum",SOL:"solana",TON:"the-open-network",USDT:"tether"};if(!pap[asset])return {ok:false,status:"manual_review"};try{let base=String((typeof process!=="undefined"&&process.env&&process.env.COINPAPRIKA_BASE_URL)||"https://api.coinpaprika.com/v1").replace(/\/+$/,""),r=await HTTP.get({url:base+"/tickers/"+encodeURIComponent(pap[asset]),timeout:6500,responseType:"json"}),v=r&&r.ok&&r.data&&r.data.quotes&&r.data.quotes.USD?Number(r.data.quotes.USD.price):0;if(v>0)return {ok:true,price:v,source:"coinpaprika"};}catch(e){}try{let id=geo[asset],base=String((typeof process!=="undefined"&&process.env&&process.env.COINGECKO_BASE_URL)||"https://api.coingecko.com/api/v3").replace(/\/+$/,""),r=await HTTP.get({url:base+"/simple/price?ids="+encodeURIComponent(id)+"&vs_currencies=usd",timeout:6500,responseType:"json"}),v=r&&r.ok&&r.data&&r.data[id]?Number(r.data[id].usd):0;if(v>0)return {ok:true,price:v,source:"coingecko"};}catch(e){}return {ok:false,status:"temporary_unavailable"};}34async function workerBalance(w){let asset=String(w.asset||"").toUpperCase(),network=String(w.network||"").toUpperCase(),address=String(w.address||"").trim();if(!asset||!address)return {ok:false,status:"manual_review"};if(asset==="BTC"||network.indexOf("BITCOIN")>=0){try{let base=String((typeof process!=="undefined"&&process.env&&process.env.MEMPOOL_API_URL)||"https://mempool.space/api").replace(/\/+$/,""),r=await HTTP.get({url:base+"/address/"+encodeURIComponent(address),timeout:7500,responseType:"json"});if(r&&r.ok&&r.data&&r.data.chain_stats){let x=r.data.chain_stats;return {ok:true,balance:Math.max(0,(Number(x.funded_txo_sum||0)-Number(x.spent_txo_sum||0))/1e8),source:"mempool.space"};}}catch(e){}return {ok:false,status:"temporary_unavailable"};}if(asset==="ETH"&&(network.indexOf("ETH")>=0||network.indexOf("ERC")>=0)){if(!workerEvm(address))return {ok:false,status:"manual_review"};let rpc=String((typeof process!=="undefined"&&process.env&&process.env.EVM_RPC_URL)||"https://cloudflare-eth.com");try{let r=await HTTP.post({url:rpc,timeout:7500,responseType:"json",body:{jsonrpc:"2.0",id:1,method:"eth_getBalance",params:[address,"latest"]}}),h=r&&r.ok&&r.data?String(r.data.result||""):"";if(/^0x[0-9a-fA-F]+$/.test(h))return {ok:true,balance:Number(BigInt(h))/1e18,source:"evm_rpc"};}catch(e){}return {ok:false,status:"temporary_unavailable"};}if(asset==="USDT"&&(network.indexOf("ETH")>=0||network.indexOf("ERC")>=0)){if(!workerEvm(address))return {ok:false,status:"manual_review"};let rpc=String((typeof process!=="undefined"&&process.env&&process.env.EVM_RPC_URL)||"https://cloudflare-eth.com"),contract="0xdAC17F958D2ee523a2206206994597C13D831ec7",clean=address.slice(2).toLowerCase().padStart(64,"0");try{let r=await HTTP.post({url:rpc,timeout:7500,responseType:"json",body:{jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:contract,data:"0x70a08231"+clean},"latest"]}}),h=r&&r.ok&&r.data?String(r.data.result||""):"";if(/^0x[0-9a-fA-F]+$/.test(h))return {ok:true,balance:Number(BigInt(h))/1e6,source:"erc20_rpc"};}catch(e){}return {ok:false,status:"temporary_unavailable"};}if(asset==="SOL"||network.indexOf("SOLANA")>=0){let rpc=String((typeof process!=="undefined"&&process.env&&process.env.SOLANA_RPC_URL)||"https://api.mainnet-beta.solana.com");try{let r=await HTTP.post({url:rpc,timeout:7500,responseType:"json",body:{jsonrpc:"2.0",id:1,method:"getBalance",params:[address]}}),v=r&&r.ok&&r.data&&r.data.result?Number(r.data.result.value):NaN;if(Number.isFinite(v))return {ok:true,balance:v/1e9,source:"solana_rpc"};}catch(e){}return {ok:false,status:"temporary_unavailable"};}if(asset==="TON"||network.indexOf("TON")>=0){let base=String((typeof process!=="undefined"&&process.env&&process.env.TONCENTER_API_URL)||"https://toncenter.com/api/v2").replace(/\/+$/,""),key=String((typeof process!=="undefined"&&process.env&&process.env.TONCENTER_API_KEY)||"");try{let r=await HTTP.get({url:base+"/getAddressBalance?address="+encodeURIComponent(address)+(key?"&api_key="+encodeURIComponent(key):""),timeout:7500,responseType:"json"}),v=r&&r.ok&&r.data&&r.data.ok===true?Number(r.data.result):NaN;if(Number.isFinite(v))return {ok:true,balance:v/1e9,source:"toncenter"};}catch(e){}return {ok:false,status:"temporary_unavailable"};}return {ok:false,status:"manual_review"};}35async function workerVerifyOne(w){let b=await workerBalance(w);if(!b.ok)return {ok:false,status:b.status||"temporary_unavailable",checked_at:Date.now()};let p=await workerPrice(w.asset);if(!p.ok)return {ok:false,status:p.status||"temporary_unavailable",balance:b.balance,checked_at:Date.now()};return {ok:true,status:"verified",balance:b.balance,price_usd:p.price,usd_value:b.balance*p.price,balance_source:b.source,price_source:p.source,checked_at:Date.now()};}36 37let retry=await workerRetryNotifications();await db.bot.set("background_worker_last_run",workerNow);38let lastBatch=Number(await db.bot.get("wallet_monitor_batch_last_run",0)||0),scanInfo={skipped:true};39if(!lastBatch||workerNow-lastBatch>=10*60000){40  await db.bot.set("wallet_monitor_batch_last_run",workerNow);let cursor=Number(await db.bot.get("wallet_monitor_cursor",0)||0),users=[];try{users=await Bot.getUsers({full:true,chatType:"private",limit:25,skip:cursor});}catch(e){users=[];await workerAudit("wallet_monitor_user_list_failed",0,{message:String(e&&e.message||e)});}if(!Array.isArray(users))users=[];41  let alerts=await db.bot.get("alerts",[]);if(!Array.isArray(alerts))alerts=[];let low=Number(workerSettings.low_wallet_threshold||500),clear=Number(workerSettings.low_wallet_clear_threshold||600),days=Number(workerSettings.low_wallet_duration_days||7),scanned=0,memberCount=0,examined=0;42  for(let u of users){examined++;let id=Number(typeof u==="object"?u.user_id:u);if(!id)continue;let ms=String(await db.user.get("member_status","",{user_id:id}));if(!["active","approved_pending_join"].includes(ms))continue;memberCount++;let ws=await db.user.get("wallets",[],{user_id:id});if(!Array.isArray(ws)||!ws.length)continue;let results=await Promise.all(ws.map(w=>workerVerifyOne(w||{}))),total=0,out=[];for(let i=0;i<ws.length;i++){let vr=results[i],nw=Object.assign({},ws[i]||{},{auto_verification:vr,verification_checked_at:Date.now()});if(vr.ok)total+=Number(vr.usd_value||0);out.push(nw);}await db.user.set("wallets",out,{user_id:id});await db.user.set("auto_verified_crypto_total",total,{user_id:id});await db.user.set("wallet_last_checked_at",Date.now(),{user_id:id});scanned++;let since=Number(await db.user.get("low_wallet_since",0,{user_id:id})||0);if(total<low){if(!since){since=Date.now();await db.user.set("low_wallet_since",since,{user_id:id});}if(Date.now()-since>=days*86400000&&!alerts.some(a=>a&&a.type==="low_wallet"&&Number(a.user_id)===id&&a.status!=="resolved")){alerts.push({id:"ALERT-"+id+"-"+Date.now(),type:"low_wallet",user_id:id,status:"open",value:total,threshold:low,since:since,created_at:Date.now()});await workerSafeNotify({chat_id:workerOwner,text:"🚨 <b>LOW WALLET ALERT</b>\n\nMember: <code>"+id+"</code>\nPublic value: <b>$"+total.toFixed(2)+"</b>\nBelow threshold for the configured duration. No automatic removal was performed.",parse_mode:"HTML"},"low_wallet_alert",workerOwner);}}else if(since&&total>=clear){await db.user.del("low_wallet_since",{user_id:id});for(let a of alerts)if(a&&a.type==="low_wallet"&&Number(a.user_id)===id&&a.status!=="resolved"){a.status="resolved";a.resolved_at=Date.now();a.resolve_reason="balance_recovered";}}if(scanned>=2)break;}43  await db.bot.set("alerts",alerts.slice(-1000));let reachedEnd=users.length<25&&examined>=users.length,nextCursor=reachedEnd?0:cursor+examined;await db.bot.set("wallet_monitor_cursor",nextCursor);if(reachedEnd)await db.bot.set("wallet_monitor_last_full_run",Date.now());scanInfo={cursor:cursor,users:users.length,examined:examined,members:memberCount,wallet_sets:scanned,next_cursor:nextCursor,full_cycle_complete:reachedEnd};await workerAudit("background_wallet_monitor_batch",0,scanInfo);44}45await workerAudit("background_worker_run",0,{retry_sent:retry.sent,retry_pending:retry.pending,retry_dropped:retry.dropped,scan:scanInfo});