Advertisement
Guest User

Untitled

a guest
Feb 15th, 2023
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 16.66 KB | None | 0 0
  1. class Song(disnake.PCMVolumeTransformer):
  2.  
  3.     example_data = {
  4.     "title": "",
  5.     "requester": "",
  6.     "artist": "",
  7.     "trackid": 0,
  8.     "albumid": 0,
  9.     "image": ""
  10.     }
  11.  
  12.     def __init__(self):
  13.         self.queue = []
  14.  
  15.     def search_tracks(self, ctx, query):
  16.         stats = True
  17.         while stats:
  18.             try:
  19.                 searcher = client.search(str(query))
  20.                 if not searcher.tracks: raise searchError("Not searched tracks")
  21.                 track_object = searcher.tracks['results'][0]
  22.                 stats = False
  23.                 text = None
  24.                 lyrics = track_object.get_supplement()
  25.                 if lyrics.lyrics: text = lyrics.lyrics.full_lyrics
  26. #                with sqlite3.connect("database.db") as db:
  27. #                    cursor = db.cursor()
  28. #                    cursor.execute("INSERT INTO songs(name, requester, author, id, albumid, lyrics, guild, image) VALUES(?, ?, ?, ?, ?, ?, ?, ?)", (track_object['title'],ctx.author.id,track_object['artists'][0]['name'],track_object['id'],track_object['albums'][0]["id"],text,ctx.guild.id,"https://" + track_object["og_image"].replace("%%", "1000x1000"),))
  29.                 self.queue.append({
  30.                     "title": track_object["title"],
  31.                     "requester": ctx.author.id,
  32.                     "artist": track_object['artists'][0]['name'],
  33.                     "trackid": track_object["id"],
  34.                     "albumid": track_object["albums"][0]["id"],
  35.                     "image": "https://" + track_object["og_image"].replace("%%", "1000x1000")
  36.                     })
  37.                 return {
  38.                 "id": track_object["id"],
  39.                 "title": track_object["title"],
  40.                 "artist": track_object["artists"][0]["name"],
  41.                 "albumid": track_object["albums"][0]["id"],
  42.                 "image": "https://" + track_object["og_image"].replace("%%", "1000x1000")
  43.                 }
  44.             except NetworkError:
  45.                 pass
  46.     async def download_track(self, ctx, track):
  47.         stats = True
  48.         while stats:
  49.             try:
  50.                 client.tracks(track['id'])[0].download(f"songs/{track['id']}.mp3")
  51.                 stats = False
  52.             except NetworkError:
  53.                 pass
  54.  
  55.  
  56.     async def join_channel(self, ctx):
  57.         voice = ctx.author.voice
  58.         if not voice: return "notChannel"
  59.         if voice:
  60.             await voice.channel.connect()
  61.             for mem in voice.channel.members:
  62.                 if mem.id == 1047125592220373075:
  63.                     await mem.edit(deafen=True)
  64.             return None
  65.  
  66.     async def leave_channel(self, ctx):
  67.         voice_state = ctx.guild.voice_client
  68.         if not voice_state:
  69.             return "notState"
  70.         if voice_state.is_connected():
  71.             await voice_state.disconnect()
  72.             return None
  73.         else:
  74.             return "notState"
  75.  
  76.     async def stop(self, ctx):
  77.         voice_state = ctx.guild.voice_client
  78.         if not voice_state:
  79.             return "notState"
  80.         if voice_state.is_connected():
  81.             await Song.leave_channel(ctx)
  82.             return None
  83.         else:
  84.             return "notState"
  85.  
  86.     async def my_after(self, ctx):
  87.         #os.remove(f"songs/{ctx.guild.id}.mp3")
  88.         if not ctx.guild:
  89.             return
  90.         voice_state = ctx.guild.voice_client
  91.         if os.path.isfile("songs/{}.mp3".format(queue[0]["trackid"])):
  92.             os.remove("songs/{}.mp3".format(queue[0]["trackid"]))
  93.         self.queue.pop(0)
  94.         if voice_state and voice_state.is_connected():
  95.             try:
  96.                 self.queue[0]
  97.             except:
  98.                 pass
  99.             else:
  100.                 await Song.play(ctx)
  101.  
  102.     def init_after(self, ctx):
  103.         asyncio.run_coroutine_threadsafe(Song.my_after(self, ctx), bot.loop)
  104.  
  105.     async def play(self, ctx):
  106.         voice_state = ctx.guild.voice_client
  107.         if not voice_state:
  108.             error = await Song.join_channel(self, ctx)
  109.             if error:
  110.                 return error
  111.         voice_state = ctx.guild.voice_client
  112.         if voice_state.is_playing():
  113.             return "alreadyPlay"
  114.         np = self.queue[0]
  115.         if not os.path.isfile(f"songs/{np['trackid']}.mp3"):
  116.             await Song.download_track(self, ctx, {'id': np["trackid"]})
  117.         voice_state.play(disnake.FFmpegPCMAudio(f"songs/{np['trackid']}.mp3"), after=lambda e: Song.init_after(self, ctx))
  118.         voice_state.is_playing()
  119.         embed = disnake.Embed(title=np["title"],color=0x228b22)
  120.         embed.add_field(name=lang(ctx,"Главный автор:"),value=np["artist"])
  121.         embed.add_field(name=lang(ctx,"Предложил:"),value=f"<@{np['requester']}>")
  122.         embed.add_field(name=lang(ctx,"Источник:"),value="<:yandexMusic:1056924402790436934> Yandex Music\n")
  123.         embed.add_field(name=lang(ctx,"Ссылка:"),value=f"[**{lang(ctx,'Это кликабельная ссылка!')}**](https://music.yandex.ru/album/{np['albumid']}/track/{np['trackid']})")
  124.         embed.set_thumbnail(url=np['image'])
  125.  
  126.         comps = [
  127.         disnake.ui.Button(emoji="⏹", style=disnake.ButtonStyle.danger, custom_id="stop"),
  128.         disnake.ui.Button(emoji="⏮", style=disnake.ButtonStyle.blurple, custom_id="replay"),
  129.         disnake.ui.Button(emoji="⏸", style=disnake.ButtonStyle.blurple, custom_id="pause"),
  130.         disnake.ui.Button(emoji="⏭", style=disnake.ButtonStyle.blurple, custom_id="next")
  131.         ]
  132.  
  133.         await ctx.channel.send(embed=embed, components=comps)
  134.         return None
  135.  
  136.     async def add_for_id(self, ctx, i):
  137.         track_object = client.tracks([f"{i}"])[0]
  138.         self.queue.append({
  139.         "title": track_object["title"],
  140.         "requester": ctx.author.id,
  141.         "artist": track_object['artists'][0]['name'],
  142.         "trackid": track_object["id"],
  143.         "albumid": track_object["albums"][0]["id"],
  144.         "image": "https://" + track_object["og_image"].replace("%%", "1000x1000")
  145.         })
  146.  
  147.  
  148.     async def skip(self, ctx):
  149.         voice_state = ctx.guild.voice_client
  150.         if voice_state and voice_state.is_playing():
  151.             try:
  152.                 await voice_state.stop()
  153.             except:
  154.                 pass
  155.             return None
  156.         else:
  157.             return "notState"
  158.  
  159.     def now_playing(self, guild):
  160.         return queue
  161.  
  162.     def construct_queue(self, guild):
  163.         texts = []
  164.         for info, pos in zip(self.queue, range(1, len(self.queue))):
  165.             texts.append(f"`{pos}.` [**{info['title']}**](https://music.yandex.ru/album/{info['albumid']}/track/{info['trackid']})")
  166.         if texts == []: return None
  167.         return "\n".join(list(map(str, texts)))
  168.  
  169.     def parse_queue(self, guild):
  170.         titles = []
  171.         urls = []
  172.         for info, pos in zip(self.queue, range(1, len(self.queue))):
  173.             titles.append(f"{pos}. {info['title']}")
  174.             urls.append(f"https://music.yandex.ru/album/{info['albumid']}/track/{info['trackid']}")
  175.         return {
  176.         "texts": titles,
  177.         "urls": urls
  178.         }
  179.  
  180.  
  181.     def pause(self, ctx):
  182.         voice_state = ctx.voice_client
  183.         if voice_state.is_playing():
  184.             voice_state.pause()
  185.  
  186.         else:
  187.             raise VoiceStateError("don't playing!")
  188.  
  189.     def resume(self, ctx):
  190.         voice_state = ctx.voice_client
  191.         if not voice_state.is_playing():
  192.             voice_state.resume()
  193.         else:
  194.             raise VoiceStateError("already Playing!")
  195.  
  196.  
  197.     def get_rand_track(self, ctx):
  198.         track = random.choice(client.users_likes_tracks()).fetch_track()
  199.         return track
  200.  
  201.  
  202. class Music(commands.Cog):
  203.     def __init__(self, bot):
  204.         self.bot = bot
  205.         self.song = Song()
  206.  
  207.     @commands.slash_command(name="join",description="Подключает бота к вашему каналу")
  208.     async def _join(self, ctx):
  209.         await ctx.response.defer()
  210.         error = await self.song.join_channel(ctx)
  211.         if error:
  212.             if error == "notChannel": return await ctx.send(embed=disnake.Embed(title=f"<:wrongCheckmark:1047244133078675607>{lang(ctx,'Ошибка')}",description=lang(ctx,"Для этого необходимо войти в голосовой канал"),color=disnake.Color.red()))
  213.  
  214.         await ctx.send(embed=disnake.Embed(title=f"<:correctCheckmark:1047244074350018700> {lang(ctx,'Успешно')}",color=0x228b22))
  215.  
  216.     @commands.slash_command(name="stop",description="Остановить воспроизведение(внимание, очередь будет сохранена.)")
  217.     async def _stop(self, ctx):
  218.         await ctx.response.defer()
  219.         error = await self.song.stop(ctx)
  220.         if error:
  221.             if error == "notState": return await ctx.send(embed=disnake.Embed(title=f"<:wrongCheckmark:1047244133078675607>{lang(ctx,'Ошибка')}",description=lang(ctx,"Я уже не подключен."),color=disnake.Color.red()))
  222.  
  223.         await ctx.send(embed=disnake.Embed(title=f"<:correctCheckmark:1047244074350018700> {lang(ctx,'Успешно')}",description=lang(ctx,"Пока-пока!"),color=0x228b22))
  224.  
  225.     @commands.slash_command(name="play",description="Воспроизвести трек")
  226.     async def _play(self, ctx, название: str = None):
  227.         await ctx.response.defer()
  228.         name = название
  229.         voice_state = ctx.guild.voice_client
  230.         if name:
  231.             try:
  232.                 track = self.song.search_tracks(ctx, name)
  233.             except searchError:
  234.                 return await ctx.send(embed=disnake.Embed(title=f"<:wrongCheckmark:1047244133078675607>{lang(ctx,'Ошибка')}",description=lang(ctx,"Ничего не нашлось :("),color=disnake.Color.red()))
  235.         else:
  236.             text = self.song.construct_queue(ctx.guild)
  237.             if not text:
  238.                 return await ctx.send(embed=disnake.Embed(title=f"<:wrongCheckmark:1047244133078675607>{lang(ctx,'Ошибка')}",description=lang(ctx,"Очередь на этом сервере пуста, поэтому добавьте что то в неё!"),color=disnake.Color.red()))
  239.         if voice_state:
  240.             if voice_state.is_playing():
  241.                 pass
  242.             else:
  243.                 error = await self.song.play(ctx)
  244.         else:
  245.             error = await self.song.play(ctx)
  246.             if error:
  247.                 if error == "notChannel": return await ctx.send(embed=disnake.Embed(title=f"<:wrongCheckmark:1047244133078675607>{lang(ctx,'Ошибка')}",description=lang(ctx,"Зайдите в голосовой канал."),color=disnake.Color.red()))
  248.         if name:
  249.             await ctx.send(f"{track['title']} {lang(ctx,'успешно добавлена в очередь')}!")
  250.         else:
  251.             await ctx.send(f"**{self.bot.user.name}** {lang(ctx,'успешно начал воспроизведение очереди')}!")
  252.  
  253.  
  254.     @commands.slash_command(name="skip",description="Пропустить трек")
  255.     async def _skip(self, ctx):
  256.         await ctx.response.defer()
  257.         error = await self.song.skip(ctx)
  258.         if error == "notState": return await ctx.send(embed=disnake.Embed(title=f"<:wrongCheckmark:1047244133078675607>{lang(ctx,'Ошибка')}",description=lang(ctx,"Сейчас ничего не играет!"),color=disnake.Color.red()))
  259.         await ctx.send(embed=disnake.Embed(title=f"<:correctCheckmark:1047244074350018700> {lang(ctx,'Успешно')}",color=0x228b22))
  260.  
  261.     # @commands.slash_command(name="now-playing",description="Что сейчас играет?")
  262.     # async def np(self, ctx):
  263.     #     await ctx.response.defer()
  264.     #     voice_state = ctx.guild.voice_client
  265.     #     if voice_state:
  266.     #         if voice_state.is_playing():
  267.     #             infor = Song.now_playing(ctx.guild)
  268.     #             embed = disnake.Embed(title=infor['name'],color=0x228b22)
  269.     #             embed.add_field(name=lang(ctx,"Главный автор:"),value=infor['artist'])
  270.     #             embed.add_field(name=lang(ctx,"Предложил:"),value=f"<@{infor['requester']}>")
  271.     #             embed.add_field(name=lang(ctx,"Источник:"),value="<:yandexMusic:1056924402790436934> Yandex Music\n")
  272.     #             embed.add_field(name=lang(ctx,"Ссылка:"),value=f"[**{lang(ctx,'Это кликабельная ссылка!')}**]({infor['uri']})")
  273.     #             embed.add_field(name=lang(ctx,"Позиция:"),value=infor['pos'])
  274.     #             embed.set_thumbnail(url=infor['image'])
  275.     #             await ctx.send(embed=embed)
  276.     #         else:
  277.     #             await ctx.send(embed=disnake.Embed(title=f"<:wrongCheckmark:1047244133078675607>{lang(ctx,'Ошибка!')}",description=lang(ctx,'Сейчас ничего не играет'),color=disnake.Color.red()))
  278.     #     else:
  279.     #         await ctx.send(embed=disnake.Embed(title=f"<:wrongCheckmark:1047244133078675607>{lang(ctx,'Ошибка!')}",description=lang(ctx,"Сейчас ничего не играет"),color=disnake.Color.red()))
  280.  
  281.     @commands.slash_command(name="queue", description="Посмотреть очередь")
  282.     async def queu(self, ctx):
  283.         await ctx.response.defer()
  284.         text = self.song.construct_queue(ctx.guild)
  285.         if not text:
  286.             return await ctx.send(embed=disnake.Embed(title=f"<:wrongCheckmark:1047244133078675607>{lang(ctx,'Ошибка')}",description=lang(ctx,"Очередь на этом сервере пуста!"),color=disnake.Color.red()))
  287.         await ctx.send(embed=disnake.Embed(title=f"{lang(ctx,'Очередь сервера')} {ctx.guild.name}!",description=text, color=0x228b22))
  288.  
  289.     @commands.slash_command(name="pause",description="Поставить воспроизведение на паузу")
  290.     async def paus_(self, ctx):
  291.         await ctx.response.defer()
  292.         try:
  293.             self.song.pause(ctx.guild)
  294.         except VoiceStateError:
  295.             await ctx.send(embed=disnake.Embed(title=f"<:wrongCheckmark:1047244133078675607>{lang(ctx,'Ошибка')}",description=lang(ctx,"Сейчас ничего не играет"),color=disnake.Color.red()))
  296.         else:
  297.             await ctx.send(f"<:correctCheckmark:1047244074350018700>, {lang(ctx,'чтобы продолжить воспроизведение введите /resume')}")
  298.  
  299.     @commands.slash_command(name="resume",description="Продолжить воспроизведение")
  300.     async def resu_(self, ctx):
  301.         await ctx.response.defer()
  302.         try:
  303.             self.song.resume(ctx.guild)
  304.         except VoiceStateError:
  305.             await ctx.send(embed=disnake.Embed(title=f"<:wrongCheckmark:1047244133078675607>{lang(ctx,'Ошибка')}",description=lang(ctx,"Трек уже играет"),color=disnake.Color.red()))
  306.         else:
  307.             await ctx.send(f"<:correctCheckmark:1047244074350018700>")
  308.  
  309.     @commands.slash_command(name="replay",description="Воспроизвести трек с начала")
  310.     async def re_(self, ctx):
  311.         await ctx.response.defer()
  312.         voice_state = ctx.guild.voice_client
  313.         if voice_state and voice_state.is_playing():
  314.             self.song.pause(ctx.guild)
  315.             await self.song.play(ctx)
  316.             await ctx.send("<:correctCheckmark:1047244074350018700>")
  317.         else:
  318.             await ctx.send("<:wrongCheckmark:1047244133078675607>" + lang(ctx, "Сейчас ничего не играет чтобы начать воспроизведение заново!"))
  319.  
  320.     @commands.slash_command(name="random-track",description="Воспроизвести рандомный трек")
  321.     async def ra_tra(self, ctx):
  322.         await ctx.response.defer()
  323.         voice_state = ctx.guild.voice_client
  324.         track = self.song.get_rand_track(ctx)
  325.         await self.song.add_for_id(ctx, track["id"])
  326.         if voice_state:
  327.             if voice_state.is_playing():
  328.                 #await Song.leave_channel(ctx)
  329.                 pass
  330.             else:
  331.                 error = await self.song.play(ctx)
  332.                 if error == "notChannel": return await ctx.send(embed=disnake.Embed(title=f"<:wrongCheckmark:1047244133078675607>{lang(ctx,'Ошибка')}",description=lang(ctx,"Зайдите в голосовой канал."),color=disnake.Color.red()))
  333.         else:
  334.             error = await self.song.play(ctx)
  335.             if error == "notChannel": return await ctx.send(embed=disnake.Embed(title=f"<:wrongCheckmark:1047244133078675607>{lang(ctx,'Ошибка')}",description=lang(ctx,"Зайдите в голосовой канал."),color=disnake.Color.red()))
  336.         await ctx.send(f"Рандомный трек успешно добавлен в очередь!")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement