github.com/diamondburned/arikawa/v2@v2.1.0/discord/snowflake.go (about)

     1  package discord
     2  
     3  import (
     4  	"strconv"
     5  	"strings"
     6  	"time"
     7  )
     8  
     9  // Epoch is the Discord epoch constant in time.Duration (nanoseconds)
    10  // since Unix epoch.
    11  const Epoch = 1420070400000 * time.Millisecond
    12  
    13  // DurationSinceEpoch returns the duration from the Discord epoch to current.
    14  func DurationSinceEpoch(t time.Time) time.Duration {
    15  	return time.Duration(t.UnixNano()) - Epoch
    16  }
    17  
    18  type Snowflake uint64
    19  
    20  // NullSnowflake gets encoded into a null. This is used for
    21  // optional and nullable snowflake fields.
    22  const NullSnowflake = ^Snowflake(0)
    23  
    24  func NewSnowflake(t time.Time) Snowflake {
    25  	return Snowflake((DurationSinceEpoch(t) / time.Millisecond) << 22)
    26  }
    27  
    28  func ParseSnowflake(sf string) (Snowflake, error) {
    29  	if sf == "null" {
    30  		return NullSnowflake, nil
    31  	}
    32  
    33  	u, err := strconv.ParseUint(sf, 10, 64)
    34  	if err != nil {
    35  		return 0, err
    36  	}
    37  
    38  	return Snowflake(u), nil
    39  }
    40  
    41  func (s *Snowflake) UnmarshalJSON(v []byte) error {
    42  	p, err := ParseSnowflake(strings.Trim(string(v), `"`))
    43  	if err != nil {
    44  		return err
    45  	}
    46  
    47  	*s = p
    48  	return nil
    49  }
    50  
    51  func (s Snowflake) MarshalJSON() ([]byte, error) {
    52  	// This includes 0 and null, because MarshalJSON does not dictate when a
    53  	// value gets omitted.
    54  	if !s.IsValid() {
    55  		return []byte("null"), nil
    56  	} else {
    57  		return []byte(`"` + strconv.FormatInt(int64(s), 10) + `"`), nil
    58  	}
    59  }
    60  
    61  // String returns the ID, or nothing if the snowflake isn't valid.
    62  func (s Snowflake) String() string {
    63  	// Check if negative.
    64  	if !s.IsValid() {
    65  		return ""
    66  	}
    67  	return strconv.FormatUint(uint64(s), 10)
    68  }
    69  
    70  // IsValid returns whether or not the snowflake is valid.
    71  func (s Snowflake) IsValid() bool {
    72  	return !(int64(s) == 0 || s == NullSnowflake)
    73  }
    74  
    75  // IsNull returns whether or not the snowflake is null.
    76  func (s Snowflake) IsNull() bool {
    77  	return s == NullSnowflake
    78  }
    79  
    80  func (s Snowflake) Time() time.Time {
    81  	unixnano := time.Duration(s>>22)*time.Millisecond + Epoch
    82  	return time.Unix(0, int64(unixnano))
    83  }
    84  
    85  func (s Snowflake) Worker() uint8 {
    86  	return uint8(s & 0x3E0000 >> 17)
    87  }
    88  
    89  func (s Snowflake) PID() uint8 {
    90  	return uint8(s & 0x1F000 >> 12)
    91  }
    92  
    93  func (s Snowflake) Increment() uint16 {
    94  	return uint16(s & 0xFFF)
    95  }
    96  
    97  type AppID Snowflake
    98  
    99  const NullAppID = AppID(NullSnowflake)
   100  
   101  func (s AppID) MarshalJSON() ([]byte, error)  { return Snowflake(s).MarshalJSON() }
   102  func (s *AppID) UnmarshalJSON(v []byte) error { return (*Snowflake)(s).UnmarshalJSON(v) }
   103  func (s AppID) String() string                { return Snowflake(s).String() }
   104  func (s AppID) IsValid() bool                 { return Snowflake(s).IsValid() }
   105  func (s AppID) IsNull() bool                  { return Snowflake(s).IsNull() }
   106  func (s AppID) Time() time.Time               { return Snowflake(s).Time() }
   107  func (s AppID) Worker() uint8                 { return Snowflake(s).Worker() }
   108  func (s AppID) PID() uint8                    { return Snowflake(s).PID() }
   109  func (s AppID) Increment() uint16             { return Snowflake(s).Increment() }
   110  
   111  type AttachmentID Snowflake
   112  
   113  const NullAttachmentID = AttachmentID(NullSnowflake)
   114  
   115  func (s AttachmentID) MarshalJSON() ([]byte, error)  { return Snowflake(s).MarshalJSON() }
   116  func (s *AttachmentID) UnmarshalJSON(v []byte) error { return (*Snowflake)(s).UnmarshalJSON(v) }
   117  func (s AttachmentID) String() string                { return Snowflake(s).String() }
   118  func (s AttachmentID) IsValid() bool                 { return Snowflake(s).IsValid() }
   119  func (s AttachmentID) IsNull() bool                  { return Snowflake(s).IsNull() }
   120  func (s AttachmentID) Time() time.Time               { return Snowflake(s).Time() }
   121  func (s AttachmentID) Worker() uint8                 { return Snowflake(s).Worker() }
   122  func (s AttachmentID) PID() uint8                    { return Snowflake(s).PID() }
   123  func (s AttachmentID) Increment() uint16             { return Snowflake(s).Increment() }
   124  
   125  type AuditLogEntryID Snowflake
   126  
   127  const NullAuditLogEntryID = AuditLogEntryID(NullSnowflake)
   128  
   129  func (s AuditLogEntryID) MarshalJSON() ([]byte, error)  { return Snowflake(s).MarshalJSON() }
   130  func (s *AuditLogEntryID) UnmarshalJSON(v []byte) error { return (*Snowflake)(s).UnmarshalJSON(v) }
   131  func (s AuditLogEntryID) String() string                { return Snowflake(s).String() }
   132  func (s AuditLogEntryID) IsValid() bool                 { return Snowflake(s).IsValid() }
   133  func (s AuditLogEntryID) IsNull() bool                  { return Snowflake(s).IsNull() }
   134  func (s AuditLogEntryID) Time() time.Time               { return Snowflake(s).Time() }
   135  func (s AuditLogEntryID) Worker() uint8                 { return Snowflake(s).Worker() }
   136  func (s AuditLogEntryID) PID() uint8                    { return Snowflake(s).PID() }
   137  func (s AuditLogEntryID) Increment() uint16             { return Snowflake(s).Increment() }
   138  
   139  type ChannelID Snowflake
   140  
   141  const NullChannelID = ChannelID(NullSnowflake)
   142  
   143  func (s ChannelID) MarshalJSON() ([]byte, error)  { return Snowflake(s).MarshalJSON() }
   144  func (s *ChannelID) UnmarshalJSON(v []byte) error { return (*Snowflake)(s).UnmarshalJSON(v) }
   145  func (s ChannelID) String() string                { return Snowflake(s).String() }
   146  func (s ChannelID) IsValid() bool                 { return Snowflake(s).IsValid() }
   147  func (s ChannelID) IsNull() bool                  { return Snowflake(s).IsNull() }
   148  func (s ChannelID) Time() time.Time               { return Snowflake(s).Time() }
   149  func (s ChannelID) Worker() uint8                 { return Snowflake(s).Worker() }
   150  func (s ChannelID) PID() uint8                    { return Snowflake(s).PID() }
   151  func (s ChannelID) Increment() uint16             { return Snowflake(s).Increment() }
   152  func (s ChannelID) Mention() string               { return "<#" + s.String() + ">" }
   153  
   154  type CommandID Snowflake
   155  
   156  const NullCommandID = CommandID(NullSnowflake)
   157  
   158  func (s CommandID) MarshalJSON() ([]byte, error)  { return Snowflake(s).MarshalJSON() }
   159  func (s *CommandID) UnmarshalJSON(v []byte) error { return (*Snowflake)(s).UnmarshalJSON(v) }
   160  func (s CommandID) String() string                { return Snowflake(s).String() }
   161  func (s CommandID) IsValid() bool                 { return Snowflake(s).IsValid() }
   162  func (s CommandID) IsNull() bool                  { return Snowflake(s).IsNull() }
   163  func (s CommandID) Time() time.Time               { return Snowflake(s).Time() }
   164  func (s CommandID) Worker() uint8                 { return Snowflake(s).Worker() }
   165  func (s CommandID) PID() uint8                    { return Snowflake(s).PID() }
   166  func (s CommandID) Increment() uint16             { return Snowflake(s).Increment() }
   167  
   168  type EmojiID Snowflake
   169  
   170  const NullEmojiID = EmojiID(NullSnowflake)
   171  
   172  func (s EmojiID) MarshalJSON() ([]byte, error)  { return Snowflake(s).MarshalJSON() }
   173  func (s *EmojiID) UnmarshalJSON(v []byte) error { return (*Snowflake)(s).UnmarshalJSON(v) }
   174  func (s EmojiID) String() string                { return Snowflake(s).String() }
   175  func (s EmojiID) IsValid() bool                 { return Snowflake(s).IsValid() }
   176  func (s EmojiID) IsNull() bool                  { return Snowflake(s).IsNull() }
   177  func (s EmojiID) Time() time.Time               { return Snowflake(s).Time() }
   178  func (s EmojiID) Worker() uint8                 { return Snowflake(s).Worker() }
   179  func (s EmojiID) PID() uint8                    { return Snowflake(s).PID() }
   180  func (s EmojiID) Increment() uint16             { return Snowflake(s).Increment() }
   181  
   182  type IntegrationID Snowflake
   183  
   184  const NullIntegrationID = IntegrationID(NullSnowflake)
   185  
   186  func (s IntegrationID) MarshalJSON() ([]byte, error)  { return Snowflake(s).MarshalJSON() }
   187  func (s *IntegrationID) UnmarshalJSON(v []byte) error { return (*Snowflake)(s).UnmarshalJSON(v) }
   188  func (s IntegrationID) String() string                { return Snowflake(s).String() }
   189  func (s IntegrationID) IsValid() bool                 { return Snowflake(s).IsValid() }
   190  func (s IntegrationID) IsNull() bool                  { return Snowflake(s).IsNull() }
   191  func (s IntegrationID) Time() time.Time               { return Snowflake(s).Time() }
   192  func (s IntegrationID) Worker() uint8                 { return Snowflake(s).Worker() }
   193  func (s IntegrationID) PID() uint8                    { return Snowflake(s).PID() }
   194  func (s IntegrationID) Increment() uint16             { return Snowflake(s).Increment() }
   195  
   196  type InteractionID Snowflake
   197  
   198  const NullInteractionID = InteractionID(NullSnowflake)
   199  
   200  func (s InteractionID) MarshalJSON() ([]byte, error)  { return Snowflake(s).MarshalJSON() }
   201  func (s *InteractionID) UnmarshalJSON(v []byte) error { return (*Snowflake)(s).UnmarshalJSON(v) }
   202  func (s InteractionID) String() string                { return Snowflake(s).String() }
   203  func (s InteractionID) IsValid() bool                 { return Snowflake(s).IsValid() }
   204  func (s InteractionID) IsNull() bool                  { return Snowflake(s).IsNull() }
   205  func (s InteractionID) Time() time.Time               { return Snowflake(s).Time() }
   206  func (s InteractionID) Worker() uint8                 { return Snowflake(s).Worker() }
   207  func (s InteractionID) PID() uint8                    { return Snowflake(s).PID() }
   208  func (s InteractionID) Increment() uint16             { return Snowflake(s).Increment() }
   209  
   210  type GuildID Snowflake
   211  
   212  const NullGuildID = GuildID(NullSnowflake)
   213  
   214  func (s GuildID) MarshalJSON() ([]byte, error)  { return Snowflake(s).MarshalJSON() }
   215  func (s *GuildID) UnmarshalJSON(v []byte) error { return (*Snowflake)(s).UnmarshalJSON(v) }
   216  func (s GuildID) String() string                { return Snowflake(s).String() }
   217  func (s GuildID) IsValid() bool                 { return Snowflake(s).IsValid() }
   218  func (s GuildID) IsNull() bool                  { return Snowflake(s).IsNull() }
   219  func (s GuildID) Time() time.Time               { return Snowflake(s).Time() }
   220  func (s GuildID) Worker() uint8                 { return Snowflake(s).Worker() }
   221  func (s GuildID) PID() uint8                    { return Snowflake(s).PID() }
   222  func (s GuildID) Increment() uint16             { return Snowflake(s).Increment() }
   223  
   224  type MessageID Snowflake
   225  
   226  const NullMessageID = MessageID(NullSnowflake)
   227  
   228  func (s MessageID) MarshalJSON() ([]byte, error)  { return Snowflake(s).MarshalJSON() }
   229  func (s *MessageID) UnmarshalJSON(v []byte) error { return (*Snowflake)(s).UnmarshalJSON(v) }
   230  func (s MessageID) String() string                { return Snowflake(s).String() }
   231  func (s MessageID) IsValid() bool                 { return Snowflake(s).IsValid() }
   232  func (s MessageID) IsNull() bool                  { return Snowflake(s).IsNull() }
   233  func (s MessageID) Time() time.Time               { return Snowflake(s).Time() }
   234  func (s MessageID) Worker() uint8                 { return Snowflake(s).Worker() }
   235  func (s MessageID) PID() uint8                    { return Snowflake(s).PID() }
   236  func (s MessageID) Increment() uint16             { return Snowflake(s).Increment() }
   237  
   238  type RoleID Snowflake
   239  
   240  const NullRoleID = RoleID(NullSnowflake)
   241  
   242  func (s RoleID) MarshalJSON() ([]byte, error)  { return Snowflake(s).MarshalJSON() }
   243  func (s *RoleID) UnmarshalJSON(v []byte) error { return (*Snowflake)(s).UnmarshalJSON(v) }
   244  func (s RoleID) String() string                { return Snowflake(s).String() }
   245  func (s RoleID) IsValid() bool                 { return Snowflake(s).IsValid() }
   246  func (s RoleID) IsNull() bool                  { return Snowflake(s).IsNull() }
   247  func (s RoleID) Time() time.Time               { return Snowflake(s).Time() }
   248  func (s RoleID) Worker() uint8                 { return Snowflake(s).Worker() }
   249  func (s RoleID) PID() uint8                    { return Snowflake(s).PID() }
   250  func (s RoleID) Increment() uint16             { return Snowflake(s).Increment() }
   251  func (s RoleID) Mention() string               { return "<@&" + s.String() + ">" }
   252  
   253  type StickerID Snowflake
   254  
   255  const NullStickerID = StickerID(NullSnowflake)
   256  
   257  func (s StickerID) MarshalJSON() ([]byte, error)  { return Snowflake(s).MarshalJSON() }
   258  func (s *StickerID) UnmarshalJSON(v []byte) error { return (*Snowflake)(s).UnmarshalJSON(v) }
   259  func (s StickerID) String() string                { return Snowflake(s).String() }
   260  func (s StickerID) IsValid() bool                 { return Snowflake(s).IsValid() }
   261  func (s StickerID) IsNull() bool                  { return Snowflake(s).IsNull() }
   262  func (s StickerID) Time() time.Time               { return Snowflake(s).Time() }
   263  func (s StickerID) Worker() uint8                 { return Snowflake(s).Worker() }
   264  func (s StickerID) PID() uint8                    { return Snowflake(s).PID() }
   265  func (s StickerID) Increment() uint16             { return Snowflake(s).Increment() }
   266  
   267  type StickerPackID Snowflake
   268  
   269  const NullStickerPackID = StickerPackID(NullSnowflake)
   270  
   271  func (s StickerPackID) MarshalJSON() ([]byte, error)  { return Snowflake(s).MarshalJSON() }
   272  func (s *StickerPackID) UnmarshalJSON(v []byte) error { return (*Snowflake)(s).UnmarshalJSON(v) }
   273  func (s StickerPackID) String() string                { return Snowflake(s).String() }
   274  func (s StickerPackID) IsValid() bool                 { return Snowflake(s).IsValid() }
   275  func (s StickerPackID) IsNull() bool                  { return Snowflake(s).IsNull() }
   276  func (s StickerPackID) Time() time.Time               { return Snowflake(s).Time() }
   277  func (s StickerPackID) Worker() uint8                 { return Snowflake(s).Worker() }
   278  func (s StickerPackID) PID() uint8                    { return Snowflake(s).PID() }
   279  func (s StickerPackID) Increment() uint16             { return Snowflake(s).Increment() }
   280  
   281  type UserID Snowflake
   282  
   283  const NullUserID = UserID(NullSnowflake)
   284  
   285  func (s UserID) MarshalJSON() ([]byte, error)  { return Snowflake(s).MarshalJSON() }
   286  func (s *UserID) UnmarshalJSON(v []byte) error { return (*Snowflake)(s).UnmarshalJSON(v) }
   287  func (s UserID) String() string                { return Snowflake(s).String() }
   288  func (s UserID) IsValid() bool                 { return Snowflake(s).IsValid() }
   289  func (s UserID) IsNull() bool                  { return Snowflake(s).IsNull() }
   290  func (s UserID) Time() time.Time               { return Snowflake(s).Time() }
   291  func (s UserID) Worker() uint8                 { return Snowflake(s).Worker() }
   292  func (s UserID) PID() uint8                    { return Snowflake(s).PID() }
   293  func (s UserID) Increment() uint16             { return Snowflake(s).Increment() }
   294  func (s UserID) Mention() string               { return "<@" + s.String() + ">" }
   295  
   296  type WebhookID Snowflake
   297  
   298  const NullWebhookID = WebhookID(NullSnowflake)
   299  
   300  func (s WebhookID) MarshalJSON() ([]byte, error)  { return Snowflake(s).MarshalJSON() }
   301  func (s *WebhookID) UnmarshalJSON(v []byte) error { return (*Snowflake)(s).UnmarshalJSON(v) }
   302  func (s WebhookID) String() string                { return Snowflake(s).String() }
   303  func (s WebhookID) IsValid() bool                 { return Snowflake(s).IsValid() }
   304  func (s WebhookID) IsNull() bool                  { return Snowflake(s).IsNull() }
   305  func (s WebhookID) Time() time.Time               { return Snowflake(s).Time() }
   306  func (s WebhookID) Worker() uint8                 { return Snowflake(s).Worker() }
   307  func (s WebhookID) PID() uint8                    { return Snowflake(s).PID() }
   308  func (s WebhookID) Increment() uint16             { return Snowflake(s).Increment() }