-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathOnlineKeeper.py
More file actions
173 lines (152 loc) · 5.97 KB
/
Copy pathOnlineKeeper.py
File metadata and controls
173 lines (152 loc) · 5.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# CopyLeft 2026 github.com/i-execute
# Author: I_execute.t.me
# Licensed under AGPLv3.
__version__ = (1, 0, 1)
# meta developer: Execute_forge.t.me
# meta banner: https://raw.githubusercontent.com/i-execute/Modules/main/Storage/OnlineKeeper/MetaBanner.jpeg
import asyncio
import logging
from telethon.tl.functions.account import UpdateStatusRequest
from telethon.tl.types import Message
from .. import loader, utils
from ..inline.types import InlineCall
logger = logging.getLogger(__name__)
@loader.tds
class OnlineKeeper(loader.Module):
"""Keep your account online"""
strings = {
"name": "OnlineKeeper",
"status_online": (
"<b>OnlineKeeper Status</b>\n"
"<b>Mode:</b> Active\n"
"<b>Account:</b> Online\n"
"<b>Update interval:</b> {interval} seconds"
),
"status_offline": (
"<b>OnlineKeeper Status</b>\n"
"<b>Mode:</b> Inactive\n"
"<b>Account:</b> Offline"
),
"btn_disable": "Disable",
"btn_enable": "Enable",
"enabling": "<b>Activating OnlineKeeper...</b>\nYour account will appear online",
"disabling": "<b>Deactivating OnlineKeeper...</b>\nYour account will go offline",
}
strings_ru = {
"status_online": (
"<b>Статус OnlineKeeper</b>\n"
"<b>Режим:</b> Активен\n"
"<b>Аккаунт:</b> Онлайн\n"
"<b>Интервал обновления:</b> {interval} секунд"
),
"status_offline": (
"<b>Статус OnlineKeeper</b>\n"
"<b>Режим:</b> Неактивен\n"
"<b>Аккаунт:</b> Оффлайн"
),
"btn_disable": "Выключить",
"btn_enable": "Включить",
"enabling": "<b>Активация OnlineKeeper...</b>\nВаш аккаунт появится в сети",
"disabling": "<b>Деактивация OnlineKeeper...</b>\nВаш аккаунт пропадет из сети",
}
def __init__(self):
self.config = loader.ModuleConfig(
loader.ConfigValue(
"AUTORUNNER",
True,
"Auto-start OnlineKeeper after restart",
validator=loader.validators.Boolean(),
),
loader.ConfigValue(
"UPDATE_INTERVAL",
15,
"Status update interval in seconds",
validator=loader.validators.Integer(minimum=5, maximum=600),
),
)
self._online_task = None
async def client_ready(self, client, db):
self._client = client
self._db = db
if not self.config["AUTORUNNER"]:
self._db.set(self.name, "keep_online", False)
return
if self._db.get(self.name, "keep_online", False):
await self._start_online_loop()
async def on_unload(self):
await self._stop_online_loop()
async def _start_online_loop(self):
if self._online_task and not self._online_task.done():
return
self._db.set(self.name, "keep_online", True)
self._online_task = asyncio.create_task(self._online_update_loop())
async def _stop_online_loop(self):
self._db.set(self.name, "keep_online", False)
if self._online_task:
self._online_task.cancel()
try:
await self._online_task
except asyncio.CancelledError:
pass
self._online_task = None
async def _online_update_loop(self):
while self._db.get(self.name, "keep_online", False):
try:
await self._client(UpdateStatusRequest(offline=False))
await asyncio.sleep(self.config["UPDATE_INTERVAL"])
except asyncio.CancelledError:
break
except Exception as e:
logger.error(f"[OnlineKeeper] Status update error: {e}")
await asyncio.sleep(30)
@loader.command()
async def ok(self, message: Message):
"""Toggle OnlineKeeper status"""
is_active = self._db.get(self.name, "keep_online", False)
await self.inline.form(
text=self.strings["status_online"].format(interval=self.config["UPDATE_INTERVAL"]) if is_active else self.strings["status_offline"],
message=message,
reply_markup=[
[
{
"text": self.strings["btn_disable"] if is_active else self.strings["btn_enable"],
"callback": self._toggle_callback,
"style": "danger" if is_active else "success",
}
]
],
)
async def _toggle_callback(self, call: InlineCall):
is_active = self._db.get(self.name, "keep_online", False)
if is_active:
await call.edit(self.strings["disabling"])
await self._stop_online_loop()
await asyncio.sleep(1)
await call.edit(
text=self.strings["status_offline"],
reply_markup=[
[
{
"text": self.strings["btn_enable"],
"callback": self._toggle_callback,
"style": "success",
}
]
],
)
else:
await call.edit(self.strings["enabling"])
await self._start_online_loop()
await asyncio.sleep(1)
await call.edit(
text=self.strings["status_online"].format(interval=self.config["UPDATE_INTERVAL"]),
reply_markup=[
[
{
"text": self.strings["btn_disable"],
"callback": self._toggle_callback,
"style": "danger",
}
]
],
)