Дота 2
мне стало интересно, какой персонаж из Dota 2 вам нравится больше все?
Вяжу в удовольствие🫶
Подробные статьи публикую на дзене!
Всем приятной и легкой трудовой недели! 🫶
История о том, как обычный человек, который хотел просто поиграть в Dota с друзьями, внезапно оказался разработчиком собственного голосового чата. Да, это звучит как начало плохого фильма, но это реальность.
Вечер. Пятница. Я захожу в Dota 2, открываю Discord — и он просто висит. Первая мысль: «Интернет умер». Вторая: «Discord умер». Третья: «Я умер».
Включаю VPN — пинг 200+, голос как будто идёт через картошку, подключение отваливается. Мы пытались играть так пару дней. Не получилось. Слишком много боли, слишком мало тимплея.
Начал искать замену:
TeamSpeak — уважаем, но ощущение, что попал в 2007 год.
Mumble — работает, но выглядит так, будто его рисовали в Paint.
VK Звонки — норм, если созваниваться с мамой.
Telegram — хорошо, но не для игр.
И вот в этот момент у меня в голове родилась мысль, которая обычно заканчивается плохо: «А что если сделать свой Discord?»
Голосовая связь — это не просто «передать звук». Это кодеки, WebRTC, STUN/TURN, шумодав, эхоподавление, джиттер-буферы и прочие слова, которые звучат как заклинания из «Гарри Поттера».
Писать всё с нуля — это как идти в рейд соло. Поэтому я выбрал LiveKit — штуку, которая делает половину работы за тебя.
Код
Frontend: React + Vite + TailwindCSS Backend: Node.js + Express + Socket.IO Voice: LiveKit (self-hosted) Database: PostgreSQL + Redis Auth: Steam OpenID Noise: RNNoise (WASM) Deploy: Docker + Docker Compose
Да, выглядит как список модов для Skyrim, но оно работает.
Первая проблема: микрофон слышит ВСЁ. Клавиатуру, кота, соседа, который сверлит в 23:40.
Discord решает это Krisp, но нам нужен был open-source вариант. Так в проект ворвался RNNoise, как герой аниме, который появляется в последний момент.
ЧтоБылоСталоКлавиатура«КЛАК-КЛАК-КЛАК»«…»Фоновый шум«Я здесь»«Я ушёл»Задержка—+3–5 мсCPU—+2–3%
Разница — как будто включили RTX на шумоподавление.
Мобильный интернет сказал: «Не сегодня». Пришлось прикручивать heartbeat, reconnection и молитвы.
LiveKit умеет AEC, но его нужно включить руками. Да, мы тоже забыли.
Safari — это Dark Souls среди браузеров. Нужен user gesture, иначе аудио не стартует. Добавили кнопку «Присоединиться к голосу». Теперь всё работает. Иногда.
Cookies не передавались. Мы страдали. Потом победили.
Серверы в России
SFU вместо P2P
Opus 32 kbps
Simulcast выключен
И да, разница с Discord через VPN ощущается так же сильно, как разница между 30 fps и 144 fps.
Голосовые каналы
RNNoise
Авторизация через Steam
Текстовые чаты
Друзья
PWA
Мобильная версия
Пинг: 20–50 мс
До 25 человек в войсе
Разработка: ~4 месяца (вечерами и по выходным)
Мобильное приложение
Демонстрация экрана
Интеграция с играми
Роли и модерация
И да, мы знаем, что вы хотите «как в Discord». Мы тоже хотим.
Потому что после блокировки Discord геймеры остались без нормального войса. ErrorParty — это попытка закрыть эту дыру своими руками.
Всем привет! Вот такого интеллигентного симпатягу покрасила я на днях. Сама фигурка высотой 7 см, размах по рукам 9 см. Небольшая, но он очень упитанный! Напечатан на Anycubic photon mono M7, смола тоже Anycubic abs like.
Я его побила как могла, поэтому он в синяках)
Кровушку (он тоже кого то побил) сделала из маникюрного топа,который покрасила красной прозрачной краской.
Ну и для тех, кто любит видео -покрутила его со всех сторон. Снимала на тапок
Всем спасибо за просмотры!
Устраивает их южнокорейский диджей, который вечерами любит запустить пару каточек, но есть нюанс: Дота 2 в южной Корее не популярна и обычно там приходят исключительно любители или мимо проходящие люди, которые не понимают куда попали.