diff --git a/src/DateCheck.php b/src/DateCheck.php new file mode 100644 index 0000000..ff59eae --- /dev/null +++ b/src/DateCheck.php @@ -0,0 +1,27 @@ + 12) + return false; + if($day < 1 || $day > 31) + return false; + + if($month === 2) + $days = $year === 0 || self::isLeapYear($year) ? 29 : 28; + elseif($month === 4 || $month === 6 || $month === 9 || $month === 11) + $days = 30; + else + $days = 31; + + return $day <= $days; + } +} diff --git a/src/Users/User.php b/src/Users/User.php index 5adfe03..4d85b6e 100644 --- a/src/Users/User.php +++ b/src/Users/User.php @@ -5,6 +5,7 @@ use DateTime; use DateTimeZone; use Index\XString; use Index\Colour\Colour; +use Misuzu\DateCheck; use Misuzu\DB; use Misuzu\HasRankInterface; use Misuzu\Memoizer; @@ -318,6 +319,10 @@ class User implements HasRankInterface { return new DateTime($this->user_birthdate ?? '0000-01-01', new DateTimeZone('UTC')); } public function setBirthdate(int $year, int $month, int $day): self { + // lowest leap year mariadb supports lol + // should probably split the date field and year field in the db but i'm afraid of internal dependencies rn + if($year < 1004) + $year = 1004; $this->user_birthdate = $month < 1 || $day < 1 ? null : sprintf('%04d-%02d-%02d', $year, $month, $day); return $this; } @@ -652,14 +657,13 @@ class User implements HasRankInterface { } public static function validateBirthdate(int $year, int $month, int $day, int $yearRange = 100): string { - if($year > 0) { - if($year < date('Y') - $yearRange || $year > date('Y')) + if($day !== 0 && $month !== 0) { + if($year > 0 && ($year < date('Y') - $yearRange || $year > date('Y'))) return 'year'; - $checkYear = $year; - } else $checkYear = date('Y'); - if(!($day === 0 && $month === 0) && !checkdate($month, $day, $checkYear)) - return 'date'; + if(!DateCheck::isValidDate($year, $month, $day)) + return 'date'; + } return ''; }