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
+128
View File
@@ -0,0 +1,128 @@
package protocol
import "encoding/json"
type OpCode int
const (
OpHeartbeat OpCode = 0
OpHello OpCode = 1
OpAuthenticate OpCode = 2
OpAuthenticated OpCode = 3
OpError OpCode = 4
OpMessageCreate OpCode = 10
OpMessageUpdate OpCode = 11
OpMessageDelete OpCode = 12
OpMessageReaction OpCode = 13
OpChannelCreate OpCode = 20
OpChannelUpdate OpCode = 21
OpChannelDelete OpCode = 22
OpGuildCreate OpCode = 30
OpGuildUpdate OpCode = 31
OpGuildDelete OpCode = 32
OpGuildMemberAdd OpCode = 33
OpGuildMemberRemove OpCode = 34
OpVoiceStateUpdate OpCode = 40
OpStreamStart OpCode = 50
OpStreamEnd OpCode = 51
OpTypingStart OpCode = 60
OpTypingStop OpCode = 61
OpUserPresence OpCode = 70
OpUserUpdate OpCode = 71
OpFederationPacket OpCode = 80
OpCallOffer OpCode = 90
OpCallAnswer OpCode = 91
OpCallICE OpCode = 92
OpCallEnd OpCode = 93
)
type Packet struct {
Op OpCode `json:"op"`
Data json.RawMessage `json:"d,omitempty"`
Seq int64 `json:"s,omitempty"`
}
type HelloData struct {
HeartbeatInterval int `json:"heartbeat_interval"`
ServerName string `json:"server_name"`
ServerVersion string `json:"server_version"`
}
type AuthData struct {
Token string `json:"token"`
Username string `json:"username,omitempty"`
}
type MessageData struct {
ID string `json:"id"`
ChannelID string `json:"channel_id"`
Content []byte `json:"content,omitempty"`
Encrypted bool `json:"encrypted"`
Nonce []byte `json:"nonce,omitempty"`
MessageType string `json:"message_type,omitempty"`
ReplyTo string `json:"reply_to,omitempty"`
}
type ReactionData struct {
MessageID string `json:"message_id"`
Emoji string `json:"emoji"`
Add bool `json:"add"`
}
type VoiceStateData struct {
GuildID string `json:"guild_id"`
ChannelID string `json:"channel_id"`
Muted bool `json:"muted"`
Deafened bool `json:"deafened"`
}
type StreamData struct {
ChannelID string `json:"channel_id"`
Title string `json:"title"`
Action string `json:"action"`
}
type FederationData struct {
FromDomain string `json:"from_domain"`
TargetID string `json:"target_id"`
PacketType string `json:"packet_type"`
Payload json.RawMessage `json:"payload"`
Signature []byte `json:"signature"`
}
type CallData struct {
ChannelID string `json:"channel_id"`
Type string `json:"type"`
PeerID string `json:"peer_id,omitempty"`
SDP json.RawMessage `json:"sdp,omitempty"`
ICE json.RawMessage `json:"ice,omitempty"`
}
type ErrorData struct {
Code int `json:"code"`
Message string `json:"message"`
}
func NewPacket(op OpCode, data interface{}) (*Packet, error) {
raw, err := json.Marshal(data)
if err != nil {
return nil, err
}
return &Packet{Op: op, Data: raw}, nil
}
func MustPacket(op OpCode, data interface{}) *Packet {
p, err := NewPacket(op, data)
if err != nil {
panic(err)
}
return p
}