Files
Qlyra/lib/backend/modules/links.dart
T
klockky ddb60b1d71 feat(links): поддержка max.ru-ссылок и komet:// диплинков
- резолв max.ru/{join,joincall,u,c,:auth,<channel>}
- открытие чатов/профилей/звонков и подтверждение веб-входа в приложении
- внешние диплинки: intent-filter (Android), URL-схемы (iOS/macOS), komet://-регистрация в рантайме (Windows/Linux)
- fix(calls): не слать opcode 79 до login (жижа я тебя выебу)
2026-06-23 14:18:51 +03:00

73 lines
1.9 KiB
Dart

import 'dart:async';
import '../../core/protocol/opcode_map.dart';
import '../../core/protocol/packet.dart';
import '../api.dart';
sealed class ResolvedLink {
const ResolvedLink();
}
class ResolvedChat extends ResolvedLink {
final Map<dynamic, dynamic> chat;
final Map<dynamic, dynamic>? message;
const ResolvedChat(this.chat, this.message);
}
class ResolvedUser extends ResolvedLink {
final Map<dynamic, dynamic> contact;
const ResolvedUser(this.contact);
}
class ResolvedLinkError extends ResolvedLink {
final String message;
const ResolvedLinkError(this.message);
}
abstract class LinkModule {
static Future<ResolvedLink?> resolve(Api api, String url) async {
final Packet response;
try {
response = await api.sendRequest(Opcode.linkInfo, {'link': url});
} on TimeoutException {
return const ResolvedLinkError('Превышено время ожидания');
} on PacketError catch (e) {
return ResolvedLinkError(e.message);
}
final payload = response.payload;
if (payload is! Map) return null;
if (!response.isOk) {
return ResolvedLinkError(messageFromErrorPayload(payload));
}
final chat = payload['chat'];
if (chat is Map) {
final message = payload['message'];
return ResolvedChat(chat, message is Map ? message : null);
}
final user = payload['user'];
if (user is Map && user['contact'] is Map) {
return ResolvedUser(user['contact'] as Map);
}
return null;
}
static Future<String?> join(Api api, String url) async {
try {
final response = await api.sendRequest(Opcode.chatJoin, {'link': url});
if (response.isOk) return null;
return messageFromErrorPayload(response.payload);
} on TimeoutException {
return 'Превышено время ожидания';
} on PacketError catch (e) {
return e.message;
}
}
}