Hilmany / cogs /timezone.py
HilmanBey's picture
Upload 64 files
cbb05ec verified
Raw
History Blame Contribute Delete
6.56 kB
import discord
from discord.ext import commands
from discord import app_commands
from datetime import datetime, timezone, timedelta
# Windows'ta tzdata eksik olabilir. Önce zoneinfo ile dene, yoksa pytz, yoksa UTC offset map'i
try:
from zoneinfo import ZoneInfo
_ZONEINFO_OK = True
except Exception:
_ZONEINFO_OK = False
try:
import pytz
_PYTZ_OK = True
except Exception:
_PYTZ_OK = False
CYBER_BLUE = discord.Color.from_rgb(52, 152, 219)
CYBER_GOLD = discord.Color.from_rgb(241, 196, 15)
# Yaygın şehirler ve timezone ID'leri
SEHIR_ZAMAN_DILIMI = {
"istanbul": "Europe/Istanbul",
"new york": "America/New_York",
"los angeles": "America/Los_Angeles",
"london": "Europe/London",
"paris": "Europe/Paris",
"berlin": "Europe/Berlin",
"moscow": "Europe/Moscow",
"dubai": "Asia/Dubai",
"tokyo": "Asia/Tokyo",
"seoul": "Asia/Seoul",
"shanghai": "Asia/Shanghai",
"singapore": "Asia/Singapore",
"sydney": "Australia/Sydney",
"mumbai": "Asia/Kolkata",
"delhi": "Asia/Kolkata",
"cairo": "Africa/Cairo",
"toronto": "America/Toronto",
"mexico city": "America/Mexico_City",
"sao paulo": "America/Sao_Paulo",
"amsterdam": "Europe/Amsterdam",
"madrid": "Europe/Madrid",
"rome": "Europe/Rome",
"stockholm": "Europe/Stockholm",
"utc": "UTC",
"ankara": "Europe/Istanbul",
"izmir": "Europe/Istanbul",
"baku": "Asia/Baku",
"riyadh": "Asia/Riyadh",
"los santos": "America/Los_Angeles",
"chicago": "America/Chicago",
"denver": "America/Denver",
"phoenix": "America/Phoenix",
"hawaii": "Pacific/Honolulu",
"auckland": "Pacific/Auckland",
"johannesburg": "Africa/Johannesburg",
"bangkok": "Asia/Bangkok",
"jakarta": "Asia/Jakarta",
"manila": "Asia/Manila",
"hong kong": "Asia/Hong_Kong",
"tel aviv": "Asia/Jerusalem",
"kiev": "Europe/Kyiv",
"kyiv": "Europe/Kyiv",
}
# UTC ofsetleri (saat cinsinden) — ZoneInfo/pytz yoksa yedek olarak
UTC_OFFSETS = {
"istanbul": 3, "ankara": 3, "izmir": 3, "baku": 4,
"london": 0, "paris": 1, "berlin": 1, "amsterdam": 1, "madrid": 1,
"rome": 1, "stockholm": 1, "moscow": 3, "kyiv": 2, "kiev": 2,
"dubai": 4, "riyadh": 3, "cairo": 2, "johannesburg": 2,
"new york": -5, "toronto": -5, "chicago": -6, "mexico city": -6,
"denver": -7, "phoenix": -7, "los angeles": -8,
"sao paulo": -3,
"mumbai": 5, "delhi": 5, "bangkok": 7, "jakarta": 7,
"hong kong": 8, "shanghai": 8, "singapore": 8, "manila": 8,
"tokyo": 9, "seoul": 9,
"sydney": 11, "auckland": 13,
"hawaii": -10,
"tel aviv": 2,
"utc": 0,
}
def _get_now_in_tz(tz_id: str, sehir_lower: str):
"""Verilen timezone ID'sine göre şimdiki zamanı döndürür. Yedek olarak UTC offset kullanır."""
if _ZONEINFO_OK:
try:
tz = ZoneInfo(tz_id)
return datetime.now(tz)
except Exception:
pass
if _PYTZ_OK:
try:
tz = pytz.timezone(tz_id)
return datetime.now(tz)
except Exception:
pass
# Yedek: UTC ofseti ile
offset = UTC_OFFSETS.get(sehir_lower, 0)
return datetime.now(timezone.utc) + timedelta(hours=offset)
class TimeZoneCog(commands.Cog):
def __init__(self, bot):
self.bot = bot
@commands.command(name="saat", description="Belirli bir şehrin şu anki saatini gösterir.")
async def saat(self, ctx: commands.Context, *, sehir: str):
sehir_lower = sehir.lower().strip()
tz_id = SEHIR_ZAMAN_DILIMI.get(sehir_lower)
if not tz_id:
# Yıldız eşleştirme: kısmi eşleşme
for key, val in SEHIR_ZAMAN_DILIMI.items():
if sehir_lower in key or key in sehir_lower:
tz_id = val
sehir_lower = key
break
if not tz_id:
await ctx.send(
f"❌ `{sehir}` için zaman dilimi bulunamadı.\n"
f"Örnek şehirler: `istanbul`, `london`, `tokyo`, `new york`, `dubai`, `moscow`, `sydney`, `los angeles`",
ephemeral=True
)
return
try:
now = _get_now_in_tz(tz_id, sehir_lower)
tarih_str = now.strftime("%d.%m.%Y")
saat_str = now.strftime("%H:%M:%S")
gun_str = ["Pzt", "Sal", "Çar", "Per", "Cum", "Cmt", "Paz"][now.weekday()]
embed = discord.Embed(
title=f"🕐 {sehir_lower.title()}",
color=CYBER_GOLD,
timestamp=datetime.now()
)
embed.add_field(name="🕒 Saat", value=f"**{saat_str}**", inline=True)
embed.add_field(name="📅 Gün", value=f"**{gun_str}**", inline=True)
embed.add_field(name="📆 Tarih", value=f"**{tarih_str}**", inline=True)
embed.add_field(name="Zaman Dilimi", value=f"`{tz_id}`", inline=False)
embed.set_footer(text="ArazAI Saat Sorgusu")
await ctx.send(embed=embed)
except Exception as e:
await ctx.send(f"❌ Hata: {e}", ephemeral=True)
@commands.command(name="saat-karşılaştır", description="Birden fazla şehrin şimdiki saatlerini karşılaştırır.")
async def saat_karsilastir(self, ctx: commands.Context, *, sehirler: str):
sehir_listesi = [s.strip() for s in sehirler.split("|") if s.strip()]
if len(sehir_listesi) < 2:
await ctx.send("❌ En az 2 şehir girin. (örn: istanbul | tokyo | london)", ephemeral=True)
return
embed = discord.Embed(title="🕐 Saat Karşılaştırma", color=CYBER_GOLD, timestamp=datetime.now())
embed.set_footer(text="ArazAI Saat Sorgusu")
for sehir in sehir_listesi[:10]:
sehir_lower = sehir.lower()
tz_id = SEHIR_ZAMAN_DILIMI.get(sehir_lower)
if not tz_id:
embed.add_field(name=f"❌ {sehir}", value="Bulunamadı", inline=True)
continue
try:
now = _get_now_in_tz(tz_id, sehir_lower)
saat_str = now.strftime("%H:%M")
gun_str = ["Pzt", "Sal", "Çar", "Per", "Cum", "Cmt", "Paz"][now.weekday()]
embed.add_field(name=f"📍 {sehir.title()}", value=f"**{saat_str}** ({gun_str})", inline=True)
except:
embed.add_field(name=f"❌ {sehir}", value="Hata", inline=True)
await ctx.send(embed=embed)
async def setup(bot):
await bot.add_cog(TimeZoneCog(bot))