From b07d0ac6691d1fdb24114171aac3d07fab010496 Mon Sep 17 00:00:00 2001 From: WhatDidYouExpect <89535984+WhatDidYouExpect@users.noreply.github.com> Date: Tue, 1 Jul 2025 15:31:46 +0200 Subject: [PATCH] new cog --- cogs/README.md | 3 ++ cogs/lastfm.py | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 cogs/lastfm.py diff --git a/cogs/README.md b/cogs/README.md index e5ec73a..6cfe875 100644 --- a/cogs/README.md +++ b/cogs/README.md @@ -22,3 +22,6 @@ by expect (requires goober version 0.11.8 or higher) [webUI](https://raw.githubusercontent.com/WhatDidYouExpect/goober/refs/heads/main/cogs/webserver.py) by expect (requires goober version 0.11.8 or higher) + +[LastFM](https://raw.githubusercontent.com/WhatDidYouExpect/goober/refs/heads/main/cogs/webserver.py) +by expect (no idea what version it needs i've only tried it on 1.0.3) diff --git a/cogs/lastfm.py b/cogs/lastfm.py new file mode 100644 index 0000000..949f09f --- /dev/null +++ b/cogs/lastfm.py @@ -0,0 +1,81 @@ +import os +import discord +from discord.ext import commands, tasks +import aiohttp +from dotenv import load_dotenv + +load_dotenv() + +#stole most of this code from my old expect bot so dont be suprised if its poorly made + +LASTFM_API_KEY = os.getenv("LASTFM_API_KEY") +LASTFM_USERNAME = os.getenv("LASTFM_USERNAME") + +class LastFmCog(commands.Cog): + def __init__(self, bot): + self.bot = bot + self.current_track = None + self.update_presence_task = None + self.ready = False + bot.loop.create_task(self.wait_until_ready()) + + async def wait_until_ready(self): + await self.bot.wait_until_ready() + self.ready = True + self.update_presence.start() + + @tasks.loop(seconds=60) + async def update_presence(self): + print("Looped!") + if not self.ready: + return + track = await self.fetch_current_track() + if track and track != self.current_track: + self.current_track = track + artist, song = track + activity_name = f"{artist} - {song}" + await self.bot.change_presence(activity=discord.Activity(type=discord.ActivityType.listening, name=activity_name)) + print(f"Updated song to {artist} - {song}") + else: + print("LastFM gave me the same track! not updating...") + + @update_presence.before_loop + async def before_update_presence(self): + await self.bot.wait_until_ready() + + @commands.command(name="lastfm") + async def lastfm_command(self, ctx): + track = await self.fetch_current_track() + if not track: + await ctx.send("No track currently playing or could not fetch data") + return + self.current_track = track + artist, song = track + activity_name = f"{artist} - {song}" + await self.bot.change_presence(activity=discord.Activity(type=discord.ActivityType.listening, name=activity_name)) + await ctx.send(f"Updated presence to: Listening to {activity_name}") + + async def fetch_current_track(self): + url = ( + f"http://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks" + f"&user={LASTFM_USERNAME}&api_key={LASTFM_API_KEY}&format=json&limit=1" + ) + async with aiohttp.ClientSession() as session: + async with session.get(url) as resp: + if resp.status != 200: + return None + data = await resp.json() + + recenttracks = data.get("recenttracks", {}).get("track", []) + if not recenttracks: + return None + + track = recenttracks[0] + if '@attr' in track and track['@attr'].get('nowplaying') == 'true': + artist = track.get('artist', {}).get('#text', 'Unknown Artist') + song = track.get('name', 'Unknown Song') + return artist, song + return None + +async def setup(bot): + await bot.add_cog(LastFmCog(bot))