Задать вопрос
  • В чем проблема слэш команд?

    nowm
    @nowm
    У дискорда есть такая фишка, что на interaction нужно ответить в течение 3-х секунд. Если не успели, он начинает выдавать такую ошибку. Есть несколько вариантов:

    1. Сразу после того, как был получен interaction, нужно вызвать interaction.deferReply. Вызов deferReply даёт возможность продлить срок ответа до 15 минут. Дальше как обычно — делаете pool.query и потом interaction.reply
      await interaction.deferReply();
      // После вызова кода выше, дискорд даёт ещё 15 минут 
      // на то, чтобы отправить ответ.
      
      // [Тут какой-то ваш код, который долго работает]
      
      await interaction.reply('Информация о сервере: бла-блабла');


    2. Можно использовать механизм Follow-ups. В таком случае вы сразу что-нибудь отвечаете с помощью interaction.reply, потом делаете pool.query и потом добавляете ещё текст с помощью interaction.followUp:
      await interaction.reply('Ща, погодь, нужно в БД посмотреть...');
      // После вызова кода выше, дискорд даёт ещё 15 минут 
      // на то, чтобы отправить follow up.
      
      // [Тут какой-то ваш код, который долго работает]
      
      await interaction.followUp('Вот, нашёл: Информация о сервере: бла-блабла');
      // Код выше добавляет к ответу текст "Вот, нашёл: Информация о сервере: бла-блабла" 
      // (фраза «Ща, погодь» никуда не пропадает)


    3. Можно точно так же сразу ответить, но вместо interaction.followUp вызывать interaction.editReply. В этом случае даётся тоже 15 минут на то, чтобы вызвать editReply.
      await interaction.reply('Подождите...');
      // После вызова кода выше, дискорд даёт ещё 15 минут 
      // на то, чтобы отредактировать это сообщение
      
      // [Тут какой-то ваш код, который долго работает]
      
      await interaction.editReply('Информация о сервере: бла-блабла');
      // Код выше заменяет "Подождите.." на "Информация о сервере: бла-блабла"


    Ответ написан
    Комментировать
  • Как сделать ответ на стикер?

    Negezor
    @Negezor
    Senior Shaurma Developer
    updates.on('new_message', async (message, next) => {
        if (message.hasAttachments('sticker')) {
            await message.send(`kkk`)
        }
    })
    Ответ написан
    1 комментарий
  • Как выполнять следующую функцию массива через некоторое время после предыдущей?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Для реализации задуманного нужен момент окончания работы очередной функции – чтобы от него считать 2 секунды.

    В вопросе не раскрыта природа функций в массиве: то ли они мгновенно отрабатывают, то ли занимают продолжительное время. Синхронные или асинхронные. Что эти функции возвращают: Promise, значение или ничего?

    Можно обернуть каждую в Promise с таймаутом:
    [func1, func2, func3]
      // обернуть каждую в Promise:
      .map((f) => () => new Promise((res, rej) => {
        f();
        setTimeout(res, 2000));
      })
      // и собрать цепочку из этих промисов:
      .reduce((acc, c) => acc.then(c()), Promise.resolve());


    Если эти функции асинхронные, то заменить
    -    f();
    -    setTimeout(res, 2000));
    +    f()
    +    .then(() => setTimeout(res, 2000)));
    Ответ написан
    Комментировать
  • Как написать метод bind самому?

    GlazOtca
    @GlazOtca
    Не в бровь, а в глаз!
    Как создать свой bind (4 способа + call, apply) очень хорошо и подробно по этому вопросу
    Ответ написан
    Комментировать
  • Как можно удалять выбранную часть смс в ВК?

    WolfInChains
    @WolfInChains
    Вам не надоело присылать один и тот же "код", с разными вопросами, и просить написать бота вместо вас? Так вы ничему не научитесь. Пора бы и самому немного подумать.

    Вам нужны всего 2 метода. Первый
    https://vk.com/dev/messages.getHistory
    Получаете при помощи него айдишники последних сообщений и сортируете, оставляя только те, где айди отправителя равен вашему айди. Чтобы указать количество сообщений, которые нужно удалить, можно просто разделить команду через split и затем сократить получившийся список с айдишниками сообщений на число из команды увеличенное на 1 (чтобы удалить сообщение и с самой командой).

    Потом просто засовываете айдишнки сообщений (перед этим объединив их в 1 строку через join) в метод
    https://vk.com/dev/messages.delete

    Про split и join информации в интернете достаточно.

    Ничего сложного, нужно лишь немного подумать, а не просить все написать за вас.
    Ответ написан
    1 комментарий
  • Почему в JS 0.1+0.2 не равно 0.3?

    @hellpirat
    Full stack developer (Python/Django, React.js)
    Ответ написан
    Комментировать
  • Как создать виджет сообщества в vk?

    @Gesparo Автор вопроса
    Fullstack разработчик
    Итак, задачу все же удалось решить. Опишу способ решения этой задачи для тех, кто подписался и для тех, кто столкнется с аналогичной задачей.

    Предварительные условия:
    Необходимо создать iframe приложение и добавить его в сообщество. Насколько я понял - это необходимо только для создания ключа ( чтобы можно было управлять виджетом на стороне сервера ) и первоначального добавления виджета на страницу.

    Iframe приложение должно "смотреть" на страницу где будет вот такой вот код:
    index.html:
    <!doctype html>
    <html lang="ru">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport"
              content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    
        <!-- Подключаем jquery -->
        <script src="https://code.jquery.com/jquery-1.12.4.min.js" defer></script>
        <!-- Подключаем VK -->
        <script src="https://vk.com/js/api/xd_connection.js?2"  type="text/javascript" defer></script>	
    	
        <!-- Подключаем скрипт регулировки высоты -->
        <script src="/vk_height.js" defer></script>
    	
    </head>
    <body style='text-align:center;padding-top:50px;' id='body'>
    	<a href="javascript:void(0)" id="set-permission">Создать ключ доступа к виждету сообщества</a>
    	<br>
    	<br>
    	<a href="javascript:void(0)" id="set-widget">Добавить виждет в сообщество</a>
    </body>
    </html>


    vk_height.js:
    // инициализация вк
    VK.init(, function() { 
         console.log('Init successful');
      }, function() { 
         console.log('Error init');
    }, '5.73'); 
    
    // функция дня изменения размера окна в зависимости от содержимого страницы
    function autosize(width) {
        //Проверяем элемент body на наличие.
        if (!document.getElementById('body')) {
            alert('error');
            return;
        }
        // Успешно ли подключен ВК скрипт
        if (typeof VK.callMethod != 'undefined') {
            /*
            Вызываем функцию vk js api для управления окном.
            VK.callMethod('функция', параметры)
            В данном случае у нас - VK.callMethod('изменение_размеров_окна', ширина, высота);
            Так же добавляем еще 60 пикселей что бы было небольшое расстояние.
            */
            VK.callMethod('resizeWindow', 840, document.getElementById('body').clientHeight + 60);
        } else {
            alert('error #2');
        }
    }
    
    $(document).ready( function(){
        //Вызываем функцию регулировки высоты каждые пол секунды.
        setInterval('autosize(607)', 500); 
    	
    	$('#set-permission').on('click', function(e) {
    		e.preventDefault();
    		
    		// запрос прав доступа для дальнейшего обновления данных посредством крона
    		// после запрса создается ключ, который можно посмотреть на странице управления сообществом
    		// его и нунжно будет применить для обновления данных в виджете через сервер
    		// дока прав тут https://vk.com/dev/permissions
    		// дока метода тут https://vk.com/dev/clientapi?f=3.+showGroupSettingsBox
    		VK.callMethod("showGroupSettingsBox", 64);
    	});
    	
    	$('#set-widget').on('click', function(e) {
    		e.preventDefault();
    		
    		// запрос установки виджета
    		// типы виджетов можно глянуть тут https://vk.com/dev/objects/appWidget
    		// как подключить виджет можно глянуть тут https://vk.com/dev/apps_widgets
    		VK.callMethod('showAppWidgetPreviewBox', 'text', 'return {' + 
    			'"title": "Цитата",' + 
    			'"text": "Текст цитаты"' + 
    		'};');
    		
    		// типы событий, генерируемых после выполнения запроса на установку виджета можно глянуть тут https://vk.com/dev/apps_widgets
    		// работа с событиями вк https://vk.com/dev/Javascript_SDK?f=4.1.+VK.addCallback
    		VK.addCallback('onAppWidgetPreviewSuccess', function f(data){ 
    			alert("Виджет успешно добавлен"); 
    		});
    	});	
    	
    });


    После создания данных страниц у вас появится возмжность создать ключ (который будет доступен из управления сообществом) и создание простого виджета

    Серверную часть я полностью описывать не буду и покажу только само тело запроса, главное запросить данные через culr по ссылке https://api.vk.com/method/ (Вот гайд)

    Сам запрос:
    $api = new \App\Api\Main\Vk(['access_token' => 'ключ_корый_мы_сгенерировали_первой_кнопкой']);
        $api->request(
            'appWidgets.update',
            [
                'type' => 'list',
                'code' => '
                    var users = API.users.get({"user_ids": [11111, 22222, 33333]});
                    
                    return { 
                      "title": "Конкурс за призы", 
                      "rows": [
                                  { 
                                      "title": users[0].first_name + " " + users[0].last_name, 
                                      "icon_id": "id11111",
                                      "descr" : "1 место - 2000 баллов",
                                      "button" : "Результаты конкурса",
                                      "button_url" : "https://vk.com/link"
                                  },
                                  { 
                                      "title": users[1].first_name + " " + users[1].last_name, 
                                      "icon_id": "id2222",
                                      "descr" : "2 место - 1890 баллов",
                                      "button" : "Правила и призы",
                                      "button_url" : "https://vk.com/link"
                                  },
                                  { 
                                      "title": users[2].first_name + " " + users[2].last_name, 
                                      "icon_id": "id22222",
                                      "descr" : "3 место - 1890 баллов",
                                      "button" : "Хочу на марафон",
                                      "button_url" : "https://vk.com/link"
                                  }
                             ]
                };'
            ]
        );


    Подробности о теле запроса можно узнать тут
    А как его правильно писать - тут

    Вышенаписанный php код можно добавить в крон, автоматизировать и наслаждаться жизнью. И на последок - вот пример рабочего кода в сообществе (сорян за стили, и некоторые замазанные части, мне лень было делать нормальный скрин):
    5a9e7f04c5275110898228.png
    Ответ написан
    5 комментариев
  • Почему метод Number() начинается с большой буквы в javascript?

    Seasle
    @Seasle Куратор тега JavaScript
    Потому что это не метод, а класс (прототип). Также существуют: String, Boolean, Object, Array. При вызове классов Number, String, Boolean без оператора new они постараются привести переданное значение к примитиву (например String(true) // "true". В том случае, если их вызвать с оператором new, то они вернут новый объект (не путать с Object), значением в котором будет переданное значение. Лучше так не создавать переменные данных классов, а использовать примитивы (об этом можете почитать в книге Стоян Стефанов - JavaScript Шаблоны). У Object особое поведение при его вызове без new - он постарается понять тип переменной и впоследствии вернет экземпляр класса определенного примитива:
    Object(100) // Number { 100 }
    typeof Object(100) // "object"
    typeof 100 // "number"
    Object(100) instanceof Number // true
    100 instanceof Number // false

    Вызов класса Array без ключевого слова new или с ним:
    с 1 аргументом - вернет пустой массив, длиной равной переданному аргументу;
    с 2 и более аргументами - вернет массив значений.
    Ответ написан
    Комментировать
  • Нужно ли отключать JavaScript в даркнете?

    Jump
    @Jump
    Системный администратор со стажем.
    Нужно ли отключать JavaScript в даркнете?
    Если вам это нужно - отключаете, если не нужно не отключаете.
    действительно ли с JavaScript`ом серфить так опасно и меня могут взламать буквально на третьем же сайте?
    Вообще не опасен. Взломать могут.
    Ответ написан
    1 комментарий
  • Нужно ли отключать JavaScript в даркнете?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Сайты в даркнете могут использовать уязвимости нулевого дня, чтобы взломать ваше устройство и для этого достаточно будет просто открыть зараженную страничку.
    Ответ написан
    Комментировать
  • Почему бот не отвечает на упоминания в беседе?

    opium
    @opium
    Просто люблю качественно работать
    Не очень понял, а почему он должен отвечать?
    Ответ написан
    Комментировать
  • Если вк возвращает ошибку, как оповестить об этом юзера?

    scripnet
    @scripnet
    vk.api.users.get({user_ids: 123}).catch((err) => {
    	message.send(`ой ошибка!`)
    	console.error(err)
    })
    Ответ написан
    Комментировать
  • Как запустить код на удаленном сервере?

    @Israfil22
    Да на самом деле создание сервера на ноде - это крайне простая процедура.
    REST API на Express пишется буквально за час вместе с разбором всего материала.
    Единственное, с чем Вам придется возиться - это HTTPS, в случае аренды машины.
    Я надеюсь, что вы уже знакомы с понятиями VPS/VDS и не нужно объяснять, где хостить.
    Если планируете сильно расширять Ваш бэкенд сервер, то, конечно, нужен свой приватный сервер.
    Для одного-десятка эндпоинтов попробуйте Heroku.

    "Привет мир" из официальной документации - проще быть не может)
    https://expressjs.com/ru/starter/hello-world.html

    Однако задумайтесь над реальной пользой. Как было сказано в комментариях выше, время пересылки пакетов может быть гораздо больше, чем время выполнения операции.
    Ответ написан
    3 комментария
  • Как переписать с метода map на filter?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    Вот то, о чём Вы просите. Только не ясно зачем Вам это именно через фильтр.
    "Каждый охотник желает знать, где сидит фазан.".split('').filter(function(char, idx, arr){
        return (idx === 0 || arr[idx-1] === ' ') && char
    })
    Ответ написан
    1 комментарий
  • Как отловить подписку на группу и сделать так, чтобы она время от времени проверялась?

    iiiBird
    @iiiBird
    Пока ты спишь - твой конкурент совершенствуется
    ловишь через callback API или longpoll - события group_join, group_leave
    проверяешь через https://vk.com/dev/groups.isMember
    Ответ написан
    Комментировать
  • Как изучать vk.api?

    mahmudchon
    @mahmudchon
    Соглашусь с Сергеем, у ВК очень простое API, в документации все описано от и до самым простым языком - https://vk.com/dev/manuals
    Ответ написан
    Комментировать
  • Как изучать vk.api?

    hottabxp
    @hottabxp
    Сначала мы жили бедно, а потом нас обокрали..
    В vk.com самое простое api в мире. Если вы не можете в нем разобраться, значит вам еще рано писать ботов. Вообще без знания основ(как показывает практика) писать ботов - это плохо. Возвращайтесь в самое начало и перечитывайте книги для начинающих с обязательной практикой.
    Ответ написан
    3 комментария