ids: add channel ID to message ID to ensure uniqueness (#25)

This commit is contained in:
Tulir Asokan
2024-08-26 20:42:06 +03:00
committed by GitHub
parent d7508579e5
commit e3e709eec6
8 changed files with 111 additions and 40 deletions
+65 -4
View File
@@ -25,16 +25,64 @@ func MakeUserLoginID(userID int64) networkid.UserLoginID {
return networkid.UserLoginID(strconv.FormatInt(userID, 10))
}
func MakeMessageID(messageID int) networkid.MessageID {
return networkid.MessageID(strconv.Itoa(messageID))
func GetMessageIDFromMessage(message tg.MessageClass) networkid.MessageID {
var peer tg.PeerClass
switch typedMsg := message.(type) {
case *tg.MessageEmpty:
peer, _ = typedMsg.GetPeerID()
case *tg.Message:
peer = typedMsg.GetPeerID()
case *tg.MessageService:
peer = typedMsg.GetPeerID()
default:
panic(fmt.Sprintf("unexpected message type %T", message))
}
return MakeMessageID(peer, message.GetID())
}
func MakeMessageID(rawChatID any, messageID int) networkid.MessageID {
var channelID int64
switch typedChatID := rawChatID.(type) {
case networkid.PortalKey:
if typedChatID.Receiver == "" {
_, channelID, _ = ParsePortalID(typedChatID.ID)
}
case *tg.PeerChannel:
channelID = typedChatID.ChannelID
case int64:
channelID = typedChatID
case *tg.PeerUser, *tg.PeerChat:
// No channel ID
case nil:
// Also no channel ID
default:
panic(fmt.Sprintf("unexpected chat ID type %T", rawChatID))
}
if channelID != 0 {
return networkid.MessageID(fmt.Sprintf("%d.%d", channelID, messageID))
}
return networkid.MessageID(fmt.Sprintf("%d", messageID))
}
func MakePaginationCursorID(messageID int) networkid.PaginationCursor {
return networkid.PaginationCursor(strconv.Itoa(messageID))
}
func ParseMessageID(messageID networkid.MessageID) (int, error) {
return strconv.Atoi(string(messageID))
func ParseMessageID(networkID networkid.MessageID) (channelID int64, messageID int, err error) {
parts := strings.Split(string(networkID), ".")
if len(parts) == 1 {
messageID, err = strconv.Atoi(parts[0])
} else if len(parts) == 2 {
channelID, err = strconv.ParseInt(parts[0], 10, 64)
if err != nil {
err = fmt.Errorf("failed to parse chat ID: %w", err)
return
}
messageID, err = strconv.Atoi(parts[1])
} else {
err = fmt.Errorf("invalid number of parts in message ID")
}
return
}
type PeerType string
@@ -81,6 +129,19 @@ func (pt PeerType) AsPortalKey(chatID int64, receiver networkid.UserLoginID) net
return portalKey
}
func GetChatID(peer tg.PeerClass) int64 {
switch v := peer.(type) {
case *tg.PeerUser:
return v.UserID
case *tg.PeerChat:
return v.ChatID
case *tg.PeerChannel:
return v.ChannelID
default:
panic(fmt.Errorf("unknown peer class type %T", v))
}
}
func MakePortalKey(peer tg.PeerClass, receiver networkid.UserLoginID) networkid.PortalKey {
switch v := peer.(type) {
case *tg.PeerUser: