Added request song channel feature
This commit is contained in:
10
.github/workflows/docker-image.yml
vendored
10
.github/workflows/docker-image.yml
vendored
@@ -17,3 +17,13 @@ jobs:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Build the Docker image
|
||||
run: docker build . --file Dockerfile --tag vocard:latest
|
||||
|
||||
- name: Log in to GitHub Docker Registry
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
|
||||
|
||||
- name: Push the Docker image
|
||||
run: |
|
||||
docker tag vocard:latest ghcr.io/chocomeow/vocard:latest
|
||||
docker push ghcr.io/chocomeow/vocard:latest
|
||||
|
||||
@@ -67,7 +67,7 @@ async def nowplay(ctx: commands.Context, player: voicelink.Player):
|
||||
icon = ":red_circle:" if track.is_stream else (":pause_button:" if player.is_paused else ":arrow_forward:")
|
||||
embed.add_field(name="\u2800", value=f"{icon} {pbar} **[{ctime(player.position)}/{track.formatted_length}]**", inline=False)
|
||||
|
||||
return await ctx.send(embed=embed, view=LinkView(texts[2].format(track.source), track.emoji, track.uri))
|
||||
return await send(ctx, embed, view=LinkView(texts[2].format(track.source), track.emoji, track.uri))
|
||||
|
||||
class Basic(commands.Cog):
|
||||
def __init__(self, bot: commands.Bot) -> None:
|
||||
@@ -148,9 +148,16 @@ class Basic(commands.Cog):
|
||||
else:
|
||||
position = await player.add_track(tracks[0], start_time=format_time(start), end_time=format_time(end))
|
||||
texts = await get_lang(ctx.guild.id, "live", "trackLoad_pos", "trackLoad")
|
||||
await ctx.send((f"`{texts[0]}`" if tracks[0].is_stream else "") + (texts[1].format(tracks[0].title, tracks[0].uri, tracks[0].author, tracks[0].formatted_length, position) if position >= 1 and player.is_playing else texts[2].format(tracks[0].title, tracks[0].uri, tracks[0].author, tracks[0].formatted_length)), allowed_mentions=False)
|
||||
except voicelink.QueueFull as e:
|
||||
await ctx.send(e)
|
||||
|
||||
stream_content = f"`{texts[0]}`" if tracks[0].is_stream else ""
|
||||
additional_content = texts[1] if position >= 1 and player.is_playing else texts[2]
|
||||
|
||||
await send(
|
||||
ctx,
|
||||
stream_content + additional_content,
|
||||
tracks[0].title, tracks[0].uri, tracks[0].author, tracks[0].formatted_length,
|
||||
position if position >= 1 and player.is_playing else None
|
||||
)
|
||||
finally:
|
||||
if not player.is_playing:
|
||||
await player.do_next()
|
||||
@@ -189,10 +196,16 @@ class Basic(commands.Cog):
|
||||
else:
|
||||
position = await player.add_track(tracks[0])
|
||||
texts = await get_lang(interaction.guild.id, "live", "trackLoad_pos", "trackLoad")
|
||||
await interaction.followup.send((f"`{texts[0]}`" if tracks[0].is_stream else "") + (texts[1].format(tracks[0].title, tracks[0].uri, tracks[0].author, tracks[0].formatted_length, position) if position >= 1 and player.is_playing else texts[2].format(tracks[0].title, tracks[0].uri, tracks[0].author, tracks[0].formatted_length)), allowed_mentions=False)
|
||||
except voicelink.QueueFull as e:
|
||||
await interaction.followup.send(e)
|
||||
|
||||
stream_content = f"`{texts[0]}`" if tracks[0].is_stream else ""
|
||||
additional_content = texts[1] if position >= 1 and player.is_playing else texts[2]
|
||||
|
||||
await send(
|
||||
interaction,
|
||||
stream_content + additional_content,
|
||||
tracks[0].title, tracks[0].uri, tracks[0].author, tracks[0].formatted_length,
|
||||
position if position >= 1 and player.is_playing else None
|
||||
)
|
||||
finally:
|
||||
if not player.is_playing:
|
||||
await player.do_next()
|
||||
@@ -227,7 +240,7 @@ class Basic(commands.Cog):
|
||||
query_track = "\n".join(f"`{index}.` `[{track.formatted_length}]` **{track.title[:35]}**" for index, track in enumerate(tracks[0:10], start=1))
|
||||
embed = discord.Embed(title=texts[0].format(query), description=texts[1].format(get_source(platform, "emoji"), platform, len(tracks[0:10]), query_track), color=settings.embed_color)
|
||||
view = SearchView(tracks=tracks[0:10], texts=[texts[5], texts[6]])
|
||||
view.response = await ctx.send(embed=embed, view=view, ephemeral=True)
|
||||
view.response = await send(ctx, embed, view=view, ephemeral=True)
|
||||
|
||||
await view.wait()
|
||||
if view.values is not None:
|
||||
@@ -236,7 +249,7 @@ class Basic(commands.Cog):
|
||||
track = tracks[int(value.split(". ")[0]) - 1]
|
||||
position = await player.add_track(track)
|
||||
msg += (f"`{texts[2]}`" if track.is_stream else "") + (texts[3].format(track.title, track.uri, track.author, track.formatted_length, position) if position >= 1 else texts[4].format(track.title, track.uri, track.author, track.formatted_length))
|
||||
await ctx.send(msg, allowed_mentions=False)
|
||||
await send(ctx, msg)
|
||||
|
||||
if not player.is_playing:
|
||||
await player.do_next()
|
||||
@@ -272,11 +285,16 @@ class Basic(commands.Cog):
|
||||
else:
|
||||
position = await player.add_track(tracks[0], start_time=format_time(start), end_time=format_time(end), at_front=True)
|
||||
texts = await get_lang(ctx.guild.id, "live", "trackLoad_pos", "trackLoad")
|
||||
await ctx.send((f"`{texts[0]}`" if tracks[0].is_stream else "") + (texts[1].format(tracks[0].title, tracks[0].uri, tracks[0].author, tracks[0].formatted_length, position) if position >= 1 and player.is_playing else texts[2].format(tracks[0].title, tracks[0].uri, tracks[0].author, tracks[0].formatted_length)), allowed_mentions=False)
|
||||
|
||||
except voicelink.QueueFull as e:
|
||||
await ctx.send(e)
|
||||
|
||||
stream_content = f"`{texts[0]}`" if tracks[0].is_stream else ""
|
||||
additional_content = texts[1] if position >= 1 and player.is_playing else texts[2]
|
||||
|
||||
await send(
|
||||
ctx,
|
||||
stream_content + additional_content,
|
||||
tracks[0].title, tracks[0].uri, tracks[0].author, tracks[0].formatted_length,
|
||||
position if position >= 1 and player.is_playing else None
|
||||
)
|
||||
finally:
|
||||
if not player.is_playing:
|
||||
await player.do_next()
|
||||
@@ -311,11 +329,14 @@ class Basic(commands.Cog):
|
||||
else:
|
||||
texts = await get_lang(ctx.guild.id, "live", "trackLoad")
|
||||
await player.add_track(tracks[0], start_time=format_time(start), end_time=format_time(end), at_front=True)
|
||||
await ctx.send((f"`{texts[0]}`" if tracks[0].is_stream else "") + texts[1].format(tracks[0].title, tracks[0].uri, tracks[0].author, tracks[0].formatted_length), allowed_mentions=False)
|
||||
|
||||
except voicelink.QueueFull as e:
|
||||
await ctx.send(e)
|
||||
stream_content = f"`{texts[0]}`" if tracks[0].is_stream else ""
|
||||
|
||||
await send(
|
||||
ctx,
|
||||
stream_content + texts[1],
|
||||
tracks[0].title, tracks[0].uri, tracks[0].author, tracks[0].formatted_length,
|
||||
)
|
||||
finally:
|
||||
if player.queue._repeat.mode == voicelink.LoopType.TRACK:
|
||||
await player.set_repeat(voicelink.LoopType.OFF)
|
||||
@@ -471,7 +492,7 @@ class Basic(commands.Cog):
|
||||
if player.queue.is_empty:
|
||||
return await nowplay(ctx, player)
|
||||
view = ListView(player=player, author=ctx.author)
|
||||
view.response = await ctx.send(embed=await view.build_embed(), view=view)
|
||||
view.response = await send(ctx, await view.build_embed(), view=view)
|
||||
|
||||
@queue.command(name="export", aliases=get_aliases("export"))
|
||||
@commands.dynamic_cooldown(cooldown_check, commands.BucketType.guild)
|
||||
@@ -532,10 +553,6 @@ class Basic(commands.Cog):
|
||||
|
||||
index = await player.add_track(tracks)
|
||||
await send(ctx, "playlistLoad", attachment.filename, index)
|
||||
|
||||
except voicelink.QueueFull as e:
|
||||
return await ctx.send(e, ephemeral=True)
|
||||
|
||||
except Exception as e:
|
||||
logger.error("error", exc_info=e)
|
||||
raise e
|
||||
@@ -559,7 +576,7 @@ class Basic(commands.Cog):
|
||||
return await nowplay(ctx, player)
|
||||
|
||||
view = ListView(player=player, author=ctx.author, is_queue=False)
|
||||
view.response = await ctx.send(embed=await view.build_embed(), view=view)
|
||||
view.response = await send(ctx, await view.build_embed(), view=view)
|
||||
|
||||
@commands.hybrid_command(name="leave", aliases=get_aliases("leave"))
|
||||
@commands.dynamic_cooldown(cooldown_check, commands.BucketType.guild)
|
||||
@@ -785,7 +802,7 @@ class Basic(commands.Cog):
|
||||
return await send(ctx, "lyricsNotFound", ephemeral=True)
|
||||
|
||||
view = LyricsView(name=title, source={_: re.findall(r'.*\n(?:.*\n){,22}', v) for _, v in song.items()}, author=ctx.author)
|
||||
view.response = await ctx.send(embed=view.build_embed(), view=view)
|
||||
view.response = await send(ctx, view.build_embed(), view=view)
|
||||
|
||||
@commands.hybrid_command(name="swapdj", aliases=get_aliases("swapdj"))
|
||||
@app_commands.describe(member="Choose a member to transfer the dj role.")
|
||||
@@ -841,7 +858,7 @@ class Basic(commands.Cog):
|
||||
category = "News"
|
||||
view = HelpView(self.bot, ctx.author)
|
||||
embed = view.build_embed(category)
|
||||
view.response = await ctx.send(embed=embed, view=view)
|
||||
view.response = await send(ctx, embed, view=view)
|
||||
|
||||
@commands.hybrid_command(name="ping", aliases=get_aliases("ping"))
|
||||
@commands.dynamic_cooldown(cooldown_check, commands.BucketType.guild)
|
||||
@@ -866,7 +883,7 @@ class Basic(commands.Cog):
|
||||
inline=False
|
||||
)
|
||||
|
||||
await ctx.send(embed=embed)
|
||||
await send(ctx, embed)
|
||||
|
||||
async def setup(bot: commands.Bot) -> None:
|
||||
await bot.add_cog(Basic(bot))
|
||||
@@ -107,7 +107,7 @@ class Playlists(commands.Cog, name="playlist"):
|
||||
async def playlist(self, ctx: commands.Context):
|
||||
view = HelpView(self.bot, ctx.author)
|
||||
embed = view.build_embed(self.qualified_name)
|
||||
view.response = await ctx.send(embed=embed, view=view)
|
||||
view.response = send(ctx, embed, view=view)
|
||||
|
||||
@playlist.command(name="play", aliases=get_aliases("play"))
|
||||
@app_commands.describe(
|
||||
@@ -212,7 +212,7 @@ class Playlists(commands.Cog, name="playlist"):
|
||||
embed.set_footer(text=text[2])
|
||||
|
||||
view = PlaylistView(embed, results, ctx.author)
|
||||
view.response = await ctx.send(embed=embed, view=view, ephemeral=True)
|
||||
view.response = await send(ctx, embed, view=view, ephemeral=True)
|
||||
|
||||
@playlist.command(name="create", aliases=get_aliases("create"))
|
||||
@app_commands.describe(
|
||||
@@ -344,7 +344,7 @@ class Playlists(commands.Cog, name="playlist"):
|
||||
|
||||
inbox = user['inbox'].copy()
|
||||
view = InboxView(ctx.author, user['inbox'])
|
||||
view.response = await ctx.send(embed=view.build_embed(), view=view, ephemeral=True)
|
||||
view.response = await send(ctx, view.build_embed(), view=view, ephemeral=True)
|
||||
await view.wait()
|
||||
|
||||
if inbox == user['inbox']:
|
||||
|
||||
@@ -58,7 +58,7 @@ class Settings(commands.Cog, name="settings"):
|
||||
async def settings(self, ctx: commands.Context):
|
||||
view = HelpView(self.bot, ctx.author)
|
||||
embed = view.build_embed(self.qualified_name)
|
||||
view.response = await ctx.send(embed=embed, view=view)
|
||||
view.response = await send(ctx, embed, view=view)
|
||||
|
||||
@settings.command(name="prefix", aliases=get_aliases("prefix"))
|
||||
@commands.has_permissions(manage_guild=True)
|
||||
@@ -170,7 +170,7 @@ class Settings(commands.Cog, name="settings"):
|
||||
),
|
||||
inline=False
|
||||
)
|
||||
await ctx.send(embed=embed)
|
||||
await send(ctx, embed)
|
||||
|
||||
@settings.command(name="volume", aliases=get_aliases("volume"))
|
||||
@app_commands.describe(value="Input a integer.")
|
||||
@@ -226,7 +226,7 @@ class Settings(commands.Cog, name="settings"):
|
||||
controller_settings = settings.get("default_controller", func.settings.controller)
|
||||
|
||||
view = EmbedBuilderView(ctx, controller_settings.get("embeds").copy())
|
||||
view.response = await ctx.send(embed=view.build_embed(), view=view)
|
||||
view.response = await send(ctx, view.build_embed(), view=view)
|
||||
|
||||
@settings.command(name="controllermsg", aliases=get_aliases("controllermsg"))
|
||||
@commands.has_permissions(manage_guild=True)
|
||||
@@ -243,9 +243,38 @@ class Settings(commands.Cog, name="settings"):
|
||||
@commands.has_permissions(manage_guild=True)
|
||||
@commands.dynamic_cooldown(cooldown_check, commands.BucketType.guild)
|
||||
async def stageannounce(self, ctx: commands.Context, template: str = None):
|
||||
"""Customize the channel topic template"""
|
||||
"Customize the channel topic template"
|
||||
await update_settings(ctx.guild.id, {"$set": {'stage_announce_template': template}})
|
||||
await send(ctx, "SetStageAnnounceTemplate")
|
||||
await send(ctx, "setStageAnnounceTemplate")
|
||||
|
||||
@settings.command(name="setupchannel", aliases=get_aliases("setupchannel"))
|
||||
@app_commands.describe(
|
||||
channel="Provide a request channel. If not, a text channel will be generated."
|
||||
)
|
||||
@commands.has_permissions(manage_guild=True)
|
||||
@commands.dynamic_cooldown(cooldown_check, commands.BucketType.guild)
|
||||
async def setupchannel(self, ctx: commands.Context, channel: discord.TextChannel = None) -> None:
|
||||
"Sets up a dedicated channel for song requests in your server."
|
||||
if not channel:
|
||||
try:
|
||||
overwrites = {
|
||||
ctx.guild.me: discord.PermissionOverwrite(
|
||||
read_messages=True,
|
||||
manage_messages=True
|
||||
)
|
||||
}
|
||||
channel = await ctx.guild.create_text_channel("vocard-song-requests", overwrites=overwrites)
|
||||
except:
|
||||
return await send(ctx, "noCreatePermission")
|
||||
|
||||
channel_perms = channel.permissions_for(ctx.me)
|
||||
if not channel_perms.text() and not channel_perms.manage_messages:
|
||||
return await send(ctx, "noCreatePermission")
|
||||
|
||||
await update_settings(ctx.guild.id, {"$set": {'music_request_channel': {
|
||||
"text_channel_id": channel.id
|
||||
}}})
|
||||
await send(ctx, "createSongRequestChannel", channel.mention)
|
||||
|
||||
@app_commands.command(name="debug")
|
||||
async def debug(self, interaction: discord.Interaction):
|
||||
@@ -268,7 +297,7 @@ class Settings(commands.Cog, name="settings"):
|
||||
value=f"```• VERSION: {func.settings.version}\n" \
|
||||
f"• LATENCY: {self.bot.latency:.2f}ms\n" \
|
||||
f"• GUILDS: {len(self.bot.guilds)}\n" \
|
||||
f"• USERS: {sum([guild.member_count for guild in self.bot.guilds])}\n" \
|
||||
f"• USERS: {sum([guild.member_count or 0 for guild in self.bot.guilds])}\n" \
|
||||
f"• PLAYERS: {len(self.bot.voice_clients)}```",
|
||||
inline=False
|
||||
)
|
||||
|
||||
51
function.py
51
function.py
@@ -143,30 +143,55 @@ def format_bytes(bytes: int, unit: bool = False):
|
||||
else:
|
||||
return f"{bytes / (1024 ** 3):.1f}" + ("GB" if unit else "")
|
||||
|
||||
async def get_lang(guild_id:int, *keys) -> Union[list[str], str]:
|
||||
async def get_lang(guild_id:int, *keys) -> Optional[Union[list[str], str]]:
|
||||
settings = await get_settings(guild_id)
|
||||
lang = settings.get("lang", "EN")
|
||||
if lang in LANGS and not LANGS[lang]:
|
||||
LANGS[lang] = open_json(os.path.join("langs", f"{lang}.json"))
|
||||
|
||||
if len(keys) == 1:
|
||||
return LANGS.get(lang, {}).get(keys[0], "Language pack not found!")
|
||||
return [LANGS.get(lang, {}).get(key, "Language pack not found!") for key in keys]
|
||||
return LANGS.get(lang, {}).get(keys[0])
|
||||
return [LANGS.get(lang, {}).get(key) for key in keys]
|
||||
|
||||
async def send(ctx: Union[commands.Context, discord.Interaction], key: str, *params, delete_after: float = None, ephemeral: bool = False) -> Optional[discord.Message]:
|
||||
text = await get_lang(ctx.guild.id, key)
|
||||
text = text.format(*params)
|
||||
async def send(
|
||||
ctx: Union[commands.Context, discord.Interaction],
|
||||
content: Union[str, discord.Embed] = None,
|
||||
*params,
|
||||
view: discord.ui.View = None,
|
||||
delete_after: float = None,
|
||||
ephemeral: bool = False
|
||||
) -> Optional[discord.Message]:
|
||||
if content is None:
|
||||
content = "No content provided."
|
||||
|
||||
if isinstance(ctx, commands.Context):
|
||||
send_func = ctx.send
|
||||
# Determine the text to send
|
||||
if isinstance(content, discord.Embed):
|
||||
embed = content
|
||||
text = None
|
||||
else:
|
||||
if not ctx.response.is_done():
|
||||
send_func = ctx.response.send_message
|
||||
|
||||
text = await get_lang(ctx.guild.id, content)
|
||||
if text:
|
||||
text = text.format(*params)
|
||||
else:
|
||||
return await ctx.followup.send(text, ephemeral=ephemeral, allowed_mentions=ALLOWED_MENTIONS)
|
||||
text = content.format(*params)
|
||||
embed = None
|
||||
|
||||
return await send_func(text, delete_after=delete_after, ephemeral=ephemeral, allowed_mentions=ALLOWED_MENTIONS)
|
||||
# Determine the sending function
|
||||
send_func = (
|
||||
ctx.send if isinstance(ctx, commands.Context) else
|
||||
ctx.response.send_message if not ctx.response.is_done() else
|
||||
ctx.followup.send
|
||||
)
|
||||
|
||||
# Check settings for delete_after duration
|
||||
settings = await get_settings(ctx.guild.id)
|
||||
if settings and ctx.channel.id == settings.get("music_request_channel", {}).get("text_channel_id"):
|
||||
delete_after = 10
|
||||
|
||||
# Send the message or embed
|
||||
if view:
|
||||
return await send_func(text, embed=embed, view=view, delete_after=delete_after, ephemeral=ephemeral, allowed_mentions=ALLOWED_MENTIONS)
|
||||
return await send_func(text, embed=embed, delete_after=delete_after, ephemeral=ephemeral, allowed_mentions=ALLOWED_MENTIONS)
|
||||
|
||||
async def update_db(db: AsyncIOMotorCollection, tempStore: dict, filter: dict, data: dict) -> bool:
|
||||
for mode, action in data.items():
|
||||
|
||||
@@ -186,5 +186,5 @@
|
||||
"invalidEndTime": "無效的結束時間! 時間必須在 `00:00` 和 `{0}` 之間。",
|
||||
"invalidTimeOrder": "結束時間不能小於或等於開始時間。",
|
||||
|
||||
"SetStageAnnounceTemplate": "完成!從現在開始,像您現在的語音狀態將根據您的模板命名。您應該在幾秒鐘內看到它更新。"
|
||||
"setStageAnnounceTemplate": "完成!從現在開始,像您現在的語音狀態將根據您的模板命名。您應該在幾秒鐘內看到它更新。"
|
||||
}
|
||||
@@ -186,5 +186,5 @@
|
||||
"invalidEndTime": "Ungültiger Endzeit! Die Zeit muss innerhalb von `00:00` und `{0}` liegen.",
|
||||
"invalidTimeOrder": "Der Endzeit darf nicht kleiner oder gleich dem Startzeit sein.",
|
||||
|
||||
"SetStageAnnounceTemplate": "Fertig! Ab sofort wird der Sprachstatus wie der, in dem Sie sich gerade befinden, gemäß Ihrer Vorlage benannt. Sie sollten in wenigen Sekunden eine Aktualisierung sehen."
|
||||
"setStageAnnounceTemplate": "Fertig! Ab sofort wird der Sprachstatus wie der, in dem Sie sich gerade befinden, gemäß Ihrer Vorlage benannt. Sie sollten in wenigen Sekunden eine Aktualisierung sehen."
|
||||
}
|
||||
@@ -7,6 +7,7 @@
|
||||
"noChannel": "No voice channel to connect. Please either provide one or join one.",
|
||||
"alreadyConnected": "Already connected to a voice channel.",
|
||||
"noPermission": "Sorry! i don't have permissions to join or speak in your voice channel.",
|
||||
"noCreatePermission": "Sorry! i don't have permissions to create a song requesting channel.",
|
||||
"noPlaySource": "Can't found any playable sources!",
|
||||
"noPlayer": "No player has found on this server.",
|
||||
"notVote": "This command requires your vote! Type `/vote` for more info.",
|
||||
@@ -186,5 +187,6 @@
|
||||
"invalidEndTime": "Invalid end time, it must be between `00:00` and `{0}`",
|
||||
"invalidTimeOrder": "End time cannot be less than or equal to start time",
|
||||
|
||||
"SetStageAnnounceTemplate": "Done! From now on, voice status like the one you're in now will be named according to your template. You should see it update in a few seconds."
|
||||
"setStageAnnounceTemplate": "Done! From now on, voice status like the one you're in now will be named according to your template. You should see it update in a few seconds.",
|
||||
"createSongRequestChannel": "A song request channel ({0}) has been created! You can start requesting any song by name or URL in that channel, without needing to use the bot prefix."
|
||||
}
|
||||
@@ -186,5 +186,5 @@
|
||||
"invalidEndTime": "Tiempo de finalización inválido! El tiempo debe estar entre `00:00` y `{0}`.",
|
||||
"invalidTimeOrder": "El tiempo final no puede ser menor o igual que el tiempo de inicio.",
|
||||
|
||||
"SetStageAnnounceTemplate": "¡Hecho! A partir de ahora, el estado de voz como el que tienes ahora se nombrará según tu plantilla. Deberías verlo actualizarse en unos segundos."
|
||||
"setStageAnnounceTemplate": "¡Hecho! A partir de ahora, el estado de voz como el que tienes ahora se nombrará según tu plantilla. Deberías verlo actualizarse en unos segundos."
|
||||
}
|
||||
@@ -186,5 +186,5 @@
|
||||
"invalidEndTime": "無効な終了時間!時間は `00:00` と `{0}` の間に設定する必要があります。",
|
||||
"invalidTimeOrder": "終了時間は開始時間より大きくない必要があります。",
|
||||
|
||||
"SetStageAnnounceTemplate": "完了!これからは、今いるボイスステータスがあなたのテンプレートに従って名前が付けられます。数秒以内に更新されるのを見ることができるはずです。"
|
||||
"setStageAnnounceTemplate": "完了!これからは、今いるボイスステータスがあなたのテンプレートに従って名前が付けられます。数秒以内に更新されるのを見ることができるはずです。"
|
||||
}
|
||||
@@ -186,5 +186,5 @@
|
||||
"invalidEndTime": "효력 없는 종료 시간! 시간은 `00:00` 과 `{0}` 사이에 설정해야 합니다.",
|
||||
"invalidTimeOrder": "종료 시간은 시작 시간보다 클수 있어야 합니다.",
|
||||
|
||||
"SetStageAnnounceTemplate": "완료! 이제부터 지금 있는 음성 상태는 귀하의 템플릿에 따라 이름이 지정됩니다. 몇 초 후에 업데이트되는 것을 볼 수 있을 것입니다."
|
||||
"setStageAnnounceTemplate": "완료! 이제부터 지금 있는 음성 상태는 귀하의 템플릿에 따라 이름이 지정됩니다. 몇 초 후에 업데이트되는 것을 볼 수 있을 것입니다."
|
||||
}
|
||||
@@ -185,5 +185,5 @@
|
||||
"invalidEndTime": "Невозможное время конца! Вход времени должен быть внутри `00:00` и `{0}`.",
|
||||
"invalidTimeOrder": "Время конца не может быть меньше или равно времени начала.",
|
||||
|
||||
"SetStageAnnounceTemplate": "Готово! С этого момента статус голоса, как тот, в котором вы находитесь сейчас, будет называться в соответствии с вашим шаблоном. Вы должны увидеть обновление через несколько секунд."
|
||||
"setStageAnnounceTemplate": "Готово! С этого момента статус голоса, как тот, в котором вы находитесь сейчас, будет называться в соответствии с вашим шаблоном. Вы должны увидеть обновление через несколько секунд."
|
||||
}
|
||||
@@ -185,5 +185,5 @@
|
||||
"invalidEndTime": "Недійснений час закінчення! Час має бути в межах `00:00` та `{0}`.",
|
||||
"invalidTimeOrder": "Час закінчення не може бути меншим або рівним часу початку.",
|
||||
|
||||
"SetStageAnnounceTemplate": "Готово! Відтепер статус голосу, як той, в якому ви зараз перебуваєте, буде називатися відповідно до вашого шаблону. Ви повинні побачити оновлення через кілька секунд."
|
||||
"setStageAnnounceTemplate": "Готово! Відтепер статус голосу, як той, в якому ви зараз перебуваєте, буде називатися відповідно до вашого шаблону. Ви повинні побачити оновлення через кілька секунд."
|
||||
}
|
||||
15
main.py
15
main.py
@@ -4,6 +4,7 @@ import os
|
||||
import aiohttp
|
||||
import update
|
||||
import logging
|
||||
import voicelink
|
||||
import function as func
|
||||
|
||||
from discord.ext import commands
|
||||
@@ -41,6 +42,20 @@ class Vocard(commands.Bot):
|
||||
return await message.channel.send("I don't have a bot prefix set.")
|
||||
await message.channel.send(f"My prefix is `{prefix}`")
|
||||
|
||||
settings = await func.get_settings(message.guild.id)
|
||||
if settings and (request_channel := settings.get("music_request_channel")):
|
||||
if message.channel.id == request_channel.get("text_channel_id"):
|
||||
try:
|
||||
ctx = await self.get_context(message)
|
||||
cmd = self.get_command("play")
|
||||
await cmd(ctx, query=message.content)
|
||||
|
||||
except Exception as e:
|
||||
await func.send(ctx, str(e), ephemeral=True)
|
||||
|
||||
finally:
|
||||
return await message.delete()
|
||||
|
||||
await self.process_commands(message)
|
||||
|
||||
async def connect_db(self) -> None:
|
||||
|
||||
@@ -45,11 +45,11 @@ class ControlButton(discord.ui.Button):
|
||||
self.disable_button_text: bool = func.settings.controller.get("disableButtonText", False)
|
||||
super().__init__(label=self.player.get_msg(label) if label and not self.disable_button_text else None, **kwargs)
|
||||
|
||||
async def send(self, interaction: discord.Interaction, key:str, *params, ephemeral: bool = False) -> None:
|
||||
async def send(self, interaction: discord.Interaction, key: str, *params, ephemeral: bool = False) -> None:
|
||||
stay = self.player.settings.get("controller_msg", True)
|
||||
return await func.send(
|
||||
interaction, key, *params,
|
||||
delete_after=None if ephemeral or stay is True else 10,
|
||||
delete_after=None if ephemeral or stay else 10,
|
||||
ephemeral=ephemeral
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user