Skip to content

Commit

Permalink
Update translator set_languages command with selectable channels
Browse files Browse the repository at this point in the history
  • Loading branch information
SeoulSKY committed Feb 27, 2024
1 parent 5055f7d commit 1a44751
Show file tree
Hide file tree
Showing 7 changed files with 83 additions and 6 deletions.
60 changes: 55 additions & 5 deletions commands/translator.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
import os
from typing import Iterator

from discord import app_commands, Interaction, Message, Embed, HTTPException, Locale
from discord import app_commands, Interaction, Message, Embed, HTTPException, Locale, ChannelType
from discord.ext.commands import Bot
from discord.ui import View
from discord.ui import View, ChannelSelect

from mongo.channel import get_channel, set_channel
from mongo.user import get_user, set_user
Expand All @@ -18,6 +18,8 @@
resources = [os.path.join("commands", "translator.ftl")]
default_loc = Localization(DEFAULT_LANGUAGE, resources)

ALL_CHANNELS_DEFAULT = True


class ChannelLanguageSelect(ui.LanguageSelect):
"""
Expand Down Expand Up @@ -57,6 +59,35 @@ async def callback(self, interaction: Interaction):
await send(success(await self.loc.format_value_or_translate("languages-updated")), ephemeral=True)


class UserChannelSelect(ChannelSelect):
"""
Select UI to select a channel for a user
"""

def __init__(self, locale: Locale):
self.loc = Localization(locale, resources)
super().__init__(placeholder="Not initialized. Call init() first")

async def init(self):
"""
Initialize the channel select UI
"""
super().__init__(placeholder=await self.loc.format_value_or_translate("select-channels"),
channel_types=list(ChannelType),
max_values=int(Limit.SELECT_MAX))

return self

async def callback(self, interaction: Interaction):
send = await defer_response(interaction)

config = await get_user(interaction.user.id)
config.translate_in = [channel.id for channel in self.values]
await set_user(config)

await send(success(await self.loc.format_value_or_translate("languages-updated")), ephemeral=True)


class Translator(app_commands.Group):
"""
Commands related to translation
Expand All @@ -75,7 +106,11 @@ def __init__(self, bot: Bot):
def _setup_user_listeners(self):
async def on_message(message: Message):
usr = await get_user(message.author.id)
if len(message.content.strip()) == 0 or len(usr.translate_to) == 0:
if (
len(message.content.strip()) == 0 or
len(usr.translate_to) == 0 or
len(usr.translate_in) != 0 and message.channel.id not in usr.translate_in
):
return

failed = False
Expand Down Expand Up @@ -164,14 +199,26 @@ def _split(string: str, count: int):

@app_commands.command(name=default_loc.format_value("set-languages-name"),
description=default_loc.format_value("set-languages-description"))
async def set_languages(self, interaction: Interaction):
@app_commands.describe(all_channels=default_loc.format_value(
"set-languages-all-channels-description",
{"set-languages-all-channels-description-default": str(ALL_CHANNELS_DEFAULT)})
)
async def set_languages(self, interaction: Interaction, all_channels: bool = ALL_CHANNELS_DEFAULT):
"""
Set languages to be translated for your messages
"""

send = await defer_response(interaction)

await send(view=View().add_item(await UserLanguageSelect(interaction.locale).init()), ephemeral=True)
view = View().add_item(await UserLanguageSelect(interaction.locale).init())
if all_channels:
user = await get_user(interaction.user.id)
user.translate_in = []
await set_user(user)
else:
view.add_item(await UserChannelSelect(interaction.locale).init())

await send(view=view, ephemeral=True)

@app_commands.command(name=default_loc.format_value("set-channel-languages-name"),
description=default_loc.format_value("set-channel-languages-description"))
Expand All @@ -196,6 +243,7 @@ async def clear_languages(self, interaction: Interaction):

user = await get_user(interaction.user.id)
user.translate_to = []
user.translate_in = []
await set_user(user)

loc = Localization(interaction.locale, resources)
Expand All @@ -219,3 +267,5 @@ async def clear_channel_languages(self, interaction: Interaction):
loc = Localization(interaction.locale, resources)

await send(success(await loc.format_value_or_translate("channel-languages-cleared")), ephemeral=True)

