PaperParser/app/blueprints/api/tasks/tasks.py

89 lines
2.5 KiB
Python

import datetime
import time
from celery import shared_task
import asyncio
from telethon.tl.types import UserStatusOnline, UserStatusOffline
from app.models.user import User
from paper.parser import PaperParser
from app.models.task import Task
from app.extensions import db
from .handlers import run_state, failure_state, success_state
async def add_to_group(session, task, task_self):
async with PaperParser(session.name) as parser:
await parser.invite_users(task.collection.users, task.url, task_self)
async def sending_message(session, task, task_self):
async with PaperParser(session.name) as parser:
await parser.send_messages(task.collection.users, task.message, task.file, task_self)
async def parse_users(session, task):
async with PaperParser(session.name) as parser:
return await parser.get_participants(task.url)
@shared_task(bind=True)
def add_to_group_task(self, task_id: int):
try:
task: Task = Task.query.get(task_id)
run_state(self.request.id, task_id)
session = task.session
time.sleep(10)
asyncio.run(
add_to_group(session, task, self)
)
except Exception as e:
failure_state(task_id, e)
raise e
else:
success_state(task_id)
@shared_task(bind=True)
def parse_users_task(self, task_id: int):
task: Task = Task.query.get_or_404(task_id)
session = task.session
collection = task.collection
users = asyncio.run(
parse_users(session, task)
)
for user in users:
if not user.username and user.bot:
continue
is_active = False
if isinstance(user.status, UserStatusOffline):
is_active = user.status.was_online + datetime.timedelta(day=5) >= datetime.now()
if isinstance(user.status, UserStatusOnline):
is_active = True
if not is_active:
continue
if not User.exist(user.username, collection):
db.session.add(
User(
first_name=user.first_name,
last_name=user.last_name,
username=user.username,
phone=user.phone,
collection=collection,
)
)
db.session.commit()
@shared_task(bind=True)
def send_messages_task(self, task_id: int):
task: Task = Task.query.get(task_id)
session = task.session
users = session.users