message storage and from removed from packedusermessage (weakness)
	
		
			
	
		
	
	
		
	
		
			Some checks failed
		
		
	
	
		
			
				
	
				continuous-integration/drone/push Build is failing
				
			
		
		
	
	
				
					
				
			
		
			Some checks failed
		
		
	
	continuous-integration/drone/push Build is failing
				
			This commit is contained in:
		@@ -2,10 +2,38 @@ package client
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import "forge.redroom.link/yves/meowlib"
 | 
					import "forge.redroom.link/yves/meowlib"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						Inbound  = 0
 | 
				
			||||||
 | 
						Outbound = 1
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type InternalUserMessage struct {
 | 
					type InternalUserMessage struct {
 | 
				
			||||||
	Message *meowlib.UserMessage
 | 
						Direction          int // 0 = inbound, 1 = outbound
 | 
				
			||||||
	Dbfile  string
 | 
						Messagetype        string
 | 
				
			||||||
	Dbid    int64
 | 
						Message            string
 | 
				
			||||||
 | 
						ConversationStatus *meowlib.ConversationStatus
 | 
				
			||||||
 | 
						Contact            *meowlib.ContactCard
 | 
				
			||||||
 | 
						//Group group
 | 
				
			||||||
 | 
						FilePaths       []string
 | 
				
			||||||
 | 
						CurrentLocation meowlib.Location
 | 
				
			||||||
 | 
						appdata         []byte
 | 
				
			||||||
 | 
						Dbfile          string
 | 
				
			||||||
 | 
						Dbid            int64
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// InternalUserMessageFromUserMessage creates an InternalUserMessage from a UserMessage
 | 
				
			||||||
 | 
					func InternalUserMessageFromUserMessage(peer *Peer, msg *meowlib.UserMessage) *InternalUserMessage {
 | 
				
			||||||
 | 
						iu := new(InternalUserMessage)
 | 
				
			||||||
 | 
						if peer.ContactPublicKey == msg.From {
 | 
				
			||||||
 | 
							iu.Direction = Inbound
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							iu.Direction = Outbound
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						iu.Messagetype = msg.Type
 | 
				
			||||||
 | 
						iu.Message = string(msg.Data)
 | 
				
			||||||
 | 
						iu.ConversationStatus = msg.Status
 | 
				
			||||||
 | 
						iu.Contact = msg.Contact
 | 
				
			||||||
 | 
						return iu
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func ProcessOutboundTextMessage(peer *Peer, text string, srv *Server) ([]byte, error) {
 | 
					func ProcessOutboundTextMessage(peer *Peer, text string, srv *Server) ([]byte, error) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -74,8 +74,8 @@ func StoreMessage(peer *Peer, usermessage *meowlib.UserMessage, password string)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Get new messages from a peer
 | 
					// Get new messages from a peer
 | 
				
			||||||
func GetNewMessages(peer *Peer, lastDbId int, password string) ([]InternalUserMessage, error) {
 | 
					func GetNewMessages(peer *Peer, lastDbId int, password string) ([]*InternalUserMessage, error) {
 | 
				
			||||||
	var messages []InternalUserMessage
 | 
						var messages []*InternalUserMessage
 | 
				
			||||||
	fileidx := len(peer.DbIds) - 1
 | 
						fileidx := len(peer.DbIds) - 1
 | 
				
			||||||
	// There fileidx should provide the db that we need (unless wantMore overlaps the next DB)
 | 
						// There fileidx should provide the db that we need (unless wantMore overlaps the next DB)
 | 
				
			||||||
	db, _ := sql.Open("sqlite3", filepath.Join(GetConfig().StoragePath, peer.DbIds[fileidx]+GetConfig().DbSuffix)) // Open the created SQLite File
 | 
						db, _ := sql.Open("sqlite3", filepath.Join(GetConfig().StoragePath, peer.DbIds[fileidx]+GetConfig().DbSuffix)) // Open the created SQLite File
 | 
				
			||||||
@@ -96,7 +96,7 @@ func GetNewMessages(peer *Peer, lastDbId int, password string) ([]InternalUserMe
 | 
				
			|||||||
	defer rows.Close()
 | 
						defer rows.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for rows.Next() {
 | 
						for rows.Next() {
 | 
				
			||||||
		var ium InternalUserMessage
 | 
							var ium *InternalUserMessage
 | 
				
			||||||
		var um meowlib.UserMessage
 | 
							var um meowlib.UserMessage
 | 
				
			||||||
		var id int64
 | 
							var id int64
 | 
				
			||||||
		var m []byte
 | 
							var m []byte
 | 
				
			||||||
@@ -112,9 +112,10 @@ func GetNewMessages(peer *Peer, lastDbId int, password string) ([]InternalUserMe
 | 
				
			|||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, err
 | 
								return nil, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ium = InternalUserMessageFromUserMessage(peer, &um)
 | 
				
			||||||
		ium.Dbid = id
 | 
							ium.Dbid = id
 | 
				
			||||||
		ium.Dbfile = peer.DbIds[fileidx]
 | 
							ium.Dbfile = peer.DbIds[fileidx]
 | 
				
			||||||
		ium.Message = &um
 | 
					 | 
				
			||||||
		messages = append(messages, ium)
 | 
							messages = append(messages, ium)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// TODO DB overlap
 | 
						// TODO DB overlap
 | 
				
			||||||
@@ -122,8 +123,8 @@ func GetNewMessages(peer *Peer, lastDbId int, password string) ([]InternalUserMe
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Get old messages from a peer
 | 
					// Get old messages from a peer
 | 
				
			||||||
func GetMessagesHistory(peer *Peer, inAppMsgCount int, lastDbId int, wantMore int, password string) ([]InternalUserMessage, error) {
 | 
					func GetMessagesHistory(peer *Peer, inAppMsgCount int, lastDbId int, wantMore int, password string) ([]*InternalUserMessage, error) {
 | 
				
			||||||
	var messages []InternalUserMessage
 | 
						var messages []*InternalUserMessage
 | 
				
			||||||
	fileidx := len(peer.DbIds) - 1
 | 
						fileidx := len(peer.DbIds) - 1
 | 
				
			||||||
	// initialize count with last db message count
 | 
						// initialize count with last db message count
 | 
				
			||||||
	countStack, err := getMessageCount(peer.DbIds[fileidx])
 | 
						countStack, err := getMessageCount(peer.DbIds[fileidx])
 | 
				
			||||||
@@ -177,9 +178,10 @@ func GetMessagesHistory(peer *Peer, inAppMsgCount int, lastDbId int, wantMore in
 | 
				
			|||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, err
 | 
								return nil, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ium = InternalUserMessageFromUserMessage(peer, &um)
 | 
				
			||||||
		ium.Dbid = id
 | 
							ium.Dbid = id
 | 
				
			||||||
		ium.Dbfile = peer.DbIds[fileidx]
 | 
							ium.Dbfile = peer.DbIds[fileidx]
 | 
				
			||||||
		ium.Message = &um
 | 
					 | 
				
			||||||
		messages = append(messages, ium)
 | 
							messages = append(messages, ium)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// TODO DB overlap
 | 
						// TODO DB overlap
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,7 +24,7 @@ func TestStoreMessage(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	// Checks
 | 
						// Checks
 | 
				
			||||||
	assert.Equal(t, len(messages), 1, "not 1 message")
 | 
						assert.Equal(t, len(messages), 1, "not 1 message")
 | 
				
			||||||
	assert.Equal(t, messages[0].Message.Data, um.Data, "not 1 message")
 | 
						assert.Equal(t, messages[0].Message, um.Data, "not 1 message")
 | 
				
			||||||
	// Cleanup
 | 
						// Cleanup
 | 
				
			||||||
	if exists("test.id") {
 | 
						if exists("test.id") {
 | 
				
			||||||
		os.Remove("test.id")
 | 
							os.Remove("test.id")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,17 +35,19 @@ type Peer struct {
 | 
				
			|||||||
	InvitationUrl      string    `json:"invitation_url,omitempty"`
 | 
						InvitationUrl      string    `json:"invitation_url,omitempty"`
 | 
				
			||||||
	InvitationMessage  string    `json:"invitation_message,omitempty"`
 | 
						InvitationMessage  string    `json:"invitation_message,omitempty"`
 | 
				
			||||||
	InvitationExpiry   time.Time `json:"invitation_expiry,omitempty"`
 | 
						InvitationExpiry   time.Time `json:"invitation_expiry,omitempty"`
 | 
				
			||||||
 | 
						LastMessage        string    `json:"last_message,omitempty"`
 | 
				
			||||||
 | 
						LastMessageDate    int64     `json:"last_message_date,omitempty"`
 | 
				
			||||||
 | 
						LastMessageStatus  string    `json:"last_message_status,omitempty"`
 | 
				
			||||||
	// Internal management attributes
 | 
						// Internal management attributes
 | 
				
			||||||
	Visible             bool      `json:"visible,omitempty"`
 | 
						Visible             bool     `json:"visible,omitempty"`
 | 
				
			||||||
	VisiblePassword     string    `json:"visible_password,omitempty"`
 | 
						VisiblePassword     string   `json:"visible_password,omitempty"`
 | 
				
			||||||
	PasswordType        string    `json:"password_type,omitempty"`
 | 
						PasswordType        string   `json:"password_type,omitempty"`
 | 
				
			||||||
	Blocked             bool      `json:"blocked,omitempty"`
 | 
						Blocked             bool     `json:"blocked,omitempty"`
 | 
				
			||||||
	MessageNotification string    `json:"message_notification,omitempty"`
 | 
						MessageNotification string   `json:"message_notification,omitempty"`
 | 
				
			||||||
	MatriochkaMode      bool      `json:"matriochka_mode,omitempty"`
 | 
						MatriochkaMode      bool     `json:"matriochka_mode,omitempty"`
 | 
				
			||||||
	DirectMode          bool      `json:"direct_mode,omitempty"`
 | 
						DirectMode          bool     `json:"direct_mode,omitempty"`
 | 
				
			||||||
	LastMessage         time.Time `json:"last_message,omitempty"`
 | 
						DbIds               []string `json:"db_ids,omitempty"`
 | 
				
			||||||
	DbIds               []string  `json:"db_ids,omitempty"`
 | 
						IsDevice            bool     `json:"is_device,omitempty"`
 | 
				
			||||||
	IsDevice            bool      `json:"is_device,omitempty"`
 | 
					 | 
				
			||||||
	dbPassword          string
 | 
						dbPassword          string
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -213,7 +215,6 @@ func (p *Peer) AsymDecryptMessage(Message []byte, Signature []byte) (DecryptedMe
 | 
				
			|||||||
// PackUserMessage will package the previously encrypted message
 | 
					// PackUserMessage will package the previously encrypted message
 | 
				
			||||||
func (p *Peer) PackUserMessage(message []byte, signature []byte) *meowlib.PackedUserMessage {
 | 
					func (p *Peer) PackUserMessage(message []byte, signature []byte) *meowlib.PackedUserMessage {
 | 
				
			||||||
	var msg meowlib.PackedUserMessage
 | 
						var msg meowlib.PackedUserMessage
 | 
				
			||||||
	msg.From = p.MyIdentity.Public
 | 
					 | 
				
			||||||
	msg.Destination = p.ContactLookupKey
 | 
						msg.Destination = p.ContactLookupKey
 | 
				
			||||||
	msg.Payload = message
 | 
						msg.Payload = message
 | 
				
			||||||
	msg.Signature = signature
 | 
						msg.Signature = signature
 | 
				
			||||||
@@ -287,12 +288,12 @@ func (p *Peer) UpdateMessage(msg InternalUserMessage) error {
 | 
				
			|||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (p *Peer) LoadLastMessages(alreadyLoadedCount int, oldestMessageId int, qty int) ([]InternalUserMessage, error) {
 | 
					func (p *Peer) LoadLastMessages(alreadyLoadedCount int, oldestMessageId int, qty int) ([]*InternalUserMessage, error) {
 | 
				
			||||||
	return GetMessagesHistory(p, alreadyLoadedCount, oldestMessageId, 1, p.GetDbPassword())
 | 
						return GetMessagesHistory(p, alreadyLoadedCount, oldestMessageId, 1, p.GetDbPassword())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (p *Peer) LoadNewMessages(lastMessageId int) ([]InternalUserMessage, error) {
 | 
					func (p *Peer) LoadNewMessages(lastMessageId int) ([]*InternalUserMessage, error) {
 | 
				
			||||||
	return GetNewMessages(p, lastMessageId, p.GetDbPassword())
 | 
						return GetNewMessages(p, lastMessageId, p.GetDbPassword())
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										168
									
								
								messages.pb.go
									
									
									
									
									
								
							
							
						
						
									
										168
									
								
								messages.pb.go
									
									
									
									
									
								
							@@ -956,10 +956,9 @@ type PackedUserMessage struct {
 | 
				
			|||||||
	unknownFields protoimpl.UnknownFields
 | 
						unknownFields protoimpl.UnknownFields
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Destination     string  `protobuf:"bytes,1,opt,name=destination,proto3" json:"destination,omitempty"`                 // the peer's current conversation lookup public key
 | 
						Destination     string  `protobuf:"bytes,1,opt,name=destination,proto3" json:"destination,omitempty"`                 // the peer's current conversation lookup public key
 | 
				
			||||||
	From            string  `protobuf:"bytes,2,opt,name=from,proto3" json:"from,omitempty"`                               // the sender public key
 | 
						Payload         []byte  `protobuf:"bytes,2,opt,name=payload,proto3" json:"payload,omitempty"`                         // the message UserMessage encrypted with the destination peer's public key
 | 
				
			||||||
	Payload         []byte  `protobuf:"bytes,3,opt,name=payload,proto3" json:"payload,omitempty"`                         // the message UserMessage encrypted with the destination peer's public key
 | 
						Signature       []byte  `protobuf:"bytes,3,opt,name=signature,proto3" json:"signature,omitempty"`                     // the payload signature with the client identity private key
 | 
				
			||||||
	Signature       []byte  `protobuf:"bytes,4,opt,name=signature,proto3" json:"signature,omitempty"`                     // the payload signature with the client identity private key
 | 
						ServerTimestamp []int64 `protobuf:"varint,4,rep,packed,name=serverTimestamp,proto3" json:"serverTimestamp,omitempty"` // server time stamp, might be several in matriochka mode
 | 
				
			||||||
	ServerTimestamp []int64 `protobuf:"varint,5,rep,packed,name=serverTimestamp,proto3" json:"serverTimestamp,omitempty"` // server time stamp, might be several in matriochka mode
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *PackedUserMessage) Reset() {
 | 
					func (x *PackedUserMessage) Reset() {
 | 
				
			||||||
@@ -1001,13 +1000,6 @@ func (x *PackedUserMessage) GetDestination() string {
 | 
				
			|||||||
	return ""
 | 
						return ""
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *PackedUserMessage) GetFrom() string {
 | 
					 | 
				
			||||||
	if x != nil {
 | 
					 | 
				
			||||||
		return x.From
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return ""
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (x *PackedUserMessage) GetPayload() []byte {
 | 
					func (x *PackedUserMessage) GetPayload() []byte {
 | 
				
			||||||
	if x != nil {
 | 
						if x != nil {
 | 
				
			||||||
		return x.Payload
 | 
							return x.Payload
 | 
				
			||||||
@@ -1607,87 +1599,85 @@ var file_messages_proto_rawDesc = []byte{
 | 
				
			|||||||
	0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x12, 0x69, 0x6e, 0x76,
 | 
						0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x12, 0x69, 0x6e, 0x76,
 | 
				
			||||||
	0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18,
 | 
						0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18,
 | 
				
			||||||
	0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f,
 | 
						0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f,
 | 
				
			||||||
	0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xab, 0x01, 0x0a, 0x11, 0x50, 0x61, 0x63,
 | 
						0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x97, 0x01, 0x0a, 0x11, 0x50, 0x61, 0x63,
 | 
				
			||||||
	0x6b, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x20,
 | 
						0x6b, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x20,
 | 
				
			||||||
	0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20,
 | 
						0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20,
 | 
				
			||||||
	0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e,
 | 
						0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e,
 | 
				
			||||||
	0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
 | 
						0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,
 | 
				
			||||||
	0x66, 0x72, 0x6f, 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18,
 | 
						0x0c, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69,
 | 
				
			||||||
	0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1c,
 | 
						0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73,
 | 
				
			||||||
	0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28,
 | 
						0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x73, 0x65, 0x72, 0x76,
 | 
				
			||||||
	0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x28, 0x0a, 0x0f,
 | 
						0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28,
 | 
				
			||||||
	0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18,
 | 
						0x03, 0x52, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
 | 
				
			||||||
	0x05, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d,
 | 
						0x6d, 0x70, 0x22, 0x96, 0x02, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74,
 | 
				
			||||||
	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x96, 0x02, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x76, 0x65,
 | 
						0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x63,
 | 
				
			||||||
	0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x0a,
 | 
						0x61, 0x6c, 0x55, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f,
 | 
				
			||||||
	0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x55, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
 | 
						0x63, 0x61, 0x6c, 0x55, 0x75, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x6c,
 | 
				
			||||||
	0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x55, 0x75, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x6c,
 | 
						0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d,
 | 
				
			||||||
	0x6f, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01,
 | 
						0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a,
 | 
				
			||||||
	0x28, 0x04, 0x52, 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63,
 | 
						0x04, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x65, 0x6e,
 | 
				
			||||||
	0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52,
 | 
						0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x18, 0x04, 0x20,
 | 
				
			||||||
	0x04, 0x73, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65,
 | 
						0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x12, 0x1c, 0x0a,
 | 
				
			||||||
	0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65,
 | 
						0x09, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04,
 | 
				
			||||||
	0x64, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x05,
 | 
						0x52, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x3c, 0x0a, 0x0e, 0x6d,
 | 
				
			||||||
	0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12,
 | 
						0x79, 0x4e, 0x65, 0x78, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20,
 | 
				
			||||||
	0x3c, 0x0a, 0x0e, 0x6d, 0x79, 0x4e, 0x65, 0x78, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74,
 | 
						0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x43, 0x6f,
 | 
				
			||||||
	0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69,
 | 
						0x6e, 0x74, 0x61, 0x63, 0x74, 0x43, 0x61, 0x72, 0x64, 0x52, 0x0e, 0x6d, 0x79, 0x4e, 0x65, 0x78,
 | 
				
			||||||
	0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x43, 0x61, 0x72, 0x64, 0x52, 0x0e, 0x6d,
 | 
						0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x30, 0x0a, 0x13, 0x70, 0x65, 0x65,
 | 
				
			||||||
	0x79, 0x4e, 0x65, 0x78, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x30, 0x0a,
 | 
						0x72, 0x4e, 0x65, 0x78, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x41, 0x63, 0x6b,
 | 
				
			||||||
	0x13, 0x70, 0x65, 0x65, 0x72, 0x4e, 0x65, 0x78, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74,
 | 
						0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x70, 0x65, 0x65, 0x72, 0x4e, 0x65, 0x78, 0x74,
 | 
				
			||||||
	0x79, 0x41, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x70, 0x65, 0x65, 0x72,
 | 
						0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x41, 0x63, 0x6b, 0x22, 0x4b, 0x0a, 0x05, 0x47,
 | 
				
			||||||
	0x4e, 0x65, 0x78, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x41, 0x63, 0x6b, 0x22,
 | 
						0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,
 | 
				
			||||||
	0x4b, 0x0a, 0x05, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
 | 
						0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x6d, 0x65, 0x6d, 0x62,
 | 
				
			||||||
	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x07,
 | 
						0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x65, 0x6f, 0x77,
 | 
				
			||||||
	0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e,
 | 
						0x6c, 0x69, 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x43, 0x61, 0x72, 0x64, 0x52,
 | 
				
			||||||
	0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x43,
 | 
						0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x22, 0xe0, 0x03, 0x0a, 0x0b, 0x55, 0x73, 0x65,
 | 
				
			||||||
	0x61, 0x72, 0x64, 0x52, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x22, 0xe0, 0x03, 0x0a,
 | 
						0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74,
 | 
				
			||||||
	0x0b, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b,
 | 
						0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64,
 | 
				
			||||||
	0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28,
 | 
						0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72,
 | 
				
			||||||
	0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12,
 | 
						0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x12,
 | 
				
			||||||
	0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x72,
 | 
						0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79,
 | 
				
			||||||
	0x6f, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
 | 
						0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c,
 | 
				
			||||||
	0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04,
 | 
						0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x33, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
 | 
				
			||||||
	0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x33, 0x0a, 0x06, 0x53, 0x74,
 | 
						0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62,
 | 
				
			||||||
	0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x65, 0x6f,
 | 
						0x2e, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61,
 | 
				
			||||||
	0x77, 0x6c, 0x69, 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f,
 | 
						0x74, 0x75, 0x73, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2e, 0x0a, 0x07, 0x63,
 | 
				
			||||||
	0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12,
 | 
						0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d,
 | 
				
			||||||
	0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b,
 | 
						0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x43, 0x61,
 | 
				
			||||||
	0x32, 0x14, 0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61,
 | 
						0x72, 0x64, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x12, 0x37, 0x0a, 0x0c, 0x6b,
 | 
				
			||||||
	0x63, 0x74, 0x43, 0x61, 0x72, 0x64, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x12,
 | 
						0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28,
 | 
				
			||||||
	0x37, 0x0a, 0x0c, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18,
 | 
						0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76,
 | 
				
			||||||
	0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e,
 | 
						0x65, 0x72, 0x43, 0x61, 0x72, 0x64, 0x52, 0x0c, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x65, 0x72,
 | 
				
			||||||
	0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x61, 0x72, 0x64, 0x52, 0x0c, 0x6b, 0x6e, 0x6f, 0x77,
 | 
						0x76, 0x65, 0x72, 0x73, 0x12, 0x24, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x08, 0x20,
 | 
				
			||||||
	0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x24, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75,
 | 
						0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x47, 0x72,
 | 
				
			||||||
	0x70, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69,
 | 
						0x6f, 0x75, 0x70, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x23, 0x0a, 0x05, 0x66, 0x69,
 | 
				
			||||||
	0x62, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x23,
 | 
						0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x6d, 0x65, 0x6f, 0x77,
 | 
				
			||||||
	0x0a, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e,
 | 
						0x6c, 0x69, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12,
 | 
				
			||||||
	0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x66, 0x69,
 | 
						0x3b, 0x0a, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69,
 | 
				
			||||||
	0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x6f,
 | 
						0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c,
 | 
				
			||||||
	0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d,
 | 
						0x69, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x63, 0x75, 0x72,
 | 
				
			||||||
	0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52,
 | 
						0x72, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07,
 | 
				
			||||||
	0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
 | 
						0x61, 0x70, 0x70, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61,
 | 
				
			||||||
	0x12, 0x18, 0x0a, 0x07, 0x61, 0x70, 0x70, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0b, 0x20, 0x01, 0x28,
 | 
						0x70, 0x70, 0x64, 0x61, 0x74, 0x61, 0x12, 0x33, 0x0a, 0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61,
 | 
				
			||||||
	0x0c, 0x52, 0x07, 0x61, 0x70, 0x70, 0x64, 0x61, 0x74, 0x61, 0x12, 0x33, 0x0a, 0x0a, 0x69, 0x6e,
 | 
						0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x65, 0x6f,
 | 
				
			||||||
	0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
 | 
						0x77, 0x6c, 0x69, 0x62, 0x2e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52,
 | 
				
			||||||
	0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74,
 | 
						0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x60, 0x0a, 0x04, 0x46,
 | 
				
			||||||
	0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22,
 | 
						0x69, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18,
 | 
				
			||||||
	0x60, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e,
 | 
						0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12,
 | 
				
			||||||
	0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e,
 | 
						0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73,
 | 
				
			||||||
	0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
 | 
						0x69, 0x7a, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x18, 0x03, 0x20, 0x01,
 | 
				
			||||||
	0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b,
 | 
						0x28, 0x0d, 0x52, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74,
 | 
				
			||||||
	0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x12, 0x0a,
 | 
						0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x74, 0x0a,
 | 
				
			||||||
	0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74,
 | 
						0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d,
 | 
				
			||||||
	0x61, 0x22, 0x74, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a,
 | 
						0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x1a, 0x0a,
 | 
				
			||||||
	0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x74, 0x69, 0x6d,
 | 
						0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52,
 | 
				
			||||||
	0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x02, 0x20,
 | 
						0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x6e,
 | 
				
			||||||
	0x01, 0x28, 0x02, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1c, 0x0a,
 | 
						0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x09, 0x6c, 0x6f,
 | 
				
			||||||
	0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02,
 | 
						0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x6c, 0x74, 0x69, 0x74,
 | 
				
			||||||
	0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x61,
 | 
						0x75, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x61, 0x6c, 0x74, 0x69, 0x74,
 | 
				
			||||||
	0x6c, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x61,
 | 
						0x75, 0x64, 0x65, 0x42, 0x21, 0x5a, 0x1f, 0x66, 0x6f, 0x72, 0x67, 0x65, 0x2e, 0x72, 0x65, 0x64,
 | 
				
			||||||
	0x6c, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x42, 0x21, 0x5a, 0x1f, 0x66, 0x6f, 0x72, 0x67, 0x65,
 | 
						0x72, 0x6f, 0x6f, 0x6d, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x2f, 0x79, 0x76, 0x65, 0x73, 0x2f, 0x6d,
 | 
				
			||||||
	0x2e, 0x72, 0x65, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x2f, 0x79, 0x76,
 | 
						0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 | 
				
			||||||
	0x65, 0x73, 0x2f, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
 | 
					 | 
				
			||||||
	0x6f, 0x33,
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,6 +30,7 @@ message Invitation {
 | 
				
			|||||||
    string uuid = 6; // id that the friend gave you, that you should include to your reply to get recognized
 | 
					    string uuid = 6; // id that the friend gave you, that you should include to your reply to get recognized
 | 
				
			||||||
    int64 expiry = 7; // the server allowed expiry date, it may be samller than the requested timeout according to server policy
 | 
					    int64 expiry = 7; // the server allowed expiry date, it may be samller than the requested timeout according to server policy
 | 
				
			||||||
    int32 step = 8; // progress in the inviattion process : 1=invite friend, 2=friend requests invitation, 3=friend's answer
 | 
					    int32 step = 8; // progress in the inviattion process : 1=invite friend, 2=friend requests invitation, 3=friend's answer
 | 
				
			||||||
 | 
					    string from=9; // used in step 3 the answer public key to check the signature in user message
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -131,10 +132,9 @@ message ContactCard {
 | 
				
			|||||||
// structure for sending a message to be forwarded to another user in protobuf format
 | 
					// structure for sending a message to be forwarded to another user in protobuf format
 | 
				
			||||||
message PackedUserMessage {
 | 
					message PackedUserMessage {
 | 
				
			||||||
	string destination=1; // the peer's current conversation lookup public key
 | 
						string destination=1; // the peer's current conversation lookup public key
 | 
				
			||||||
    string from=2; // the sender public key
 | 
					    bytes payload=2;  // the message UserMessage encrypted with the destination peer's public key
 | 
				
			||||||
    bytes payload=3;  // the message UserMessage encrypted with the destination peer's public key
 | 
						bytes signature=3; // the payload signature with the client identity private key
 | 
				
			||||||
	bytes signature=4; // the payload signature with the client identity private key
 | 
					    repeated int64 serverTimestamp=4; // server time stamp, might be several in matriochka mode
 | 
				
			||||||
    repeated int64 serverTimestamp=5; // server time stamp, might be several in matriochka mode
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
message ConversationStatus {
 | 
					message ConversationStatus {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user