Initial commit: JustAMessenger v0.1.0

Серверная часть (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 — спецификация протокола
This commit is contained in:
SashegDev
2026-06-06 22:39:14 +00:00
commit 096c4d0a2d
40 changed files with 5054 additions and 0 deletions
+62
View File
@@ -0,0 +1,62 @@
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,
);
}
}