import os import subprocess import asyncio import threading import pandas as pd import plotly.express as px import gradio as gr from datetime import datetime import psutil from telegram import Update from telegram.ext import ApplicationBuilder, MessageHandler, filters, ContextTypes # --- AYARLAR --- TOKEN = "8669709095:AAFRPWdZ9gaVX8PXuVsPJMFlUtOHicjyoyg" # Burayı kontrol et ALLOWED_USERS = [7671497065, 6518828406] COMMAND_HISTORY_FILE = "badtime_history.csv" # --- STORAGE MANTIĞI --- def save_command(user, cmd, status): now = datetime.now().strftime("%Y-%m-%d %H:%M:%S") new_data = pd.DataFrame([[now, user, cmd, status]], columns=['Tarih', 'Kullanıcı', 'Komut', 'Durum']) if not os.path.isfile(COMMAND_HISTORY_FILE): new_data.to_csv(COMMAND_HISTORY_FILE, index=False) else: new_data.to_csv(COMMAND_HISTORY_FILE, mode='a', header=False, index=False) # --- TERMİNAL MOTORU --- def run_shell(command): blacklist = ["rm -rf", "shred", "mkfs", "dd ", "shutdown", "reboot", ":(){ :|:& };:"] if any(b in command.lower() for b in blacklist): save_command("Sistem", command, "YASAKLANDI") return "❌ GÜVENLİK İHLALİ: Bu komut BadTiMe tarafından engellendi!" try: process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) stdout, stderr = process.communicate() output = stdout if stdout else stderr if not output or output.strip() == "": output = "Komut çalıştırıldı (Çıktı boş)." save_command("Admin", command, "Başarılı") return output except Exception as e: save_command("Admin", command, f"Hata: {str(e)}") return f"Sistem Hatası: {str(e)}" # --- GRADIO FONKSİYONLARI --- def get_dashboard_data(): if os.path.exists(COMMAND_HISTORY_FILE): df = pd.read_csv(COMMAND_HISTORY_FILE) recent = df.tail(15).iloc[::-1] fig = px.pie(df, names='Durum', title="BadTiMe İşlem Dağılımı") return recent, fig return pd.DataFrame(columns=['Tarih', 'Kullanıcı', 'Komut', 'Durum']), None def get_system_stats(): cpu = psutil.cpu_percent() ram = psutil.virtual_memory().percent return f"CPU: %{cpu} | RAM: %{ram}" # --- TELEGRAM BRIDGE --- async def telegram_bridge(update: Update, context: ContextTypes.DEFAULT_TYPE): user_id = update.effective_chat.id if user_id not in ALLOWED_USERS: save_command(f"Korsan:{user_id}", update.message.text, "REDDEDİLDİ") return cmd = update.message.text response = run_shell(cmd) # Telegram'a terminal çıktısını gönderiyoruz if len(response) > 4000: response = response[:4000] + "\n...(devamı Dashboard'da)" await update.message.reply_text(f"```\n{response}\n```", parse_mode='Markdown') def run_tg_bot(): """Telegram botunu yanıt verebilir şekilde başlatır""" loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) app = ApplicationBuilder().token(TOKEN).build() app.add_handler(MessageHandler(filters.TEXT & (~filters.COMMAND), telegram_bridge)) print("🚀 Telegram Hattı Dinleniyor...") app.run_polling(close_loop=False) # --- GRADIO ARAYÜZÜ (Gradio 6.0 Uyumlu) --- with gr.Blocks(theme=gr.themes.Monochrome()) as badtime_ui: gr.HTML("BadTiMe Control") gr.Markdown("# 💀 BadTiMe Command & Storage Center") with gr.Row(): stats_box = gr.Textbox(value=get_system_stats(), label="Sistem Durumu", interactive=False) refresh_stats = gr.Button("Yenile") with gr.Tab("🚀 Canlı Terminal"): with gr.Row(): cmd_input = gr.Textbox(label="Komut", placeholder="ls -la", scale=4) run_btn = gr.Button("ÇALIŞTIR", variant="primary", scale=1) output_display = gr.Code(label="Terminal Çıktısı", language="shell", lines=15) with gr.Tab("📁 Storage Bucket"): history_refresh = gr.Button("Kayıtları Getir", variant="primary") with gr.Row(): history_table = gr.DataFrame(label="Komut Geçmişi") stats_plot = gr.Plot(label="Analiz") run_btn.click(run_shell, inputs=cmd_input, outputs=output_display) refresh_stats.click(get_system_stats, outputs=stats_box) history_refresh.click(get_dashboard_data, outputs=[history_table, stats_plot]) if __name__ == "__main__": # Telegram Botunu Arka Planda Başlat tg_thread = threading.Thread(target=run_tg_bot, daemon=True) tg_thread.start() # Gradio Arayüzünü Başlat badtime_ui.launch(server_name="0.0.0.0", server_port=7860)