Spaces:
Runtime error
Runtime error
Update main.py
Browse files
main.py
CHANGED
|
@@ -16,12 +16,10 @@ SESSION_STRING = os.environ.get('SESSION_STRING')
|
|
| 16 |
|
| 17 |
# --- Storage Path Initialization (Aligned with Dockerfile) ---
|
| 18 |
# This name MUST match the directory created in the Dockerfile
|
| 19 |
-
# (either the default in ARG or how you set it in `RUN mkdir -p ./${APP_TEMPLATE_DIR_NAME}`)
|
| 20 |
APP_TEMPLATE_SUBDIR_NAME = "app_template_storage"
|
| 21 |
TEMPLATE_FILENAME = "user_template_content.txt"
|
| 22 |
|
| 23 |
# The data directory is now relative to the WORKDIR (e.g., /app/app_template_storage)
|
| 24 |
-
# This path is prepared by the Dockerfile.
|
| 25 |
DATA_DIR = Path(".") / APP_TEMPLATE_SUBDIR_NAME
|
| 26 |
TEMPLATE_FILE_PATH = DATA_DIR / TEMPLATE_FILENAME
|
| 27 |
|
|
@@ -30,15 +28,11 @@ current_template_content = None # Global variable for template
|
|
| 30 |
def verify_storage_path_is_writable():
|
| 31 |
"""Verifies that the pre-configured DATA_DIR is writable."""
|
| 32 |
try:
|
| 33 |
-
# The Dockerfile should have created DATA_DIR.
|
| 34 |
-
# Python's mkdir with exist_ok=True is safe even if it exists.
|
| 35 |
-
# More importantly, we test if we can write into it.
|
| 36 |
DATA_DIR.mkdir(parents=True, exist_ok=True)
|
| 37 |
-
|
| 38 |
test_file = DATA_DIR / ".writable_test_py"
|
| 39 |
with open(test_file, "w") as f:
|
| 40 |
f.write("test")
|
| 41 |
-
test_file.unlink()
|
| 42 |
logger.info(f"Successfully verified writable data directory: {DATA_DIR.resolve()}")
|
| 43 |
return True
|
| 44 |
except Exception as e:
|
|
@@ -48,9 +42,8 @@ def verify_storage_path_is_writable():
|
|
| 48 |
|
| 49 |
# --- Helper Functions for Template Management ---
|
| 50 |
async def load_template_from_file():
|
| 51 |
-
"""Loads template content from the persistent file."""
|
| 52 |
global current_template_content
|
| 53 |
-
if not TEMPLATE_FILE_PATH:
|
| 54 |
logger.error("Template file path is not configured. Cannot load template.")
|
| 55 |
current_template_content = None
|
| 56 |
return
|
|
@@ -64,18 +57,15 @@ async def load_template_from_file():
|
|
| 64 |
logger.error(f"Error loading template from {TEMPLATE_FILE_PATH}: {e}")
|
| 65 |
current_template_content = None
|
| 66 |
else:
|
| 67 |
-
logger.info(f"Template file {TEMPLATE_FILE_PATH} not found. No template loaded.")
|
| 68 |
current_template_content = None
|
| 69 |
|
| 70 |
async def save_template_to_file(content: str):
|
| 71 |
-
"""Saves template content to the persistent file."""
|
| 72 |
global current_template_content
|
| 73 |
-
if not TEMPLATE_FILE_PATH:
|
| 74 |
logger.error("Template file path is not configured. Cannot save template.")
|
| 75 |
return False
|
| 76 |
try:
|
| 77 |
-
# DATA_DIR.mkdir(parents=True, exist_ok=True) # Dockerfile should handle this.
|
| 78 |
-
# verify_storage_path_is_writable also calls it.
|
| 79 |
with open(TEMPLATE_FILE_PATH, "w", encoding="utf-8") as f:
|
| 80 |
f.write(content)
|
| 81 |
current_template_content = content
|
|
@@ -90,16 +80,19 @@ if not SESSION_STRING:
|
|
| 90 |
logger.error("SESSION_STRING environment variable not found. Please set it in Hugging Face secrets.")
|
| 91 |
exit(1)
|
| 92 |
|
| 93 |
-
# Verify the storage path *before* initializing the client or doing anything else
|
| 94 |
if not verify_storage_path_is_writable():
|
| 95 |
logger.critical("Exiting due to storage path issues. Check Dockerfile and permissions.")
|
| 96 |
exit(1)
|
| 97 |
|
| 98 |
-
logger.info("Initializing Hydrogram Client with session string...")
|
| 99 |
try:
|
| 100 |
app = Client(
|
| 101 |
-
name="
|
| 102 |
session_string=SESSION_STRING,
|
|
|
|
|
|
|
|
|
|
|
|
|
| 103 |
)
|
| 104 |
logger.info("Hydrogram Client initialized.")
|
| 105 |
except Exception as e:
|
|
@@ -107,13 +100,17 @@ except Exception as e:
|
|
| 107 |
exit(1)
|
| 108 |
|
| 109 |
|
| 110 |
-
# --- Bot Event Handlers
|
| 111 |
@app.on_message(filters.command("start") & filters.private)
|
| 112 |
async def start_handler(client: Client, message: Message):
|
|
|
|
|
|
|
|
|
|
| 113 |
sender_name = message.from_user.first_name if message.from_user else "User"
|
| 114 |
-
logger.info(f"Received /start command from {sender_name} (ID: {message.from_user.id})")
|
|
|
|
| 115 |
welcome_text = f"Hello {sender_name}!\n"
|
| 116 |
-
welcome_text += "I am
|
| 117 |
welcome_text += "Template storage is at: " + str(TEMPLATE_FILE_PATH.resolve()) + "\n"
|
| 118 |
welcome_text += "Use /settemplate <your text> to set a new template.\n"
|
| 119 |
welcome_text += "Use /gettemplate to view the current template."
|
|
@@ -125,8 +122,8 @@ async def start_handler(client: Client, message: Message):
|
|
| 125 |
|
| 126 |
@app.on_message(filters.command("settemplate") & filters.private)
|
| 127 |
async def set_template_handler(client: Client, message: Message):
|
| 128 |
-
|
| 129 |
-
|
| 130 |
if len(message.command) > 1:
|
| 131 |
new_template = message.text.split(" ", 1)[1].strip()
|
| 132 |
if new_template:
|
|
@@ -141,24 +138,25 @@ async def set_template_handler(client: Client, message: Message):
|
|
| 141 |
|
| 142 |
@app.on_message(filters.command("gettemplate") & filters.private)
|
| 143 |
async def get_template_handler(client: Client, message: Message):
|
| 144 |
-
|
| 145 |
-
|
| 146 |
if current_template_content:
|
| 147 |
response_text = f"📜 **Current Template:**\n\n{current_template_content}"
|
| 148 |
else:
|
| 149 |
response_text = "ℹ️ No template is currently set. Use `/settemplate <your text>` to set one."
|
| 150 |
await message.reply_text(response_text)
|
| 151 |
|
| 152 |
-
# --- Main Execution
|
| 153 |
async def main():
|
| 154 |
await load_template_from_file()
|
| 155 |
logger.info("Attempting to connect and start the bot...")
|
| 156 |
try:
|
| 157 |
await app.start()
|
| 158 |
me = await app.get_me()
|
| 159 |
-
|
|
|
|
| 160 |
logger.info("Listening for messages...")
|
| 161 |
-
await asyncio.Event().wait()
|
| 162 |
except (SessionPasswordNeeded, PhoneCodeInvalid, PhoneNumberInvalid, PasswordHashInvalid) as e:
|
| 163 |
logger.error(f"Authorization error: {type(e).__name__} - {e}. Your SESSION_STRING might be invalid or expired.")
|
| 164 |
except ConnectionError as e:
|
|
|
|
| 16 |
|
| 17 |
# --- Storage Path Initialization (Aligned with Dockerfile) ---
|
| 18 |
# This name MUST match the directory created in the Dockerfile
|
|
|
|
| 19 |
APP_TEMPLATE_SUBDIR_NAME = "app_template_storage"
|
| 20 |
TEMPLATE_FILENAME = "user_template_content.txt"
|
| 21 |
|
| 22 |
# The data directory is now relative to the WORKDIR (e.g., /app/app_template_storage)
|
|
|
|
| 23 |
DATA_DIR = Path(".") / APP_TEMPLATE_SUBDIR_NAME
|
| 24 |
TEMPLATE_FILE_PATH = DATA_DIR / TEMPLATE_FILENAME
|
| 25 |
|
|
|
|
| 28 |
def verify_storage_path_is_writable():
|
| 29 |
"""Verifies that the pre-configured DATA_DIR is writable."""
|
| 30 |
try:
|
|
|
|
|
|
|
|
|
|
| 31 |
DATA_DIR.mkdir(parents=True, exist_ok=True)
|
|
|
|
| 32 |
test_file = DATA_DIR / ".writable_test_py"
|
| 33 |
with open(test_file, "w") as f:
|
| 34 |
f.write("test")
|
| 35 |
+
test_file.unlink()
|
| 36 |
logger.info(f"Successfully verified writable data directory: {DATA_DIR.resolve()}")
|
| 37 |
return True
|
| 38 |
except Exception as e:
|
|
|
|
| 42 |
|
| 43 |
# --- Helper Functions for Template Management ---
|
| 44 |
async def load_template_from_file():
|
|
|
|
| 45 |
global current_template_content
|
| 46 |
+
if not TEMPLATE_FILE_PATH:
|
| 47 |
logger.error("Template file path is not configured. Cannot load template.")
|
| 48 |
current_template_content = None
|
| 49 |
return
|
|
|
|
| 57 |
logger.error(f"Error loading template from {TEMPLATE_FILE_PATH}: {e}")
|
| 58 |
current_template_content = None
|
| 59 |
else:
|
| 60 |
+
logger.info(f"Template file {TEMPLATE_FILE_PATH.resolve()} not found. No template loaded.")
|
| 61 |
current_template_content = None
|
| 62 |
|
| 63 |
async def save_template_to_file(content: str):
|
|
|
|
| 64 |
global current_template_content
|
| 65 |
+
if not TEMPLATE_FILE_PATH:
|
| 66 |
logger.error("Template file path is not configured. Cannot save template.")
|
| 67 |
return False
|
| 68 |
try:
|
|
|
|
|
|
|
| 69 |
with open(TEMPLATE_FILE_PATH, "w", encoding="utf-8") as f:
|
| 70 |
f.write(content)
|
| 71 |
current_template_content = content
|
|
|
|
| 80 |
logger.error("SESSION_STRING environment variable not found. Please set it in Hugging Face secrets.")
|
| 81 |
exit(1)
|
| 82 |
|
|
|
|
| 83 |
if not verify_storage_path_is_writable():
|
| 84 |
logger.critical("Exiting due to storage path issues. Check Dockerfile and permissions.")
|
| 85 |
exit(1)
|
| 86 |
|
| 87 |
+
logger.info("Initializing Hydrogram Client with BOT session string...") # Clarified log
|
| 88 |
try:
|
| 89 |
app = Client(
|
| 90 |
+
name="my_bot_session_v4", # Use a distinct session name
|
| 91 |
session_string=SESSION_STRING,
|
| 92 |
+
# For bot sessions, api_id and api_hash are not strictly needed here
|
| 93 |
+
# if they were embedded in the session string (Hydrogram handles this).
|
| 94 |
+
# However, some older versions or ways of creating session strings might benefit
|
| 95 |
+
# from having them. If your session string already works, this is fine.
|
| 96 |
)
|
| 97 |
logger.info("Hydrogram Client initialized.")
|
| 98 |
except Exception as e:
|
|
|
|
| 100 |
exit(1)
|
| 101 |
|
| 102 |
|
| 103 |
+
# --- Bot Event Handlers ---
|
| 104 |
@app.on_message(filters.command("start") & filters.private)
|
| 105 |
async def start_handler(client: Client, message: Message):
|
| 106 |
+
# THIS IS THE CRUCIAL DIAGNOSTIC LOG:
|
| 107 |
+
logger.info(f"!!!!!! START HANDLER TRIGGERED by user {message.from_user.id} in chat {message.chat.id} with text: '{message.text}'")
|
| 108 |
+
|
| 109 |
sender_name = message.from_user.first_name if message.from_user else "User"
|
| 110 |
+
logger.info(f"Received /start command from {sender_name} (ID: {message.from_user.id})") # Original log
|
| 111 |
+
|
| 112 |
welcome_text = f"Hello {sender_name}!\n"
|
| 113 |
+
welcome_text += "I am your template management bot.\n"
|
| 114 |
welcome_text += "Template storage is at: " + str(TEMPLATE_FILE_PATH.resolve()) + "\n"
|
| 115 |
welcome_text += "Use /settemplate <your text> to set a new template.\n"
|
| 116 |
welcome_text += "Use /gettemplate to view the current template."
|
|
|
|
| 122 |
|
| 123 |
@app.on_message(filters.command("settemplate") & filters.private)
|
| 124 |
async def set_template_handler(client: Client, message: Message):
|
| 125 |
+
logger.info(f"!!!!!! SETTEMPLATE HANDLER TRIGGERED by user {message.from_user.id} in chat {message.chat.id}")
|
| 126 |
+
user_id = message.from_user.id # Retained for potential future use
|
| 127 |
if len(message.command) > 1:
|
| 128 |
new_template = message.text.split(" ", 1)[1].strip()
|
| 129 |
if new_template:
|
|
|
|
| 138 |
|
| 139 |
@app.on_message(filters.command("gettemplate") & filters.private)
|
| 140 |
async def get_template_handler(client: Client, message: Message):
|
| 141 |
+
logger.info(f"!!!!!! GETTEMPLATE HANDLER TRIGGERED by user {message.from_user.id} in chat {message.chat.id}")
|
| 142 |
+
user_id = message.from_user.id # Retained for potential future use
|
| 143 |
if current_template_content:
|
| 144 |
response_text = f"📜 **Current Template:**\n\n{current_template_content}"
|
| 145 |
else:
|
| 146 |
response_text = "ℹ️ No template is currently set. Use `/settemplate <your text>` to set one."
|
| 147 |
await message.reply_text(response_text)
|
| 148 |
|
| 149 |
+
# --- Main Execution ---
|
| 150 |
async def main():
|
| 151 |
await load_template_from_file()
|
| 152 |
logger.info("Attempting to connect and start the bot...")
|
| 153 |
try:
|
| 154 |
await app.start()
|
| 155 |
me = await app.get_me()
|
| 156 |
+
# For bots, me.username is also useful
|
| 157 |
+
logger.info(f"Bot started successfully as '{me.first_name}' (ID: {me.id}, Username: @{me.username or 'N/A'})")
|
| 158 |
logger.info("Listening for messages...")
|
| 159 |
+
await asyncio.Event().wait() # Keep the bot running
|
| 160 |
except (SessionPasswordNeeded, PhoneCodeInvalid, PhoneNumberInvalid, PasswordHashInvalid) as e:
|
| 161 |
logger.error(f"Authorization error: {type(e).__name__} - {e}. Your SESSION_STRING might be invalid or expired.")
|
| 162 |
except ConnectionError as e:
|