Spaces:
Running
Running
# management/tasks.py | |
# -*- coding: utf-8 -*- | |
from __future__ import absolute_import, unicode_literals | |
import requests | |
import json | |
import os | |
import datetime | |
from celery import shared_task | |
from django.db import connections, connection | |
from django.conf import settings | |
from django.utils import timezone | |
from .models import ( | |
Panel, | |
AdminLevel2, | |
AdminLevel3, | |
EndUser, | |
Payment, | |
CustomUser, | |
Subscription, | |
) | |
from django.core.management import call_command | |
# --- Utilities --- | |
# FIXED: Renamed function to match imports in other files | |
def send_telegram_message(chat_id, message, bot_token): | |
""" | |
Sends a message to a specific Telegram chat using a bot token. | |
""" | |
if not bot_token: | |
print("Telegram bot token is not configured.") | |
return | |
url = f"https://api.telegram.org/bot{bot_token}/sendMessage" | |
payload = { | |
"chat_id": chat_id, | |
"text": message, | |
"parse_mode": "Markdown" | |
} | |
try: | |
response = requests.post(url, json=payload) | |
response.raise_for_status() | |
print(f"Notification sent successfully to chat_id {chat_id}") | |
except requests.RequestException as e: | |
print(f"Failed to send notification to chat_id {chat_id}: {e}") | |
# --- Celery Tasks --- | |
def schedule_reminders(): | |
""" | |
Celery task to send periodic reminders to admins and users. | |
""" | |
now = timezone.now().date() | |
# 1. License expiry warnings for AdminLevel2s (resellers) | |
three_days_from_now = now + datetime.timedelta(days=3) | |
admin_level2s = AdminLevel2.objects.filter(license_expiry_date__lte=three_days_from_now) | |
for admin in admin_level2s: | |
# Assuming AdminLevel2 is linked to a Panel through its CustomUser owner | |
# This part might need adjustment based on the final model structure | |
try: | |
panel = Panel.objects.get(owner=admin.user) | |
if admin.telegram_chat_id and panel.telegram_bot_token: | |
message = ( | |
f"🚨 **هشدار انقضای لایسنس!**\n\n" | |
f"ادمین {admin.user.username}، لایسنس شما در تاریخ {admin.license_expiry_date} منقضی خواهد شد. لطفاً برای تمدید آن اقدام کنید." | |
) | |
send_telegram_message( | |
chat_id=admin.telegram_chat_id, | |
message=message, | |
bot_token=panel.telegram_bot_token | |
) | |
except Panel.DoesNotExist: | |
print(f"Panel for admin {admin.user.username} not found.") | |
def send_payment_receipt_to_admin(payment_id): | |
""" | |
Sends a payment receipt notification to the relevant admin via Telegram. | |
""" | |
try: | |
payment = Payment.objects.get(id=payment_id) | |
admin = payment.admin | |
panel = payment.subscription.panel | |
if not admin.admin_level_3.telegram_chat_id or not panel.telegram_bot_token: | |
print(f"Admin telegram_chat_id or bot token not found for payment {payment_id}.") | |
return | |
message = ( | |
f"🔔 **رسید پرداخت جدید!**\n\n" | |
f"یک کاربر ({payment.subscription.end_user.username}) رسید پرداختی را برای تمدید اشتراک ارسال کرده است.\n" | |
f"مبلغ: {payment.amount} تومان\n" | |
f"توکن پرداخت: `{payment.payment_token}`\n" | |
f"لطفا به پنل خود مراجعه کرده و پرداخت را تایید کنید." | |
) | |
if payment.receipt_image: | |
message += f"\n\nتصویر رسید پرداخت آپلود شده است." | |
elif payment.receipt_text: | |
message += f"\n\nمتن رسید پرداخت: {payment.receipt_text}" | |
send_telegram_message( | |
chat_id=admin.admin_level_3.telegram_chat_id, | |
message=message, | |
bot_token=panel.telegram_bot_token | |
) | |
except Payment.DoesNotExist: | |
print(f"Payment with id {payment_id} not found.") | |
except Exception as e: | |
print(f"Error sending payment receipt to admin: {e}") | |
def send_payment_confirmation_to_user(end_user_id, amount, status): | |
""" | |
Sends a payment confirmation message to the end-user. | |
""" | |
try: | |
end_user = EndUser.objects.get(id=end_user_id) | |
panel = end_user.panel | |
if not panel or not panel.telegram_bot_token or not end_user.telegram_chat_id: | |
print(f"EndUser panel, bot token or telegram_chat_id not found for user {end_user_id}.") | |
return | |
if status == 'approved': | |
message = ( | |
f"✅ **پرداخت شما تأیید شد**\n\n" | |
f"مبلغ {amount} تومان برای پنل {panel.name} با موفقیت تأیید شد. سرویس شما به زودی فعال خواهد شد." | |
) | |
else: | |
message = ( | |
f"❌ **پرداخت شما رد شد**\n\n" | |
f"پرداخت {amount} تومان برای پنل {panel.name} رد شد. لطفاً رسید معتبر را ارسال کنید." | |
) | |
send_telegram_message( | |
chat_id=end_user.telegram_chat_id, | |
message=message, | |
bot_token=panel.telegram_bot_token | |
) | |
except EndUser.DoesNotExist: | |
print(f"EndUser with id {end_user_id} not found.") | |
except Exception as e: | |
print(f"Error sending payment confirmation to user: {e}") | |
def check_subscription_expiry(): | |
""" | |
Celery task to check subscription expiry and send notifications. | |
""" | |
now = timezone.now().date() | |
# Send reminder 3 days before expiry | |
three_days_from_now = now + datetime.timedelta(days=3) | |
expiring_soon_subscriptions = Subscription.objects.filter( | |
end_date__date=three_days_from_now, | |
status='active' | |
) | |
for sub in expiring_soon_subscriptions: | |
if sub.end_user.telegram_chat_id and sub.panel.telegram_bot_token: | |
message = ( | |
f"⏳ **اشتراک شما به زودی منقضی میشود!**\n\n" | |
f"کاربر {sub.end_user.username}، اشتراک شما در تاریخ {sub.end_date.strftime('%Y-%m-%d')} منقضی خواهد شد. برای تمدید آن از طریق بات اقدام کنید." | |
) | |
send_telegram_message( | |
chat_id=sub.end_user.telegram_chat_id, | |
message=message, | |
bot_token=sub.panel.telegram_bot_token | |
) | |
# Deactivate expired subscriptions | |
expired_subscriptions = Subscription.objects.filter(end_date__lte=now, status='active') | |
for sub in expired_subscriptions: | |
sub.status = 'expired' | |
sub.save() | |
if sub.end_user.telegram_chat_id and sub.panel.telegram_bot_token: | |
message = ( | |
f"❌ **اشتراک شما منقضی شد!**\n\n" | |
f"کاربر {sub.end_user.username}، اشتراک شما منقضی شده است. لطفا برای تمدید اقدام کنید." | |
) | |
send_telegram_message( | |
chat_id=sub.end_user.telegram_chat_id, | |
message=message, | |
bot_token=sub.panel.telegram_bot_token | |
) | |