Untitled

mail@pastecode.io avatar
unknown
python
a month ago
2.3 kB
11
Indexable
Never
import multiprocessing
import uuid
import asyncio
from pyrogram import Client
from pyrogram.raw import functions
from multiprocessing import Process, Queue


def client_worker(userbot_id, task_queue, result_queue):
    client = Client(f"userbot_{userbot_id}")
    client.start()
    
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)

    async def process_task(task):
        action = task['action']
        if action == 'get_full_chat':
            chat_id = task['chat_id']
            entity = await client.resolve_peer(chat_id)
            full_chat = await client.invoke(functions.channels.GetFullChannel(channel=entity))
            result_queue.put((task['task_id'], full_chat))
    
    while True:
        task = task_queue.get()
        if task == 'STOP':
            break
        loop.run_until_complete(process_task(task))
    
    client.stop()


class ClientManager:
    def __init__(self, userbot_ids):
        self.clients = {}
        
        for userbot_id in userbot_ids:
            task_queue = Queue()
            result_queue = Queue()
            process = Process(target=client_worker, args=(userbot_id, task_queue, result_queue))
            process.start()
            self.clients[userbot_id] = {
                'process': process,
                'task_queue': task_queue,
                'result_queue': result_queue
            }

    def send_task(self, userbot_id, task):
        task_id = str(uuid.uuid4())
        task['task_id'] = task_id
        self.clients[userbot_id]['task_queue'].put(task)
        return task_id

    def get_result(self, userbot_id, task_id):
        while True:
            result_task_id, result = self.clients[userbot_id]['result_queue'].get()
            if result_task_id == task_id:
                return result

    def stop_clients(self):
        for client in self.clients.values():
            client['task_queue'].put('STOP')
            client['process'].join()


if __name__ == "__main__":
    userbot_ids = ['userbot_1', 'userbot_2']
    manager = ClientManager(userbot_ids)
    
    chat_id = -100123456789
    task_id = manager.send_task('userbot_1', {'action': 'get_full_chat', 'chat_id': chat_id})
    
    full_chat = manager.get_result('userbot_1', task_id)
    print(full_chat)
    
    manager.stop_clients()
Leave a Comment