openclaw-neo-bot / telegram_bot.py
bakulkrupuk2025's picture
Create telegram_bot.py
d5857c9 verified
Raw
History Blame
7.49 kB
import os
import asyncio
import httpx
from modules.agents import MODULES, run_module
from jarvis_links import get_all_links, get_random_template
BOT_TOKEN = os.environ.get("TELEGRAM_BOT_TOKEN", "")
MASTER_CHAT_ID = os.environ.get("TELEGRAM_CHAT_ID", "")
API_URL = f"https://api.telegram.org/bot{BOT_TOKEN}"
class JarvisTelegramBot:
def __init__(self):
self.offset = 0
self.running = False
async def send_message(self, chat_id: str, text: str) -> bool:
if not BOT_TOKEN:
return False
try:
async with httpx.AsyncClient(timeout=30) as client:
response = await client.post(f"{API_URL}/sendMessage", json={
"chat_id": chat_id,
"text": text[:4096],
"parse_mode": "Markdown"
})
return response.status_code == 200
except Exception:
return False
async def notify_master(self, text: str):
if MASTER_CHAT_ID:
await self.send_message(MASTER_CHAT_ID, text)
async def get_updates(self) -> list:
try:
async with httpx.AsyncClient(timeout=30) as client:
response = await client.get(f"{API_URL}/getUpdates",
params={"offset": self.offset, "timeout": 10})
if response.status_code == 200:
return response.json().get("result", [])
except Exception:
pass
return []
async def process_command(self, chat_id: str, text: str) -> str:
parts = text.strip().split(None, 2)
command = parts[0].lower()
args = parts[1] if len(parts) > 1 else ""
extra = parts[2] if len(parts) > 2 else ""
if command in ["/start", "/help"]:
return """🤖 *JARVIS EMPIRE — Online*
*COMMANDS:*
/status — Cek status sistem
/trend [topik] — Hijack trending topic
/write [topik] [hostinger/shopee] — Tulis konten
/analyze [konten] — Prediksi viral score
/scout [target] — Riset kompetitor
/ghost [konten] — Distribusi multi-platform
/publish [konten] — Jadwal publishing
/analyst — Analisa performa
/links — Affiliate links
/runall — Jalankan semua modul"""
elif command == "/status":
from ai_engine import engine
available = engine.get_available_providers()
return f"""⚡ *JARVIS STATUS*
*AI Providers:* {len(available)} aktif
{chr(10).join(['✅ ' + p for p in available]) if available else '❌ Tidak ada API key'}
*Modul:* 7 aktif
*Status:* 🟢 Online"""
elif command == "/links":
links = get_all_links()
msg = "🔗 *AFFILIATE LINKS*\n\n"
for platform, data in links.items():
msg += f"*{platform.upper()}*\n{data['full']}\nKomisi: {data['commission']}\n\n"
return msg
elif command == "/trend":
topic = args or None
await self.send_message(chat_id, "🔥 Mencari trending topic...")
result = await run_module("trend", custom_topic=topic)
return f"🔥 *TREND HIJACKER*\n\n{result['output']}\n\n_via {result['provider']}_"
elif command == "/write":
if not args:
return "❌ Format: `/write [topik] [hostinger/shopee]`"
platform = "shopee" if "shopee" in text.lower() else "hostinger"
topic = args.replace("shopee","").replace("hostinger","").strip()
await self.send_message(chat_id, f"✍️ Menulis konten '{topic}'...")
result = await run_module("writer", topic=topic, platform=platform)
return f"✍️ *KONTEN AFFILIATE*\n\n{result['output']}\n\n_via {result['provider']}_"
elif command == "/analyze":
content = f"{args} {extra}".strip()
if not content:
return "❌ Format: `/analyze [konten]`"
await self.send_message(chat_id, "📊 Menganalisa...")
result = await run_module("viral", content=content)
return f"📊 *VIRAL PREDICTOR*\n\n{result['output']}\n\n_via {result['provider']}_"
elif command == "/scout":
target = args or "hostinger competitor indonesia"
await self.send_message(chat_id, f"🔍 Riset '{target}'...")
result = await run_module("scout", target=target)
return f"🔍 *SCOUT REPORT*\n\n{result['output']}\n\n_via {result['provider']}_"
elif command == "/ghost":
content = f"{args} {extra}".strip()
if not content:
return "❌ Format: `/ghost [konten]`"
await self.send_message(chat_id, "👻 Menyiapkan distribusi...")
result = await run_module("ghost", content=content)
return f"👻 *GHOST NETWORK*\n\n{result['output']}\n\n_via {result['provider']}_"
elif command == "/publish":
content = f"{args} {extra}".strip()
if not content:
return "❌ Format: `/publish [konten]`"
await self.send_message(chat_id, "📢 Membuat jadwal...")
result = await run_module("publisher", content=content)
return f"📢 *PUBLISHER*\n\n{result['output']}\n\n_via {result['provider']}_"
elif command == "/analyst":
await self.send_message(chat_id, "📈 Menganalisa performa...")
result = await run_module("analyst")
return f"📈 *ANALYST*\n\n{result['output']}\n\n_via {result['provider']}_"
elif command == "/runall":
await self.send_message(chat_id, "🚀 Menjalankan semua modul...")
results = []
for name, module in MODULES.items():
try:
await module.run()
results.append(f"✅ {module.name}")
except:
results.append(f"❌ {name}")
return "🚀 *RUN ALL*\n\n" + "\n".join(results)
else:
from ai_engine import engine
result = await engine.think(text)
return f"🤖 *JARVIS:*\n\n{result['response']}\n\n_via {result['provider']}_"
async def start_polling(self):
self.running = True
print("🤖 Telegram Bot polling started...")
if MASTER_CHAT_ID:
await self.notify_master("🟢 *JARVIS EMPIRE ONLINE*\n\nSistem aktif, Master!")
while self.running:
try:
updates = await self.get_updates()
for update in updates:
self.offset = update["update_id"] + 1
message = update.get("message", {})
if not message:
continue
chat_id = str(message["chat"]["id"])
text = message.get("text", "")
if not text:
continue
if MASTER_CHAT_ID and chat_id != MASTER_CHAT_ID:
await self.send_message(chat_id, "⛔ Unauthorized.")
continue
response = await self.process_command(chat_id, text)
if response:
for i in range(0, len(response), 4000):
await self.send_message(chat_id, response[i:i+4000])
except Exception as e:
print(f"Bot error: {e}")
await asyncio.sleep(1)
def stop(self):
self.running = False
bot = JarvisTelegramBot()