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 }