"""
Absfuyu: Fun
------------
Some fun or weird stuff
Version: 5.1.0
Date updated: 10/03/2025 (dd/mm/yyyy)
"""
# Library
# ---------------------------------------------------------------------------
from datetime import date
from absfuyu.core import deprecated, versionadded, versionchanged
from absfuyu.logger import logger
from absfuyu.tools.shutdownizer import ShutDownizer
from absfuyu.util.lunar import LunarCalendar
# Function
# ---------------------------------------------------------------------------
[docs]
@versionchanged("5.0.0", reason="Updated functionality")
def zodiac_sign(day: int, month: int, zodiac13: bool = False) -> str:
"""
Calculate zodiac sign
Parameters
----------
day : int
Day (in range [1, 31])
month : int
Month (in range [1, 12])
zodiac13 : bool
13 zodiacs mode (Default: ``False``)
Returns
-------
str
Zodiac sign
"""
# Condition check
if not 1 <= month <= 12 or not 1 <= day <= 31:
raise ValueError("Value out of range")
if zodiac13:
zodiac_dates = {
"Capricorn": ((1, 21), (2, 16)),
"Aquarius": ((2, 17), (3, 11)),
"Pisces": ((3, 12), (4, 18)),
"Aries": ((4, 19), (5, 13)),
"Taurus": ((5, 14), (6, 21)),
"Gemini": ((6, 22), (7, 20)),
"Cancer": ((7, 21), (8, 10)),
"Leo": ((8, 11), (9, 16)),
"Virgo": ((9, 17), (10, 30)),
"Libra": ((10, 31), (11, 23)),
"Scorpio": ((11, 24), (11, 29)),
"Ophiuchus": ((11, 30), (12, 17)),
"Sagittarius": ((12, 18), (1, 20)),
}
else:
zodiac_dates = {
"Capricorn (E)": ((12, 22), (1, 19)),
"Aquarius (A)": ((1, 20), (2, 18)),
"Pisces (W)": ((2, 19), (3, 20)),
"Aries (F)": ((3, 21), (4, 19)),
"Taurus (E)": ((4, 20), (5, 20)),
"Gemini (A)": ((5, 21), (6, 20)),
"Cancer (W)": ((6, 21), (7, 22)),
"Leo (F)": ((7, 23), (8, 22)),
"Virgo (E)": ((8, 23), (9, 22)),
"Libra (A)": ((9, 23), (10, 22)),
"Scorpio (W)": ((10, 23), (11, 21)),
"Sagittarius (F)": ((11, 22), (12, 21)),
}
result = ""
for sign, (start_date, end_date) in zodiac_dates.items():
start_month, start_day = start_date
end_month, end_day = end_date
if (month == start_month and day >= start_day) or (
month == end_month and day <= end_day
):
result = sign
break
return result
[docs]
@deprecated("5.0.0", reason="API shutdown, will be removed later")
def im_bored() -> str:
"""
Get random activity from ``boredapi`` website
Returns
-------
str
Random activity
"""
raise SystemExit("API shuted down")
# try:
# api = APIRequest("https://www.boredapi.com/api/activity")
# return api.fetch_data_only().json()["activity"] # type: ignore
# except Exception:
# return "FAILED"
# For new year only
[docs]
def happy_new_year(forced: bool = False, include_lunar: bool = False) -> None:
"""
Only occurs on 01/01 every year
Parameters
----------
forced : bool
Shutdown ASAP (Default: ``False``)
include_lunar : bool
Include Lunar New Year (Default: ``False``)
"""
if forced:
return ShutDownizer().shutdown()
today = date.today()
m = today.month
d = today.day
solar_new_year = m == 1 and d == 1
logger.debug(f"Solar: {today}")
if include_lunar:
lunar = LunarCalendar.now().date
lunar_new_year = lunar.month == 1 and lunar.day == 1
logger.debug(f"Lunar: {lunar}")
else:
lunar_new_year = False
if solar_new_year or lunar_new_year:
print("Happy New Year! You should take rest now.")
return ShutDownizer().shutdown()
else:
raise SystemExit("The time has not come yet")
[docs]
@versionadded("5.0.0")
def human_year_to_dog_year(
human_year: int | float, is_small: bool = True
) -> int | float:
"""
Convert human's year to dog's year
General Guidelines:
1. First Year: The first year of a dog's life
is roughly equal to 15 human years.
2. Second Year: The second year adds about 9 human years,
making a 2-year-old dog equivalent to about 24 human years.
3. Subsequent Years: After the second year,
each additional yeartypically equals about 4-5 human years,
depending on the dog's size and breed. (Small-4, Large-5)
Parameters
----------
human_year : int | float
Dog's age in human year
is_small : bool, optional
Is the dog small or not, by default ``True``
Returns
-------
int | float
Dog's year/age
Raises
------
ValueError
When ``human_year`` < 0
"""
if human_year < 0:
raise ValueError("Value must be positive")
if human_year <= 1:
return human_year * 15
elif human_year <= 2:
return 15 + (human_year - 1) * 9
else:
if is_small:
return 24 + (human_year - 2) * 4
else:
return 24 + (human_year - 2) * 5