from telethon import TelegramClient
from telethon.tl.functions.messages import GetHistoryRequest
from telethon.tl.functions.stories import SendStoryRequest
from telethon.tl.types import (
    InputPeerChannel,
    InputPrivacyValueAllowAll,
    InputMediaUploadedPhoto,
    InputMediaUploadedDocument,
    MessageMediaPhoto,
    MessageMediaDocument,
    InputMediaPhotoExternal
)
import logging
import time

# تنظیم لاگینگ برای دیباگ
logging.basicConfig(level=logging.DEBUG)

api_id = 29007504  # API ID شما
api_hash = "877e958822f299acd9d72729b9507cd2"  # API Hash شما
session_name = 'my_session'  # نام فایل سشن

phone_number = 'YOUR_PHONE_NUMBER'  # شماره تلفن خود را وارد کنید
channel_username = 'oto_dianat'

client = TelegramClient(session_name, api_id, api_hash)

async def repost_story():
    try:
        # شروع اتصال
        if not client.is_connected():
            await client.start()

        while True:  # حلقه بی‌نهایت برای چک کردن مداوم
            try:
                # دریافت اطلاعات کانال
                channel = await client.get_entity(channel_username)
                logging.info(f"Successfully connected to channel: {channel.title}")

                # گرفتن تاریخچه پست‌های کانال
                history = await client(GetHistoryRequest(
                    peer=channel,
                    limit=1,  # فقط آخرین پست
                    offset_id=0,
                    offset_date=None,
                    add_offset=0,
                    max_id=0,
                    min_id=0,
                    hash=0
                ))

                if not history.messages:
                    print("❌ هیچ پستی در کانال یافت نشد! 30 ثانیه دیگر دوباره تلاش می‌کنم...")
                    time.sleep(30)
                    continue

                post = history.messages[0]
                
                # تنظیمات حریم خصوصی استوری
                privacy_rules = [InputPrivacyValueAllowAll()]

                # اگر پست فقط متن داشت، آن را به عنوان استوری ارسال کنیم
                if hasattr(post, 'message') and post.message:
                    try:
                        # برای پست‌های متنی، یک تصویر پیش‌فرض استفاده می‌کنیم
                        default_image_url = "https://raw.githubusercontent.com/telegramdesktop/tdesktop/dev/Telegram/Resources/art/bg_initial.jpg"
                        media = InputMediaPhotoExternal(default_image_url)
                        
                        # ارسال استوری با متن و تصویر پیش‌فرض
                        result = await client(SendStoryRequest(
                            peer=await client.get_me(),
                            media=media,
                            caption=post.message,
                            privacy_rules=privacy_rules,
                            noforwards=False,
                            pinned=False,
                            random_id=0
                        ))
                        print("✅ استوری متنی با موفقیت ارسال شد!")
                    except Exception as e:
                        print(f"❌ خطا در ارسال استوری متنی: {str(e)}")
                        print("30 ثانیه دیگر دوباره تلاش می‌کنم...")
                        time.sleep(30)
                        continue

                # اگر پست مدیا داشت
                elif hasattr(post, 'media') and post.media and (isinstance(post.media, MessageMediaPhoto) or isinstance(post.media, MessageMediaDocument)):
                    logging.info(f"Found post with media, ID: {post.id}")
                    
                    try:
                        # دانلود مدیا
                        downloaded_media = await client.download_media(post.media, bytes)
                        
                        # آپلود مدیا به سرور تلگرام
                        uploaded_media = await client.upload_file(downloaded_media)
                        
                        # تشخیص نوع مدیا و ایجاد InputMedia مناسب
                        if isinstance(post.media, MessageMediaPhoto):
                            media = InputMediaUploadedPhoto(uploaded_media)
                        else:
                            media = InputMediaUploadedDocument(uploaded_media)

                        # ارسال استوری با مدیا
                        result = await client(SendStoryRequest(
                            peer=await client.get_me(),
                            media=media,
                            caption=post.message if hasattr(post, 'message') else "",
                            privacy_rules=privacy_rules,
                            noforwards=False,
                            pinned=False,
                            random_id=0
                        ))
                        print("✅ استوری با مدیا با موفقیت ارسال شد!")
                    except Exception as e:
                        print(f"❌ خطا در پردازش مدیا: {str(e)}")
                        print("30 ثانیه دیگر دوباره تلاش می‌کنم...")
                        time.sleep(30)
                        continue
                else:
                    print("❌ پست خالی است - نه متن دارد نه مدیا")
                    
                time.sleep(30)  # انتظار 30 ثانیه قبل از چک کردن مجدد

            except Exception as e:
                print(f"❌ خطا در اجرای برنامه: {str(e)}")
                print("30 ثانیه دیگر دوباره تلاش می‌کنم...")
                logging.error(f"Error: {str(e)}", exc_info=True)
                time.sleep(30)

    except KeyboardInterrupt:
        print("\n✅ برنامه با موفقیت متوقف شد.")
    finally:
        await client.disconnect()

# اجرای کد
client.loop.run_until_complete(repost_story())
