forked from subinps/VCPlayerBot
-
Notifications
You must be signed in to change notification settings - Fork 0
/
debug.py
342 lines (316 loc) · 15.3 KB
/
debug.py
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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
from config import Config
import os
import time
from threading import Thread
import sys
if Config.DATABASE_URI:
from database import db
from pyrogram import (
Client,
filters
)
from pyrogram.errors import (
MessageIdInvalid,
MessageNotModified
)
from pyrogram.types import (
InlineKeyboardButton,
InlineKeyboardMarkup,
Message
)
from contextlib import suppress
debug = Client(
"Debug",
Config.API_ID,
Config.API_HASH,
bot_token=Config.BOT_TOKEN,
)
@debug.on_message(filters.command(['env', f"env@{Config.BOT_USERNAME}", "config", f"config@{Config.BOT_USERNAME}"]) & filters.private & filters.user(Config.SUDO))
async def set_heroku_var(client, message):
with suppress(MessageIdInvalid, MessageNotModified):
m = await message.reply("Checking config vars..")
if " " in message.text:
cmd, env = message.text.split(" ", 1)
if not "=" in env:
await m.edit("You should specify the value for env.\nExample: /env CHAT=-100213658211")
return
var, value = env.split("=", 1)
else:
await m.edit("You haven't provided any value for env, you should follow the correct format.\nExample: <code>/env CHAT=-1020202020202</code> to change or set CHAT var.\n<code>/env REPLY_MESSAGE= <code>To delete REPLY_MESSAGE.")
return
if Config.DATABASE_URI and var in ["STARTUP_STREAM", "CHAT", "LOG_GROUP", "REPLY_MESSAGE", "DELAY", "RECORDING_DUMP"]:
await m.edit("Mongo DB Found, Setting up config vars...")
if not value:
await m.edit(f"No value for env specified. Trying to delete env {var}.")
if var in ["STARTUP_STREAM", "CHAT", "DELAY"]:
await m.edit("This is a mandatory var and cannot be deleted.")
return
await edit_config(var, False)
await m.edit(f"Sucessfully deleted {var}")
return
else:
if var in ["CHAT", "LOG_GROUP", "RECORDING_DUMP"]:
try:
value=int(value)
except:
await m.edit("You should give me a chat id . It should be an interger.")
return
if var == "CHAT":
Config.ADMIN_CACHE=False
Config.CHAT=int(value)
await edit_config(var, int(value))
await m.edit(f"Succesfully changed {var} to {value}")
return
else:
if var == "STARTUP_STREAM":
Config.STREAM_SETUP=False
await edit_config(var, value)
await m.edit(f"Succesfully changed {var} to {value}")
return
else:
if not Config.HEROKU_APP:
buttons = [[InlineKeyboardButton('Heroku API_KEY', url='https://dashboard.heroku.com/account/applications/authorizations/new'), InlineKeyboardButton('🗑 Close', callback_data='close'),]]
await m.edit(
text="No heroku app found, this command needs the following heroku vars to be set.\n\n1. <code>HEROKU_API_KEY</code>: Your heroku account api key.\n2. <code>HEROKU_APP_NAME</code>: Your heroku app name.",
reply_markup=InlineKeyboardMarkup(buttons))
return
config = Config.HEROKU_APP.config()
if not value:
await m.edit(f"No value for env specified. Trying to delete env {var}.")
if var in ["STARTUP_STREAM", "CHAT", "DELAY", "API_ID", "API_HASH", "BOT_TOKEN", "SESSION_STRING", "ADMINS"]:
await m.edit("These are mandatory vars and cannot be deleted.")
return
if var in config:
await m.edit(f"Sucessfully deleted {var}")
await m.edit("Now restarting the app to make changes.")
if Config.DATABASE_URI:
msg = {"msg_id":m.message_id, "chat_id":m.chat.id}
if not await db.is_saved("RESTART"):
db.add_config("RESTART", msg)
else:
await db.edit_config("RESTART", msg)
del config[var]
config[var] = None
else:
k = await m.edit(f"No env named {var} found. Nothing was changed.")
return
if var in config:
await m.edit(f"Variable already found. Now edited to {value}")
else:
await m.edit(f"Variable not found, Now setting as new var.")
await m.edit(f"Succesfully set {var} with value {value}, Now Restarting to take effect of changes...")
if Config.DATABASE_URI:
msg = {"msg_id":m.message_id, "chat_id":m.chat.id}
if not await db.is_saved("RESTART"):
db.add_config("RESTART", msg)
else:
await db.edit_config("RESTART", msg)
config[var] = str(value)
@debug.on_message(filters.command(["restart", f"restart@{Config.BOT_USERNAME}"]) & filters.private & filters.user(Config.SUDO))
async def update(bot, message):
m=await message.reply("Restarting with new changes..")
if Config.DATABASE_URI:
msg = {"msg_id":m.message_id, "chat_id":m.chat.id}
if not await db.is_saved("RESTART"):
db.add_config("RESTART", msg)
else:
await db.edit_config("RESTART", msg)
if Config.HEROKU_APP:
Config.HEROKU_APP.restart()
else:
await message
Thread(
target=stop_and_restart()
).start()
@debug.on_message(filters.command(["clearplaylist", f"clearplaylist@{Config.BOT_USERNAME}"]) & filters.private & filters.user(Config.SUDO))
async def clear_play_list(client, m: Message):
if not Config.playlist:
k = await m.reply("Playlist is empty.")
return
Config.playlist.clear()
k=await m.reply_text(f"Playlist Cleared.")
await clear_db_playlist(all=True)
@debug.on_message(filters.command(["skip", f"skip@{Config.BOT_USERNAME}"]) & filters.private & filters.user(Config.SUDO))
async def skip_track(_, m: Message):
msg=await m.reply('trying to skip from queue..')
if not Config.playlist:
await msg.edit("Playlist is Empty.")
return
if len(m.command) == 1:
old_track = Config.playlist.pop(0)
await clear_db_playlist(song=old_track)
else:
#https://github.com/callsmusic/tgvc-userbot/blob/dev/plugins/vc/player.py#L268-L288
try:
items = list(dict.fromkeys(m.command[1:]))
items = [int(x) for x in items if x.isdigit()]
items.sort(reverse=True)
for i in items:
if 2 <= i <= (len(Config.playlist) - 1):
await msg.edit(f"Succesfully Removed from Playlist- {i}. **{Config.playlist[i][1]}**")
await clear_db_playlist(song=Config.playlist[i])
Config.playlist.pop(i)
else:
await msg.edit(f"You cant skip first two songs- {i}")
except (ValueError, TypeError):
await msg.edit("Invalid input")
pl=await get_playlist_str()
if m.chat.type == "private":
await msg.edit(pl, disable_web_page_preview=True)
elif not Config.LOG_GROUP and m.chat.type == "supergroup":
if Config.msg.get('player'):
await Config.msg['player'].delete()
Config.msg['player'] = await msg.edit(pl, disable_web_page_preview=True)
@debug.on_message(filters.command(['logs', f"logs@{Config.BOT_USERNAME}"]) & filters.private & filters.user(Config.SUDO))
async def get_logs(client, message):
m=await message.reply("Checking logs..")
if os.path.exists("botlog.txt"):
await message.reply_document('botlog.txt', caption="Bot Logs")
await m.delete()
else:
k = await m.edit("No log files found.")
@debug.on_message(filters.text & filters.private)
async def reply_else(bot, message):
await message.reply("**Development mode is activated.\nThis occures when there are some errors in startup of the bot.\nOnly Configuration commands works in development mode.\nAvailabe commands are /env, /skip, /clearplaylist and /restart and /logs**")
def stop_and_restart():
os.system("git pull")
time.sleep(10)
os.execl(sys.executable, sys.executable, *sys.argv)
async def get_playlist_str():
if not Config.playlist:
pl = f"🔈 Playlist is empty.)ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ"
else:
if len(Config.playlist)>=25:
tplaylist=Config.playlist[:25]
pl=f"Listing first 25 songs of total {len(Config.playlist)} songs.\n"
pl += f"▶️ **Playlist**: ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ\n" + "\n".join([
f"**{i}**. **🎸{x[1]}**\n 👤**Requested by:** {x[4]}"
for i, x in enumerate(tplaylist)
])
tplaylist.clear()
else:
pl = f"▶️ **Playlist**: ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ\n" + "\n".join([
f"**{i}**. **🎸{x[1]}**\n 👤**Requested by:** {x[4]}\n"
for i, x in enumerate(Config.playlist)
])
return pl
async def sync_to_db():
if Config.DATABASE_URI:
await check_db()
await db.edit_config("ADMINS", Config.ADMINS)
await db.edit_config("IS_VIDEO", Config.IS_VIDEO)
await db.edit_config("IS_LOOP", Config.IS_LOOP)
await db.edit_config("REPLY_PM", Config.REPLY_PM)
await db.edit_config("ADMIN_ONLY", Config.ADMIN_ONLY)
await db.edit_config("SHUFFLE", Config.SHUFFLE)
await db.edit_config("EDIT_TITLE", Config.EDIT_TITLE)
await db.edit_config("CHAT", Config.CHAT)
await db.edit_config("SUDO", Config.SUDO)
await db.edit_config("REPLY_MESSAGE", Config.REPLY_MESSAGE)
await db.edit_config("LOG_GROUP", Config.LOG_GROUP)
await db.edit_config("STREAM_URL", Config.STREAM_URL)
await db.edit_config("DELAY", Config.DELAY)
await db.edit_config("SCHEDULED_STREAM", Config.SCHEDULED_STREAM)
await db.edit_config("SCHEDULE_LIST", Config.SCHEDULE_LIST)
await db.edit_config("IS_VIDEO_RECORD", Config.IS_VIDEO_RECORD)
await db.edit_config("IS_RECORDING", Config.IS_RECORDING)
await db.edit_config("WAS_RECORDING", Config.WAS_RECORDING)
await db.edit_config("PORTRAIT", Config.PORTRAIT)
await db.edit_config("RECORDING_DUMP", Config.RECORDING_DUMP)
await db.edit_config("RECORDING_TITLE", Config.RECORDING_TITLE)
await db.edit_config("HAS_SCHEDULE", Config.HAS_SCHEDULE)
async def sync_from_db():
if Config.DATABASE_URI:
await check_db()
Config.ADMINS = await db.get_config("ADMINS")
Config.IS_VIDEO = await db.get_config("IS_VIDEO")
Config.IS_LOOP = await db.get_config("IS_LOOP")
Config.REPLY_PM = await db.get_config("REPLY_PM")
Config.ADMIN_ONLY = await db.get_config("ADMIN_ONLY")
Config.SHUFFLE = await db.get_config("SHUFFLE")
Config.EDIT_TITLE = await db.get_config("EDIT_TITLE")
Config.CHAT = int(await db.get_config("CHAT"))
Config.playlist = await db.get_playlist()
Config.LOG_GROUP = await db.get_config("LOG_GROUP")
Config.SUDO = await db.get_config("SUDO")
Config.REPLY_MESSAGE = await db.get_config("REPLY_MESSAGE")
Config.DELAY = await db.get_config("DELAY")
Config.STREAM_URL = await db.get_config("STREAM_URL")
Config.SCHEDULED_STREAM = await db.get_config("SCHEDULED_STREAM")
Config.SCHEDULE_LIST = await db.get_config("SCHEDULE_LIST")
Config.IS_VIDEO_RECORD = await db.get_config('IS_VIDEO_RECORD')
Config.IS_RECORDING = await db.get_config("IS_RECORDING")
Config.WAS_RECORDING = await db.get_config('WAS_RECORDING')
Config.PORTRAIT = await db.get_config("PORTRAIT")
Config.RECORDING_DUMP = await db.get_config("RECORDING_DUMP")
Config.RECORDING_TITLE = await db.get_config("RECORDING_TITLE")
Config.HAS_SCHEDULE = await db.get_config("HAS_SCHEDULE")
async def add_to_db_playlist(song):
if Config.DATABASE_URI:
song_={str(k):v for k,v in song.items()}
db.add_to_playlist(song[5], song_)
async def clear_db_playlist(song=None, all=False):
if Config.DATABASE_URI:
if all:
await db.clear_playlist()
else:
await db.del_song(song[5])
async def check_db():
if not await db.is_saved("ADMINS"):
db.add_config("ADMINS", Config.ADMINS)
if not await db.is_saved("IS_VIDEO"):
db.add_config("IS_VIDEO", Config.IS_VIDEO)
if not await db.is_saved("IS_LOOP"):
db.add_config("IS_LOOP", Config.IS_LOOP)
if not await db.is_saved("REPLY_PM"):
db.add_config("REPLY_PM", Config.REPLY_PM)
if not await db.is_saved("ADMIN_ONLY"):
db.add_config("ADMIN_ONLY", Config.ADMIN_ONLY)
if not await db.is_saved("SHUFFLE"):
db.add_config("SHUFFLE", Config.SHUFFLE)
if not await db.is_saved("EDIT_TITLE"):
db.add_config("EDIT_TITLE", Config.EDIT_TITLE)
if not await db.is_saved("CHAT"):
db.add_config("CHAT", Config.CHAT)
if not await db.is_saved("SUDO"):
db.add_config("SUDO", Config.SUDO)
if not await db.is_saved("REPLY_MESSAGE"):
db.add_config("REPLY_MESSAGE", Config.REPLY_MESSAGE)
if not await db.is_saved("STREAM_URL"):
db.add_config("STREAM_URL", Config.STREAM_URL)
if not await db.is_saved("DELAY"):
db.add_config("DELAY", Config.DELAY)
if not await db.is_saved("LOG_GROUP"):
db.add_config("LOG_GROUP", Config.LOG_GROUP)
if not await db.is_saved("SCHEDULED_STREAM"):
db.add_config("SCHEDULED_STREAM", Config.SCHEDULED_STREAM)
if not await db.is_saved("SCHEDULE_LIST"):
db.add_config("SCHEDULE_LIST", Config.SCHEDULE_LIST)
if not await db.is_saved("IS_VIDEO_RECORD"):
db.add_config("IS_VIDEO_RECORD", Config.IS_VIDEO_RECORD)
if not await db.is_saved("PORTRAIT"):
db.add_config("PORTRAIT", Config.PORTRAIT)
if not await db.is_saved("IS_RECORDING"):
db.add_config("IS_RECORDING", Config.IS_RECORDING)
if not await db.is_saved('WAS_RECORDING'):
db.add_config('WAS_RECORDING', Config.WAS_RECORDING)
if not await db.is_saved("RECORDING_DUMP"):
db.add_config("RECORDING_DUMP", Config.RECORDING_DUMP)
if not await db.is_saved("RECORDING_TITLE"):
db.add_config("RECORDING_TITLE", Config.RECORDING_TITLE)
if not await db.is_saved('HAS_SCHEDULE'):
db.add_config("HAS_SCHEDULE", Config.HAS_SCHEDULE)
async def edit_config(var, value):
if var == "STARTUP_STREAM":
Config.STREAM_URL = value
elif var == "CHAT":
Config.CHAT = int(value)
elif var == "LOG_GROUP":
Config.LOG_GROUP = int(value)
elif var == "DELAY":
Config.DELAY = int(value)
elif var == "REPLY_MESSAGE":
Config.REPLY_MESSAGE = value
elif var == "RECORDING_DUMP":
Config.RECORDING_DUMP = value
await sync_to_db()