gitscope
← marzneshin / v0.6.2 / app/tasks/review_users.py
https://dev.kronoz.win/r/marzneshin.git
app/tasks/review_users.py · Python
Blame Raw
 1import asyncio
 2import logging
 3from datetime import datetime, timedelta
 4from typing import TYPE_CHECKING
 5
 6from app import marznode
 7from app.db import (
 8    GetDB,
 9    get_users,
10)
11from app.models.user import (
12    UserResponse,
13    UserExpireStrategy,
14)
15from app.utils import report
16
17if TYPE_CHECKING:
18    pass
19
20
21logger = logging.getLogger(__name__)
22
23
24async def review_users():
25    now = datetime.utcnow()
26    with GetDB() as db:
27        for user in get_users(db, activated=True, is_active=False):
28            """looking for expired/to be limited users who are still active"""
29
30            marznode.operations.update_user(user, remove=True)
31            user.activated = False
32            db.commit()
33            db.refresh(user)
34            asyncio.ensure_future(
35                report.status_change(
36                    user.username,
37                    user.status,
38                    UserResponse.model_validate(user),
39                )
40            )
41
42            logger.info(
43                "User `%s` activation state changed to `%s`",
44                user.username,
45                str(user.activated),
46            )
47
48        for user in get_users(
49            db,
50            expire_strategy=UserExpireStrategy.START_ON_FIRST_USE,
51            is_active=True,
52        ):
53            """looking for to be activated, on hold users"""
54            base_time = user.edit_at or user.created_at
55
56            # Check if the user is online After or at 'base_time' or...
57            # If the user didn't connect until activation_deadline; change status to "Active"
58            if not (
59                (user.online_at and base_time <= user.online_at)
60                or (
61                    user.activation_deadline
62                    and (user.activation_deadline <= now)
63                )
64            ):
65                continue
66
67            user.expire_date = datetime.utcnow() + timedelta(
68                seconds=user.usage_duration
69            )
70            user.expire_strategy = UserExpireStrategy.FIXED_DATE
71            db.commit()
72            db.refresh(user)
73            asyncio.ensure_future(
74                report.status_change(
75                    user.username,
76                    user.status,
77                    UserResponse.model_validate(user),
78                )
79            )
80            logger.info("on hold user `%s` has been activated", user.username)