Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
anasty17
GitHub Repository: anasty17/mirror-leech-telegram-bot
Path: blob/master/bot/modules/status.py
1619 views
1
from psutil import cpu_percent, virtual_memory, disk_usage
2
from time import time
3
from asyncio import gather, iscoroutinefunction
4
5
from .. import (
6
task_dict_lock,
7
status_dict,
8
task_dict,
9
bot_start_time,
10
intervals,
11
sabnzbd_client,
12
DOWNLOAD_DIR,
13
)
14
from ..core.torrent_manager import TorrentManager
15
from ..core.jdownloader_booter import jdownloader
16
from ..helper.ext_utils.bot_utils import new_task
17
from ..helper.ext_utils.status_utils import (
18
MirrorStatus,
19
get_readable_file_size,
20
get_readable_time,
21
speed_string_to_bytes,
22
)
23
from ..helper.telegram_helper.bot_commands import BotCommands
24
from ..helper.telegram_helper.message_utils import (
25
send_message,
26
delete_message,
27
auto_delete_message,
28
send_status_message,
29
update_status_message,
30
edit_message,
31
)
32
from ..helper.telegram_helper.button_build import ButtonMaker
33
34
35
@new_task
36
async def task_status(_, message):
37
async with task_dict_lock:
38
count = len(task_dict)
39
if count == 0:
40
currentTime = get_readable_time(time() - bot_start_time)
41
free = get_readable_file_size(disk_usage(DOWNLOAD_DIR).free)
42
msg = f"No Active Tasks!\nEach user can get status for his tasks by adding me or user_id after cmd: /{BotCommands.StatusCommand} me"
43
msg += (
44
f"\n<b>CPU:</b> {cpu_percent()}% | <b>FREE:</b> {free}"
45
f"\n<b>RAM:</b> {virtual_memory().percent}% | <b>UPTIME:</b> {currentTime}"
46
)
47
reply_message = await send_message(message, msg)
48
await auto_delete_message(message, reply_message)
49
else:
50
text = message.text.split()
51
if len(text) > 1:
52
user_id = message.from_user.id if text[1] == "me" else int(text[1])
53
else:
54
user_id = 0
55
sid = message.chat.id
56
if obj := intervals["status"].get(sid):
57
obj.cancel()
58
del intervals["status"][sid]
59
await send_status_message(message, user_id)
60
await delete_message(message)
61
62
63
async def get_download_status(download):
64
tool = download.tool
65
if tool in [
66
"telegram",
67
"yt-dlp",
68
"rclone",
69
"gDriveApi",
70
]:
71
speed = download.speed()
72
else:
73
speed = 0
74
return (
75
await download.status()
76
if iscoroutinefunction(download.status)
77
else download.status()
78
), speed
79
80
81
@new_task
82
async def status_pages(_, query):
83
data = query.data.split()
84
key = int(data[1])
85
await query.answer()
86
if data[2] == "ref":
87
await update_status_message(key, force=True)
88
elif data[2] in ["nex", "pre"]:
89
async with task_dict_lock:
90
if key in status_dict:
91
if data[2] == "nex":
92
status_dict[key]["page_no"] += status_dict[key]["page_step"]
93
else:
94
status_dict[key]["page_no"] -= status_dict[key]["page_step"]
95
elif data[2] == "ps":
96
async with task_dict_lock:
97
if key in status_dict:
98
status_dict[key]["page_step"] = int(data[3])
99
elif data[2] == "st":
100
async with task_dict_lock:
101
if key in status_dict:
102
status_dict[key]["status"] = data[3]
103
await update_status_message(key, force=True)
104
elif data[2] == "ov":
105
ds, ss = await TorrentManager.overall_speed()
106
if sabnzbd_client.LOGGED_IN:
107
sds = await sabnzbd_client.get_downloads()
108
sds = int(float(sds["queue"].get("kbpersec", "0"))) * 1024
109
ds += sds
110
if jdownloader.is_connected:
111
jdres = await jdownloader.device.downloadcontroller.get_speed_in_bytes()
112
ds += jdres
113
message = query.message
114
tasks = {
115
"Download": 0,
116
"Upload": 0,
117
"Seed": 0,
118
"Archive": 0,
119
"Extract": 0,
120
"Split": 0,
121
"QueueDl": 0,
122
"QueueUp": 0,
123
"Clone": 0,
124
"CheckUp": 0,
125
"Pause": 0,
126
"SamVid": 0,
127
"ConvertMedia": 0,
128
"FFmpeg": 0,
129
}
130
dl_speed = ds
131
up_speed = 0
132
seed_speed = ss
133
async with task_dict_lock:
134
status_results = await gather(
135
*(get_download_status(download) for download in task_dict.values())
136
)
137
for status, speed in status_results:
138
match status:
139
case MirrorStatus.STATUS_DOWNLOAD:
140
tasks["Download"] += 1
141
if speed:
142
dl_speed += speed_string_to_bytes(speed)
143
case MirrorStatus.STATUS_UPLOAD:
144
tasks["Upload"] += 1
145
up_speed += speed_string_to_bytes(speed)
146
case MirrorStatus.STATUS_SEED:
147
tasks["Seed"] += 1
148
case MirrorStatus.STATUS_ARCHIVE:
149
tasks["Archive"] += 1
150
case MirrorStatus.STATUS_EXTRACT:
151
tasks["Extract"] += 1
152
case MirrorStatus.STATUS_SPLIT:
153
tasks["Split"] += 1
154
case MirrorStatus.STATUS_QUEUEDL:
155
tasks["QueueDl"] += 1
156
case MirrorStatus.STATUS_QUEUEUP:
157
tasks["QueueUp"] += 1
158
case MirrorStatus.STATUS_CLONE:
159
tasks["Clone"] += 1
160
case MirrorStatus.STATUS_CHECK:
161
tasks["CheckUp"] += 1
162
case MirrorStatus.STATUS_PAUSED:
163
tasks["Pause"] += 1
164
case MirrorStatus.STATUS_SAMVID:
165
tasks["SamVid"] += 1
166
case MirrorStatus.STATUS_CONVERT:
167
tasks["ConvertMedia"] += 1
168
case MirrorStatus.STATUS_FFMPEG:
169
tasks["FFmpeg"] += 1
170
case _:
171
tasks["Download"] += 1
172
173
msg = f"""<b>DL:</b> {tasks['Download']} | <b>UP:</b> {tasks['Upload']} | <b>SD:</b> {tasks['Seed']} | <b>AR:</b> {tasks['Archive']}
174
<b>EX:</b> {tasks['Extract']} | <b>SP:</b> {tasks['Split']} | <b>QD:</b> {tasks['QueueDl']} | <b>QU:</b> {tasks['QueueUp']}
175
<b>CL:</b> {tasks['Clone']} | <b>CK:</b> {tasks['CheckUp']} | <b>PA:</b> {tasks['Pause']} | <b>SV:</b> {tasks['SamVid']}
176
<b>CM:</b> {tasks['ConvertMedia']} | <b>FF:</b> {tasks['FFmpeg']}
177
178
<b>ODLS:</b> {get_readable_file_size(dl_speed)}/s
179
<b>OULS:</b> {get_readable_file_size(up_speed)}/s
180
<b>OSDS:</b> {get_readable_file_size(seed_speed)}/s
181
"""
182
button = ButtonMaker()
183
button.data_button("Back", f"status {data[1]} ref")
184
await edit_message(message, msg, button.build_menu())
185
186