-
Notifications
You must be signed in to change notification settings - Fork 0
/
jid.go
91 lines (77 loc) · 1.99 KB
/
jid.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package tdproto
import (
"encoding/json"
"log"
"strings"
"github.com/vmihailenco/msgpack/v5"
)
const (
ContactPrefix = "d-"
GroupPrefix = "g-"
TaskPrefix = "t-"
ContactSectionPrefix = "sd-"
GroupSectionPrefix = "sg-"
TaskSectionPrefix = "st-"
)
type HasJid interface {
JID() JID
}
type JID string
func (jid JID) ChatType() ChatType {
switch {
case jid.IsDirect():
return DirectChatType
case jid.IsGroup():
return GroupChatType
case jid.IsTask():
return TaskChatType
default:
log.Fatalf("invalid chat type: %s", jid)
return ""
}
}
func (jid JID) IsDirect() bool { return strings.HasPrefix(jid.String(), ContactPrefix) }
func (jid JID) IsGroup() bool { return strings.HasPrefix(jid.String(), GroupPrefix) }
func (jid JID) IsTask() bool { return strings.HasPrefix(jid.String(), TaskPrefix) }
func (jid JID) IsSection() bool { return strings.HasPrefix(jid.String(), ContactSectionPrefix) }
func (jid JID) Empty() bool { return jid.String() == "" }
func (jid JID) JID() JID { return jid }
func (jid JID) String() string { return string(jid) }
func (jid JID) Valid() bool { return jid.Uid() != "" }
func (jid JID) Value() string { return jid.String() }
func (jid JID) Uid() string {
if jid.Empty() {
return ""
}
bits := strings.SplitN(jid.String(), "-", 2)
if len(bits) != 2 || !ValidUid(bits[1]) {
return ""
}
return bits[1]
}
func (jid JID) MarshalJSON() ([]byte, error) {
return json.Marshal(jid.String())
}
func (jid *JID) UnmarshalJSON(data []byte) error {
var s string
if err := json.Unmarshal(data, &s); err != nil {
return err
}
*jid = JID(s)
return nil
}
func (jid JID) MarshalMsgpack() ([]byte, error) {
return msgpack.Marshal(jid.String())
}
func (jid *JID) UnmarshalMsgpack(data []byte) error {
var s string
if err := msgpack.Unmarshal(data, &s); err != nil {
return err
}
* jid = JID(s)
return nil
}
func (jid *JID) UnmarshalText(data []byte) error {
*jid = JID(data)
return nil
}