diff --git a/mtproto/rpc/rpc_proxy_flags.go b/mtproto/rpc/rpc_proxy_flags.go new file mode 100644 index 0000000..8e0f202 --- /dev/null +++ b/mtproto/rpc/rpc_proxy_flags.go @@ -0,0 +1,51 @@ +package rpc + +import ( + "bytes" + "encoding/binary" + + "github.com/9seconds/mtg/mtproto" +) + +type RPCProxyRequestFlags uint32 + +const ( + RPCProxyRequestFlagsHasAdTag RPCProxyRequestFlags = 0x8 + RPCProxyRequestFlagsEncrypted = 0x2 + RPCProxyRequestFlagsMagic = 0x1000 + RPCProxyRequestFlagsExtMode2 = 0x20000 + RPCProxyRequestFlagsIntermediate = 0x20000000 + RPCProxyRequestFlagsAbdridged = 0x40000000 + RPCProxyRequestFlagsQuickAck = 0x80000000 +) + +var rpcProxyRequestFlagsEncryptedPrefix [8]byte + +func (r RPCProxyRequestFlags) Bytes() []byte { + converted := make([]byte, 4) + binary.LittleEndian.PutUint32(converted, uint32(r)) + + return converted +} + +func NewRPCRproxyRequestFlags(connectionType mtproto.ConnectionType, quickAck bool, message []byte) RPCProxyRequestFlags { + flags := RPCProxyRequestFlagsHasAdTag + flags |= RPCProxyRequestFlagsMagic + flags |= RPCProxyRequestFlagsExtMode2 + + switch connectionType { + case mtproto.ConnectionTypeAbridged: + flags |= RPCProxyRequestFlagsAbdridged + case mtproto.ConnectionTypeIntermediate: + flags |= RPCProxyRequestFlagsIntermediate + } + + if quickAck { + flags |= RPCProxyRequestFlagsQuickAck + } + if bytes.HasPrefix(message, rpcProxyRequestFlagsEncryptedPrefix[:]) { + flags |= RPCProxyRequestFlagsEncrypted + } + + return flags +}