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
+108
View File
@@ -0,0 +1,108 @@
package models
import "time"
type User struct {
ID string `json:"id"`
Username string `json:"username"`
Avatar string `json:"avatar,omitempty"`
Bio string `json:"bio,omitempty"`
PublicKey []byte `json:"public_key"`
CreatedAt time.Time `json:"created_at"`
}
type Guild struct {
ID string `json:"id"`
Name string `json:"name"`
OwnerID string `json:"owner_id"`
Icon string `json:"icon,omitempty"`
Description string `json:"description,omitempty"`
CreatedAt time.Time `json:"created_at"`
}
type Channel struct {
ID string `json:"id"`
GuildID string `json:"guild_id"`
Name string `json:"name"`
Type string `json:"type"`
Topic string `json:"topic,omitempty"`
Position int `json:"position"`
Category string `json:"category,omitempty"`
CreatedAt time.Time `json:"created_at"`
}
type Role struct {
ID string `json:"id"`
GuildID string `json:"guild_id"`
Name string `json:"name"`
Color int `json:"color"`
Position int `json:"position"`
Permissions []string `json:"permissions"`
IsDefault bool `json:"is_default"`
}
type Message struct {
ID string `json:"id"`
ChannelID string `json:"channel_id"`
AuthorID string `json:"author_id"`
Content []byte `json:"content,omitempty"`
Encrypted bool `json:"encrypted"`
Nonce []byte `json:"nonce,omitempty"`
MessageType string `json:"message_type"`
ReplyTo string `json:"reply_to,omitempty"`
Attachments []string `json:"attachments,omitempty"`
EditedAt *time.Time `json:"edited_at,omitempty"`
Pinned bool `json:"pinned"`
SelfDestruct *time.Time `json:"self_destruct,omitempty"`
CreatedAt time.Time `json:"created_at"`
}
type VoiceState struct {
UserID string `json:"user_id"`
ChannelID string `json:"channel_id"`
GuildID string `json:"guild_id"`
Muted bool `json:"muted"`
Deafened bool `json:"deafened"`
}
type Stream struct {
ID string `json:"id"`
ChannelID string `json:"channel_id"`
UserID string `json:"user_id"`
Title string `json:"title"`
StartedAt time.Time `json:"started_at"`
}
type Reaction struct {
MessageID string `json:"message_id"`
UserID string `json:"user_id"`
Emoji string `json:"emoji"`
}
type Attachment struct {
ID string `json:"id"`
MessageID string `json:"message_id"`
Filename string `json:"filename"`
FileType string `json:"file_type"`
Size int64 `json:"size"`
Compressed bool `json:"compressed"`
OriginalSize int64 `json:"original_size,omitempty"`
URL string `json:"url"`
Hash string `json:"hash"`
}
type Sticker struct {
ID string `json:"id"`
GuildID string `json:"guild_id"`
Name string `json:"name"`
Data []byte `json:"data"`
Format string `json:"format"`
}
type FederationPeer struct {
Domain string `json:"domain"`
Name string `json:"name"`
PublicKey []byte `json:"public_key"`
LastSeen time.Time `json:"last_seen"`
IsActive bool `json:"is_active"`
}