• Как написать приватные комнаты на кнопках Discord py?

    Lapita12
    @Lapita12
    Тесты, тесты?
    Для создания приватных комнат на кнопках Discord.py, вам нужно использовать модуль discord.ui

    import discord
    from discord.ext import commands
    from discord.ui import View, button
    
    class PrivateRoomView(View):
        def __init__(self):
            super().__init__()
            self.add_item(button(label="Создать комнату", custom_id="create_room"))
            self.add_item(button(label="Присоединиться к комнате", custom_id="join_room"))
    
        @button(custom_id="create_room")
        async def create_room(self, button: discord.ui.Button, interaction: discord.Interaction):
            # Здесь вы можете добавить логику для создания комнаты
            await interaction.response.send_message("Комната создана!")
    
        @button(custom_id="join_room")
        async def join_room(self, button: discord.ui.Button, interaction: discord.Interaction):
            # Здесь вы можете добавить логику для присоединения к комнате
            await interaction.response.send_message("Вы присоединились к комнате!")


    Вы можете использовать этот класс PrivateRoomView в своем боте Discord.py, чтобы создать меню с кнопками для создания и присоединения к приватным комнатам.
    Чтобы добавить логику для редактирования названия комнаты, вы можете добавить еще одну кнопку в PrivateRoomView и обработчик для нее, который будет выполнять запрос на редактирование названия комнаты.
    Ответ написан
  • Как отправить новый пост во все беседы бота?

    Lapita12
    @Lapita12
    Тесты, тесты?
    Для отправки сообщения во все беседы, где есть бот, вам нужно получить список всех бесед, в которых бот является участником, и отправить сообщение в каждую из них. Вы можете использовать метод messages.getConversations для получения списка бесед, а затем перебрать каждую беседу и отправить сообщение в ней.

    conversations = await bot.api.messages.getConversations(filter='all')
    for conversation in conversations['items']:
        peer_id = conversation['peer']['id']
        try:
            await bot.api.messages.send(
                peer_id=peer_id,
                message='Новый пост!',
                random_id=0,
                attachment=f'wall-{event.group_id}_{event.object.id}'
            )
        except Exception as ex:
            print(f'error: {ex}')


    В этом примере мы получаем список всех бесед, используя метод messages.getConversations, и затем перебираем каждую беседу и отправляем сообщение в ней, используя метод messages.send . В peer_id мы передаем идентификатор беседы, а в attachment мы передаем идентификатор записи на стене, которую мы хотим прикрепить к сообщению.
    Ответ написан
  • Как решить отображение NFTShape для NFT с превью в формате SVG?

    Lapita12
    @Lapita12
    Тесты, тесты?
    Для отображения NFT с превью в формате SVG на NFTShape можно использовать следующий подход:
    1. Получить URL превью NFT с помощью API, например, от opensea.io.
    2. Создать новый компонент, который будет отображать SVG-изображение. Для этого можно использовать стандартный компонент , но указать ему тип изображения "image/svg+xml". Например:
    <img src="https://example.com/nft-preview.svg" alt="NFT preview" type="image/svg+xml">

    3. Вставить созданный компонент внутрь NFTShape с помощью свойства "children". Например:
    <NFTShape
      entityId="0x123456789abcdef"
      position={{ x: 5, y: 1, z: 5 }}
      rotation={{ x: 0, y: 45, z: 0 }}
    >
      <img src="https://example.com/nft-preview.svg" alt="NFT preview" type="image/svg+xml">
    </NFTShape>


    4. Дополнительно можно добавить обработку ошибок при загрузке SVG-изображения и замену его на заглушку в случае ошибки.
    Ответ написан
    9 комментариев
  • Как изменить настройки сетки/спрайта?

    Lapita12
    @Lapita12
    Тесты, тесты?
    Возможно, проблема в настройках сетки (grid) или масштабирования спрайта. Проверьте следующие настройки:

    1. Проверьте, что размер сетки (grid size) соответствует размеру клеток на сцене. Например, если клетки на сцене имеют размер 1м x 1м, то размер сетки должен быть установлен на 1м x 1м.

    2. Убедитесь, что масштаб спрайта установлен правильно. Если вы используете спрайт с размером 300 пикселей, то его масштаб должен быть установлен на 3 (т.е. каждый пиксель спрайта будет соответствовать одному юниту на сцене).

    3. Если вы используете программу для создания игр, проверьте настройки масштабирования и плотности пикселей (pixel density). Некоторые программы автоматически масштабируют спрайты и изменяют их размеры, чтобы они соответствовали плотности пикселей на устройстве, на котором будет запущена игра.

    Если проблема не решается, попробуйте задать размер спрайта в юнитах вместо пикселей. Например, если вы хотите, чтобы спрайт был высотой 3 клетки, установите его высоту в 3м (или 300см, в зависимости от единиц измерения на вашей сцене).
    Ответ написан
  • EAV фильтры: фронтенд и бэкенд. Проблема 1 значения и как реализовать правильный подсчет значений и disable несуществующих комбинаций?

    Lapita12
    @Lapita12
    Тесты, тесты?
    Для решения проблемы с подсчетом значений и отключением несуществующих комбинаций фильтров, можно использовать следующий подход:
    1. Для каждого атрибута, полученного из запроса построения списка фильтров, нужно выполнить отдельный запрос для подсчета количества товаров, у которых есть значение этого атрибута. Например:
    SELECT COUNT(DISTINCT pa.product_id) as filter_counter FROM product_attribute pa WHERE pa.attribute_id = '27' AND pa.value_id IN (SELECT av.value_id FROM attribute_value av WHERE av.attribute_id = '27' AND av.value IN ('Значение 1', 'Значение 2'))

    2. Если значение фильтра не выбрано, то нужно использовать общее количество товаров в категории для подсчета значения счетчика. Например:
    SELECT COUNT(*) as total_count FROM product p INNER JOIN product_to_category p2c ON p2c.product_id = p.product_id WHERE p2c.category_id = '6'

    3. При выборе значения фильтра нужно пересчитывать значения счетчиков для всех остальных фильтров, чтобы отключить несуществующие комбинации. Например:
    - При выборе значения атрибута 27 (Значение 1) нужно выполнить запросы для подсчета количества товаров для всех остальных атрибутов:
    SELECT COUNT(DISTINCT pa.product_id) as filter_counter FROM product_attribute pa WHERE pa.attribute_id = '45' AND pa.value_id IN (SELECT av.value_id FROM attribute_value av WHERE av.attribute_id = '45' AND av.value IN ('Значение А', 'Значение Б'))

    - После получения значений счетчиков для всех остальных атрибутов, нужно отключить те значения, которые имеют нулевое количество товаров. Например:
    SELECT av.value, av.value_id, COUNT(DISTINCT pa.product_id) as filter_counter FROM product_attribute pa INNER JOIN attribute_value av ON av.value_id = pa.value_id WHERE pa.attribute_id = '27' AND pa.product_id IN (SELECT p2c.product_id FROM product_to_category p2c WHERE p2c.category_id = '6') AND pa.value_id IN (SELECT av.value_id FROM attribute_value av WHERE av.attribute_id = '27' AND av.value IN ('Значение 1', 'Значение 2')) AND (SELECT COUNT(DISTINCT pa1.product_id) FROM product_attribute pa1 WHERE pa1.attribute_id = '45' AND pa1.product_id IN (SELECT p2c.product_id FROM product_to_category p2c WHERE p2c.category_id = '6') AND pa1.value_id IN (SELECT av1.value_id FROM attribute_value av1 WHERE av1.attribute_id = '45' AND av1.value IN ('Значение А', 'Значение Б'))) > 0 GROUP BY av.value_id

    4. Для отображения выбранных фильтров и их значений на странице нужно использовать параметры GET-запроса или cookies, чтобы сохранить выбранные значения между запросами. Например:
    - При выборе значения атрибута 27 (Значение 1) нужно добавить параметр в GET-запрос или сохранить значение в cookies:
    http://example.com/category/?attr27=Значение+1
    или

    setcookie('attr27', 'Значение 1');
    - При выполнении запроса выборки товаров нужно проверять наличие параметров GET-запроса или cookies и добавлять соответствующие условия в запрос. Например:
    SELECT p.*,pd.* FROM product p LEFT JOIN product_description pd ON pd.product_id = p.product_id LEFT JOIN product_to_category p2c ON p2c.product_id = p.product_id INNER JOIN product_attribute pa0 ON pa0.product_id = p.product_id AND pa0.attribute_id = 27 INNER JOIN product_attribute pa1 ON pa1.product_id = p.product_id AND pa1.attribute_id = 45 WHERE p2c.category_id = '6' AND ((pa0.value_id = '496') AND (pa1.value_id = '1124')) AND pd.name LIKE '%%' AND p.status = '1' AND (pa0.value_id IN (SELECT av.value_id FROM attribute_value av WHERE av.attribute_id = '27' AND av.value IN ('Значение 1'))) GROUP BY p.product_id ORDER BY p.quantity < 1,p.popularity DESC LIMIT 0,6.
    Ответ написан
    Комментировать
  • Как убрать действие preventDefault у ссылок в подмени?

    Lapita12
    @Lapita12
    Тесты, тесты?
    Чтобы убрать e.preventDefault() для ссылок в подменю, вам нужно добавить проверку на target с помощью if в теле функции handlerItem(). Ниже приведен измененный код:
    document.addEventListener('DOMContentLoaded', () => {
      const submenuItem = document.querySelectorAll(".header .menu-item-has-children");
      const menuBody = document.querySelector(".sub-menu");
    
      submenuItem.forEach((item) => {
        item.addEventListener('click', handlerItem);
    
        // слушаем клик вне меню
        document.addEventListener("click", function (e) {
          const target = e.target;
          const its_menu = target == menuBody || menuBody.contains(target);
          const its_btnMenu = target == menuBody;
          const menu_is_active = item.classList.contains("--show");
    
          if (!its_menu && !its_btnMenu && menu_is_active) {
            item.classList.toggle("--show");
          }
        });
    
        // слушаем скролл
        document.addEventListener("scroll", function () {
          //убираем класс если произошел скролл
          item.classList.remove("--show");
        });
      });
    
      function handlerItem(e) {
        if (e.target.classList.contains('sub-menu-link') || e.target.closest('.sub-menu-link')) {
          // если нажата ссылка в подменю, то предотвращаем действие по умолчанию только для нее
          return;
        }
    
        e.preventDefault();
        e.stopPropagation();
    
        this.classList.toggle("--show");
      }
    });


    Я добавил проверку на класс sub-menu-link для e.target и его ближайшего родителя с помощью метода closest(). Если элемент, на который был клик, имеет класс sub-menu-link или является его потомком, тогда e.preventDefault() не выполняется и действие по умолчанию будет выполнено.
    Ответ написан
    Комментировать
  • Не работает snscrape. Как исправить?

    Lapita12
    @Lapita12
    Тесты, тесты?
    Ошибка UnicodeEncodeError 'charmap' codec can't encode character означает, что используемая кодировка не может обработать некоторые символы. Эта ошибка, скорее всего, связана с тем, что название группы, которое вы используете, содержит символы, которые не могут быть обработаны текущей кодировкой.

    Чтобы решить эту проблему, необходимо установить кодировку в командной строке на UTF-8. Для этого введите следующую команду в командной строке:

    chcp 65001
    Данная команда устанавливает кодировку на UTF-8.

    Ошибку AttributeError: 'NoneType' object has no attribute 'url' можно исправить, обновив библиотеку snscrape. Для этого выполните следующую команду:
    pip install -U git+https://github.com/JustAnotherArchivist/snscrape.git


    Эта команда установит последнюю версию библиотеки snscrape из репозитория GitHub. После обновления библиотеки наберите команду для парсинга заново.

    Если эти решения не помогут, попробуйте использовать другой парсер. Например, вы можете использовать библиотеку "vk-api" для парсинга данных из ВКонтакте.
    Ответ написан
  • Почему не выводит ошибку sqlite3?

    Lapita12
    @Lapita12
    Тесты, тесты?
    Вы забыли создать объект базы данных для выполнения операций здесь:
    cur.execute('INSERT INTO system (userid, nick) VALUES(?, ?)', (member.id, member.name))


    Попробуйте добавить строку кода перед этой строкой, чтобы создать объект базы данных:
    base = sqlite3.connect('название_базы_данных.db')
    cur = base.cursor()


    Если список импорта не содержит sqlite3, добавьте его в начало файла:
    import sqlite3
    Также убедитесь, что вы верно указали токен бота и активировали команды. Если все еще не удается получить ошибку из базы данных, проверьте, правильно ли вы подключаетесь к базе данных, и есть ли записи в таблице «system». Возможно, вы должны сделать несколько модификаций в вашем коде, чтобы работать с ошибками правильно.
    Ответ написан
  • Как написать фото галерею?

    Lapita12
    @Lapita12
    Тесты, тесты?
    Для этого вы можете использовать HTML, CSS и JavaScript, а также библиотеки, такие как jQuery и Bootstrap. Фотографии и видео можно загружать на сервер и хранить их в специальной папке.

    Бэкенд может быть написан на различных языках программирования, включая Python. Вы можете использовать фреймворки, такие как Flask или Django, чтобы создать API, которое будет взаимодействовать с фронтендом и обрабатывать запросы на загрузку или просмотр файлов. Например, на бэкенд можно создать путь для запроса списка файлов в папке и отсылки клиенту их метаданных (имя, размер, тип и др.), а также отдельный метод для загрузки файлов на сервер.

    Для просмотра фотографий и видео вы можете использовать библиотеки на фронтенде, такие как Fancybox, Justified Gallery, PhotoSwipe и другие. Они предоставляют готовые шаблоны и скрипты для отображения изображений в галерее и переключения между ними.
    Ответ написан
  • Как из гугл формы на основе ответа пользователя сделать пинг определенной роли в дискорде через вебхук?

    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": [...]
        }),
    };

    Теперь при отправке ответов пользователем на гугл форму будут упомянуты только те роли, которые привязаны к ответам на вопросы с помощью тэгов.
    Ответ написан
  • Почему не запускается локальный сервер Django?

    Lapita12
    @Lapita12
    Тесты, тесты?
    Предполагаю, что проблема может быть в том, что не были установлены необходимые зависимости или приложение Django не было запущено виртуальном окружении.

    1. Установите необходимые зависимости.
    pip install django
    2. Создайте виртуальное окружение (virtual environment):
    python -m venv myvenv
    3. Активируйте виртуальное окружение:
    myvenv\Scripts\activate
    4. Перейдите в корневую директорию проекта:
    cd E:\Python\project_django\learning_log
    5. Выполните команду для запуска локального сервера:
    python manage.py runserver
    6. Если вы хотите указать другой порт, можно выполнить команду следующим образом:
    python manage.py runserver 0.0.0.0:8001
    Если проблема будет продолжаться, может быть полезным проверить логи на наличие возможных ошибок.
    Ответ написан
  • Как используя js сделать разбитие изображения на сектора и пометить каждый сектор оригинальным значком?

    Lapita12
    @Lapita12
    Тесты, тесты?
    Для разбиения изображения на пиксели можно использовать HTML5 Canvas и JavaScript.
    Пример кода на JavaScript для разбиения изображения на пиксели с определенным размером:
    function drawPixelatedImage(image, pixelSize) {
        const canvas = document.createElement('canvas');
        canvas.width = image.width;
        canvas.height = image.height;
        const ctx = canvas.getContext('2d');
        ctx.imageSmoothingEnabled = false;
        ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
    
        const pixelImage = document.createElement('canvas');
        pixelImage.width = pixelSize;
        pixelImage.height = pixelSize;
        const pixelCtx = pixelImage.getContext('2d');
        pixelCtx.imageSmoothingEnabled = false;
        pixelCtx.drawImage(canvas, 0, 0, pixelSize, pixelSize);
    
        const resizedImage = document.createElement('canvas');
        resizedImage.width = canvas.width; 
        resizedImage.height = canvas.height;
        const resizedCtx = resizedImage.getContext('2d');
        resizedCtx.imageSmoothingEnabled = false;
        for (let x = 0; x < canvas.width; x += pixelSize) {
            for (let y = 0; y < canvas.height; y += pixelSize) {
                resizedCtx.drawImage(pixelImage, x, y, pixelSize, pixelSize, x, y, pixelSize, pixelSize);
            }
        }
    
        return resizedImage.toDataURL('image/png');
    }


    Чтобы присвоить каждому сектору свой оригинальный значок, можно использовать карту на изображении. В HTML5 Canvas можно создать карту на изображении с помощью функции createImageData().
    function createImageMap(image) {
        const canvas = document.createElement('canvas');
        canvas.width = image.width;
        canvas.height = image.height;
    
        const ctx = canvas.getContext('2d');
        ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
    
        const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
        const pixelMap = [];
    
        for (let i = 0; i < imageData.data.length; i += 4) {
            const red = imageData.data[i];
            const green = imageData.data[i + 1];
            const blue = imageData.data[i + 2];
            const alpha = imageData.data[i + 3];
    
            if (alpha === 0) {
                pixelMap.push(null);
            } else {
                pixelMap.push({ r: red, g: green, b: blue });
            }
        }
    
        return pixelMap;
    }

    Затем вы можете использовать карту для установки значков для каждого сектора изображения. Пример кода на JavaScript для установки значков на каждый сектор:
    function markSectorsWithIcons(image, pixelSize) {
        const pixelatedImage = drawPixelatedImage(image, pixelSize);
        const pixelMap = createImageMap(image);
    
        const canvas = document.createElement('canvas');
        canvas.width = image.width;
        canvas.height = image.height;
    
        const ctx = canvas.getContext('2d');
        ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
    
        const resizedImageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
        const resizedData = resizedImageData.data;
    
        for (let x = 0; x < canvas.width; x += pixelSize) {
            for (let y = 0; y < canvas.height; y += pixelSize) {
                const dataIndex = (y * canvas.width + x) * 4;
                const pixelColor = pixelMap[dataIndex / 4];
                const markerImage = getMarkerImage(pixelColor);
    
                if (markerImage) {
                    const pixelImage = new Image();
                    pixelImage.src = markerImage;
                    ctx.drawImage(pixelImage, x, y, pixelSize, pixelSize);
                }
            }
        }
    
        return canvas.toDataURL('image/png');
    }
    
    function getMarkerImage(color) {
        // здесь вы можете создать и возвращать нужный значок на основе цвета пикселя
    }
    Ответ написан
    1 комментарий
  • Как открыть консоль браузера на Андроид смартфоне?

    Lapita12
    @Lapita12
    Тесты, тесты?
    В зависимости от используемого браузера, процесс открытия консоли может отличаться.
    Например, для Google Chrome на Android:
    1. Откройте браузер и перейдите на страницу, которую хотите проанализировать.
    2. Нажмите на три точки (или кнопку "Еще") в правом верхнем углу экрана.
    3. В выпадающем меню выберите "Инструменты для разработчиков".
    4. В появившемся меню выберите "Консоль".
    Теперь вы можете использовать консоль для анализа ошибок и выполнения других задач.
    Ответ написан
  • Что делать, если бот не реагирует на команды?

    Lapita12
    @Lapita12
    Тесты, тесты?
    Если ваш бот перестал реагировать на команды, возможно, что проблема связана с разрешениями, присвоенными боту на сервере Discord. Убедитесь, что ваш бот имеет правильные разрешения доступа, чтобы просматривать и отправлять сообщения в канал, в котором вы пытаетесь использовать команду.

    Также убедитесь, что вы правильно настроили Intents для вашего бота, чтобы ваш бот мог получать ивенты, которые ему нужны. В вашем коде пока что нет никакой настройки Intents. Проверьте, что вы настроили их правильно, и добавьте нужные Intents для вашего бота:
    intents = discord.Intents.default()
    intents.members = True  # добавляем этот Intent, если мы прописали команду clear с аргументом "amount"
    bot = commands.Bot(command_prefix=settings['prefix'], intents=intents)


    Также добавьте обработку ошибок, чтобы увидеть, возможно, ли бот выдавать какие-либо ошибки:
    @bot.event
    async def on_command_error(ctx, error):
        await ctx.send(f'Произошла ошибка: {error}')


    Если вы добавите этот код, то при возникновении ошибки во время выполнения команды бот сообщит вам о ней и вы сможете понять, какую ошибку выдает ваш бот.
    Ответ написан
    2 комментария
  • Как вывести имя пользователя после юза modal menu? pycord-discord.py?

    Lapita12
    @Lapita12
    Тесты, тесты?
    Чтобы получить имя пользователя, который использовал modal menu, вам нужно использовать атрибут user в объекте interaction. Вот так можно выводить имя пользователя:

    #Извлекаем имя пользователя
    username = interaction.user.name
    
    # Создаем embed и выводим данные пользователя
    embed = discord.Embed(title="Набор на эвентера")
    embed.add_field(name="Имя пользователя", value=username, inline=False)
    embed.add_field(name="Сколько вам лет", value=self.children[0].value, inline=False)
    embed.add_field(name="Почему мы должны взять именно вас?", value=self.children[1].value, inline=False)
    embed.add_field(name="Был ли у вас опыт в модерации?", value=self.children[2].value, inline=False)
    embed.add_field(name="Откуда вы?", value=self.children[3].value, inline=False)
    embed.add_field(name="Расскажите о себе", value=self.children[4].value, inline=False)
    embed.set_footer(text=f"Заявку оставил: {username}")


    Здесь мы используем метод name, чтобы получить имя пользователя из объекта user, и затем добавляем его в footer нашего Embed.
    Ответ написан
    Комментировать
  • Как изменить переменную в useEffect?

    Lapita12
    @Lapita12
    Тесты, тесты?
    Проблема возникает из-за того, что когда вы изменяете массив elements, это не вызывает перерисовку компонента.
    Чтобы изменять переменную в useEffect, вы можете использовать локальный state. Для этого можно использовать хук useState
    import React, { useState, useEffect } from 'react';
    
    function App() {
      const [elements, setElements] = useState([]);
    
      useEffect(() => {
        // вместо data.data используйте свой набор данных
        const data = { data: ['file1', 'file2', 'file3'] };
        const newElements = [];
        for (let i = 0; i < data.data.length; i++) {
          newElements.push(<Uploaded_file button_name={data.data[i]} key={i}></Uploaded_file>);
        }
        setElements(newElements);
      }, []);
    
      return (
        <div>
          {elements}
        </div>
      );
    }
    
    export default App;
    Ответ написан
  • Почему не выводятся данные из запроса в заголовок?

    Lapita12
    @Lapita12
    Тесты, тесты?
    function installWeather(props) {
      const request = new Promise((resolve, reject) => {
        console.log('Запрос данных на сервер...')
        fetch('https://api.openweathermap.org/data/2.5/weather?q=LVIV&units=metric&APPID=5d066958a60d315387d9492393935c19')
          .then(response => {
            if (response.ok) {
              return resolve(response.json());
            } else {
              reject('Что-то пошло нет так');
            }
          });
      });
      
      return request
        .then(data => {
          return (
            <div className='wrapper'>
              <div className='container'>
                <h1 className="place" id="place">City: {data.name}</h1>
                <p className="temp" id="temp"></p>
                <p className="pressure" id="pressure"></p>
                <p className="description" id="description"></p>
                <p className="humidity" id="humidity"></p>
                <p className="speed" id="speed"></p>
                <p className="degree" id="degree"></p>
                <img className="image" id="image" src="" alt="clouds" title="Weather"/>
              </div>
            </div>
          )
        })
    }
    
    export default installWeather;
    Ответ написан
    7 комментариев
  • Как остановить скролл на последнем фрейме?

    Lapita12
    @Lapita12
    Тесты, тесты?
    let zSpacing = -1000,
      lastPos = zSpacing / 5,
      $frames = document.getElementsByClassName('frame'),
      frames = Array.from($frames),
      zVals = [];
    
    const lastFrame = $frames[$frames.length - 1];
    const lastFrameHeight = lastFrame.offsetHeight;
    const lastFrameTop = lastFrame.offsetTop;
    
    window.onscroll = function() {
      let top = document.documentElement.scrollTop,
        delta = lastPos - top
      lastPos = top
    
      frames.forEach(function(n, i) {
        zVals.push((i * zSpacing) + zSpacing)
        zVals[i] += delta * -5.5
        let frame = frames[i],
          transform = `translateZ(${zVals[i]}px)`,
        opacity = zVals[i] < Math.abs(zSpacing) / 1.8 ? 1 : 0
        
        frame.setAttribute('style', `transform: ${transform}; opacity: ${opacity};`);
      });
    
      if (top + window.innerHeight >= lastFrameTop + lastFrameHeight) {
        window.scrollTo(0, lastFrameTop);
      }
    };
    
    window.scrollTo(0, 1);
    
    let soundbutton = document.querySelector('.soundbutton'),
        audio = document.querySelector('.audio')
    
    soundbutton.addEventListener('click', e =>{
      soundbutton.classList.toggle('paused')
      audio.paused ? audio.play() : audio.pause()
    })
    
    window.onfocus = function(){
      soundbutton.classList.contains('paused') ? audio.pause() : audio.play()
    }
    
    window.onblur = function() {
      audio.pause()
    }
    Ответ написан
    5 комментариев
  • Почему цифры не переводятся в строки?

    Lapita12
    @Lapita12
    Тесты, тесты?
    Ваш код пытается выполнить операцию сложения на числах 1 и 1 перед тем, как конвертировать результат в строку.
    function run(str) {
      return str.toString();
    }
    
    console.log(run("1" + "+" + "1"));
    Ответ написан