1
0
Fork 0
mirror of https://github.com/mautrix/whatsapp.git synced 2026-05-15 10:16:52 -04:00
mautrix-whatsapp/pkg/waid/id.go

118 lines
3.5 KiB
Go
Raw Permalink Normal View History

2024-09-25 16:01:35 +03:00
// mautrix-whatsapp - A Matrix-WhatsApp puppeting bridge.
// Copyright (C) 2024 Tulir Asokan
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
2024-08-13 14:11:10 +03:00
package waid
import (
"fmt"
"strings"
"go.mau.fi/whatsmeow/types"
"maunium.net/go/mautrix/bridgev2/networkid"
)
2024-09-06 17:41:26 +03:00
func MakePortalID(jid types.JID) networkid.PortalID {
2024-08-15 18:14:49 +03:00
return networkid.PortalID(jid.ToNonAD().String())
2024-08-13 14:11:10 +03:00
}
2024-09-06 17:41:26 +03:00
func ParsePortalID(portal networkid.PortalID) (types.JID, error) {
parsed, err := types.ParseJID(string(portal))
if err != nil {
return types.EmptyJID, fmt.Errorf("invalid portal ID: %w", err)
2024-08-13 14:11:10 +03:00
}
2024-09-06 17:41:26 +03:00
return parsed, nil
2024-08-13 14:11:10 +03:00
}
2024-12-15 12:15:49 +02:00
const LIDPrefix = "lid-"
const BotPrefix = "bot-"
2024-12-15 12:15:49 +02:00
2024-09-06 17:41:26 +03:00
func MakeUserID(user types.JID) networkid.UserID {
2024-12-15 12:15:49 +02:00
switch user.Server {
case types.DefaultUserServer:
return networkid.UserID(user.User)
case types.BotServer:
return networkid.UserID(BotPrefix + user.User)
2024-12-15 12:15:49 +02:00
case types.HiddenUserServer:
return networkid.UserID(LIDPrefix + user.User)
default:
return ""
}
2024-08-13 14:11:10 +03:00
}
func ParseUserID(user networkid.UserID) types.JID {
2024-12-15 12:15:49 +02:00
if strings.HasPrefix(string(user), LIDPrefix) {
return types.NewJID(strings.TrimPrefix(string(user), LIDPrefix), types.HiddenUserServer)
} else if strings.HasPrefix(string(user), BotPrefix) {
return types.NewJID(strings.TrimPrefix(string(user), BotPrefix), types.BotServer)
2024-12-15 12:15:49 +02:00
}
return types.NewJID(string(user), types.DefaultUserServer)
}
2024-09-06 17:41:26 +03:00
func MakeUserLoginID(user types.JID) networkid.UserLoginID {
2024-12-15 12:15:49 +02:00
if user.Server != types.DefaultUserServer {
return ""
}
2024-09-06 17:41:26 +03:00
return networkid.UserLoginID(user.User)
}
func ParseUserLoginID(user networkid.UserLoginID, deviceID uint16) types.JID {
2024-11-06 17:15:03 +01:00
if user == "" {
return types.EmptyJID
}
2024-09-06 17:41:26 +03:00
return types.JID{
Server: types.DefaultUserServer,
User: string(user),
Device: deviceID,
}
2024-08-13 14:11:10 +03:00
}
func MakeMessageID(chat, sender types.JID, id types.MessageID) networkid.MessageID {
2024-08-15 18:14:49 +03:00
return networkid.MessageID(fmt.Sprintf("%s:%s:%s", chat.ToNonAD().String(), sender.ToNonAD().String(), id))
2024-08-13 14:11:10 +03:00
}
func MakeFakeMessageID(chat, sender types.JID, data string) networkid.MessageID {
return networkid.MessageID(fmt.Sprintf("fake:%s:%s:%s", chat.ToNonAD().String(), sender.ToNonAD().String(), data))
}
2024-08-13 14:11:10 +03:00
type ParsedMessageID struct {
Chat types.JID
Sender types.JID
ID types.MessageID
}
2024-11-06 13:14:12 +01:00
func (pmi *ParsedMessageID) String() networkid.MessageID {
return MakeMessageID(pmi.Chat, pmi.Sender, pmi.ID)
}
2024-08-13 14:11:10 +03:00
func ParseMessageID(messageID networkid.MessageID) (*ParsedMessageID, error) {
parts := strings.SplitN(string(messageID), ":", 3)
if len(parts) == 3 {
if parts[0] == "fake" || strings.HasPrefix(parts[2], "FAKE::") {
return nil, fmt.Errorf("fake message ID")
}
2024-08-13 14:11:10 +03:00
chat, err := types.ParseJID(parts[0])
if err != nil {
return nil, err
}
sender, err := types.ParseJID(parts[1])
if err != nil {
return nil, err
}
return &ParsedMessageID{Chat: chat, Sender: sender, ID: parts[2]}, nil
} else {
return nil, fmt.Errorf("invalid message ID")
2024-08-13 14:11:10 +03:00
}
}