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() }