Files
mautrix-telegram/pkg/connector/ids/ids.go
T
Sumner Evans 7e680f1fee reactions: support deletions
Signed-off-by: Sumner Evans <sumner.evans@automattic.com>
2024-07-09 14:04:49 -06:00

139 lines
3.5 KiB
Go

package ids
import (
"fmt"
"strconv"
"strings"
"github.com/gotd/td/tg"
"maunium.net/go/mautrix/bridgev2/networkid"
)
func MakeUserID(userID int64) networkid.UserID {
return networkid.UserID(strconv.FormatInt(userID, 10))
}
func ParseUserID(userID networkid.UserID) (int64, error) {
return strconv.ParseInt(string(userID), 10, 64)
}
func ParseUserLoginID(userID networkid.UserLoginID) (int64, error) {
return strconv.ParseInt(string(userID), 10, 64)
}
func MakeUserLoginID(userID int64) networkid.UserLoginID {
return networkid.UserLoginID(strconv.FormatInt(userID, 10))
}
// TODO: add space ID
func MakeMessageID(messageID int) networkid.MessageID {
return networkid.MessageID(strconv.Itoa(messageID))
}
func ParseMessageID(messageID networkid.MessageID) (int, error) {
return strconv.Atoi(string(messageID))
}
type PeerType string
const (
PeerTypeUser PeerType = "user"
PeerTypeChat PeerType = "chat"
PeerTypeChannel PeerType = "channel"
)
func PeerTypeFromByte(pt byte) (PeerType, error) {
switch pt {
case 0x01:
return PeerTypeUser, nil
case 0x02:
return PeerTypeChat, nil
case 0x03:
return PeerTypeChannel, nil
default:
return "", fmt.Errorf("unknown peer type %d", pt)
}
}
func (pt PeerType) AsByte() byte {
switch pt {
case PeerTypeUser:
return 0x01
case PeerTypeChat:
return 0x02
case PeerTypeChannel:
return 0x03
default:
panic(fmt.Errorf("unknown peer type %s", pt))
}
}
func (pt PeerType) AsPortalKey(chatID int64) networkid.PortalKey {
return networkid.PortalKey{ID: networkid.PortalID(fmt.Sprintf("%s:%d", pt, chatID))}
}
func MakePortalKey(peer tg.PeerClass) networkid.PortalKey {
switch v := peer.(type) {
case *tg.PeerUser:
return networkid.PortalKey{ID: networkid.PortalID(fmt.Sprintf("%s:%d", PeerTypeUser, v.UserID))}
case *tg.PeerChat:
return networkid.PortalKey{ID: networkid.PortalID(fmt.Sprintf("%s:%d", PeerTypeChat, v.ChatID))}
case *tg.PeerChannel:
return networkid.PortalKey{ID: networkid.PortalID(fmt.Sprintf("%s:%d", PeerTypeChannel, v.ChannelID))}
default:
panic(fmt.Errorf("unknown peer class type %T", v))
}
}
func ParsePortalID(portalID networkid.PortalID) (pt PeerType, id int64, err error) {
parts := strings.Split(string(portalID), ":")
pt = PeerType(parts[0])
id, err = strconv.ParseInt(parts[1], 10, 64)
return
}
func InputPeerForPortalID(portalID networkid.PortalID) (tg.InputPeerClass, error) {
peerType, id, err := ParsePortalID(portalID)
if err != nil {
return nil, err
}
switch peerType {
case PeerTypeUser:
return &tg.InputPeerUser{UserID: id}, nil
case PeerTypeChat:
return &tg.InputPeerChat{ChatID: id}, nil
case PeerTypeChannel:
return &tg.InputPeerChannel{ChannelID: id}, nil
default:
panic("invalid peer type")
}
}
func InputPeerForPortalKey(portalKey networkid.PortalKey) (tg.InputPeerClass, error) {
return InputPeerForPortalID(portalKey.ID)
}
func MakeAvatarID(photoID int64) networkid.AvatarID {
return networkid.AvatarID(strconv.FormatInt(photoID, 10))
}
func MakeEmojiIDFromDocumentID(documentID int64) networkid.EmojiID {
return networkid.EmojiID(fmt.Sprintf("d%d", documentID))
}
func MakeEmojiIDFromEmoticon(emoticon string) networkid.EmojiID {
return networkid.EmojiID(fmt.Sprintf("e%s", emoticon))
}
func ParseEmojiID(emojiID networkid.EmojiID) (documentID int64, emoticon string, err error) {
switch emojiID[0] {
case 'd':
documentID, err = strconv.ParseInt(string(emojiID[1:]), 10, 64)
case 'e':
emoticon = string(emojiID[1:])
default:
err = fmt.Errorf("invalid emoji ID type %s", string(emojiID[0]))
}
return
}