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