Ok
Browse files- chatbot/__main__.py +60 -13
chatbot/__main__.py
CHANGED
@@ -20,40 +20,87 @@
|
|
20 |
import asyncio
|
21 |
import logging
|
22 |
import sys
|
23 |
-
import importlib
|
24 |
-
from pyrogram import idle
|
25 |
import traceback
|
|
|
|
|
|
|
|
|
|
|
26 |
|
27 |
from chatbot import Randydev
|
28 |
from database import db
|
29 |
from logger import LOGS
|
30 |
-
from pyrogram.errors import *
|
31 |
-
from contextlib import closing, suppress
|
32 |
-
from uvloop import install
|
33 |
|
34 |
-
logging.basicConfig(
|
|
|
|
|
|
|
35 |
logging.getLogger("pyrogram.syncer").setLevel(logging.WARNING)
|
36 |
logging.getLogger("pyrogram.client").setLevel(logging.WARNING)
|
37 |
loop = asyncio.get_event_loop()
|
38 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
39 |
async def main():
|
40 |
try:
|
41 |
await db.connect()
|
42 |
randydev = Randydev(loop=loop)
|
|
|
43 |
await randydev.start()
|
|
|
|
|
|
|
44 |
await idle()
|
|
|
45 |
except Exception as e:
|
|
|
46 |
traceback.print_exc()
|
47 |
-
LOGS.error(f"Error in main: {e}")
|
48 |
finally:
|
49 |
-
|
50 |
-
task.cancel()
|
51 |
-
|
52 |
-
LOGS.info("All tasks completed successfully!")
|
53 |
|
54 |
if __name__ == "__main__":
|
55 |
install()
|
|
|
56 |
with closing(loop):
|
57 |
-
with suppress(asyncio.
|
58 |
loop.run_until_complete(main())
|
59 |
-
|
|
|
|
|
|
|
|
20 |
import asyncio
|
21 |
import logging
|
22 |
import sys
|
|
|
|
|
23 |
import traceback
|
24 |
+
from contextlib import closing, suppress
|
25 |
+
from datetime import datetime as dt, timedelta
|
26 |
+
|
27 |
+
from pyrogram import idle
|
28 |
+
from uvloop import install
|
29 |
|
30 |
from chatbot import Randydev
|
31 |
from database import db
|
32 |
from logger import LOGS
|
|
|
|
|
|
|
33 |
|
34 |
+
logging.basicConfig(
|
35 |
+
level=logging.INFO,
|
36 |
+
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
37 |
+
)
|
38 |
logging.getLogger("pyrogram.syncer").setLevel(logging.WARNING)
|
39 |
logging.getLogger("pyrogram.client").setLevel(logging.WARNING)
|
40 |
loop = asyncio.get_event_loop()
|
41 |
|
42 |
+
async def process_unfreezes(client):
|
43 |
+
while True:
|
44 |
+
try:
|
45 |
+
now = dt.now()
|
46 |
+
expired_users = db.user_blacklists.find({
|
47 |
+
"is_frozen": True,
|
48 |
+
"unfreeze_at": {"$lte": now}
|
49 |
+
})
|
50 |
+
|
51 |
+
async for user in expired_users:
|
52 |
+
await db.user_blacklists.update_one(
|
53 |
+
{"_id": user["_id"]},
|
54 |
+
{"$set": {"is_frozen": False}}
|
55 |
+
)
|
56 |
+
LOGS.info(f"Auto-unfrozen user {user['user_id']}")
|
57 |
+
|
58 |
+
with suppress(Exception):
|
59 |
+
await client.send_message(
|
60 |
+
user["user_id"],
|
61 |
+
"✅ Your restrictions have been automatically lifted"
|
62 |
+
)
|
63 |
+
|
64 |
+
await asyncio.sleep(300)
|
65 |
+
|
66 |
+
except Exception as e:
|
67 |
+
LOGS.error(f"Unfreeze task error: {str(e)}")
|
68 |
+
await asyncio.sleep(60)
|
69 |
+
|
70 |
+
async def shutdown(loop):
|
71 |
+
tasks = [t for t in asyncio.all_tasks() if t is not asyncio.current_task()]
|
72 |
+
for task in tasks:
|
73 |
+
task.cancel()
|
74 |
+
|
75 |
+
with suppress(asyncio.CancelledError):
|
76 |
+
await asyncio.gather(*tasks, return_exceptions=True)
|
77 |
+
|
78 |
+
LOGS.info("Application shutdown complete")
|
79 |
+
|
80 |
async def main():
|
81 |
try:
|
82 |
await db.connect()
|
83 |
randydev = Randydev(loop=loop)
|
84 |
+
|
85 |
await randydev.start()
|
86 |
+
asyncio.create_task(process_unfreezes(randydev))
|
87 |
+
LOGS.info("Application startup complete")
|
88 |
+
|
89 |
await idle()
|
90 |
+
|
91 |
except Exception as e:
|
92 |
+
LOGS.critical(f"Fatal error: {str(e)}")
|
93 |
traceback.print_exc()
|
|
|
94 |
finally:
|
95 |
+
await shutdown(asyncio.get_event_loop())
|
|
|
|
|
|
|
96 |
|
97 |
if __name__ == "__main__":
|
98 |
install()
|
99 |
+
|
100 |
with closing(loop):
|
101 |
+
with suppress(asyncio.CancelledError, KeyboardInterrupt):
|
102 |
loop.run_until_complete(main())
|
103 |
+
|
104 |
+
loop.run_until_complete(asyncio.sleep(3))
|
105 |
+
if not loop.is_closed():
|
106 |
+
loop.close()
|