import random from datetime import timezone import discord, aiohttp, json, kitsu from discord import app_commands from discord.ext import commands from requests.utils import requote_uri from customs.log import AuroraLogger file = open("config.json", "r") config = json.loads(file.read()) error_logger = AuroraLogger("AuroraErrorLog", "logs/errors.log") # CUSTOM FUNCTIONS async def get_movie_info(query: str, count: int, family_friendly: bool = True) -> dict | str: base_url = "https://api.themoviedb.org/3/search/movie?api_key=" api_key = config["API_KEYS"]["MOVIE_API"] query = requote_uri(query) url = base_url + api_key + "&language=en-US&query=" + query + "&page=1&include_adult=" + str(family_friendly) async with aiohttp.ClientSession() as session: async with session.get(url) as data: result = await data.json() # print(f"Length of total value : {len(result['results'])}") try: return result["results"][count] except IndexError: raise IndexError # VIEWS class ControlsMovie(discord.ui.View): def __init__(self, query: str, family_friendly: bool): super().__init__() self.value = None self.counter = 0 self.query = query self.nsfw_check = family_friendly @discord.ui.button(emoji="<:left:912268440029528075>", style=discord.ButtonStyle.blurple, disabled=True) async def before(self, interaction: discord.Interaction, button: discord.ui.Button): self.counter -= 1 await interaction.response.defer() data = await get_movie_info(query=self.query, family_friendly=self.nsfw_check, count=self.counter) if self.counter == 0 or self.counter <= 0: button.disabled = True await interaction.message.edit(view=self) if self.next.disabled is True: self.next.disabled = False await interaction.message.edit(view=self) try: nsfw = data["adult"] or "N/A" language = data["original_language"] or "N/A" original_title = data["original_title"] or "N/A" overview = data["overview"] or "N/A" popularity = data["popularity"] or "N/A" if data["poster_path"] is not None: poster = "https://image.tmdb.org/t/p/w500" + data["poster_path"] else: poster = "https://upload.wikimedia.org/wikipedia/commons/thumb/6/65/No-Image-Placeholder.svg/832px-No-Image-Placeholder.svg.png" release_date = data["release_date"] or "N/A" title = data["title"] or "N/A" vote_average = data["vote_average"] or "N/A" vote_count = data["vote_count"] or "N/A" embed = discord.Embed(title=original_title, color=discord.Color.blurple(), timestamp=interaction.created_at) embed.set_footer(text=f"The most common aurora colours are red and green β€’ Page {self.counter}", icon_url=interaction.user.display_avatar) embed.set_image(url=poster) embed.add_field(name="<:owdcinema:996728312510562365> Title", value=title, inline=True) embed.add_field(name="<:owdcinema:996728312510562365> Language", value=language, inline=True) embed.add_field(name="<:adultsonly:996729151673352222> Is Nsfw?", value=nsfw, inline=True) embed.add_field(name="<:heppy:996729953259356252> Popularity", value=popularity, inline=True) embed.add_field(name=" Release Date", value=release_date, inline=True) embed.add_field(name="<:owdcinema:996728312510562365> Movie Overview", value=overview, inline=False) embed.add_field(name="<:pepeupvote:996729520893722715>Vote Average", value=vote_average, inline=True) embed.add_field(name="<:pepeupvote:996729520893722715> Vote Count", value=vote_count, inline=True) await interaction.message.edit(embed=embed) except IndexError: button.disabled = True await interaction.followup.edit(embed=discord.Embed(title="No More Info Found :(", description="No more information has been found regarding the movie you searched for.", color=discord.Color.blurple(), timestamp=interaction.created_at), view=self) @discord.ui.button(emoji="<:delete:912359260954984459>", style=discord.ButtonStyle.red) async def delete(self, interaction: discord.Interaction, button: discord.Button): await interaction.response.defer() await interaction.delete_original_message() @discord.ui.button(emoji="<:right:912268383179919360>", style=discord.ButtonStyle.blurple) async def next(self, interaction: discord.Interaction, button: discord.ui.Button): self.counter += 1 await interaction.response.defer() if self.counter != 0 and self.before.disabled is True: self.before.disabled = False await interaction.message.edit(view=self) try: data = await get_movie_info(query=self.query, family_friendly=self.nsfw_check, count=self.counter) nsfw = data["adult"] or "N/A" language = data["original_language"] or "N/A" original_title = data["original_title"] or "N/A" overview = data["overview"] or "N/A" popularity = data["popularity"] or "N/A" if data["poster_path"] is not None: poster = "https://image.tmdb.org/t/p/w500" + data["poster_path"] else: poster = "https://upload.wikimedia.org/wikipedia/commons/thumb/6/65/No-Image-Placeholder.svg/832px-No-Image-Placeholder.svg.png" release_date = data["release_date"] or "N/A" title = data["title"] or "N/A" vote_average = data["vote_average"] or "N/A" vote_count = data["vote_count"] or "N/A" embed = discord.Embed(title=original_title, color=discord.Color.blurple(), timestamp=interaction.created_at) embed.set_footer(text=f"The most common aurora colours are red and green β€’ Page {self.counter}", icon_url=interaction.user.display_avatar) embed.set_image(url=poster) embed.add_field(name="<:owdcinema:996728312510562365> Title", value=title, inline=True) embed.add_field(name="<:owdcinema:996728312510562365> Language", value=language, inline=True) embed.add_field(name="<:adultsonly:996729151673352222> Is Nsfw?", value=nsfw, inline=True) embed.add_field(name="<:heppy:996729953259356252> Popularity", value=popularity, inline=True) embed.add_field(name=" Release Date", value=release_date, inline=True) embed.add_field(name="<:owdcinema:996728312510562365> Movie Overview", value=overview, inline=False) embed.add_field(name="<:pepeupvote:996729520893722715> Vote Average", value=vote_average, inline=True) embed.add_field(name="<:pepeupvote:996729520893722715> Vote Count", value=vote_count, inline=True) await interaction.message.edit(embed=embed) except IndexError: button.disabled = True await interaction.message.edit(embed=discord.Embed(title="No More Info Found :(", description="No more information has been found regarding the movie you searched for.", color=discord.Color.blurple(), timestamp=interaction.created_at), view=self) @discord.ui.button(emoji="πŸ”–", style=discord.ButtonStyle.grey) async def share_embed(self, interaction: discord.Interaction, button: discord.ui.Button): await interaction.response.send_message("Sending movie info to dm...", ephemeral=True) data = await get_movie_info(query=self.query, family_friendly=self.nsfw_check, count=self.counter) nsfw = data["adult"] or "N/A" language = data["original_language"] or "N/A" original_title = data["original_title"] or "N/A" overview = data["overview"] or "N/A" popularity = data["popularity"] or "N/A" if data["poster_path"] is not None: poster = "https://image.tmdb.org/t/p/w500" + data["poster_path"] else: poster = "https://upload.wikimedia.org/wikipedia/commons/thumb/6/65/No-Image-Placeholder.svg/832px-No-Image-Placeholder.svg.png" release_date = data["release_date"] or "N/A" title = data["title"] or "N/A" vote_average = data["vote_average"] or "N/A" vote_count = data["vote_count"] or "N/A" embed = discord.Embed(title=original_title, color=discord.Color.blurple(), timestamp=interaction.created_at) embed.set_footer(text=f"The most common aurora colours are red and green β€’ Page {self.counter}", icon_url=interaction.user.display_avatar) embed.set_image(url=poster) embed.add_field(name="<:owdcinema:996728312510562365> Title", value=title, inline=True) embed.add_field(name="<:owdcinema:996728312510562365> Language", value=language, inline=True) embed.add_field(name="<:adultsonly:996729151673352222> Is Nsfw?", value=nsfw, inline=True) embed.add_field(name="<:heppy:996729953259356252> Popularity", value=popularity, inline=True) embed.add_field(name=" Release Date", value=release_date, inline=True) embed.add_field(name="<:owdcinema:996728312510562365> Movie Overview", value=overview, inline=False) embed.add_field(name="<:pepeupvote:996729520893722715> Vote Average", value=vote_average, inline=True) embed.add_field(name="<:pepeupvote:996729520893722715> Vote Count", value=vote_count, inline=True) user_dm = await interaction.user.create_dm() await user_dm.send(embed=embed) class ControlsAnime(discord.ui.View): def __init__(self, query: str): self.query = query self.counter = 0 self.kitsu = kitsu.Client() super().__init__() @discord.ui.button(emoji="<:left:912268440029528075>", style=discord.ButtonStyle.blurple, disabled=True) async def back(self, interaction: discord.Interaction, button: discord.ui.Button): try: self.counter -= 1 await interaction.response.defer() search = await self.kitsu.search_anime(self.query, limit=11) if self.counter == 0 or self.counter <= 0: button.disabled = True await interaction.message.edit(view=self) if self.next.disabled is True: self.next.disabled = False await interaction.message.edit(view=self) title = search[self.counter].canonical_title synopsis = search[self.counter].synopsis or "N/A" anime_type = search[self.counter].subtype or "N/A" episode_count = search[self.counter].episode_count or "N/A" try: start_date = f"()" except AttributeError: start_date = "N/A" try: end_date = f"()" except AttributeError: end_date = "N/A" try: rating_rank = search[self.counter].rating_rank except TypeError: rating_rank = None rating_rank = f"**TOP** {rating_rank:,}" if rating_rank is not None else None duration = f"{search[self.counter].episode_length // 60} hour(s) and {search[self.counter].episode_length % 60} minutes" if \ search[self.counter].episode_length is not None else "N/A" poster_image = search[self.counter].poster_image( _type="large") or "https://upload.wikimedia.org/wikipedia/commons/thumb/6/65/No-Image-Placeholder.svg/832px-No-Image-Placeholder.svg.png" status = search[self.counter].status or "N/A" embed = discord.Embed(title=title, timestamp=interaction.created_at, color=discord.Color.blurple(), description=synopsis, url=f"https://kitsu.io/anime/{search[self.counter].id}") embed.add_field(name='❓ Type', value=anime_type) embed.add_field(name='πŸ’½ Episodes', value=episode_count, inline=True) embed.add_field(name=' Start Date', value=start_date, inline=False) embed.add_field(name=" End Date", value=end_date, inline=True) embed.add_field(name="⏲️ Duration", value=duration, inline=False) embed.add_field(name=" Status", value=status, inline=True) embed.add_field(name=" Rating", value=rating_rank, inline=True) embed.set_image(url=poster_image) embed.set_footer(text=f"Earth isn’t the only planet with auroras β€’ Page {self.counter}/10", icon_url=interaction.user.display_avatar) await interaction.message.edit(embed=embed) except IndexError: button.disabled = True await interaction.message.edit(embed=discord.Embed(title="No More Info Found :(", description="No more information has been found regarding the movie you searched for.", color=discord.Color.blurple(), timestamp=interaction.created_at), view=self) @discord.ui.button(emoji="<:delete:912359260954984459>", style=discord.ButtonStyle.red) async def delete(self, interaction: discord.Interaction, button: discord.Button): await interaction.response.defer() await interaction.delete_original_message() @discord.ui.button(emoji="<:right:912268383179919360>", style=discord.ButtonStyle.blurple) async def next(self, interaction: discord.Interaction, button: discord.ui.Button): try: self.counter += 1 await interaction.response.defer() if self.counter != 0 and self.back.disabled is True: self.back.disabled = False await interaction.message.edit(view=self) search = await self.kitsu.search_anime(self.query, limit=11) title = search[self.counter].canonical_title synopsis = search[self.counter].synopsis anime_type = search[self.counter].subtype or "N/A" episode_count = search[self.counter].episode_count or "N/A" try: start_date = f"()" except AttributeError: start_date = "N/A" try: end_date = f"()" except AttributeError: end_date = "N/A" try: rating_rank = search[self.counter].rating_rank except TypeError: rating_rank = None rating_rank = f"**TOP** {rating_rank:,}" if rating_rank is not None else None duration = f"{search[self.counter].episode_length // 60} hour(s) and {search[self.counter].episode_length % 60} minutes" if search[self.counter].episode_length is not None else "N/A" poster_image = search[self.counter].poster_image( _type="large") or "https://upload.wikimedia.org/wikipedia/commons/thumb/6/65/No-Image-Placeholder.svg/832px-No-Image-Placeholder.svg.png" status = search[self.counter].status or "N/A" embed = discord.Embed(title=title, timestamp=interaction.created_at, color=discord.Color.blurple(), description=synopsis, url=f"https://kitsu.io/anime/{search[self.counter].id}") embed.add_field(name='❓ Type', value=anime_type) embed.add_field(name='πŸ’½ Episodes', value=episode_count, inline=True) embed.add_field(name=' Start Date', value=start_date, inline=False) embed.add_field(name=" End Date", value=end_date, inline=True) embed.add_field(name="⏲️ Duration", value=duration, inline=False) embed.add_field(name=" Status", value=status, inline=True) embed.add_field(name=" Rating", value=rating_rank, inline=True) embed.set_image(url=poster_image) embed.set_footer(text=f"Earth isn’t the only planet with auroras β€’ Page {self.counter}/10", icon_url=interaction.user.display_avatar) await interaction.message.edit(embed=embed) except IndexError: button.disabled = True await interaction.message.edit(embed=discord.Embed(title="No More Info Found :(", description="No more information has been found regarding the movie you searched for.", color=discord.Color.blurple(), timestamp=interaction.created_at), view=self) @discord.ui.button(emoji="πŸ”–", style=discord.ButtonStyle.grey) async def share_embed(self, interaction: discord.Interaction, button: discord.ui.Button): await interaction.response.send_message("Sending movie info to dm...", ephemeral=True) search = await self.kitsu.search_anime(self.query, limit=11) title = search[self.counter].canonical_title synopsis = search[self.counter].synopsis anime_type = search[self.counter].subtype or "N/A" episode_count = search[self.counter].episode_count or "N/A" try: start_date = f"()" except AttributeError: start_date = "N/A" try: end_date = f"()" except AttributeError: end_date = "N/A" try: rating_rank = search[self.counter].rating_rank except TypeError: rating_rank = None rating_rank = f"**TOP** {rating_rank:,}" if rating_rank is not None else None duration = f"{search[self.counter].episode_length // 60} hour(s) and {search[self.counter].episode_length % 60} minutes" if search[self.counter].episode_length is not None else "N/A" poster_image = search[self.counter].poster_image( _type="large") or "https://upload.wikimedia.org/wikipedia/commons/thumb/6/65/No-Image-Placeholder.svg/832px-No-Image-Placeholder.svg.png" status = search[self.counter].status or "N/A" embed = discord.Embed(title=title, timestamp=interaction.created_at, color=discord.Color.blurple(), description=synopsis, url=f"https://kitsu.io/anime/{search[self.counter].id}") embed.add_field(name='❓ Type', value=anime_type) embed.add_field(name='πŸ’½ Episodes', value=episode_count, inline=True) embed.add_field(name=' Start Date', value=start_date, inline=False) embed.add_field(name=" End Date", value=end_date, inline=True) embed.add_field(name="⏲️ Duration", value=duration, inline=False) embed.add_field(name=" Status", value=status, inline=True) embed.add_field(name=" Rating", value=rating_rank, inline=True) embed.set_image(url=poster_image) embed.set_footer(text=f"Earth isn’t the only planet with auroras β€’ Page {self.counter}/10", icon_url=interaction.user.display_avatar) user_dm = await interaction.user.create_dm() await user_dm.send(embed=embed) class Search(commands.GroupCog, name="search"): def __init__(self, client): self.client = client self.kitsu = kitsu.Client() super().__init__() @app_commands.command(name="movie", description="Searches for a movie query") @app_commands.describe( query="The movie to get info on", family_friendly="Whether to show nsfw data or not" ) async def movie_info(self, interaction: discord.Interaction, query: str, family_friendly: bool = True): try: view = ControlsMovie(query=query, family_friendly=family_friendly) data = await get_movie_info(query=query, count=0) nsfw = data["adult"] language = data["original_language"] original_title = data["original_title"] overview = data["overview"] popularity = data["popularity"] poster = "https://image.tmdb.org/t/p/w500" + data["poster_path"] release_date = data["release_date"] title = data["title"] vote_average = data["vote_average"] vote_count = data["vote_count"] embed = discord.Embed(title=original_title, color=discord.Color.blurple(), timestamp=interaction.created_at) embed.set_footer(text=f"The most common aurora colours are red and green β€’ Page 0", icon_url=interaction.user.display_avatar) embed.set_image(url=poster) embed.add_field(name="<:owdcinema:996728312510562365> Title", value=title, inline=True) embed.add_field(name="<:owdcinema:996728312510562365> Language", value=language, inline=True) embed.add_field(name="<:adultsonly:996729151673352222> Is Nsfw?", value=nsfw, inline=True) embed.add_field(name="<:heppy:996729953259356252> Popularity", value=popularity, inline=True) embed.add_field(name="Release Date", value=release_date, inline=True) embed.add_field(name="<:owdcinema:996728312510562365> Movie Overview", value=overview, inline=False) embed.add_field(name="<:pepeupvote:996729520893722715> Vote Average", value=vote_average, inline=True) embed.add_field(name="<:pepeupvote:996729520893722715> Vote Count", value=vote_count, inline=True) await interaction.response.send_message(embed=embed, view=view) except: error_logger.error(f"Error occurred while running movie_info command:- ", exc_info=True) @app_commands.command(name="anime", description="Searches for an anime query") @app_commands.describe( query="The anime name to get info on" ) async def anime_info(self, interaction: discord.Interaction, query: str): search = await self.kitsu.search_anime(query, limit=10) view = ControlsAnime(query=query) embed = discord.Embed(title=f" {search[0].canonical_title}", description=search[0].synopsis, url=f"https://kitsu.io/anime/{search[0].id}", timestamp=interaction.created_at, color=discord.Color.dark_teal()) embed.add_field(name='❓ Type', value=search[0].subtype) embed.add_field(name='πŸ’½ Episodes', value=search[0].episode_count, inline=True) start_date = int(search[0].start_date.replace(tzinfo=timezone.utc).timestamp()) embed.add_field(name=' Start Date', value=f'()', inline=False) end_date = int(search[0].start_date.replace(tzinfo=timezone.utc).timestamp()) embed.add_field(name=" End Date", value=f"()", inline=True) try: rr = search[0].rating_rank except TypeError: rr = None rr = f"**TOP** {rr:,}" if rr is not None else None embed.add_field(name="⏲️ Duration", value=f"{search[0].episode_length} minutes", inline=False) embed.add_field(name=" Status", value=search[0].status, inline=True) embed.add_field(name=" Rating", value=rr, inline=True) embed.set_image(url=search[0].poster_image(_type="large")) embed.set_footer(text="Earth isn’t the only planet with auroras β€’ Page 0/10", icon_url=interaction.user.display_avatar) await interaction.response.send_message(embed=embed, view=view) @app_commands.command(name='weather', description="The weather details of a ceratin place") @app_commands.describe( location="The place whose weather information you want" ) async def weather_details(self, interaction: discord.Interaction, location: str): try: url = f"http://api.openweathermap.org/data/2.5/weather?appid=77f5585dd715ec1e39ba87b818b44498&q={location}" async with aiohttp.ClientSession() as session: async with session.get(url) as data: data = await data.json() try: longitude = data['coord']['lon'] latitude = data['coord']['lat'] cloud_type = data['weather'][0]['description'] temp = data['main']['temp'] feels_like = data['main']['feels_like'] temp = (temp - 273.15).__format__('0.2f') feels_like = (feels_like - 273.15).__format__('0.2f') min_temp = data['main']['temp_min'] min_temp = (min_temp - 273.15).__format__('0.2f') max_temp = data['main']['temp_max'] max_temp = (max_temp - 273.15).__format__('0.2f') pressure = data['main']['pressure'] humidity = data['main']['humidity'] wind_speed = data['wind']['speed'] country = data['sys']['country'] city_name = data['name'] except KeyError: await interaction.response.send_message("<:hellno:871582891585437759> Please provide a valid location.") emojis = ["β›…", "🌩️", "🌧️", "🌨️", "β›ˆοΈ", "🌦️", "🌀️"] embed = discord.Embed(title=f"{random.choice(emojis)} {city_name}'s Weather Info", timestamp=interaction.created_at, color=discord.Color.blurple()) embed.set_footer(text="Northern And Southern Lights Might Not Be Symmetrical", icon_url=interaction.user.display_avatar) embed.set_thumbnail(url="https://i.pinimg.com/originals/e7/7a/60/e77a6068aa8bb2731e3b6d835c09c84c.gif") # content embed.add_field(name="City", value=city_name) embed.add_field(name="Country", value=country) embed.add_field(name="Longitude", value=longitude) embed.add_field(name="Latitude", value=latitude) embed.add_field(name="Cloud Type", value=cloud_type) embed.add_field(name="Temperature", value=f"{temp}℃") embed.add_field(name="Feels Like", value=f"{feels_like}℃") embed.add_field(name="Minimum Temp", value=f"{min_temp}℃") embed.add_field(name="Maximum Temp", value=f"{max_temp}℃") embed.add_field(name="Pressure", value=f"{pressure}hPa") embed.add_field(name="Wind Speed", value=f"{wind_speed}m/s") embed.add_field(name="Humidity", value=f"{humidity}%") await interaction.response.send_message(embed=embed) except: error_logger.error("An error occurred while running weather command:- ", exc_info=True) async def setup(client): await client.add_cog(Search(client))