Skip to content

Commit

Permalink
Bot name uniqueness check (#7052)
Browse files Browse the repository at this point in the history
  • Loading branch information
julianjelfs authored Dec 12, 2024
1 parent 19f5d39 commit 702ba3d
Show file tree
Hide file tree
Showing 19 changed files with 304 additions and 20 deletions.
32 changes: 31 additions & 1 deletion frontend/app/src/components/bots/BotBuilder.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand All @@ -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<OpenChat>("client");
interface Props {
valid: boolean;
Expand All @@ -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<ValidationErrorMessages> {
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);
Expand Down
20 changes: 19 additions & 1 deletion frontend/app/src/i18n/ar.json
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,14 @@
"blockUserFailed": "غير قادر على حظر المستخدم",
"blockUserSucceeded": "لقد تم حظر المستخدم",
"bots": {
"add": {
"addBot": "إضافة بوت",
"choosePermissions": "الأذونات",
"failure": "نأسف لعدم تمكننا من إضافة البوت",
"noPermissions": "لا يتطلب أذونات خاصة",
"permissionsInfo": "يسعى هذا الروبوت إلى الحصول على الأذونات التالية. سيؤدي اختيار تقييد الأذونات الممنوحة إلى تقييد الأوامر المتاحة.",
"title": "إضافة بوت إلى المجتمع"
},
"builder": {
"addAnother": "أضف آخر",
"addChoice": "أضف خيارا",
Expand All @@ -171,11 +179,15 @@
"endpointRules": "يجب أن يكون أصلًا صالحًا أو معرف علبة",
"errors": {
"alphaOnly": "يجب أن يحتوي فقط على أحرف أبجدية رقمية وشرطات سفلية",
"botNameInvalid": "اسم هذا البوت غير صالح",
"duplicateCommands": "يحتوي الروبوت على أوامر مكررة",
"duplicateName": "اسم هذا الروبوت مأخوذ بالفعل",
"duplicateParams": "يحتوي الأمر على معلمات مكررة",
"endpoint": "يجب أن تكون نقطة النهاية أصلًا أو معرف علبة صالحًا",
"minLength": "يجب أن يحتوي على {n} حرفًا على الأقل",
"noCommands": "يجب أن يحتوي الروبوت على أمر واحد على الأقل"
"nameCheckError": "حدث خطأ أثناء التحقق من اسم الروبوت",
"noCommands": "يجب أن يحتوي الروبوت على أمر واحد على الأقل",
"principal": "يجب عليك إدخال مدير صالح لتحديد الروبوت"
},
"iconLabel": "أيقونة البوت",
"maxLengthLabel": "الحد الأقصى للطول",
Expand Down Expand Up @@ -203,6 +215,8 @@
"permScopeCommunity": "مجتمع",
"permScopeMessage": "رسالة",
"permScopeThread": "خيط",
"principalLabel": "رئيسي",
"principalPlaceholder": "أدخل رئيس البوت",
"required": "المعلمة المطلوبة",
"requiredDesc": "هل هذه معلمة مطلوبة للأمر",
"title": "بناء بوت",
Expand Down Expand Up @@ -230,6 +244,10 @@
"diamond": {
"desc": "انشر رابطًا لشرح العضوية الماسية"
},
"explorer": {
"addBots": "إضافة الروبوتات",
"loadMore": "تحميل المزيد..."
},
"failed": "عذرا، لقد فشلنا في تنفيذ أمر الروبوت",
"faq": {
"desc": "إنشاء رابط لموضوع الأسئلة الشائعة",
Expand Down
20 changes: 19 additions & 1 deletion frontend/app/src/i18n/cn.json
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,14 @@
"blockUserFailed": "无法加入黑名单",
"blockUserSucceeded": "该用户已被加入黑名单",
"bots": {
"add": {
"addBot": "添加机器人",
"choosePermissions": "权限",
"failure": "抱歉,我们无法添加该机器人",
"noPermissions": "无需特殊权限",
"permissionsInfo": "此机器人寻求以下权限。选择限制授予的权限将限制可用的命令。",
"title": "将机器人添加到社区"
},
"builder": {
"addAnother": "添加另一个",
"addChoice": "添加选择",
Expand All @@ -171,11 +179,15 @@
"endpointRules": "必须是有效的来源或 canisterID",
"errors": {
"alphaOnly": "只能包含字母数字和下划线",
"botNameInvalid": "此机器人名称无效",
"duplicateCommands": "机器人包含重复的命令",
"duplicateName": "该机器人名称已被占用",
"duplicateParams": "命令包含重复参数",
"endpoint": "端点必须是有效的来源或 canisterID",
"minLength": "必须至少包含 {n} 个字符",
"noCommands": "机器人必须至少包含一个命令"
"nameCheckError": "检查机器人名称时出错",
"noCommands": "机器人必须至少包含一个命令",
"principal": "您必须输入有效的主体来识别机器人"
},
"iconLabel": "机器人图标",
"maxLengthLabel": "最大长度",
Expand Down Expand Up @@ -203,6 +215,8 @@
"permScopeCommunity": "社区",
"permScopeMessage": "信息",
"permScopeThread": "线",
"principalLabel": "主要的",
"principalPlaceholder": "输入机器人主体",
"required": "必需参数",
"requiredDesc": "这是命令的必需参数吗",
"title": "构建机器人",
Expand Down Expand Up @@ -230,6 +244,10 @@
"diamond": {
"desc": "发布链接解释钻石会员资格"
},
"explorer": {
"addBots": "添加机器人",
"loadMore": "加载更多..."
},
"failed": "抱歉,我们无法执行机器人命令",
"faq": {
"desc": "创建常见问题解答主题的链接",
Expand Down
20 changes: 19 additions & 1 deletion frontend/app/src/i18n/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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",
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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",
Expand Down
5 changes: 4 additions & 1 deletion frontend/app/src/i18n/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
},
Expand Down Expand Up @@ -1834,4 +1837,4 @@
"yourChats": "Your chats",
"youreBlocked": "Sorry - you have been blocked from this group",
"yourRoleChanged": "{changedBy} changed your role to {newRole}"
}
}
20 changes: 19 additions & 1 deletion frontend/app/src/i18n/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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",
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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",
Expand Down
20 changes: 19 additions & 1 deletion frontend/app/src/i18n/fa.json
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,14 @@
"blockUserFailed": "مسدود کردن کاربر ممکن نیست",
"blockUserSucceeded": "کاربر مسدود شده است",
"bots": {
"add": {
"addBot": "اضافه کردن ربات",
"choosePermissions": "مجوزها",
"failure": "متأسفیم که نتوانستیم ربات را اضافه کنیم",
"noPermissions": "هیچ مجوز خاصی لازم نیست",
"permissionsInfo": "این ربات به دنبال مجوزهای زیر است. انتخاب محدود کردن مجوزهای اعطا شده، دستورات موجود را محدود می کند.",
"title": "اضافه کردن ربات به انجمن"
},
"builder": {
"addAnother": "دیگری اضافه کنید",
"addChoice": "یک انتخاب اضافه کنید",
Expand All @@ -171,11 +179,15 @@
"endpointRules": "باید مبدأ معتبر یا شناسه قوطی باشد",
"errors": {
"alphaOnly": "فقط باید دارای حروف الفبا و زیرخط باشد",
"botNameInvalid": "این نام ربات نامعتبر است",
"duplicateCommands": "ربات حاوی دستورات تکراری است",
"duplicateName": "آن نام ربات قبلاً گرفته شده است",
"duplicateParams": "فرمان حاوی پارامترهای تکراری است",
"endpoint": "نقطه پایانی باید یک مبدا یا شناسه canister معتبر باشد",
"minLength": "باید حداقل {n} کاراکتر داشته باشد",
"noCommands": "یک ربات باید حداقل یک دستور داشته باشد"
"nameCheckError": "هنگام بررسی نام ربات خطایی روی داد",
"noCommands": "یک ربات باید حداقل یک دستور داشته باشد",
"principal": "برای شناسایی ربات باید یک اصل معتبر وارد کنید"
},
"iconLabel": "نماد ربات",
"maxLengthLabel": "حداکثر طول",
Expand Down Expand Up @@ -203,6 +215,8 @@
"permScopeCommunity": "جامعه",
"permScopeMessage": "پیام",
"permScopeThread": "موضوع",
"principalLabel": "اصلی",
"principalPlaceholder": "اصل ربات را وارد کنید",
"required": "پارامتر مورد نیاز",
"requiredDesc": "آیا این یک پارامتر لازم برای دستور است؟",
"title": "یک ربات بسازید",
Expand Down Expand Up @@ -230,6 +244,10 @@
"diamond": {
"desc": "یک لینک برای توضیح عضویت در Diamond ارسال کنید"
},
"explorer": {
"addBots": "ربات ها را اضافه کنید",
"loadMore": "بارگیری بیشتر..."
},
"failed": "با عرض پوزش، ما نتوانستیم دستور ربات را اجرا کنیم",
"faq": {
"desc": "یک پیوند به یک موضوع سؤالات متداول ایجاد کنید",
Expand Down
Loading

0 comments on commit 702ba3d

Please sign in to comment.