randydev commited on
Commit
7d0b9ec
·
verified ·
1 Parent(s): 5735e26
Files changed (1) hide show
  1. 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(level=logging.INFO)
 
 
 
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
- for task in asyncio.all_tasks():
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.exceptions.CancelledError):
58
  loop.run_until_complete(main())
59
- loop.run_until_complete(asyncio.sleep(3.0))
 
 
 
 
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()