@lefqua

Как из гугл формы на основе ответа пользователя сделать пинг определенной роли в дискорде через вебхук?

Есть такой код, но при отправке формы прилетает пуш только указанных ролей в mention
Мне необходимо сделать, чтобы при выборе разных ответов пользователем, отправлялся пинг той роли за которой закреплен ответ

const webhooks = [""];
 
const title = "", avatarImage = "", shortDescription = "", colour = "#f5a4a0", mention = "\<@&800466869626208267>  \<@&800468194431205407> <@&971746892805472306>", type = "";
 
 
const bonusFeatures = {
    convert2Link: 'ON', 
    convert2Mention: 'ON' 
}
 
 
const form = FormApp.getActiveForm(), allResponses = form.getResponses(), latestResponse = allResponses[allResponses.length - 1];
let response;
var items = [];
 
try {
    response = latestResponse.getItemResponses()
} catch (error) {
    throw "No Responses found in your form."
}
 
for (const hook of webhooks) {
    if (!/^(?:https?:\/\/)?(?:www\.)?(?:(?:canary|ptb)\.)?discord(?:app)?\.com\/api\/webhooks\/\d+\/[\w-+]+$/i.test(hook)) throw `Webhook ${i + 1 || 1} is not valid.`;
}
 
if (avatarImage && !/\.(jpeg|jpg|gif|png)$/.test(avatarImage)) throw "Image URL is not a direct link";
 
 
for (var i = 0; i < response.length; i++) {
    const question = response[i].getItem().getTitle(), answer = response[i].getResponse();
    if (answer == "") continue;
    items.push({ "name": question, "value": answer });
 
    function data(item) {
        const linkValidate = /(?:(?:https?|http?):\/\/)(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[-A-Z0-9+&@#\/%=~_|$?!:,.])*(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[A-Z0-9+&@#\/%=~_|$])/i;
 
        if (bonusFeatures.convert2Mention == 'ON' && !isNaN(item.value) && item.value.length == 18) item.value = `<@!${item.value}>`;
 
        if (bonusFeatures.convert2Link == 'ON' && type.toLowerCase() !== 'text') {
            if (linkValidate.test(item.value)) item.value = `[${item.value}](${item.value})`;
        } else {
            if (bonusFeatures.convert2Link == 'ON' && linkValidate.test(item.value)) item.value = `<${item.value}>`;
        }
 
        return [`**${item.name}**`, `${item.value}`].join("\n");
    }
}
 
if (items.map(data).toString().length + shortDescription.length > 1999) throw "Discord limit reached. Please add limits to your questions!";
 
function plainText(e) {
 
    const text = {
        "method": "post",
        "headers": { "Content-Type": "application/json" },
        "muteHttpExceptions": true,
        "payload": JSON.stringify({
            "content": `${mention ? mention : ''}${title ? `**${title}**` : `**${form.getTitle()}**`}\n\n${shortDescription ? `${shortDescription}\n\n${items.map(data).join('\n\n')}` : items.map(data).join('\n\n')}`
        }),
    };
 
    for (var i = 0; i < webhooks.length; i++) { UrlFetchApp.fetch(webhooks[i], text); };
}
 
function embedText(e) {
 
    const embed = {
        "method": "post",
        "headers": { "Content-Type": "application/json" },
        "muteHttpExceptions": true,
        "payload": JSON.stringify({
            "content": mention ? mention : '',
            "embeds": [{
                "title": title ? title : form.getTitle(), // Either the set title or the forms title.
                "description": shortDescription ? `${shortDescription}\n\n${items.map(data).join('\n\n')}` : items.map(data).join('\n\n'), 
                "thumbnail": { url: avatarImage ? encodeURI(avatarImage) : null }, 
                "color": colour ? parseInt(colour.substr(1), 16) : Math.floor(Math.random() * 16777215), 
                "timestamp": new Date().toISOString() 
            }]
        }),
    };
 
    for (var i = 0; i < webhooks.length; i++) { UrlFetchApp.fetch(webhooks[i], embed); };


}
  • Вопрос задан
  • 610 просмотров
Пригласить эксперта
Ответы на вопрос 1
Lapita12
@Lapita12
Тесты, тесты?
1. Добавьте к каждому вопросу в гугл форме тэг, например #role_, где id роли - идентификатор роли в дискорде, за которой закреплен вопрос.

2. В коде скрипта нужно добавить обработку тэгов вопросов и передачу вебхукам нужных ролей для упоминания.
Можно использовать метод String.includes() для поиска тэгов в ответах пользователя.
for (var i = 0; i < response.length; i++) {
    const question = response[i].getItem().getTitle(), answer = response[i].getResponse();
    if (answer == "") continue;
    items.push({ "name": question, "value": answer });

    if (answer.includes('#role_')) {
        const roleId = answer.split('#role_')[1];
        mention += `<@&${roleId}> `;
    }

Здесь мы проверяем, содержится ли в ответе пользователя тэг #role_. Если да, то мы получаем идентификатор роли из ответа и добавляем ее к строке mention для упоминания вебхуком.

3. В конце функции plainText или embedText добавьте передачу переменной mention в тело POST-запроса
const text = {
    "method": "post",
    "headers": { "Content-Type": "application/json" },
    "muteHttpExceptions": true,
    "payload": JSON.stringify({
        "content": mention ? mention : '',
        "embeds": [...]
    }),
};

Теперь при отправке ответов пользователем на гугл форму будут упомянуты только те роли, которые привязаны к ответам на вопросы с помощью тэгов.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы