From 702ba3d7dbb5f71ae64b6e8a4a59b2c69afbbe15 Mon Sep 17 00:00:00 2001 From: Julian Jelfs Date: Thu, 12 Dec 2024 16:40:06 +0000 Subject: [PATCH] Bot name uniqueness check (#7052) --- .../app/src/components/bots/BotBuilder.svelte | 32 ++++++++++++++++++- frontend/app/src/i18n/ar.json | 20 +++++++++++- frontend/app/src/i18n/cn.json | 20 +++++++++++- frontend/app/src/i18n/de.json | 20 +++++++++++- frontend/app/src/i18n/en.json | 5 ++- frontend/app/src/i18n/es.json | 20 +++++++++++- frontend/app/src/i18n/fa.json | 20 +++++++++++- frontend/app/src/i18n/fr.json | 20 +++++++++++- frontend/app/src/i18n/hi.json | 20 +++++++++++- frontend/app/src/i18n/it.json | 20 +++++++++++- frontend/app/src/i18n/iw.json | 20 +++++++++++- frontend/app/src/i18n/jp.json | 20 +++++++++++- frontend/app/src/i18n/pl.json | 20 +++++++++++- frontend/app/src/i18n/ru.json | 20 +++++++++++- frontend/app/src/i18n/uk.json | 20 +++++++++++- frontend/app/src/i18n/vi.json | 20 +++++++++++- frontend/app/src/utils/reactivity.svelte.ts | 4 +-- frontend/openchat-client/src/openchat.ts | 1 - frontend/openchat-shared/src/domain/bots.ts | 2 +- 19 files changed, 304 insertions(+), 20 deletions(-) diff --git a/frontend/app/src/components/bots/BotBuilder.svelte b/frontend/app/src/components/bots/BotBuilder.svelte index 1fc5c89938..205ffd890b 100644 --- a/frontend/app/src/components/bots/BotBuilder.svelte +++ b/frontend/app/src/components/bots/BotBuilder.svelte @@ -2,10 +2,12 @@ import { emptyBotInstance, emptySlashCommandPermissions, + OpenChat, validateBot, ValidationErrors, type ExternalBot, type SlashCommandSchema, + type ValidationErrorMessages, } from "openchat-client"; import { i18nKey } from "../../i18n/i18n"; import Input from "../Input.svelte"; @@ -18,6 +20,9 @@ import ValidatingInput from "./ValidatingInput.svelte"; import ErrorMessage from "../ErrorMessage.svelte"; import { debouncedDerived } from "../../utils/reactivity.svelte"; + import { getContext } from "svelte"; + + const client = getContext("client"); interface Props { valid: boolean; @@ -33,12 +38,37 @@ let errors = $derived.by( debouncedDerived( () => [$state.snapshot(candidate)], - () => validateBot(candidate), + async () => { + const errors = validateBot(candidate); + if (errors.get("bot_name").length == 0) { + errors.addErrors("bot_name", await checkUsername(candidate.name)); + } + return errors; + }, 300, new ValidationErrors(), ), ); + function checkUsername(value: string): Promise { + return client + .checkUsername(value, true) + .then((resp) => { + if (resp === "success") { + return []; + } + + if (resp === "username_taken") { + return [i18nKey("bots.builder.errors.duplicateName")]; + } + + return [i18nKey("bots.builder.errors.botNameInvalid")]; + }) + .catch((_) => { + return [i18nKey("bots.builder.errors.nameCheckError")]; + }); + } + // TODO we will probably need to come back to this to flesh out edit mode (is the bot dirty etc) // let editing = $derived(bot !== undefined); diff --git a/frontend/app/src/i18n/ar.json b/frontend/app/src/i18n/ar.json index 4ad3287d99..55739d5282 100644 --- a/frontend/app/src/i18n/ar.json +++ b/frontend/app/src/i18n/ar.json @@ -149,6 +149,14 @@ "blockUserFailed": "غير قادر على حظر المستخدم", "blockUserSucceeded": "لقد تم حظر المستخدم", "bots": { + "add": { + "addBot": "إضافة بوت", + "choosePermissions": "الأذونات", + "failure": "نأسف لعدم تمكننا من إضافة البوت", + "noPermissions": "لا يتطلب أذونات خاصة", + "permissionsInfo": "يسعى هذا الروبوت إلى الحصول على الأذونات التالية. سيؤدي اختيار تقييد الأذونات الممنوحة إلى تقييد الأوامر المتاحة.", + "title": "إضافة بوت إلى المجتمع" + }, "builder": { "addAnother": "أضف آخر", "addChoice": "أضف خيارا", @@ -171,11 +179,15 @@ "endpointRules": "يجب أن يكون أصلًا صالحًا أو معرف علبة", "errors": { "alphaOnly": "يجب أن يحتوي فقط على أحرف أبجدية رقمية وشرطات سفلية", + "botNameInvalid": "اسم هذا البوت غير صالح", "duplicateCommands": "يحتوي الروبوت على أوامر مكررة", + "duplicateName": "اسم هذا الروبوت مأخوذ بالفعل", "duplicateParams": "يحتوي الأمر على معلمات مكررة", "endpoint": "يجب أن تكون نقطة النهاية أصلًا أو معرف علبة صالحًا", "minLength": "يجب أن يحتوي على {n} حرفًا على الأقل", - "noCommands": "يجب أن يحتوي الروبوت على أمر واحد على الأقل" + "nameCheckError": "حدث خطأ أثناء التحقق من اسم الروبوت", + "noCommands": "يجب أن يحتوي الروبوت على أمر واحد على الأقل", + "principal": "يجب عليك إدخال مدير صالح لتحديد الروبوت" }, "iconLabel": "أيقونة البوت", "maxLengthLabel": "الحد الأقصى للطول", @@ -203,6 +215,8 @@ "permScopeCommunity": "مجتمع", "permScopeMessage": "رسالة", "permScopeThread": "خيط", + "principalLabel": "رئيسي", + "principalPlaceholder": "أدخل رئيس البوت", "required": "المعلمة المطلوبة", "requiredDesc": "هل هذه معلمة مطلوبة للأمر", "title": "بناء بوت", @@ -230,6 +244,10 @@ "diamond": { "desc": "انشر رابطًا لشرح العضوية الماسية" }, + "explorer": { + "addBots": "إضافة الروبوتات", + "loadMore": "تحميل المزيد..." + }, "failed": "عذرا، لقد فشلنا في تنفيذ أمر الروبوت", "faq": { "desc": "إنشاء رابط لموضوع الأسئلة الشائعة", diff --git a/frontend/app/src/i18n/cn.json b/frontend/app/src/i18n/cn.json index 2cbadbf1b2..a2a33fe6d2 100644 --- a/frontend/app/src/i18n/cn.json +++ b/frontend/app/src/i18n/cn.json @@ -149,6 +149,14 @@ "blockUserFailed": "无法加入黑名单", "blockUserSucceeded": "该用户已被加入黑名单", "bots": { + "add": { + "addBot": "添加机器人", + "choosePermissions": "权限", + "failure": "抱歉,我们无法添加该机器人", + "noPermissions": "无需特殊权限", + "permissionsInfo": "此机器人寻求以下权限。选择限制授予的权限将限制可用的命令。", + "title": "将机器人添加到社区" + }, "builder": { "addAnother": "添加另一个", "addChoice": "添加选择", @@ -171,11 +179,15 @@ "endpointRules": "必须是有效的来源或 canisterID", "errors": { "alphaOnly": "只能包含字母数字和下划线", + "botNameInvalid": "此机器人名称无效", "duplicateCommands": "机器人包含重复的命令", + "duplicateName": "该机器人名称已被占用", "duplicateParams": "命令包含重复参数", "endpoint": "端点必须是有效的来源或 canisterID", "minLength": "必须至少包含 {n} 个字符", - "noCommands": "机器人必须至少包含一个命令" + "nameCheckError": "检查机器人名称时出错", + "noCommands": "机器人必须至少包含一个命令", + "principal": "您必须输入有效的主体来识别机器人" }, "iconLabel": "机器人图标", "maxLengthLabel": "最大长度", @@ -203,6 +215,8 @@ "permScopeCommunity": "社区", "permScopeMessage": "信息", "permScopeThread": "线", + "principalLabel": "主要的", + "principalPlaceholder": "输入机器人主体", "required": "必需参数", "requiredDesc": "这是命令的必需参数吗", "title": "构建机器人", @@ -230,6 +244,10 @@ "diamond": { "desc": "发布链接解释钻石会员资格" }, + "explorer": { + "addBots": "添加机器人", + "loadMore": "加载更多..." + }, "failed": "抱歉,我们无法执行机器人命令", "faq": { "desc": "创建常见问题解答主题的链接", diff --git a/frontend/app/src/i18n/de.json b/frontend/app/src/i18n/de.json index 532e1d71c5..808cbe9f32 100644 --- a/frontend/app/src/i18n/de.json +++ b/frontend/app/src/i18n/de.json @@ -149,6 +149,14 @@ "blockUserFailed": "Benutzer kann nicht blockiert werden", "blockUserSucceeded": "Benutzer wurde gesperrt", "bots": { + "add": { + "addBot": "Bot hinzufügen", + "choosePermissions": "Berechtigungen", + "failure": "Es ist uns leider nicht gelungen, den Bot hinzuzufügen.", + "noPermissions": "Keine besonderen Berechtigungen erforderlich", + "permissionsInfo": "Dieser Bot fordert die folgenden Berechtigungen an. Wenn Sie die erteilten Berechtigungen einschränken, werden auch die verfügbaren Befehle eingeschränkt.", + "title": "Bot zur Community hinzufügen" + }, "builder": { "addAnother": "Weitere hinzufügen", "addChoice": "Auswahl hinzufügen", @@ -171,11 +179,15 @@ "endpointRules": "Muss ein gültiger Ursprung oder eine Kanister-ID sein", "errors": { "alphaOnly": "Darf nur alphanumerische Zeichen und Unterstriche enthalten", + "botNameInvalid": "Dieser Botname ist ungültig", "duplicateCommands": "Bot enthält doppelte Befehle", + "duplicateName": "Dieser Botname ist bereits vergeben", "duplicateParams": "Befehl enthält doppelte Parameter", "endpoint": "Der Endpunkt muss ein gültiger Ursprung oder eine gültige Kanister-ID sein", "minLength": "Muss mindestens {n} Zeichen haben", - "noCommands": "Ein Bot muss mindestens einen Befehl enthalten" + "nameCheckError": "Beim Überprüfen des Botnamens ist ein Fehler aufgetreten", + "noCommands": "Ein Bot muss mindestens einen Befehl enthalten", + "principal": "Sie müssen einen gültigen Auftraggeber eingeben, um den Bot zu identifizieren" }, "iconLabel": "Bot-Symbol", "maxLengthLabel": "Maximallänge", @@ -203,6 +215,8 @@ "permScopeCommunity": "Gemeinschaft", "permScopeMessage": "Nachricht", "permScopeThread": "Faden", + "principalLabel": "Rektor", + "principalPlaceholder": "Geben Sie den Bot-Hauptbenutzer ein", "required": "Erforderlicher Parameter", "requiredDesc": "Ist dies ein erforderlicher Parameter für den Befehl", "title": "Einen Bot erstellen", @@ -230,6 +244,10 @@ "diamond": { "desc": "Posten Sie einen Link, um die Diamond-Mitgliedschaft zu erklären" }, + "explorer": { + "addBots": "Bots hinzufügen", + "loadMore": "Mehr laden..." + }, "failed": "Entschuldigung, wir konnten den Bot-Befehl nicht ausführen", "faq": { "desc": "Einen Link zu einem FAQ-Thema erstellen", diff --git a/frontend/app/src/i18n/en.json b/frontend/app/src/i18n/en.json index 905e198de3..4180f9bb98 100644 --- a/frontend/app/src/i18n/en.json +++ b/frontend/app/src/i18n/en.json @@ -179,10 +179,13 @@ "endpointRules": "Must be a valid origin or a canisterID", "errors": { "alphaOnly": "Must only contain alphanumerics and underscores", + "botNameInvalid": "This bot name is invalid", "duplicateCommands": "Bot contains duplicate commands", + "duplicateName": "That bot name is already taken", "duplicateParams": "Command contains duplicate params", "endpoint": "Endpoint must be a valid origin or canisterID", "minLength": "Must have at least {n} characters", + "nameCheckError": "There was an error checking the bot name", "noCommands": "A bot must contain at least one command", "principal": "You must enter a valid principal to identify the bot" }, @@ -1834,4 +1837,4 @@ "yourChats": "Your chats", "youreBlocked": "Sorry - you have been blocked from this group", "yourRoleChanged": "{changedBy} changed your role to {newRole}" -} +} \ No newline at end of file diff --git a/frontend/app/src/i18n/es.json b/frontend/app/src/i18n/es.json index 0819fd24ae..fc390a743c 100644 --- a/frontend/app/src/i18n/es.json +++ b/frontend/app/src/i18n/es.json @@ -149,6 +149,14 @@ "blockUserFailed": "No se puede bloquear al usuario", "blockUserSucceeded": "El usuario ha sido bloqueado", "bots": { + "add": { + "addBot": "Agregar bot", + "choosePermissions": "Permisos", + "failure": "Lo sentimos, no pudimos agregar el bot.", + "noPermissions": "No se requieren permisos especiales", + "permissionsInfo": "Este bot solicita los siguientes permisos. Si elige limitar los permisos otorgados, se limitarán los comandos disponibles.", + "title": "Agregar bot a la comunidad" + }, "builder": { "addAnother": "Agregar otro", "addChoice": "Añadir una opción", @@ -171,11 +179,15 @@ "endpointRules": "Debe ser un origen válido o un canisterID", "errors": { "alphaOnly": "Solo debe contener caracteres alfanuméricos y guiones bajos.", + "botNameInvalid": "Este nombre de bot no es válido", "duplicateCommands": "El bot contiene comandos duplicados", + "duplicateName": "Ese nombre de bot ya está tomado", "duplicateParams": "El comando contiene parámetros duplicados", "endpoint": "El punto final debe ser un origen o un ID de recipiente válido", "minLength": "Debe tener al menos {n} caracteres", - "noCommands": "Un bot debe contener al menos un comando" + "nameCheckError": "Se produjo un error al verificar el nombre del bot.", + "noCommands": "Un bot debe contener al menos un comando", + "principal": "Debes ingresar un principal válido para identificar el bot" }, "iconLabel": "Icono de bot", "maxLengthLabel": "Longitud máxima", @@ -203,6 +215,8 @@ "permScopeCommunity": "Comunidad", "permScopeMessage": "Mensaje", "permScopeThread": "Hilo", + "principalLabel": "Principal", + "principalPlaceholder": "Ingresar el bot principal", "required": "Parámetro requerido", "requiredDesc": "¿Es este un parámetro obligatorio para el comando?", "title": "Construir un bot", @@ -230,6 +244,10 @@ "diamond": { "desc": "Publica un enlace para explicar la membresía Diamante" }, + "explorer": { + "addBots": "Agregar bots", + "loadMore": "Cargar más..." + }, "failed": "Lo sentimos, no pudimos ejecutar el comando del bot", "faq": { "desc": "Crear un enlace a un tema de preguntas frecuentes", diff --git a/frontend/app/src/i18n/fa.json b/frontend/app/src/i18n/fa.json index ccb3de1301..5c622e2af8 100644 --- a/frontend/app/src/i18n/fa.json +++ b/frontend/app/src/i18n/fa.json @@ -149,6 +149,14 @@ "blockUserFailed": "مسدود کردن کاربر ممکن نیست", "blockUserSucceeded": "کاربر مسدود شده است", "bots": { + "add": { + "addBot": "اضافه کردن ربات", + "choosePermissions": "مجوزها", + "failure": "متأسفیم که نتوانستیم ربات را اضافه کنیم", + "noPermissions": "هیچ مجوز خاصی لازم نیست", + "permissionsInfo": "این ربات به دنبال مجوزهای زیر است. انتخاب محدود کردن مجوزهای اعطا شده، دستورات موجود را محدود می کند.", + "title": "اضافه کردن ربات به انجمن" + }, "builder": { "addAnother": "دیگری اضافه کنید", "addChoice": "یک انتخاب اضافه کنید", @@ -171,11 +179,15 @@ "endpointRules": "باید مبدأ معتبر یا شناسه قوطی باشد", "errors": { "alphaOnly": "فقط باید دارای حروف الفبا و زیرخط باشد", + "botNameInvalid": "این نام ربات نامعتبر است", "duplicateCommands": "ربات حاوی دستورات تکراری است", + "duplicateName": "آن نام ربات قبلاً گرفته شده است", "duplicateParams": "فرمان حاوی پارامترهای تکراری است", "endpoint": "نقطه پایانی باید یک مبدا یا شناسه canister معتبر باشد", "minLength": "باید حداقل {n} کاراکتر داشته باشد", - "noCommands": "یک ربات باید حداقل یک دستور داشته باشد" + "nameCheckError": "هنگام بررسی نام ربات خطایی روی داد", + "noCommands": "یک ربات باید حداقل یک دستور داشته باشد", + "principal": "برای شناسایی ربات باید یک اصل معتبر وارد کنید" }, "iconLabel": "نماد ربات", "maxLengthLabel": "حداکثر طول", @@ -203,6 +215,8 @@ "permScopeCommunity": "جامعه", "permScopeMessage": "پیام", "permScopeThread": "موضوع", + "principalLabel": "اصلی", + "principalPlaceholder": "اصل ربات را وارد کنید", "required": "پارامتر مورد نیاز", "requiredDesc": "آیا این یک پارامتر لازم برای دستور است؟", "title": "یک ربات بسازید", @@ -230,6 +244,10 @@ "diamond": { "desc": "یک لینک برای توضیح عضویت در Diamond ارسال کنید" }, + "explorer": { + "addBots": "ربات ها را اضافه کنید", + "loadMore": "بارگیری بیشتر..." + }, "failed": "با عرض پوزش، ما نتوانستیم دستور ربات را اجرا کنیم", "faq": { "desc": "یک پیوند به یک موضوع سؤالات متداول ایجاد کنید", diff --git a/frontend/app/src/i18n/fr.json b/frontend/app/src/i18n/fr.json index 6d51101ae8..4f2813f881 100644 --- a/frontend/app/src/i18n/fr.json +++ b/frontend/app/src/i18n/fr.json @@ -149,6 +149,14 @@ "blockUserFailed": "Impossible de bloquer l'utilisateur", "blockUserSucceeded": "L'utilisateur a été bloqué", "bots": { + "add": { + "addBot": "Ajouter un bot", + "choosePermissions": "Autorisations", + "failure": "Désolé, nous n'avons pas pu ajouter le bot", + "noPermissions": "Aucune autorisation spéciale requise", + "permissionsInfo": "Ce bot recherche les autorisations suivantes. Choisir de limiter les autorisations accordées limitera les commandes disponibles.", + "title": "Ajouter un bot à la communauté" + }, "builder": { "addAnother": "Ajouter un autre", "addChoice": "Ajouter un choix", @@ -171,11 +179,15 @@ "endpointRules": "Doit être une origine valide ou un canisterID", "errors": { "alphaOnly": "Doit contenir uniquement des caractères alphanumériques et des traits de soulignement", + "botNameInvalid": "Ce nom de bot n'est pas valide", "duplicateCommands": "Le bot contient des commandes en double", + "duplicateName": "Ce nom de bot est déjà pris", "duplicateParams": "La commande contient des paramètres en double", "endpoint": "Le point de terminaison doit être une origine ou un canisterID valide", "minLength": "Doit avoir au moins {n} caractères", - "noCommands": "Un bot doit contenir au moins une commande" + "nameCheckError": "Une erreur s'est produite lors de la vérification du nom du bot", + "noCommands": "Un bot doit contenir au moins une commande", + "principal": "Vous devez entrer un principal valide pour identifier le bot" }, "iconLabel": "Icône de bot", "maxLengthLabel": "Longueur maximale", @@ -203,6 +215,8 @@ "permScopeCommunity": "Communauté", "permScopeMessage": "Message", "permScopeThread": "Fil", + "principalLabel": "Principal", + "principalPlaceholder": "Entrez le principal du bot", "required": "Paramètre obligatoire", "requiredDesc": "Est-ce un paramètre obligatoire pour la commande", "title": "Construire un bot", @@ -230,6 +244,10 @@ "diamond": { "desc": "Postez un lien pour expliquer l'adhésion Diamond" }, + "explorer": { + "addBots": "Ajouter des robots", + "loadMore": "Charger plus..." + }, "failed": "Désolé, nous n'avons pas réussi à exécuter la commande du bot", "faq": { "desc": "Créer un lien vers un sujet de FAQ", diff --git a/frontend/app/src/i18n/hi.json b/frontend/app/src/i18n/hi.json index afc93a8ef8..a181181be0 100644 --- a/frontend/app/src/i18n/hi.json +++ b/frontend/app/src/i18n/hi.json @@ -149,6 +149,14 @@ "blockUserFailed": "उपयोगकर्ता को ब्लॉक करने में असमर्थ", "blockUserSucceeded": "उपयोगकर्ता को ब्लॉक कर दिया गया है", "bots": { + "add": { + "addBot": "बॉट जोड़ें", + "choosePermissions": "अनुमतियां", + "failure": "खेद है कि हम बॉट को जोड़ने में असमर्थ रहे", + "noPermissions": "किसी विशेष अनुमति की आवश्यकता नहीं", + "permissionsInfo": "यह बॉट निम्नलिखित अनुमतियाँ चाहता है। दी गई अनुमतियों को सीमित करने का चयन करने से उपलब्ध कमांड सीमित हो जाएँगे।", + "title": "बॉट को समुदाय में जोड़ें" + }, "builder": { "addAnother": "एक और जोड़ें", "addChoice": "कोई विकल्प जोड़ें", @@ -171,11 +179,15 @@ "endpointRules": "वैध मूल या कैनिस्टरआईडी होना चाहिए", "errors": { "alphaOnly": "इसमें केवल अल्फ़ान्यूमेरिक्स और अंडरस्कोर ही होने चाहिए", + "botNameInvalid": "यह बॉट नाम अमान्य है", "duplicateCommands": "बॉट में डुप्लिकेट कमांड हैं", + "duplicateName": "वह बॉट नाम पहले से ही लिया जा चुका है", "duplicateParams": "कमांड में डुप्लिकेट पैरामीटर्स शामिल हैं", "endpoint": "एंडपॉइंट एक वैध मूल या कैनिस्टरआईडी होना चाहिए", "minLength": "कम से कम {n} अक्षर होने चाहिए", - "noCommands": "बॉट में कम से कम एक कमांड अवश्य होना चाहिए" + "nameCheckError": "बॉट नाम की जाँच करते समय एक त्रुटि हुई", + "noCommands": "बॉट में कम से कम एक कमांड अवश्य होना चाहिए", + "principal": "बॉट की पहचान करने के लिए आपको एक वैध प्रिंसिपल दर्ज करना होगा" }, "iconLabel": "बॉट आइकन", "maxLengthLabel": "ज्यादा से ज्यादा लंबाई", @@ -203,6 +215,8 @@ "permScopeCommunity": "समुदाय", "permScopeMessage": "संदेश", "permScopeThread": "धागा", + "principalLabel": "प्रधानाचार्य", + "principalPlaceholder": "बॉट प्रिंसिपल दर्ज करें", "required": "आवश्यक पैरामीटर", "requiredDesc": "क्या यह कमांड के लिए आवश्यक पैरामीटर है", "title": "एक बॉट बनाएँ", @@ -230,6 +244,10 @@ "diamond": { "desc": "डायमंड सदस्यता के बारे में बताने के लिए लिंक पोस्ट करें" }, + "explorer": { + "addBots": "बॉट जोड़ें", + "loadMore": "और लोड करें..." + }, "failed": "क्षमा करें, हम बॉट कमांड निष्पादित करने में विफल रहे", "faq": { "desc": "FAQ विषय के लिए लिंक बनाएं", diff --git a/frontend/app/src/i18n/it.json b/frontend/app/src/i18n/it.json index 1eecac6e1a..db2055cac4 100644 --- a/frontend/app/src/i18n/it.json +++ b/frontend/app/src/i18n/it.json @@ -149,6 +149,14 @@ "blockUserFailed": "Impossibile bloccare l'utente", "blockUserSucceeded": "L'utente è stato bloccato", "bots": { + "add": { + "addBot": "Aggiungi bot", + "choosePermissions": "Permessi", + "failure": "Spiacenti, non siamo riusciti ad aggiungere il bot", + "noPermissions": "Non sono richieste autorizzazioni speciali", + "permissionsInfo": "Questo bot richiede i seguenti permessi. Scegliendo di limitare i permessi concessi si limiteranno i comandi disponibili.", + "title": "Aggiungi bot alla community" + }, "builder": { "addAnother": "Aggiungine un altro", "addChoice": "Aggiungi una scelta", @@ -171,11 +179,15 @@ "endpointRules": "Deve essere un'origine valida o un canisterID", "errors": { "alphaOnly": "Deve contenere solo caratteri alfanumerici e caratteri di sottolineatura", + "botNameInvalid": "Il nome di questo bot non è valido", "duplicateCommands": "Il bot contiene comandi duplicati", + "duplicateName": "Quel nome bot è già stato preso", "duplicateParams": "Il comando contiene parametri duplicati", "endpoint": "L'endpoint deve essere un'origine o un canisterID valido", "minLength": "Deve contenere almeno {n} caratteri", - "noCommands": "Un bot deve contenere almeno un comando" + "nameCheckError": "Si è verificato un errore durante il controllo del nome del bot", + "noCommands": "Un bot deve contenere almeno un comando", + "principal": "Devi inserire un'entità valida per identificare il bot" }, "iconLabel": "Icona del bot", "maxLengthLabel": "Lunghezza massima", @@ -203,6 +215,8 @@ "permScopeCommunity": "Comunità", "permScopeMessage": "Messaggio", "permScopeThread": "Filo", + "principalLabel": "Principale", + "principalPlaceholder": "Inserisci il bot principale", "required": "Parametro obbligatorio", "requiredDesc": "Questo è un parametro obbligatorio per il comando", "title": "Costruisci un bot", @@ -230,6 +244,10 @@ "diamond": { "desc": "Pubblica un link per spiegare l'appartenenza a Diamond" }, + "explorer": { + "addBots": "Aggiungi bot", + "loadMore": "Carica altro..." + }, "failed": "Spiacenti, non siamo riusciti a eseguire il comando del bot", "faq": { "desc": "Crea un collegamento a un argomento FAQ", diff --git a/frontend/app/src/i18n/iw.json b/frontend/app/src/i18n/iw.json index 585cbf8e0e..8a3e5da289 100644 --- a/frontend/app/src/i18n/iw.json +++ b/frontend/app/src/i18n/iw.json @@ -149,6 +149,14 @@ "blockUserFailed": "לא ניתן לחסום משתמש", "blockUserSucceeded": "המשתמש נחסם", "bots": { + "add": { + "addBot": "הוסף בוט", + "choosePermissions": "הרשאות", + "failure": "מצטערים שלא הצלחנו להוסיף את הבוט", + "noPermissions": "אין צורך בהרשאות מיוחדות", + "permissionsInfo": "הבוט הזה מחפש את ההרשאות הבאות. בחירה להגביל את ההרשאות שניתנו תגביל את הפקודות הזמינות.", + "title": "הוסף בוט לקהילה" + }, "builder": { "addAnother": "הוסף עוד אחד", "addChoice": "הוסף בחירה", @@ -171,11 +179,15 @@ "endpointRules": "חייב להיות מקור חוקי או מזהה מיכל", "errors": { "alphaOnly": "חייב להכיל רק אלפאנומריות וקווים תחתונים", + "botNameInvalid": "שם הבוט הזה לא חוקי", "duplicateCommands": "הבוט מכיל פקודות כפולות", + "duplicateName": "שם הבוט הזה כבר תפוס", "duplicateParams": "הפקודה מכילה פרמטרים כפולים", "endpoint": "נקודת הקצה חייבת להיות מקור חוקי או מזהה מיכל", "minLength": "חייב לכלול לפחות {n} תווים", - "noCommands": "בוט חייב להכיל לפחות פקודה אחת" + "nameCheckError": "אירעה שגיאה בבדיקת שם הבוט", + "noCommands": "בוט חייב להכיל לפחות פקודה אחת", + "principal": "עליך להזין מנהל תקף כדי לזהות את הבוט" }, "iconLabel": "סמל בוט", "maxLengthLabel": "אורך מקסימלי", @@ -203,6 +215,8 @@ "permScopeCommunity": "קהילה", "permScopeMessage": "הוֹדָעָה", "permScopeThread": "פְּתִיל", + "principalLabel": "קֶרֶן", + "principalPlaceholder": "הכנס למנהל הבוט", "required": "פרמטר נדרש", "requiredDesc": "האם זה פרמטר נדרש עבור הפקודה", "title": "בנה בוט", @@ -230,6 +244,10 @@ "diamond": { "desc": "פרסם קישור להסבר על חברות Diamond" }, + "explorer": { + "addBots": "הוסף בוטים", + "loadMore": "טען עוד..." + }, "failed": "מצטערים, לא הצלחנו לבצע את פקודת הבוט", "faq": { "desc": "צור קישור לנושא שאלות נפוצות", diff --git a/frontend/app/src/i18n/jp.json b/frontend/app/src/i18n/jp.json index ab3692a2b2..6de48bb6dd 100644 --- a/frontend/app/src/i18n/jp.json +++ b/frontend/app/src/i18n/jp.json @@ -149,6 +149,14 @@ "blockUserFailed": "ユーザーをブロックできませんでした", "blockUserSucceeded": "ユーザーはブロックされました", "bots": { + "add": { + "addBot": "ボットを追加", + "choosePermissions": "権限", + "failure": "申し訳ありませんが、ボットを追加できませんでした", + "noPermissions": "特別な許可は必要ありません", + "permissionsInfo": "このボットは以下の権限を要求します。付与される権限を制限することを選択すると、使用可能なコマンドが制限されます。", + "title": "コミュニティにボットを追加する" + }, "builder": { "addAnother": "追加する", "addChoice": "選択肢を追加", @@ -171,11 +179,15 @@ "endpointRules": "有効なオリジンまたはキャニスターIDである必要があります", "errors": { "alphaOnly": "英数字とアンダースコアのみを含める必要があります", + "botNameInvalid": "このボット名は無効です", "duplicateCommands": "ボットに重複したコマンドが含まれています", + "duplicateName": "そのボット名はすでに使用されています", "duplicateParams": "コマンドに重複したパラメータが含まれています", "endpoint": "エンドポイントは有効なオリジンまたはキャニスターIDである必要があります", "minLength": "少なくとも {n} 文字が必要です", - "noCommands": "ボットには少なくとも1つのコマンドが含まれている必要があります" + "nameCheckError": "ボット名の確認中にエラーが発生しました", + "noCommands": "ボットには少なくとも1つのコマンドが含まれている必要があります", + "principal": "ボットを識別するには有効なプリンシパルを入力する必要があります" }, "iconLabel": "ボットアイコン", "maxLengthLabel": "最大長", @@ -203,6 +215,8 @@ "permScopeCommunity": "コミュニティ", "permScopeMessage": "メッセージ", "permScopeThread": "糸", + "principalLabel": "主要", + "principalPlaceholder": "ボットプリンシパルを入力", "required": "必須パラメータ", "requiredDesc": "これはコマンドの必須パラメータですか", "title": "ボットを構築する", @@ -230,6 +244,10 @@ "diamond": { "desc": "ダイヤモンド会員資格を説明するリンクを投稿する" }, + "explorer": { + "addBots": "ボットを追加", + "loadMore": "さらに読み込む..." + }, "failed": "申し訳ありませんが、ボットコマンドの実行に失敗しました", "faq": { "desc": "FAQトピックへのリンクを作成する", diff --git a/frontend/app/src/i18n/pl.json b/frontend/app/src/i18n/pl.json index 18c117abb2..379f99564e 100644 --- a/frontend/app/src/i18n/pl.json +++ b/frontend/app/src/i18n/pl.json @@ -149,6 +149,14 @@ "blockUserFailed": "Nie można zablokować użytkownika", "blockUserSucceeded": "Użytkownik został zablokowany", "bots": { + "add": { + "addBot": "Dodaj bota", + "choosePermissions": "Uprawnienia", + "failure": "Przepraszamy, nie udało nam się dodać bota", + "noPermissions": "Nie są wymagane żadne specjalne uprawnienia", + "permissionsInfo": "Ten bot szuka następujących uprawnień. Wybór ograniczenia przyznanych uprawnień ograniczy dostępne polecenia.", + "title": "Dodaj bota do społeczności" + }, "builder": { "addAnother": "Dodaj kolejny", "addChoice": "Dodaj wybór", @@ -171,11 +179,15 @@ "endpointRules": "Musi to być prawidłowe pochodzenie lub canisterID", "errors": { "alphaOnly": "Może zawierać wyłącznie znaki alfanumeryczne i podkreślenia", + "botNameInvalid": "Ta nazwa bota jest nieprawidłowa", "duplicateCommands": "Bot zawiera zduplikowane polecenia", + "duplicateName": "Ta nazwa bota jest już zajęta", "duplicateParams": "Polecenie zawiera zduplikowane parametry", "endpoint": "Punkt końcowy musi być prawidłowym źródłem lub identyfikatorem kanistra", "minLength": "Musi mieć co najmniej {n} znaków", - "noCommands": "Bot musi zawierać co najmniej jedno polecenie" + "nameCheckError": "Wystąpił błąd podczas sprawdzania nazwy bota", + "noCommands": "Bot musi zawierać co najmniej jedno polecenie", + "principal": "Aby zidentyfikować bota, należy wprowadzić prawidłowy podmiot" }, "iconLabel": "Ikona bota", "maxLengthLabel": "Maksymalna długość", @@ -203,6 +215,8 @@ "permScopeCommunity": "Wspólnota", "permScopeMessage": "Wiadomość", "permScopeThread": "Nitka", + "principalLabel": "Główny", + "principalPlaceholder": "Wprowadź dane bota", "required": "Wymagany parametr", "requiredDesc": "Czy jest to wymagany parametr dla polecenia?", "title": "Zbuduj bota", @@ -230,6 +244,10 @@ "diamond": { "desc": "Opublikuj link wyjaśniający członkostwo Diamond" }, + "explorer": { + "addBots": "Dodaj boty", + "loadMore": "Załaduj więcej..." + }, "failed": "Przepraszamy, nie udało nam się wykonać polecenia bota", "faq": { "desc": "Utwórz link do tematu FAQ", diff --git a/frontend/app/src/i18n/ru.json b/frontend/app/src/i18n/ru.json index 3a8ff5cdcf..91659d32d9 100644 --- a/frontend/app/src/i18n/ru.json +++ b/frontend/app/src/i18n/ru.json @@ -149,6 +149,14 @@ "blockUserFailed": "Не удалось заблокировать пользователя", "blockUserSucceeded": "Пользователь заблокирован", "bots": { + "add": { + "addBot": "Добавить бота", + "choosePermissions": "Разрешения", + "failure": "Извините, мы не смогли добавить бота.", + "noPermissions": "Никаких специальных разрешений не требуется.", + "permissionsInfo": "Этот бот запрашивает следующие разрешения. Выбор ограничения предоставленных разрешений ограничит доступные команды.", + "title": "Добавить бота в сообщество" + }, "builder": { "addAnother": "Добавить еще", "addChoice": "Добавить выбор", @@ -171,11 +179,15 @@ "endpointRules": "Должен быть действительный источник или идентификатор контейнера", "errors": { "alphaOnly": "Должен содержать только буквы, цифры и подчеркивания.", + "botNameInvalid": "Это имя бота недействительно", "duplicateCommands": "Бот содержит дублирующиеся команды", + "duplicateName": "Это имя бота уже занято.", "duplicateParams": "Команда содержит повторяющиеся параметры", "endpoint": "Конечная точка должна быть действительным источником или идентификатором canisterID.", "minLength": "Должно быть не менее {n} символов", - "noCommands": "Бот должен содержать хотя бы одну команду" + "nameCheckError": "Произошла ошибка при проверке имени бота", + "noCommands": "Бот должен содержать хотя бы одну команду", + "principal": "Вам необходимо ввести действительного принципала для идентификации бота." }, "iconLabel": "Значок бота", "maxLengthLabel": "Максимальная длина", @@ -203,6 +215,8 @@ "permScopeCommunity": "Сообщество", "permScopeMessage": "Сообщение", "permScopeThread": "Нить", + "principalLabel": "Главный", + "principalPlaceholder": "Введите принципала бота", "required": "Обязательный параметр", "requiredDesc": "Является ли это обязательным параметром для команды?", "title": "Создать бота", @@ -230,6 +244,10 @@ "diamond": { "desc": "Опубликуйте ссылку, чтобы объяснить суть членства Diamond" }, + "explorer": { + "addBots": "Добавить ботов", + "loadMore": "Загрузить еще..." + }, "failed": "Извините, нам не удалось выполнить команду бота", "faq": { "desc": "Создайте ссылку на тему часто задаваемых вопросов", diff --git a/frontend/app/src/i18n/uk.json b/frontend/app/src/i18n/uk.json index b9731fb8d0..71d35e5a09 100644 --- a/frontend/app/src/i18n/uk.json +++ b/frontend/app/src/i18n/uk.json @@ -149,6 +149,14 @@ "blockUserFailed": "Не вдалося заблокувати користувача", "blockUserSucceeded": "Користувача заблоковано", "bots": { + "add": { + "addBot": "Додати бота", + "choosePermissions": "Дозволи", + "failure": "На жаль, ми не змогли додати бота", + "noPermissions": "Спеціальні дозволи не потрібні", + "permissionsInfo": "Цей бот шукає такі дозволи. Вибір обмеження наданих дозволів обмежить доступні команди.", + "title": "Додати бота до спільноти" + }, "builder": { "addAnother": "Додайте іншу", "addChoice": "Додати вибір", @@ -171,11 +179,15 @@ "endpointRules": "Має бути дійсне джерело або canisterID", "errors": { "alphaOnly": "Має містити лише буквено-цифрові символи та підкреслення", + "botNameInvalid": "Це ім'я бота недійсне", "duplicateCommands": "Бот містить повторювані команди", + "duplicateName": "Ця назва бота вже зайнята", "duplicateParams": "Команда містить повторювані параметри", "endpoint": "Кінцева точка має бути дійсним джерелом або canisterID", "minLength": "Має бути принаймні {n} символів", - "noCommands": "Бот повинен містити хоча б одну команду" + "nameCheckError": "Під час перевірки імені бота сталася помилка", + "noCommands": "Бот повинен містити хоча б одну команду", + "principal": "Ви повинні ввести дійсний принципал, щоб ідентифікувати бота" }, "iconLabel": "Значок бота", "maxLengthLabel": "Максимальна довжина", @@ -203,6 +215,8 @@ "permScopeCommunity": "Спільнота", "permScopeMessage": "повідомлення", "permScopeThread": "Нитка", + "principalLabel": "Директор", + "principalPlaceholder": "Введіть принципала бота", "required": "Обов'язковий параметр", "requiredDesc": "Чи є це обов'язковим параметром для команди", "title": "Створіть бота", @@ -230,6 +244,10 @@ "diamond": { "desc": "Опублікуйте посилання, щоб пояснити Діамантове членство" }, + "explorer": { + "addBots": "Додайте ботів", + "loadMore": "Завантажити більше..." + }, "failed": "На жаль, нам не вдалося виконати команду бота", "faq": { "desc": "Створіть посилання на тему поширених запитань", diff --git a/frontend/app/src/i18n/vi.json b/frontend/app/src/i18n/vi.json index bdf23d52b1..bf202ad2e9 100644 --- a/frontend/app/src/i18n/vi.json +++ b/frontend/app/src/i18n/vi.json @@ -149,6 +149,14 @@ "blockUserFailed": "Không thể chặn người dùng", "blockUserSucceeded": "Người dùng đã bị chặn", "bots": { + "add": { + "addBot": "Thêm bot", + "choosePermissions": "Quyền", + "failure": "Xin lỗi chúng tôi không thể thêm bot", + "noPermissions": "Không cần quyền đặc biệt", + "permissionsInfo": "Bot này tìm kiếm các quyền sau. Việc chọn giới hạn các quyền được cấp sẽ giới hạn các lệnh khả dụng.", + "title": "Thêm bot vào cộng đồng" + }, "builder": { "addAnother": "Thêm một cái nữa", "addChoice": "Thêm một lựa chọn", @@ -171,11 +179,15 @@ "endpointRules": "Phải là nguồn gốc hợp lệ hoặc là một canisterID", "errors": { "alphaOnly": "Chỉ được chứa chữ và số và dấu gạch dưới", + "botNameInvalid": "Tên bot này không hợp lệ", "duplicateCommands": "Bot chứa các lệnh trùng lặp", + "duplicateName": "Tên bot đó đã được sử dụng rồi", "duplicateParams": "Lệnh chứa các tham số trùng lặp", "endpoint": "Điểm cuối phải là một origin hoặc canisterID hợp lệ", "minLength": "Phải có ít nhất {n} ký tự", - "noCommands": "Một bot phải chứa ít nhất một lệnh" + "nameCheckError": "Đã xảy ra lỗi khi kiểm tra tên bot", + "noCommands": "Một bot phải chứa ít nhất một lệnh", + "principal": "Bạn phải nhập một nguyên tắc hợp lệ để xác định bot" }, "iconLabel": "Biểu tượng bot", "maxLengthLabel": "Chiều dài tối đa", @@ -203,6 +215,8 @@ "permScopeCommunity": "Cộng đồng", "permScopeMessage": "Tin nhắn", "permScopeThread": "Chủ đề", + "principalLabel": "Hiệu trưởng", + "principalPlaceholder": "Nhập bot chính", "required": "Tham số bắt buộc", "requiredDesc": "Đây có phải là tham số bắt buộc cho lệnh không?", "title": "Xây dựng một bot", @@ -230,6 +244,10 @@ "diamond": { "desc": "Đăng liên kết để giải thích về tư cách thành viên Kim cương" }, + "explorer": { + "addBots": "Thêm bot", + "loadMore": "Tải thêm..." + }, "failed": "Xin lỗi, chúng tôi không thực hiện được lệnh bot", "faq": { "desc": "Tạo liên kết đến chủ đề FAQ", diff --git a/frontend/app/src/utils/reactivity.svelte.ts b/frontend/app/src/utils/reactivity.svelte.ts index 570331bfae..0217dfe443 100644 --- a/frontend/app/src/utils/reactivity.svelte.ts +++ b/frontend/app/src/utils/reactivity.svelte.ts @@ -16,7 +16,7 @@ */ export function debouncedDerived( dependencies: () => void, - action: () => T, + action: () => Promise, delay: number, initialValue: T, ) { @@ -25,7 +25,7 @@ export function debouncedDerived( $effect(() => { dependencies(); // subscribe to the dependencies (*this* is the hack) window.clearTimeout(timer); - timer = window.setTimeout(() => (value = action()), delay); + timer = window.setTimeout(async () => (value = await action()), delay); return () => clearTimeout(timer); }); return () => value; diff --git a/frontend/openchat-client/src/openchat.ts b/frontend/openchat-client/src/openchat.ts index 30c7440107..760d0cfc4d 100644 --- a/frontend/openchat-client/src/openchat.ts +++ b/frontend/openchat-client/src/openchat.ts @@ -5875,7 +5875,6 @@ export class OpenChat extends OpenChatAgentWorker { initialLoad: !this.botsLoaded, }).subscribe({ onResult: async ({ bots }) => { - console.log("GetBots response: ", bots); setExternalBots(bots); this.botsLoaded = true; }, diff --git a/frontend/openchat-shared/src/domain/bots.ts b/frontend/openchat-shared/src/domain/bots.ts index 5f616d7f0e..7b7a8b7b5b 100644 --- a/frontend/openchat-shared/src/domain/bots.ts +++ b/frontend/openchat-shared/src/domain/bots.ts @@ -4,7 +4,7 @@ import type { ChatPermissions, CommunityPermissions, MessagePermission } from ". import type { InterpolationValues, ResourceKey } from "../utils"; import { ValidationErrors } from "../utils/validation"; -export const MIN_NAME_LENGTH = 3; +export const MIN_NAME_LENGTH = 5; export type BotGroupDetails = { id: string;