Skip to content

Commit

Permalink
Increase number of supported languages for translator command
Browse files Browse the repository at this point in the history
  • Loading branch information
SeoulSKY committed Feb 28, 2024
1 parent c2db72c commit 8d4174b
Show file tree
Hide file tree
Showing 15 changed files with 228 additions and 130 deletions.
3 changes: 3 additions & 0 deletions .github/workflows/docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Free Disk Space (Ubuntu)
uses: jlumbroso/free-disk-space@main

-
name: Checkout
uses: actions/checkout@v3
Expand Down
22 changes: 12 additions & 10 deletions .github/workflows/pytest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,13 @@ jobs:

env:
BOT_TOKEN: ${{ secrets.BOT_TOKEN }}
FIREBASE_AUTH_PROVIDER_X509_CERT_URL: ${{ secrets.FIREBASE_AUTH_PROVIDER_X509_CERT_URL }}
FIREBASE_AUTH_URI: ${{ secrets.FIREBASE_AUTH_URI }}
FIREBASE_CLIENT_EMAIL: ${{ secrets.FIREBASE_CLIENT_EMAIL }}
FIREBASE_CLIENT_ID: ${{ secrets.FIREBASE_CLIENT_ID }}
FIREBASE_CLIENT_X509_CERT_URL: ${{ secrets.FIREBASE_CLIENT_X509_CERT_URL }}
FIREBASE_PRIVATE_KEY: ${{ secrets.FIREBASE_PRIVATE_KEY }}
FIREBASE_PRIVATE_KEY_ID: ${{ secrets.FIREBASE_PRIVATE_KEY_ID }}
FIREBASE_PROJECT_ID: ${{ secrets.FIREBASE_PROJECT_ID }}
FIREBASE_TOKEN_URI: ${{ secrets.FIREBASE_TOKEN_URI }}
FIREBASE_TYPE: ${{ secrets.FIREBASE_TYPE }}
TEST_GUILD_ID: ${{ secrets.TEST_GUILD_ID }}

steps:

- name: Free Disk Space (Ubuntu)
uses: jlumbroso/free-disk-space@main

- name: Checkout
uses: actions/checkout@v3

Expand All @@ -41,6 +35,14 @@ jobs:
with:
python-version: "3.11"

- name: Cache dependencies
uses: actions/cache@v3
with:
path: ${{ runner.temp }}/cache
key: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }}
restore-keys: |
${{ runner.os }}-pip-
- name: Install dependencies
run: |
python -m pip install --upgrade pip
Expand Down
61 changes: 48 additions & 13 deletions commands/chat.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,51 @@

from characterai import PyAsyncCAI
from discord import app_commands, Message, Interaction
from discord.app_commands import Choice
from discord.ext.commands import Bot

from mongo.user import User, get_user, set_user
from utils import defer_response
from utils.constants import languages, BOT_NAME, BUG_REPORT_URL
from utils.constants import BOT_NAME, BUG_REPORT_URL
from utils.templates import info, success, error
from utils.translator import Language, Localization, DEFAULT_LANGUAGE, get_translator
from utils.ui import LanguageSelectView

resources = [os.path.join("commands", "chat.ftl"), Localization.get_resource()]
default_loc = Localization(DEFAULT_LANGUAGE, resources)

CURRENT_LANGUAGE_DEFAULT = True


async def _select_language(interaction: Interaction, language: Language, send: callable):
user = await get_user(interaction.user.id)
user.locale = language.code
await set_user(user)

loc = Localization(interaction.locale, resources)

await send(await loc.format_value_or_translate("updated", {"language": loc.language.name}),
ephemeral=True)


class ChatLanguageSelectView(LanguageSelectView):
"""
A view to select a language for the chat
"""

def __init__(self, interaction: Interaction):
loc = Localization(interaction.locale, resources)
super().__init__(loc.format_value_or_translate("set-language-select"), interaction.locale, max_values=1)

async def callback(self, interaction: Interaction):
await super().callback(interaction)

send = await defer_response(interaction)

await _select_language(interaction, Language(list(self.selected)[0]), send)

self.clear_items()
self.stop()