set_languages.extras["set-channel-languages-description-default"] = str(ALL_CHANNELS_DEFAULT)
7 changes: 7 additions & 0 deletions docs/help/translator/set_languages/en.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,10 @@ Set languages to be translated for your messages.
When this command is used, it will send a dropdown menu to this channel. You can select the languages you want to translate your messages into. You can select multiple languages.

For every message you send, SoruSora will translate the message into the selected languages and reply with the translations.

## Usages
* If you want to translate your messages in specific channels, set `all_channels` to `False`. Then, there will be an additional dropdown menu to select the channels you want to translate your messages in.

## Parameters

* `all_channels` (Optional): Translate your messages in all channels. Defaults to `True`.
8 changes: 8 additions & 0 deletions docs/help/translator/set_languages/ko.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,11 @@
이 명령어를 사용하면 이 채널에 드롭다운 메뉴가 전송됩니다. 그 메뉴에서 번역할 언어들을 선택하면 됩니다. 여러 언어를 선택할 수 있습니다.

당신의 모든 메세지를 SoruSora가 선택된 언어들로 번역하고 번역 결과를 해당 메세지에 답장합니다.

## 사용법

* 특정 채널에서만 번역하고 싶다면, `모든채널``False`로 설정하세요. 그러면, 당신이 메세지를 번역하고 싶은 채널을 선택할 수 있는 추가적인 드롭다운 메뉴가 나타납니다.

## 변수

* `모든채널` (선택적): 모든 채널에서 당신의 메세지를 번역합니다. 기본값은 `True`입니다.
3 changes: 3 additions & 0 deletions locales/en/commands/translator.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ translator-description = Commands related to translation
set-languages-name = set_languages
set-languages-description = Set languages to be translated for your messages
set-languages-all-channels-name = all_channels
set-languages-all-channels-description = Set languages to be translated for your messages in all channels. Default is { $set-languages-all-channels-description-default }
set-channel-languages-name = set_channel_languages
set-channel-languages-description = [Admins only] Set languages to be translated for this channel
Expand All @@ -16,6 +18,7 @@ clear-channel-languages-description = [Admins only] Clear languages to be transl
# Select UI
select-languages = Select the languages you want to translate your messages to
select-channels = Select the channels you want to translate messages in
select-channel-languages = Select the languages you want to translate messages in this channel to
# Successes
Expand Down
3 changes: 3 additions & 0 deletions locales/ko/commands/translator.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ translator-description = 번역기에 관련된 명령어 입니다
set-languages-name = 언어설정
set-languages-description = 당신의 메세지를 번역할 언어들을 설정합니다
set-languages-all-channels-name = 모든채널
set-languages-all-channels-description = 당신의 메세지를 번역할 언어들을 모든 채널에 설정합니다. 기본값은 { $set-languages-all-channels-description-default } 입니다
set-channel-languages-name = 채널언어설정
set-channel-languages-description = [관리자 전용] 해당 채널 메세지를 번역할 언어들을 설정합니다
Expand All @@ -16,6 +18,7 @@ clear-channel-languages-description = [관리자 전용] 설정한 해당 채널
# Select UI
select-languages = 당신의 메세지를 번역할 언어들을 선택하세요
select-channels = 당신의 메세지를 번역할 채널들을 선택하세요
select-channel-languages = 해당 채널 메세지를 번역할 언어들을 선택하세요
# Successes
Expand Down
7 changes: 6 additions & 1 deletion mongo/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,17 @@ class User(Document):
"""
A wrapper class to represent user in the database
"""
# pylint: disable=too-many-arguments

def __init__(self, user_id: int = -1, chat_history_id: str = None, translate_to: list[str] = None,
def __init__(self, user_id: int = -1,
chat_history_id: str = None,
translate_to: list[str] = None,
translate_in: list[int] = None,
locale: str = None):
self.user_id = user_id
self.chat_history_id = chat_history_id
self.translate_to: list[str] = translate_to if translate_to is not None else []
self.translate_in: list[str] = translate_in if translate_in is not None else []
self.locale = locale

@staticmethod
Expand Down
1 change: 1 addition & 0 deletions utils/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ class Limit(Enum):
COMMAND_NAME_LEN = 32
COMMAND_DESCRIPTION_LEN = 100
NUM_EMBEDS_IN_MESSAGE = 10
SELECT_MAX = 25

def __eq__(self, other):
return self.value == other
Expand Down

0 comments on commit 1a44751

Please sign in to comment.