github.com/tada-team/tdproto@v1.51.57/jid.go (about)

     1  package tdproto
     2  
     3  import (
     4  	"encoding/json"
     5  	"log"
     6  	"strings"
     7  
     8  	"github.com/fxamacker/cbor/v2"
     9  	"github.com/vmihailenco/msgpack/v5"
    10  )
    11  
    12  const (
    13  	ContactPrefix        = "d-"
    14  	GroupPrefix          = "g-"
    15  	TaskPrefix           = "t-"
    16  	ContactSectionPrefix = "sd-"
    17  	GroupSectionPrefix   = "sg-"
    18  	TaskSectionPrefix    = "st-"
    19  	MeetingPrefix        = "m-"
    20  	ThreadPrefix         = "th-"
    21  )
    22  
    23  type HasJid interface {
    24  	JID() JID
    25  }
    26  
    27  type JID string
    28  
    29  func (jid JID) ChatType() ChatType {
    30  	switch {
    31  	case jid.IsDirect():
    32  		return DirectChatType
    33  	case jid.IsGroup():
    34  		return GroupChatType
    35  	case jid.IsTask():
    36  		return TaskChatType
    37  	case jid.IsMeeting():
    38  		return MeetingChatType
    39  	case jid.IsThread():
    40  		return ThreadChatType
    41  	default:
    42  		log.Fatalf("invalid chat type: %s", jid)
    43  		return ""
    44  	}
    45  }
    46  
    47  func (jid JID) IsDirect() bool  { return strings.HasPrefix(jid.String(), ContactPrefix) }
    48  func (jid JID) IsGroup() bool   { return strings.HasPrefix(jid.String(), GroupPrefix) }
    49  func (jid JID) IsTask() bool    { return strings.HasPrefix(jid.String(), TaskPrefix) }
    50  func (jid JID) IsSection() bool { return strings.HasPrefix(jid.String(), ContactSectionPrefix) }
    51  func (jid JID) IsMeeting() bool { return strings.HasPrefix(jid.String(), MeetingPrefix) }
    52  func (jid JID) IsThread() bool  { return strings.HasPrefix(jid.String(), ThreadPrefix) }
    53  
    54  func (jid JID) Empty() bool    { return jid.String() == "" }
    55  func (jid JID) JID() JID       { return jid }
    56  func (jid JID) String() string { return string(jid) }
    57  func (jid JID) Valid() bool    { return jid.Uid() != "" }
    58  func (jid JID) Value() string  { return jid.String() }
    59  
    60  func (jid JID) Uid() string {
    61  	if jid.Empty() {
    62  		return ""
    63  	}
    64  	bits := strings.SplitN(jid.String(), "-", 2)
    65  	if len(bits) != 2 || !ValidUid(bits[1]) {
    66  		return ""
    67  	}
    68  	return bits[1]
    69  }
    70  
    71  func (jid JID) MarshalJSON() ([]byte, error) {
    72  	return json.Marshal(jid.String())
    73  }
    74  
    75  func (jid *JID) UnmarshalJSON(data []byte) error {
    76  	var s string
    77  	if err := json.Unmarshal(data, &s); err != nil {
    78  		return err
    79  	}
    80  	*jid = JID(s)
    81  	return nil
    82  }
    83  
    84  func (jid JID) MarshalMsgpack() ([]byte, error) {
    85  	return msgpack.Marshal(jid.String())
    86  }
    87  
    88  func (jid *JID) UnmarshalMsgpack(data []byte) error {
    89  	var s string
    90  	if err := msgpack.Unmarshal(data, &s); err != nil {
    91  		return err
    92  	}
    93  	*jid = JID(s)
    94  	return nil
    95  }
    96  
    97  func (jid JID) MarshalCBOR() ([]byte, error) {
    98  	return cbor.Marshal(jid.String())
    99  }
   100  
   101  func (jid *JID) UnmarshalCBOR(data []byte) error {
   102  	var s string
   103  	if err := cbor.Unmarshal(data, &s); err != nil {
   104  		return err
   105  	}
   106  	*jid = JID(s)
   107  	return nil
   108  }
   109  
   110  func (jid *JID) UnmarshalText(data []byte) error {
   111  	*jid = JID(data)
   112  	return nil
   113  }