forked from blizzthewolf/SeaCogs
feat(tts): bunch of changes
- changed how the cog loads, instead of depending on the `PyLavPlayer` cog, it'll just load PyLav from the `__init__.py` file - moved configuration to a separate file - added a configuration menu - added pylav as a dependency in poetry and `info.json` - set repository python version to `>=3.11,<3.12`
This commit is contained in:
parent
bcca864d02
commit
3c4fba46b6
7 changed files with 1275 additions and 51 deletions
1196
poetry.lock
generated
1196
poetry.lock
generated
File diff suppressed because it is too large
Load diff
|
@ -7,10 +7,11 @@ license = "MPL 2"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
|
|
||||||
[tool.poetry.dependencies]
|
[tool.poetry.dependencies]
|
||||||
python = ">=3.9,<3.12"
|
python = ">=3.11,<3.12"
|
||||||
Red-DiscordBot = "^3.5.5"
|
Red-DiscordBot = "^3.5.5"
|
||||||
pytimeparse2 = "^1.7.1"
|
pytimeparse2 = "^1.7.1"
|
||||||
humanize = "^4.8.0"
|
humanize = "^4.8.0"
|
||||||
|
py-lav = {extras = ["all"], version = ">=1.14.3,<1.15"}
|
||||||
|
|
||||||
[tool.poetry.group.dev]
|
[tool.poetry.group.dev]
|
||||||
optional = true
|
optional = true
|
||||||
|
|
|
@ -1,5 +1,12 @@
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from pylav.extension.red.utils.required_methods import pylav_auto_setup
|
||||||
|
from pylav.type_hints.bot import DISCORD_BOT_TYPE
|
||||||
|
from redbot.core.utils import get_end_user_data_statement
|
||||||
|
|
||||||
from .tts import TTS
|
from .tts import TTS
|
||||||
|
|
||||||
|
__red_end_user_data_statement__ = get_end_user_data_statement(__file__)
|
||||||
|
|
||||||
async def setup(bot):
|
async def setup(bot: DISCORD_BOT_TYPE):
|
||||||
await bot.add_cog(TTS(bot))
|
await pylav_auto_setup(bot, TTS)
|
||||||
|
|
14
tts/config.py
Normal file
14
tts/config.py
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
from redbot.core import Config
|
||||||
|
|
||||||
|
config: Config = Config.get_conf(None, identifier=69737245070283, cog_name="TTS")
|
||||||
|
|
||||||
|
|
||||||
|
def register_config(config_obj: Config):
|
||||||
|
config_obj.register_global(
|
||||||
|
use_google_tts = False,
|
||||||
|
)
|
||||||
|
config_obj.register_guild(
|
||||||
|
enabled_channels = [],
|
||||||
|
announce = False,
|
||||||
|
voice_channels = True
|
||||||
|
)
|
|
@ -8,7 +8,10 @@
|
||||||
"hidden": false,
|
"hidden": false,
|
||||||
"disabled": false,
|
"disabled": false,
|
||||||
"min_bot_version": "3.5.0",
|
"min_bot_version": "3.5.0",
|
||||||
"min_python_version": [3, 10, 0],
|
"min_python_version": [3, 11, 0],
|
||||||
|
"requirements": [
|
||||||
|
"Py-Lav[all]"
|
||||||
|
],
|
||||||
"tags": [
|
"tags": [
|
||||||
"pylav",
|
"pylav",
|
||||||
"audio",
|
"audio",
|
||||||
|
|
68
tts/menu.py
Normal file
68
tts/menu.py
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
from discord import ButtonStyle, Embed, Interaction, ui
|
||||||
|
from redbot.core import commands
|
||||||
|
from redbot.core.utils.chat_formatting import bold
|
||||||
|
|
||||||
|
from tts.config import config
|
||||||
|
|
||||||
|
|
||||||
|
class Menu(ui.View):
|
||||||
|
def __init__(self, ctx: commands.Context):
|
||||||
|
super().__init__()
|
||||||
|
self.ctx = ctx
|
||||||
|
|
||||||
|
@ui.button(label="Announce", style=ButtonStyle.green, row=0)
|
||||||
|
async def announce(self, interaction: Interaction, button: ui.Button):
|
||||||
|
if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator:
|
||||||
|
await interaction.response.send_message("You must have the manage guild permission to change this setting.", ephemeral=True)
|
||||||
|
return
|
||||||
|
await interaction.response.defer()
|
||||||
|
current_setting = await config.guild(interaction.guild).announce
|
||||||
|
await config.guild(interaction.guild).announce.set(not current_setting)
|
||||||
|
await interaction.message.edit(embed=await embed(self.ctx))
|
||||||
|
|
||||||
|
@ui.button(label="Use Voice Channels", style=ButtonStyle.green, row=0)
|
||||||
|
async def voice_channels(self, interaction: Interaction, button: ui.Button):
|
||||||
|
if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator:
|
||||||
|
await interaction.response.send_message("You must have the manage guild permission to change this setting.", ephemeral=True)
|
||||||
|
return
|
||||||
|
await interaction.response.defer()
|
||||||
|
current_setting = await config.guild(interaction.guild).voice_channels()
|
||||||
|
await config.guild(interaction.guild).voice_channels.set(not current_setting)
|
||||||
|
await interaction.message.edit(embed=await embed(self.ctx))
|
||||||
|
|
||||||
|
@ui.select(placeholder="Enabled Channels", cls=ui.ChannelSelect, row=1)
|
||||||
|
async def log_channel(self, interaction: Interaction, select: ui.ChannelSelect):
|
||||||
|
if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator:
|
||||||
|
await interaction.response.send_message("You must have the manage guild permission to change this setting.", ephemeral=True)
|
||||||
|
return
|
||||||
|
await interaction.response.defer()
|
||||||
|
channels: list = await config.guild(interaction.guild).enabled_channels()
|
||||||
|
if select.values[0] in channels:
|
||||||
|
channels.remove(select.values[0])
|
||||||
|
else:
|
||||||
|
channels.append(select.values[0])
|
||||||
|
await config.guild(interaction.guild).enabled_channels.set(channels)
|
||||||
|
await interaction.message.edit(embed=await embed(self.ctx))
|
||||||
|
|
||||||
|
async def embed(ctx: commands.Context):
|
||||||
|
embed = Embed(title="TTS Settings", color=ctx.embed_color)
|
||||||
|
override_settings = {
|
||||||
|
"announce": await config.guild(ctx.guild).announce(),
|
||||||
|
"voice_channels": await config.guild(ctx.guild).voice_channels(),
|
||||||
|
"enabled_channels": await config.guild(ctx.guild).enabled_channels(),
|
||||||
|
}
|
||||||
|
|
||||||
|
override_str = [
|
||||||
|
"- " + bold("Announce: ") + get_bool_emoji(override_settings["announce"]),
|
||||||
|
"- " + bold("Voice Channels: ") + get_bool_emoji(override_settings["voice_channels"]),
|
||||||
|
"- " + ", ".join([f"<#{channel}>" for channel in override_settings["voice_channels"]])
|
||||||
|
]
|
||||||
|
embed.description = "\n".join(override_str)
|
||||||
|
|
||||||
|
def get_bool_emoji(value: bool) -> str:
|
||||||
|
"""Returns a unicode emoji based on a boolean value."""
|
||||||
|
if value is True:
|
||||||
|
return "\N{WHITE HEAVY CHECK MARK}"
|
||||||
|
if value is False:
|
||||||
|
return "\N{NO ENTRY SIGN}"
|
||||||
|
return "\N{BLACK QUESTION MARK ORNAMENT}\N{VARIATION SELECTOR-16}"
|
29
tts/tts.py
29
tts/tts.py
|
@ -8,9 +8,12 @@
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from discord import Message
|
from discord import Message
|
||||||
from redbot.core import Config, commands
|
from redbot.core import commands
|
||||||
from redbot.core.bot import Red
|
from redbot.core.bot import Red
|
||||||
|
|
||||||
|
from tts.config import config
|
||||||
|
from tts.menu import Menu
|
||||||
|
|
||||||
|
|
||||||
class TTS(commands.Cog):
|
class TTS(commands.Cog):
|
||||||
"""Text to Speech through Pylav"""
|
"""Text to Speech through Pylav"""
|
||||||
|
@ -18,15 +21,6 @@ class TTS(commands.Cog):
|
||||||
def __init__(self, bot: Red):
|
def __init__(self, bot: Red):
|
||||||
self.bot = bot
|
self.bot = bot
|
||||||
self.logger = logging.getLogger("red.sea.tts")
|
self.logger = logging.getLogger("red.sea.tts")
|
||||||
self.config = Config.get_conf(self, 69737245070283, force_registration=True)
|
|
||||||
self.config.register_global(
|
|
||||||
use_google_tts = False,
|
|
||||||
)
|
|
||||||
self.config.register_guild(
|
|
||||||
enabled_channels = [],
|
|
||||||
announce = False,
|
|
||||||
voice_channels = True
|
|
||||||
)
|
|
||||||
|
|
||||||
async def on_message(self, message: Message):
|
async def on_message(self, message: Message):
|
||||||
await self.bot.wait_until_red_ready()
|
await self.bot.wait_until_red_ready()
|
||||||
|
@ -47,4 +41,17 @@ class TTS(commands.Cog):
|
||||||
#TODO - add PyLav integration
|
#TODO - add PyLav integration
|
||||||
return
|
return
|
||||||
|
|
||||||
#TODO - add commands for enabling/disabling channels, setting voice channel settings, and setting global settings
|
@commands.group(name="tts", autohelp=True)
|
||||||
|
@commands.admin_or_permissions(manage_guild=True)
|
||||||
|
async def tts(self, ctx: commands.Context):
|
||||||
|
"""Text to Speech settings"""
|
||||||
|
await ctx.send(view=Menu(ctx))
|
||||||
|
|
||||||
|
@tts.command(name="google")
|
||||||
|
@commands.is_owner()
|
||||||
|
async def tts_google(self, ctx: commands.Context, enable: bool = None):
|
||||||
|
"""Enable or disable Google Cloud TTS"""
|
||||||
|
if enable is None:
|
||||||
|
enable = not await config.use_google_tts()
|
||||||
|
await config.use_google_tts.set(enable)
|
||||||
|
await ctx.send(f"Google TTS has been {'enabled' if enable else 'disabled'}.")
|
||||||
|
|
Loading…
Reference in a new issue