Compare commits

..

8 Commits

7 changed files with 115 additions and 4 deletions

View File

@ -5,6 +5,7 @@ import constants
class Command(enum.Enum): class Command(enum.Enum):
CLEAR = "clear" CLEAR = "clear"
CURRENT = "current"
EXECUTE = "execute" EXECUTE = "execute"
FAST_FORWARD = "ff" FAST_FORWARD = "ff"
HELP = "help" HELP = "help"

View File

@ -196,7 +196,7 @@ async def queue_or_play(message, edited=False):
description=description, description=description,
color=constants.EMBED_COLOR, color=constants.EMBED_COLOR,
) )
if formatted_duration: if formatted_duration and len(players[message.guild.id].queue) > 1:
e.set_footer(text=f"{formatted_duration} in total") e.set_footer(text=f"{formatted_duration} in total")
return e return e
@ -447,9 +447,24 @@ def play_next(message, once=False, first=False):
message.guild.voice_client.play( message.guild.voice_client.play(
queued.player, after=lambda e: play_after_callback(e, message, once) queued.player, after=lambda e: play_after_callback(e, message, once)
) )
client.loop.create_task(
utils.channel_send(message, queued.format(show_queuer=not first)) embed = disnake.Embed(
color=constants.EMBED_COLOR,
title=queued.player.title,
url=queued.player.original_url,
) )
embed.add_field(name="Volume", value=f"{int(queued.player.volume*100)}%")
embed.add_field(name="Views", value=f"{queued.player.view_count:,}")
embed.add_field(
name="Queuer",
value=players[message.guild.id].current.trigger_message.author.mention,
)
embed.set_image(queued.player.thumbnail_url)
if first:
client.loop.create_task(utils.reply(message, embed=embed))
else:
client.loop.create_task(utils.channel_send(message, embed=embed))
async def ensure_joined(message): async def ensure_joined(message):

View File

@ -28,6 +28,7 @@ RELOADABLE_MODULES = [
"constants", "constants",
"core", "core",
"events", "events",
"extra",
"tasks", "tasks",
"utils", "utils",
"voice", "voice",

View File

@ -48,6 +48,7 @@ async def on_message(message, edited=False):
case C.RELOAD if message.author.id in constants.OWNERS: case C.RELOAD if message.author.id in constants.OWNERS:
reloaded_modules = set() reloaded_modules = set()
rreload(reloaded_modules, __import__("core")) rreload(reloaded_modules, __import__("core"))
rreload(reloaded_modules, __import__("extra"))
for module in filter( for module in filter(
lambda v: inspect.ismodule(v) lambda v: inspect.ismodule(v)
and v.__name__ in constants.RELOADABLE_MODULES, and v.__name__ in constants.RELOADABLE_MODULES,
@ -120,7 +121,7 @@ async def on_message(message, edited=False):
await commands.bot.help(message) await commands.bot.help(message)
case C.UPTIME: case C.UPTIME:
await commands.bot.uptime(message) await commands.bot.uptime(message)
case C.PLAYING: case C.PLAYING | C.CURRENT:
await commands.voice.playing(message) await commands.voice.playing(message)
case C.FAST_FORWARD: case C.FAST_FORWARD:
await commands.voice.fast_forward(message) await commands.voice.fast_forward(message)

91
extra.py Normal file
View File

@ -0,0 +1,91 @@
import asyncio
import string
import disnake
import youtube_transcript_api
from state import client, players
async def transcript(
message, languages=["en"], max_messages=6, min_messages=3, upper=True
):
initial_id = message.guild.voice_client.source.id
transcript_list = youtube_transcript_api.YouTubeTranscriptApi.list_transcripts(
initial_id
)
try:
transcript = transcript_list.find_manually_created_transcript(languages).fetch()
except Exception:
transcript = transcript_list.find_generated_transcript(languages).fetch()
await message.channel.send("(autogenerated)")
messages = []
for line in transcript:
if (
players[message.guild.id].current.player.original.progress
>= line["start"] + line["duration"]
):
continue
while (
players[message.guild.id].current.player.original.progress < line["start"]
):
await asyncio.sleep(0.2)
messages.insert(
0,
await message.channel.send(line["text"].upper() if upper else line["text"]),
)
if len(messages) > max_messages:
try:
await message.channel.delete_messages(
[messages.pop() for _ in range(max_messages - min_messages)]
)
except Exception:
pass
if message.guild.voice_client.source.id != initial_id:
break
def messages_per_second(limit=500):
oldest = 2**64
newest = 0
guilds = set()
members = set()
cached_messages = list(client.cached_messages)[-limit:]
for message in cached_messages:
if message.guild:
guilds.add(message.guild.id)
members.add(message.author.id)
t = message.created_at.timestamp()
if t < oldest:
oldest = t
elif t > newest:
newest = t
average = round(len(cached_messages) / (newest - oldest), 1)
if average == 1.0:
average = 1
print(
f"I am receiving **{average} {'message' if average == 1 else 'messages'} per second** "
f"from **{len(members)} {'member' if len(members) == 1 else 'members'}** across **{len(guilds)} {'guild' if len(guilds) == 1 else 'guilds'}**"
)
async def auto_count(channel_id):
if (channel := await client.fetch_channel(channel_id)) and isinstance(
channel, disnake.TextChannel
):
last_message = (await channel.history(limit=1).flatten())[0]
try:
result = str(
int("".join(filter(lambda d: d in string.digits, last_message.content)))
+ 1
)
except Exception:
result = "where number"
await channel.send(result)

View File

@ -2,4 +2,5 @@ audioop-lts
disnake disnake
disnake_paginator disnake_paginator
PyNaCl PyNaCl
youtube_transcript_api
yt-dlp yt-dlp

View File

@ -39,6 +39,7 @@ class YTDLSource(disnake.PCMVolumeTransformer):
self.description = data.get("description") self.description = data.get("description")
self.duration = data.get("duration") self.duration = data.get("duration")
self.id = data.get("id")
self.original_url = data.get("original_url") self.original_url = data.get("original_url")
self.thumbnail_url = data.get("thumbnail") self.thumbnail_url = data.get("thumbnail")
self.title = data.get("title") self.title = data.get("title")