ids: add channel ID to message ID to ensure uniqueness (#25)
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user