096c4d0a2d
Серверная часть (Go): - WebSocket сервер с бинарным протоколом - XChaCha20-Poly1305 шифрование - zstd сжатие с дедупликацией (64KB чанки) - SQLite хранилище (WAL режим) - Управление гильдиями, каналами, ролями - Федерация между серверами (ed25519) - REST API + WebSocket endpoints Клиентская часть (Flutter): - Material Design 3 тёмная тема (Discord-like) - WebSocket соединение с сервером - Экраны: сплэш, логин, домашний, гильдии, чат - Модели: пользователи, гильдии, каналы, сообщения, роли - Сервисы: соединение, API, криптография, тема - Виджеты: иконки гильдий, сообщения, ввод чата - Web сборка (PWA) Документация: - AGENTS.md — контекст для ИИ ассистентов - docs/protocol.md — спецификация протокола
63 lines
1.4 KiB
Dart
63 lines
1.4 KiB
Dart
import 'channel.dart';
|
|
import 'role.dart';
|
|
|
|
class Guild {
|
|
final String id;
|
|
final String name;
|
|
final String ownerId;
|
|
final String? icon;
|
|
final String? description;
|
|
final DateTime createdAt;
|
|
List<Channel> channels;
|
|
List<Role> roles;
|
|
List<Category> categories;
|
|
|
|
Guild({
|
|
required this.id,
|
|
required this.name,
|
|
required this.ownerId,
|
|
this.icon,
|
|
this.description,
|
|
DateTime? createdAt,
|
|
List<Channel>? channels,
|
|
List<Role>? roles,
|
|
List<Category>? categories,
|
|
}) : createdAt = createdAt ?? DateTime.now(),
|
|
channels = channels ?? [],
|
|
roles = roles ?? [],
|
|
categories = categories ?? [];
|
|
|
|
factory Guild.fromJson(Map<String, dynamic> json) {
|
|
return Guild(
|
|
id: json['id'] as String,
|
|
name: json['name'] as String,
|
|
ownerId: json['owner_id'] as String,
|
|
icon: json['icon'] as String?,
|
|
description: json['description'] as String?,
|
|
createdAt: json['created_at'] != null
|
|
? DateTime.parse(json['created_at'] as String)
|
|
: DateTime.now(),
|
|
);
|
|
}
|
|
}
|
|
|
|
class Category {
|
|
final String id;
|
|
final String name;
|
|
final int position;
|
|
|
|
Category({
|
|
required this.id,
|
|
required this.name,
|
|
required this.position,
|
|
});
|
|
|
|
factory Category.fromJson(Map<String, dynamic> json) {
|
|
return Category(
|
|
id: json['id'] as String,
|
|
name: json['name'] as String,
|
|
position: json['position'] as int? ?? 0,
|
|
);
|
|
}
|
|
}
|