File size: 3,973 Bytes
1e0c9d6
 
ba34f84
 
1e0c9d6
 
479d580
1e0c9d6
 
7ce64c9
9f65335
 
479d580
9f65335
479d580
1e0c9d6
 
 
 
9f65335
1e0c9d6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2142971
7d376c9
2142971
 
1e0c9d6
 
eceb86e
9f65335
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1e0c9d6
 
 
b00d2c6
9f65335
1e0c9d6
 
 
 
9f65335
 
 
 
eceb86e
9f65335
b00d2c6
9f65335
1e0c9d6
 
9f65335
1e0c9d6
 
 
9f65335
1e0c9d6
9f65335
 
1e0c9d6
 
 
 
9f65335
1e0c9d6
 
 
 
2142971
1e0c9d6
 
 
 
 
9f65335
 
479d580
ba34f84
 
9f65335
 
1e0c9d6
 
9f65335
2142971
 
1e0c9d6
9f65335
1e0c9d6
9f65335
4501114
1e0c9d6
9f65335
 
 
ba34f84
9f65335
479d580
 
 
9f65335
ba34f84
eece125
ba34f84
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import gradio as gr
import subprocess
import asyncio
import threading
from queue import Queue, Empty
import os
import time
from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes

# --- Config ---
BOT_TOKEN = os.environ.get("BOT_TOKEN", "YOUR_BOT_TOKEN_HERE")

# --- Globals ---
bot_app = None
bot_running = False
log_queue = Queue()
telegram_cmd_logs = []

# --- Telegram Bot Command Handler ---
async def bash_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
    cmd = ' '.join(context.args)
    if not cmd:
        await update.message.reply_text("Usage: /bash <command>")
        return

    log_queue.put(f"[Telegram] Received command: {cmd}")
    try:
        proc = await asyncio.create_subprocess_shell(
            cmd,
            stdout=asyncio.subprocess.PIPE,
            stderr=asyncio.subprocess.STDOUT,
        )
        stdout, _ = await proc.communicate()
        output = stdout.decode().strip()
        if len(output) > 4000:
            output = output[:4000] + "\n...[truncated]"
    except Exception as e:
        output = f"Error: {e}"

    await update.message.reply_text(f"$ {cmd}\n{output}")
    telegram_cmd_logs.append(f"$ {cmd}\n{output}")
    if len(telegram_cmd_logs) > 50:
        telegram_cmd_logs.pop(0)

# --- Terminal Command Function ---
def live_terminal(cmd):
    if not cmd.strip():
        yield "$ "
        return
    yield f"$ {cmd}\n"
    process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)
    for line in iter(process.stdout.readline, ''):
        yield line
    process.stdout.close()
    process.wait()
    yield "$ "

# --- Bot Start/Stop Functions ---
def start_bot_sync():
    global bot_app, bot_running
    if bot_running:
        log_queue.put("[Bot] Already running.")
        return

    async def main():
        global bot_app, bot_running
        bot_app = ApplicationBuilder().token(BOT_TOKEN).build()
        bot_app.add_handler(CommandHandler("bash", bash_command))
        bot_running = True
        log_queue.put("[Bot] Started.")
        await bot_app.initialize()
        await bot_app.start()
        await bot_app.updater.start_polling()

    asyncio.run(main())

def stop_bot_sync():
    global bot_app, bot_running
    if not bot_running:
        log_queue.put("[Bot] Not running.")
        return

    async def shutdown():
        await bot_app.updater.stop()
        await bot_app.stop()
        await bot_app.shutdown()
        log_queue.put("[Bot] Stopped.")

    asyncio.run(shutdown())
    bot_running = False

# --- Log Collector ---
def update_log_box():
    logs = []
    try:
        while True:
            logs.append(log_queue.get_nowait())
    except Empty:
        pass
    logs.extend(telegram_cmd_logs[-20:])
    return "\n".join(logs[-20:])

# --- Gradio UI ---
with gr.Blocks() as demo:
    gr.Markdown("## πŸ–₯️ Live Terminal + Telegram Bot Interface")

    with gr.Row():
        terminal_output = gr.Textbox(label="Live Terminal", lines=20, interactive=False)
        cmd_input = gr.Textbox(placeholder="Type shell command", label="Command Input")

    with gr.Row():
        run_btn = gr.Button("▢️ Run")
        start_btn = gr.Button("πŸ€– Start Telegram Bot")
        stop_btn = gr.Button("πŸ›‘ Stop Telegram Bot")

    log_output = gr.Textbox(label="πŸ“œ Bot & Telegram Logs", lines=15, interactive=False)

    # Streaming terminal output
    run_btn.click(fn=live_terminal, inputs=cmd_input, outputs=terminal_output)

    # Start/Stop bot
    start_btn.click(lambda: update_log_box() or start_bot_sync(), outputs=log_output)
    stop_btn.click(lambda: update_log_box() or stop_bot_sync(), outputs=log_output)

    # Auto log updater every 3 seconds (Gradio v5 style)
    def background_log_updater():
        while True:
            time.sleep(3)
            yield update_log_box()

    demo.load(background_log_updater, outputs=log_output)

demo.launch()