Top.Mail.Ru
Ответы
Аватар пользователя

Фронтенд-разработка

Интерфейсы и пользовательский опыт: HTML/CSS, JavaScript-фреймворки, доступность, кросс-браузерность. Как ускорить загрузку страниц, или почему не рендерится React-компонент?
12 постов
63 участника
Что вы по этому поводу имеете сказать?

АнрилЭнджин использует свою встроенную систему материалов и редактор материалов, которая по сути является альтернативой Канве для создания визуальных эффектов и текстур. Хотя Канва в основном ассоциируется с графическими редакторами для дизайна и коллажей, в игровом движке типа Unreal Engine есть системы, позволяющие управлять материалами, шейдерами и текстурами — например, сам редактор материалов в АнрилЭнджине, который широко используется для создания сложных визуальных эффектов.

Если речь идет именно о графических интерфейсах для дизайна или визуальных редакторах, то внутри Unreal есть инструмент под названием Material Editor — его можно считать «канвой» для создания и визуализации текстурных средств. Впрочем, это не отдельная внешняя канва, а встроенный инструментарий.

Итак, альтернативой графической Канвы в АнрилЭнже для игровых материалов является его собственный редактор материалов и редактор ландшафтов, с помощью которых создаются визуальные эффекты и текстуры, делая мир живым и красочным.

Если говорить о реализации редактора через адрес сайта и его вложениях по точке, то, вероятно, ты имеешь в виду глубокие URL-адреса или маршрутизацию с подсистемами (например, /editor, /editor/settings, /editor/attachments).

Такое структурирование обычно достигается с помощью роутеров в веб-фреймворках: указываешь путь через слеши, а внутри уже обрабатываешь вложения. А точки в адресах — это скорее редкие случаи, потому что точки часто используются для расширений файлов или отделения версии, к примеру, file.html или api.v1.

Если говорить о конкретных реализациях, то в современных сайтах используют маршрутные системы (например, React Router или Vue Router), где можно задать маршруты с вложенными компонентами, например:

```jsx
<Route path="/editor" component={EditorPage}>
<Route path="attachments" component={AttachmentsPanel} />
<Route path="settings" component={SettingsPanel} />
</Route>
```

Точки в адресе обычно не нужны, разве что в частных случаях с расширениями или точечными именами, например:

```
/editor.v1/attachments.js
```

или через параметры:

```
/editor?version=1
```

Но в большинстве случаев и без точек всё реализуется через слеши и параметры.

Если же ты имел в виду что-то конкретное — можешь уточнить? Тогда я постараюсь удивить тебя каким-то необычным приёмом!

Если говорить о доменном имени с точками внутри — как store.steampowered.com. Такой подход называется субдоменной структурой, которая помогает разгруппировать разные разделы сайта или сервисы.

К примеру, store.steampowered.com — это основной магазин, а если бы было что-то вроде community.steampowered.com, то это другая подсистема — коммьюнити, форумы или группы.

Этот метод реализуется на уровне DNS и веб-сервера, где для каждого субдомена задается отдельное приложение или маршруты. В системах маршрутизации часто можно настроить раздельную обработку поддоменов, чтобы они вели к разным кодовым базам или разделам сайта.

А что интересно — внутри самого уровня сайта разработчики используют маршрутизацию меню, чтобы организовать внутренние адреса вида /games, /reviews, /users — всё как в архитектуре с точным разделением по субдоменам.

И кстати, это не только удобно, но и добавляет сайту вид стратифицированной системы — словно у каждого отделения есть свой цифровой адрес! Так что точки в домене — это как улицы в городе: помогают ориентироваться и структурировать информацию.

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

Общий подход для реализации такого редактора включает следующие компоненты:

1. Бэкэнд:
- API для хранения и обновления конфигураций субдоменов.
- База данных для хранения данных о субдоменах, их правилах, маршрутах и связях.
- Логика для проверки корректности настроек и автоматического применения изменений.

2. Фронтенд:
- Интерактивный интерфейс для добавления, редактирования и удаления субдоменов.
- Визуальные средства для отображения структуры и связей.
- Валидация и предпросмотр изменений перед их применением.

3. Интеграция:
- Автоматизация обновлений DNS-записей и конфигураций веб-сервера (например, Nginx, Apache) через API или скрипты.

Что касается сравнения с редакторами ландшафтов и текстур:

- Общие черты:
- Все они работают с набором объектов или данных, требующих структуриции и редактирования.
- Включают визуальный компонент (отображение структуры/ландшафта/текста) и редактор — интерфейс для изменений.
- Важна возможность предварительного просмотра и отмены изменений.

- Различия:
- Редактор ландшафтов и текстур больше похож на 3D-графический или графический редактор: манипуляции с графическими элементами, моделями, материалами.
- Редактор субдоменов — это скорее менеджер конфигураций, который управляет маршрутизацией и настройками инфраструктуры, а не визуальными элементами.

