From 43cec2b3c145901d08fdc6b96ce9135c6b38dffc Mon Sep 17 00:00:00 2001 From: Amarnath C Date: Fri, 21 Oct 2022 19:13:20 +0530 Subject: [PATCH 1/3] Update utils.go --- internal/utils/utils.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/internal/utils/utils.go b/internal/utils/utils.go index 3de36d8..165ccc0 100644 --- a/internal/utils/utils.go +++ b/internal/utils/utils.go @@ -18,12 +18,16 @@ import ( // GenerateMessageId отдает по сути unix timestamp но ужасно специфическим образом // TODO: нахуя нужно битовое и на -4?? -func GenerateMessageId() int64 { +func GenerateMessageId(prevID int64) int64 { const billion = 1000 * 1000 * 1000 unixnano := time.Now().UnixNano() seconds := unixnano / billion nanoseconds := unixnano % billion - return (seconds << 32) | (nanoseconds & -4) + newID := (seconds << 32) | (nanoseconds & -4) + if newID <= prevID { + return GenerateMessageId(prevID) + } + return newID } func AuthKeyHash(key []byte) []byte { From 40c842f3e4d3d99281fd29651d5e6de7fbc16f67 Mon Sep 17 00:00:00 2001 From: Amarnath C Date: Fri, 21 Oct 2022 19:14:02 +0530 Subject: [PATCH 2/3] Update mtproto.go --- mtproto.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mtproto.go b/mtproto.go index 7ee97df..d998e03 100644 --- a/mtproto.go +++ b/mtproto.go @@ -53,6 +53,8 @@ type MTProto struct { // идентификаторы сообщений, нужны что бы посылать и принимать сообщения. seqNoMutex sync.Mutex seqNo int32 + lastMessageIDMutex sync.Mutex + lastMessageID int64 // айдишники DC для КОНКРЕТНОГО Приложения и клиента. Может меняться, но фиксирована для // связки приложение+клиент From cbbd4353bd46361de146b82925bcc2bcb31b6879 Mon Sep 17 00:00:00 2001 From: Amarnath C Date: Fri, 21 Oct 2022 19:14:55 +0530 Subject: [PATCH 3/3] Update network.go --- network.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/network.go b/network.go index e583c32..7131682 100644 --- a/network.go +++ b/network.go @@ -24,10 +24,13 @@ func (m *MTProto) sendPacket(request tl.Object, expectedTypes ...reflect.Type) ( return nil, errors.Wrap(err, "encoding request message") } + m.lastMessageIDMutex.Lock() var ( data messages.Common - msgID = utils.GenerateMessageId() + msgID = utils.GenerateMessageId(m.lastMessageID) ) + m.lastMessageIDMutex.Unlock() + m.lastMessageID = msgID // adding types for parser if required if len(expectedTypes) > 0 {