2020-02-10 09:23:10 +00:00
|
|
|
package models
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
|
|
|
type EntityIDType string
|
|
|
|
|
|
|
|
const (
|
|
|
|
UsernameType EntityIDType = "@"
|
2021-03-30 19:40:02 +00:00
|
|
|
ChatAliasType EntityIDType = "#"
|
|
|
|
ChatIDType EntityIDType = "!"
|
2021-04-24 21:09:42 +00:00
|
|
|
ThirdPIDType EntityIDType = "%"
|
|
|
|
OtherType EntityIDType = "&"
|
2020-02-10 09:23:10 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
type EntityID struct {
|
2021-04-24 21:56:20 +00:00
|
|
|
Type EntityIDType
|
|
|
|
LocalPart string
|
|
|
|
ServerPart string
|
|
|
|
Attr string
|
|
|
|
OnlyServerPart bool
|
2020-02-10 09:23:10 +00:00
|
|
|
}
|
|
|
|
|
2021-03-30 19:40:02 +00:00
|
|
|
func NewEntityIDFromString(entityID string) (*EntityID, error) {
|
|
|
|
eid := &EntityID{}
|
|
|
|
typ := string(entityID[0])
|
2021-04-24 21:09:42 +00:00
|
|
|
withAttr := false
|
2021-04-24 21:56:20 +00:00
|
|
|
localAndServerPart := strings.Split(entityID, "@")
|
|
|
|
if localAndServerPart[0] == "" {
|
|
|
|
localAndServerPart = localAndServerPart[1:]
|
|
|
|
}
|
|
|
|
if len(localAndServerPart) == 1 {
|
|
|
|
eid.ServerPart = localAndServerPart[0]
|
|
|
|
eid.OnlyServerPart = true
|
|
|
|
return eid, nil
|
|
|
|
}
|
2021-04-24 21:09:42 +00:00
|
|
|
|
2021-03-30 19:40:02 +00:00
|
|
|
switch EntityIDType(typ) {
|
2020-02-10 09:23:10 +00:00
|
|
|
case UsernameType:
|
2021-03-30 19:40:02 +00:00
|
|
|
fallthrough
|
|
|
|
case ChatAliasType:
|
|
|
|
fallthrough
|
|
|
|
case ChatIDType:
|
2020-02-10 09:23:10 +00:00
|
|
|
{
|
2021-04-24 21:09:42 +00:00
|
|
|
eid.Type = EntityIDType(typ)
|
|
|
|
}
|
|
|
|
case ThirdPIDType:
|
|
|
|
fallthrough
|
|
|
|
case OtherType:
|
|
|
|
{
|
|
|
|
eid.Type = EntityIDType(typ)
|
|
|
|
withAttr = true
|
2020-02-10 09:23:10 +00:00
|
|
|
}
|
2021-03-30 19:40:02 +00:00
|
|
|
default:
|
|
|
|
return nil, fmt.Errorf("invalid entity id type: %s", typ)
|
2020-02-10 09:23:10 +00:00
|
|
|
}
|
2021-03-30 19:40:02 +00:00
|
|
|
|
2021-04-24 21:09:42 +00:00
|
|
|
if !withAttr {
|
|
|
|
eid.LocalPart = localAndServerPart[0]
|
|
|
|
eid.ServerPart = localAndServerPart[1]
|
|
|
|
} else {
|
|
|
|
attrAndLocal := strings.Split(localAndServerPart[0], ":")
|
|
|
|
attr := attrAndLocal[0][1:]
|
|
|
|
eid.Attr = attr
|
|
|
|
eid.LocalPart = attrAndLocal[1]
|
|
|
|
eid.ServerPart = localAndServerPart[len(localAndServerPart)-1]
|
2020-02-10 09:23:10 +00:00
|
|
|
}
|
2021-03-30 19:40:02 +00:00
|
|
|
|
|
|
|
return eid, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewEntityID(typ, localPart, serverPart string) (*EntityID, error) {
|
|
|
|
eid := &EntityID{}
|
|
|
|
|
|
|
|
switch EntityIDType(typ) {
|
|
|
|
case UsernameType:
|
|
|
|
fallthrough
|
|
|
|
case ChatAliasType:
|
|
|
|
fallthrough
|
|
|
|
case ChatIDType:
|
|
|
|
{
|
2021-04-24 21:09:42 +00:00
|
|
|
eid.Type = EntityIDType(typ)
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
return nil, fmt.Errorf("invalid entity id type: %s", typ)
|
|
|
|
}
|
|
|
|
|
|
|
|
eid.LocalPart = localPart
|
|
|
|
eid.ServerPart = serverPart
|
|
|
|
|
|
|
|
return eid, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewEntityIDWithAttr(typ, attr, localPart, serverPart string) (*EntityID, error) {
|
|
|
|
eid := &EntityID{}
|
|
|
|
|
|
|
|
switch EntityIDType(typ) {
|
|
|
|
case OtherType:
|
|
|
|
fallthrough
|
|
|
|
case ThirdPIDType:
|
|
|
|
{
|
|
|
|
eid.Type = EntityIDType(typ)
|
2021-03-30 19:40:02 +00:00
|
|
|
}
|
|
|
|
default:
|
|
|
|
return nil, fmt.Errorf("invalid entity id type: %s", typ)
|
|
|
|
}
|
|
|
|
|
2021-04-24 21:09:42 +00:00
|
|
|
eid.Attr = attr
|
2021-03-30 19:40:02 +00:00
|
|
|
eid.LocalPart = localPart
|
|
|
|
eid.ServerPart = serverPart
|
2020-02-10 09:23:10 +00:00
|
|
|
|
2021-03-30 19:40:02 +00:00
|
|
|
return eid, nil
|
2020-02-10 09:23:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (eID *EntityID) String() string {
|
2021-04-24 21:09:42 +00:00
|
|
|
if eID.Attr != "" {
|
|
|
|
return fmt.Sprintf("%s%s:%s@%s", eID.Type, eID.Attr, eID.LocalPart, eID.ServerPart)
|
|
|
|
}
|
|
|
|
return fmt.Sprintf("%s%s@%s", eID.Type, eID.LocalPart, eID.ServerPart)
|
2020-02-10 09:23:10 +00:00
|
|
|
}
|