69 lines
2 KiB
Dart
69 lines
2 KiB
Dart
class Snowflake implements Comparable<Snowflake> {
|
|
/// Discord Epoch
|
|
static final DiscordEpoch = DateTime.utc(2015, 1, 1, 0, 0, 0);
|
|
|
|
/// Aria's Creations Epoch
|
|
static final ACEpoch = DateTime.utc(2024, 7, 9, 23, 0, 0);
|
|
|
|
final DateTime epoch;
|
|
final int value;
|
|
static final ZERO = Snowflake(epoch: DiscordEpoch, value: 0);
|
|
|
|
Snowflake({required this.epoch, required this.value});
|
|
|
|
DateTime get timestamp =>
|
|
epoch.add(Duration(milliseconds: millisecondsSinceEpoch));
|
|
|
|
int get millisecondsSinceEpoch => value >> 22;
|
|
|
|
int get workerId => (value & 0x3E0000) >> 17;
|
|
|
|
int get processId => (value & 0x1F000) >> 12;
|
|
|
|
int get increment => value & 0xFFF;
|
|
|
|
bool get isZero => value == 0;
|
|
|
|
factory Snowflake.parse(dynamic value, DateTime epoch) {
|
|
int val = int.parse(value.toString());
|
|
return Snowflake(epoch: epoch, value: val);
|
|
}
|
|
|
|
factory Snowflake.now(DateTime epoch) =>
|
|
Snowflake.fromDateTime(DateTime.now(), epoch);
|
|
|
|
factory Snowflake.fromDateTime(DateTime dt, DateTime epoch) {
|
|
return Snowflake(
|
|
epoch: epoch, value: dt.difference(epoch).inMilliseconds << 22);
|
|
}
|
|
|
|
bool isBefore(Snowflake other) => timestamp.isBefore(other.timestamp);
|
|
|
|
bool isAfter(Snowflake other) => timestamp.isAfter(other.timestamp);
|
|
|
|
bool isAtSameMomentAs(Snowflake other) =>
|
|
timestamp.isAtSameMomentAs(other.timestamp);
|
|
|
|
Snowflake operator +(Duration duration) =>
|
|
Snowflake.fromDateTime(timestamp.add(duration), epoch);
|
|
|
|
Snowflake operator -(Duration duration) =>
|
|
Snowflake.fromDateTime(timestamp.subtract(duration), epoch);
|
|
|
|
@override
|
|
int compareTo(Snowflake other) => value.compareTo(other.value);
|
|
|
|
bool operator <(Snowflake other) => isBefore(other);
|
|
|
|
bool operator >(Snowflake other) => isAfter(other);
|
|
|
|
@override
|
|
bool operator ==(Object other) =>
|
|
identical(this, other) || (other is Snowflake && other.value == value);
|
|
|
|
@override
|
|
int get hashCode => value.hashCode;
|
|
|
|
@override
|
|
String toString() => value.toString();
|
|
}
|