Возможно, чтобы сделать такой редактор более "визуальным", можно добавить карту инфраструктуры или дерево субдоменов, позволяющее управлять сложной структурой, как в редакторах ландшафтов/текстур. В итоге, у них есть общий принцип — управление данными через удобный интерфейс — и различия в сфере применения и визуализации.

Как превратить svg код в файл?

Скопировал svg код с сайта https://heropatterns.com/, его нужно вставлять прям в CSS, но смотреть на эту огромную кучу цифр тошно, просто запихнуть в svg файл не получается, так как перед тегом svg есть непонятное предложение, че делать?

Бот для телеграм

Здравствуйте, описываю ситуацию: есть сайт https://csgo-guides.ru/blog/grow-a-garden-stock/ , который показывает автосток из режима в рб (то, что есть в магазине), попросили сделать бота для телеграм, но я в пайтоне не сильно харош, как можно запарсить этот сайт? Как понял для названий используется html файл, а вот для количества и времени обновления уже API (ну, повторюсь, я так понял), и хотелось бы, чтобы в боте в тг можно было выбрать, что отслеживать, может подскажите как нормально парсить? Или как-то по другому бота создать? Вот пример: @Grow_Garden_Abot

Помогите разобраться с кодом для Telegram бота

Выдает бесконечные ошибки в коде, не знаю уже что делать, устал голову ломать , установлен aiogram 3.0, знатоки подскажите пожалуйста, бот по меркам реалий не такой уж и сложный

Пишу через Replit

main.ru:

import asyncio

from aiogram import Bot, Dispatcher

from aiogram.enums import ParseMode

from aiogram.types import Message

from aiogram.fsm.storage.memory import MemoryStorage

from aiogram.filters import Command

from handlers import blog, broadcast, poll

TOKEN = "Мой токен"

CHANNEL_ID = "@Serquor_DevLog"

async def main():

bot = Bot(token=TOKEN, parse_mode=ParseMode.HTML)

dp = Dispatcher(storage=MemoryStorage())

dp.include_routers(blog.router, broadcast.router, poll.router)

@dp.message(Command("start"))

async def start(message: Message):

await message.answer("Привет! Я — бот для блога Serquor.")

await dp.start_polling(bot)

if name == "__main__":

asyncio.run(main())

blog.py;

from aiogram import Router, F

from aiogram.types import Message

from aiogram.filters import Command

from main import CHANNEL_ID

router = Router()

@router.message(Command("publish"))

async def publish_blog(message: Message):

if message.from_user.id != Мой id:

await message.answer("Нет доступа.")

return

lines = message.text.split("\n", 1)

if len(lines) < 2:

await message.answer("Формат: /publish\nТекст блога")

return

text = lines[1]

await message.bot.send_message(CHANNEL_ID, text)

await message.answer("✅ Опубликовано в канал.")

broadcast.pu

from aiogram import Router, F

from aiogram.types import Message

from aiogram.filters import Command

import json

import os

router = Router()

DATA_FILE = "data/users.json"

def save_user(user_id):

users = []

if os.path.exists(DATA_FILE):

with open(DATA_FILE, "r") as f:

users = json.load(f)

if user_id not in users:

users.append(user_id)

with open(DATA_FILE, "w") as f:

json.dump(users, f)

@router.message(Command("start"))

async def track_user(message: Message):

save_user(message.from_user.id)

await message.answer("Вы подписались на обновления.")

@router.message(Command("broadcast"))

async def broadcast(message: Message):

if message.from_user.id != Мой Id:

return

parts = message.text.split("\n", 1)

if len(parts) < 2:

await message.answer("Формат: /broadcast\nТекст рассылки")

return

text = parts[1]

with open(DATA_FILE, "r") as f:

users = json.load(f)

for uid in users:

try:

await message.bot.send_message(uid, text)

except:

continue

await message.answer("✅ Рассылка отправлена.")

poll.py

from aiogram import Router

from aiogram.types import Message, InlineKeyboardMarkup, InlineKeyboardButton, CallbackQuery

from aiogram.filters import Command

from aiogram.utils.keyboard import InlineKeyboardBuilder

router = Router()

votes = {"yes": 0, "no": 0, "maybe": 0}

@router.message(Command("poll"))

async def send_poll(message: Message):

keyboard = InlineKeyboardBuilder()

keyboard.button(text="✅ Да", callback_data="vote_yes")

keyboard.button(text="❌ Нет", callback_data="vote_no")

keyboard.button(text="🤔 Не уверен", callback_data="vote_maybe")

await message.answer("Что ты думаешь о блоге?", reply_markup=keyboard.as_markup())

@router.callback_query(F.data.startswith("vote_"))

async def handle_vote(callback: CallbackQuery):

vote_type = callback.data.split("_")[1]

votes[vote_type] += 1

text = f"✅ Да: {votes['yes']} | ❌ Нет: {votes['no']} | 🤔 Не уверен: {votes['maybe']}"

await callback.message.edit_text("Что ты думаешь о блоге?\n" + text, reply_markup=callback.message.reply_markup)

await callback.answer("Спасибо за голос!")