feat(voice): вход в голосовые комнаты, voice states и модерация (Фаза 3)
AGENT.md 7.14, начало Фазы 3:
- `internal/voice`: собственный подписыватель токенов LiveKit (HS256, grants
roomJoin/canPublish/canSubscribe/canPublishData) и адрес комнаты
`guild_{g}_channel_{c}` — без внешних зависимостей;
- таблица `voice_states` (миграция 00009) и store-методы: вход, флаги
(микрофон, звук, камера, экран), серверный мьют и глушение, перемещение,
выход, подсчёт участников комнаты;
- ручки: POST /channels/{id}/voice/join (проверяет CONNECT_VOICE, тип комнаты,
лимит участников и выдаёт токен), POST /channels/{id}/voice/leave,
PATCH /guilds/{id}/voice-states/@me, GET /guilds/{id}/voice-states,
PATCH /guilds/{id}/voice-states/{user_id} (MUTE_MEMBERS/DEAFEN_MEMBERS,
аудит), POST /guilds/{id}/voice-states/{user_id}/move (MOVE_MEMBERS);
- события VOICE_STATE_UPDATE всем участникам сервера, системные записи о входе
в голосовую комнату, READY отдаёт голосовые состояния серверов;
- конфиг: LIVEKIT_API_KEY/SECRET/URL приложению, публичный адрес
`LIVEKIT_PUBLIC_URL` (по умолчанию ws(s)://<домен>/rtc) в установщике и
compose; `/api/v1/meta` сообщает voice_enabled и voice_url;
- тесты: claims токена LiveKit и подпись, выключенный голос, имя комнаты, вход
и флаги, запрет мьюта без прав, перемещение и выход.
This commit is contained in:
@@ -37,11 +37,15 @@ type Config struct {
|
||||
Argon2MemoryKiB int
|
||||
Argon2Iterations int
|
||||
Argon2Parallelism int
|
||||
Version string
|
||||
Commit string
|
||||
BuildDate string
|
||||
ShutdownTTL time.Duration
|
||||
Maintenance time.Duration
|
||||
// LiveKit: голос, видео и шаринг экрана (AGENT.md 7.14).
|
||||
LiveKitAPIKey string
|
||||
LiveKitAPISecret string
|
||||
LiveKitURL string
|
||||
Version string
|
||||
Commit string
|
||||
BuildDate string
|
||||
ShutdownTTL time.Duration
|
||||
Maintenance time.Duration
|
||||
}
|
||||
|
||||
func Load() (Config, error) {
|
||||
@@ -67,6 +71,9 @@ func Load() (Config, error) {
|
||||
Argon2MemoryKiB: envInt("ARGON2_MEMORY_KIB", 19456),
|
||||
Argon2Iterations: envInt("ARGON2_ITERATIONS", 2),
|
||||
Argon2Parallelism: envInt("ARGON2_PARALLELISM", 1),
|
||||
LiveKitAPIKey: env("LIVEKIT_API_KEY", ""),
|
||||
LiveKitAPISecret: env("LIVEKIT_API_SECRET", ""),
|
||||
LiveKitURL: env("LIVEKIT_URL", ""),
|
||||
Version: env("APP_VERSION", "dev"),
|
||||
Commit: env("APP_COMMIT", "none"),
|
||||
BuildDate: env("APP_BUILD_DATE", "unknown"),
|
||||
@@ -113,6 +120,11 @@ func (c Config) AllowedOrigins() []string {
|
||||
return origins
|
||||
}
|
||||
|
||||
// VoiceEnabled сообщает, настроен ли LiveKit: без ключей голос выключен.
|
||||
func (c Config) VoiceEnabled() bool {
|
||||
return c.LiveKitAPIKey != "" && c.LiveKitAPISecret != "" && c.LiveKitURL != ""
|
||||
}
|
||||
|
||||
func (c Config) BaseURL() string { return c.Scheme() + "://" + c.Domain }
|
||||
func (c Config) FilesURL() string { return c.Scheme() + "://" + c.FilesDomain }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user