class Chat(app_commands.Group):
"""
Expand Down Expand Up @@ -99,22 +132,23 @@ async def _send_message(self, user: User, text: str) -> str:

@app_commands.command(name=default_loc.format_value("set-language-name"),
description=default_loc.format_value("set-language-description"))
@app_commands.choices(language=[Choice(name=default_loc.format_value(code), value=code) for code in languages])
@app_commands.describe(language=default_loc.format_value("set-language-language-description"))
async def set_language(self, interaction: Interaction, language: str = None):
@app_commands.describe(
current_language=default_loc.format_value(
"set-language-current-language-description",
{"set-language-current-language-description-default": str(CURRENT_LANGUAGE_DEFAULT)}
)
)
async def set_language(self, interaction: Interaction, current_language: bool = CURRENT_LANGUAGE_DEFAULT):
"""
Set the chat language to the current discord language
"""
send = await defer_response(interaction)

user = await get_user(interaction.user.id)
user.locale = language if language is not None else str(interaction.locale)
await set_user(user)

loc = Localization(interaction.locale, resources)
if current_language:
await _select_language(interaction, Language(interaction.locale), send)
return

await send(await loc.format_value_or_translate("updated", {"language": loc.language.name}),
ephemeral=True)
await send(view=await ChatLanguageSelectView(interaction).init(), ephemeral=True)

@app_commands.command(name=default_loc.format_value("clear-name"),
description=default_loc.format_value("clear-description",
Expand All @@ -129,7 +163,7 @@ async def clear(self, interaction: Interaction):
if user.chat_history_id is None:
await interaction.response.send_message(
error(await loc.format_value_or_translate("no-history",
{"name": interaction.client.user.display_name})),
{"name": interaction.client.user.display_name})),
ephemeral=True)
return

Expand All @@ -148,4 +182,5 @@ async def clear(self, interaction: Interaction):

await interaction.followup.send(success(await loc.format_value_or_translate("deleted")), ephemeral=True)

set_language.extras["set-language-current-language-description-default"] = CURRENT_LANGUAGE_DEFAULT
clear.extras["clear-description-name"] = BOT_NAME
2 changes: 1 addition & 1 deletion commands/help_.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ async def help_(interaction: Interaction):
else:
text += f"* `{await interaction.translate(context_menu.name)}`\n"

await send(text, view=View().add_item(await HelpSelect(interaction).init()))
await send(text, view=View().add_item(await HelpSelect(interaction).init()), ephemeral=True)


help_.extras["help-description-name"] = BOT_NAME
48 changes: 23 additions & 25 deletions commands/translator.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,24 @@

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

from mongo.channel import get_channel, set_channel
from mongo.user import get_user, set_user
from utils import templates, ui, defer_response
from utils.constants import ErrorCode, Limit, languages
from utils import defer_response, templates
from utils.constants import ErrorCode, Limit
from utils.templates import success
from utils.translator import Localization, Language, DEFAULT_LANGUAGE, get_translator, BaseTranslator
from utils.ui import LanguageSelectView

resources = [os.path.join("commands", "translator.ftl")]
default_loc = Localization(DEFAULT_LANGUAGE, resources)

ALL_CHANNELS_DEFAULT = True


class ChannelLanguageSelect(ui.LanguageSelect):
class ChannelLanguageSelectView(LanguageSelectView):

"""
Select UI to select available languages for a channel
"""
Expand All @@ -31,16 +33,19 @@ def __init__(self, locale: Locale):
super().__init__(self.loc.format_value_or_translate("select-channel-languages"), locale)

async def callback(self, interaction: Interaction):
await super().callback(interaction)

send = await defer_response(interaction)

config = await get_channel(interaction.channel_id)
config.translate_to = self.values
config.translate_to = list(self.selected)
await set_channel(config)

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


class UserLanguageSelect(ui.LanguageSelect):
class UserLanguageSelectView(LanguageSelectView):
# pylint: disable=too-few-public-methods
"""
Select UI to select available languages for a user
"""
Expand All @@ -50,10 +55,12 @@ def __init__(self, locale: Locale):
super().__init__(self.loc.format_value_or_translate("select-languages"), locale)

async def callback(self, interaction: Interaction):
await super().callback(interaction)

send = await defer_response(interaction)

config = await get_user(interaction.user.id)
config.translate_to = self.values
config.translate_to = list(self.selected)
await set_user(config)

await send(success(await self.loc.format_value_or_translate("languages-updated")), ephemeral=True)
Expand Down Expand Up @@ -113,15 +120,6 @@ async def on_message(message: Message):
):
return

failed = False
for code in usr.translate_to:
if code not in languages:
usr.translate_to.remove(code)
failed = True

if failed:
await set_user(usr)

if len(usr.translate_to) == 0:
return

Expand All @@ -138,14 +136,14 @@ async def on_message(message: Message):
if len(message.content.strip()) == 0 or len(chan.translate_to) == 0:
return

failed = False
for code in chan.translate_to:
if code not in languages:
chan.translate_to.remove(code)
failed = True
# failed = False
# for code in chan.translate_to:
# if code not in languages:
# chan.translate_to.remove(code)
# failed = True

if failed:
await set_channel(chan)
# if failed:
# await set_channel(chan)

if len(chan.translate_to) == 0:
return
Expand Down Expand Up @@ -210,7 +208,7 @@ async def set_languages(self, interaction: Interaction, all_channels: bool = ALL

send = await defer_response(interaction)

view = View().add_item(await UserLanguageSelect(interaction.locale).init())
view = await UserLanguageSelectView(interaction.locale).init()
if all_channels:
user = await get_user(interaction.user.id)
user.translate_in = []
Expand All @@ -230,7 +228,7 @@ async def set_channel_languages(self, interaction: Interaction):

send = await defer_response(interaction)

await send(view=View().add_item(await ChannelLanguageSelect(interaction.locale).init()), ephemeral=True)
await send(view=await ChannelLanguageSelectView(interaction.locale).init(), ephemeral=True)

@app_commands.command(name=default_loc.format_value("clear-languages-name"),
description=default_loc.format_value("clear-languages-description"))
Expand Down
11 changes: 7 additions & 4 deletions docs/help/chat/set_language/en.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
# /chat update_language
# /chat set_language

Update the chat language to the current discord language.
Update the chat language to the current discord language. Updating the language doesn't affect the chat history.

If the parameter `language` is provided, update the chat language to the provided language.

## Usage

* If the parameter `current_language` is set to `False`, you can select the language you want.

## Parameters

* `language` (Optional): The new chat language. Defaults to your current discord language.
* `current_language` (Optional): Set your chat language to your current discord language. Defaults to True.
9 changes: 5 additions & 4 deletions docs/help/chat/set_language/ko.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
# /채팅 언어변경

현재 디스코드 언어로 채팅 언어를 변경합니다.
현재 디스코드 언어로 채팅 언어를 변경합니다. 언어를 변경해도 채팅 기록은 사라지지 않습니다.

만약 변수인 `언어`를 입력한다면 해당 언어로 변경됩니다.
## 사용법
* 만약 현재 디스코드 언어가 아닌 다른 언어로 설정하고 싶다면 `현재언어``False`로 설정하고 언어를 선택하실 수 있습니다.

# 변수
## 변수

* `언어` (선택적): 변경할 언어입니다.
* `현재언어` (선택적): 언어를 현재 디스코드 언어로 설정합니다. 기본값은 True 입니다.
5 changes: 3 additions & 2 deletions locales/en/commands/chat.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@ chat-description = Commands related to AI chats
set-language-name = set_language
set-language-description = Set the chat language to the current discord language
set-language-language-name = language
set-language-language-description = The new chat language. Defaults to your current discord language
set-language-current-language-name = current_language
set-language-current-language-description = Set your chat language to your current discord language. Defaults to { $set-language-current-language-description-default}
set-language-select = Select your chat language
clear-name = clear
clear-description = Clear the chat history between you and { $clear-description-name }
Expand Down
35 changes: 28 additions & 7 deletions locales/en/utils/translator.ftl
Original file line number Diff line number Diff line change
@@ -1,25 +1,46 @@
zh-CN = Chinese (Simplified)
zh-TW = Chinese (Traditional)
nl = Dutch
ar = Arabic
az = Azerbaijani
bg = Bulgarian
bn = Bengali
ca = Catalan
cs = Czech
da = Danish
de = German
el = Greek
en = English
tl = Filipino
eo = Esperanto
es = Spanish
et = Estonian
fa = Persian
fi = Finnish
fr = French
de = German
el = Greek
ga = Irish
he = Hebrew
hi = Hindi
hu = Hungarian
id = Indonesian
it = Italian
ja = Japanese
ko = Korean
li = Limburgish
lt = Lithuanian
lv = Latvian
ms = Malay
nb = Norwegian (Bokmål)
nl = Dutch
no = Norwegian
pl = Polish
pt = Portuguese
ro = Romanian
ru = Russian
es = Spanish
sk = Slovak
sl = Slovenian
sq = Albanian
sv = Swedish
th = Thai
tl = Filipino
tr = Turkish
uk = Ukrainian
vi = Vietnamese
zh-CN = Chinese (Simplified)
zh-TW = Chinese (Traditional)
5 changes: 3 additions & 2 deletions locales/ko/commands/chat.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@ chat-description = AI 채팅과 관련된 명령어 입니다
set-language-name = 언어변경
set-language-description = 현재 디스코드 언어로 채팅 언어를 변경합니다
set-language-language-name = 언어
set-language-language-description = 변경할 언어. 기본값은 현재 디스코드 언어입니다
set-language-current-language-name = 현재언어
set-language-current-language-description = 언어를 현재 디스코드 언어로 설정합니다. 기본값은 { $set-language-current-language-description-default} 입니다
set-language-select = 채팅 언어를 선택하세요
clear-name = 삭제
clear-description = { $clear-description-name }와(과) 당신 사이의 채팅 기록을 삭제합니다
Expand Down
Loading

0 comments on commit 8d4174b

Please sign in to comment.