Migrate scripts to voicelink, rewrite handlers and views

This commit is contained in:
Choco
2025-09-29 19:39:19 +08:00
parent 7a4f85a74d
commit ef54f96f51
52 changed files with 2048 additions and 1642 deletions

View File

@@ -22,11 +22,10 @@ SOFTWARE.
"""
import time, logging
import function as func
from math import ceil
from asyncio import sleep
from views import InteractiveController
from random import shuffle, choice
from typing import Any, Dict, List, Optional, Union, Tuple
from discord import (
@@ -45,18 +44,22 @@ from discord import (
from discord.ext import commands
from . import events
from .config import Config
from .pool import Node, NodePool
from .objects import Track, Playlist
from .filters import Filter, Filters
from .enums import SearchType, LoopType, RequestMethod
from .events import VoicelinkEvent, TrackEndEvent, TrackStartEvent, TrackExceptionEvent
from .exceptions import VoicelinkException, FilterInvalidArgument, TrackInvalidPosition, FilterTagAlreadyInUse, DuplicateTrack
from .filters import Filter, Filters
from .objects import Track, Playlist
from .pool import Node, NodePool
from .placeholders import Placeholders, build_embed
from .placeholders import PlayerPlaceholder
from .queue import Queue, QUEUE_TYPES
from random import shuffle, choice
from .mongodb import MongoDBHandler
from .language import LangHandler
from .views import InteractiveController
from .utils import format_ms, dispatch_message
async def connect_channel(ctx: Union[commands.Context, Interaction], channel: VoiceChannel = None):
texts = await func.get_lang(ctx.guild.id, "noChannel", "noPermission")
texts = await LangHandler.get_lang(ctx.guild.id, "noChannel", "noPermission")
try:
channel = channel or ctx.author.voice.channel if isinstance(ctx, commands.Context) else ctx.user.voice.channel
except:
@@ -66,7 +69,7 @@ async def connect_channel(ctx: Union[commands.Context, Interaction], channel: Vo
if check.connect == False or check.speak == False:
raise VoicelinkException(texts[1])
settings = await func.get_settings(channel.guild.id)
settings = await MongoDBHandler.get_settings(channel.guild.id)
player: Player = await channel.connect(
cls=Player(
ctx.bot if isinstance(ctx, commands.Context) else ctx.client,
@@ -116,7 +119,7 @@ class Player(VoiceProtocol):
self.joinTime: float = round(time.time())
self._volume: int = self.settings.get('volume', 100)
self.queue: Queue = QUEUE_TYPES.get(self.settings.get("queue_type", "queue").lower())(
self.settings.get("max_queue", func.settings.max_queue),
self.settings.get("max_queue", Config().max_queue),
self.settings.get("duplicate_track", True), self.get_msg
)
@@ -145,7 +148,7 @@ class Player(VoiceProtocol):
self.shuffle_votes = set()
self.stop_votes = set()
self._ph = Placeholders(client, self)
self._ph = PlayerPlaceholder(client, self)
self._logger: Optional[logging.Logger] = self._node._logger
def __repr__(self):
@@ -258,7 +261,7 @@ class Player(VoiceProtocol):
"""Retrieves a localized message or list of messages based on the given keys
for the guild associated with this player.
"""
return func._get_lang(self.settings.get("lang"), *keys)
return LangHandler._get_lang(self.settings.get("lang"), *keys)
def required(self, leave=False):
"""
@@ -291,7 +294,7 @@ class Player(VoiceProtocol):
has 'Manage Server' permission, or meets the DJ role criteria in the settings.
Raises an exception if `check_user_join` is True and the user is not in the channel.
"""
if user.id in func.settings.bot_access_user:
if user.id in Config().bot_access_user:
return True
manage_perm = user.guild_permissions.manage_guild
@@ -304,10 +307,10 @@ class Player(VoiceProtocol):
def build_embed(self, current_track: Track = None):
"""Builds an embed based on the current track state."""
controller = self.settings.get("default_controller", func.settings.controller).get("embeds", {})
controller = self.settings.get("default_controller", Config().controller).get("embeds", {})
embed_form = controller.get("active" if current_track else "inactive", {})
return build_embed(embed_form, self._ph)
return PlayerPlaceholder.build_embed(embed_form, self._ph)
async def send(self, method: RequestMethod, query: str = None, data: Union[Dict, str] = {}) -> Dict:
"""Sends an HTTP request to the node with the given method, query, and data."""
@@ -424,7 +427,7 @@ class Player(VoiceProtocol):
return await self.do_next()
if not track.requester.bot:
self._bot.loop.create_task(func.update_user(track.requester.id, {
self._bot.loop.create_task(MongoDBHandler.update_user(track.requester.id, {
"$push": {"history": {"$each": [track.track_id], "$slice": -25}}
}))
@@ -463,11 +466,11 @@ class Player(VoiceProtocol):
# Send a new controller message if none exists
if not self.controller:
self.controller = await func.send(self.context, content=embed, view=view, requires_fetch=True)
self.controller = await dispatch_message(self.context, content=embed, view=view, requires_fetch=True)
elif not await self.is_position_fresh():
await self.controller.delete()
self.controller = await func.send(self.context, content=embed, view=view, requires_fetch=True)
self.controller = await dispatch_message(self.context, content=embed, view=view, requires_fetch=True)
else:
await self.controller.edit(embed=embed, view=view)
@@ -495,7 +498,7 @@ class Player(VoiceProtocol):
async def teardown(self):
"""Cleans up the player and associated resources."""
try:
await func.update_settings(self.guild.id, {"$set": {
await MongoDBHandler.update_settings(self.guild.id, {"$set": {
"last_active": (timeNow := round(time.time())),
"played_time": round(self.settings.get("played_time", 0) + ((timeNow - self.joinTime) / 60), 2)
}})
@@ -611,9 +614,9 @@ class Player(VoiceProtocol):
track_length = track.length
if not 0 <= start_time <= track_length:
raise VoicelinkException(self.get_msg("invalidStartTime", func.time(track_length)))
raise VoicelinkException(self.get_msg("invalidStartTime", format_ms(track_length)))
if not 0 <= end_time <= track_length:
raise VoicelinkException(self.get_msg("invalidEndTime", func.time(track_length)))
raise VoicelinkException(self.get_msg("invalidEndTime", format_ms(track_length)))
track.position = start_time
track.end_time = end_time
@@ -864,7 +867,7 @@ class Player(VoiceProtocol):
async def update_voice_status(self, remove_status: bool = False) -> None:
"""Updates the voice status of the channel based on the specified template."""
template = self.settings.get("stage_announce_template", func.settings.voice_status_template)
template = self.settings.get("stage_announce_template", Config().voice_status_template)
if not template or not self.channel:
return