Compare commits

...

3 commits

Author SHA1 Message Date
4fa08e9e97 add setfm 2025-10-07 03:09:42 -03:00
6a9c1038d2 add sqlite database 2025-10-07 03:09:25 -03:00
6cfeed39e1 move utils (again) 2025-10-07 02:38:23 -03:00
7 changed files with 99 additions and 34 deletions

2
.gitignore vendored
View file

@ -3,6 +3,8 @@ config.toml
.vscode .vscode
database.db
# Byte-compiled / optimized / DLL files # Byte-compiled / optimized / DLL files
__pycache__/ __pycache__/
*.py[codz] *.py[codz]

36
bot.py
View file

@ -1,17 +1,23 @@
import os import os
import importlib import importlib
import aiosqlite
import nerimity import nerimity
import pylast import pylast
class Bot(nerimity.Client): class Bot(nerimity.Client):
"""Extended client class for extra functionality.""" """Extended client class for extra functionality."""
def __init__(self, lastfm_api_key: str, lastfm_api_secret: str, *args, **kwargs): def __init__(self, lastfm_api_key: str, lastfm_api_secret: str, db_file: str = "database.db", *args, **kwargs):
super().__init__(*args, **kwargs)
# initialize last.fm client
self.lastfm = pylast.LastFMNetwork( self.lastfm = pylast.LastFMNetwork(
api_key = lastfm_api_key, api_key = lastfm_api_key,
api_secret = lastfm_api_secret api_secret = lastfm_api_secret
) )
super().__init__(*args, **kwargs)
self.db = None
self.db_file = db_file
def load_commands(self, commands_dir: str): def load_commands(self, commands_dir: str):
for filename in os.listdir(commands_dir): for filename in os.listdir(commands_dir):
@ -22,3 +28,29 @@ class Bot(nerimity.Client):
module.setup(self) module.setup(self)
print(f"Loaded {module_name}") print(f"Loaded {module_name}")
print("Registered commands:", self.commands) print("Registered commands:", self.commands)
async def init_db(self):
print("Initializing database...")
self.db = await aiosqlite.connect(self.db_file)
await self.db.execute("""
CREATE TABLE IF NOT EXISTS lastfm_users (
user_id TEXT PRIMARY KEY,
lastfm_username TEXT NOT NULL
)
""")
await self.db.commit()
async def set_lastfm(self, user_id: str, username: str):
await self.db.execute(
"INSERT OR REPLACE INTO lastfm_users (user_id, lastfm_username) VALUES (?, ?)",
(user_id, username)
)
await self.db.commit()
async def get_lastfm(self, user_id: str):
async with self.db.execute(
"SELECT lastfm_username FROM lastfm_users WHERE user_id = ?",
(user_id,)
) as cursor:
row = await cursor.fetchone()
return row[0] if row else None

18
commands/config.py Normal file
View file

@ -0,0 +1,18 @@
import nerimity
import bot
import utils as u
def setup(bot: bot.Bot):
@bot.command(name="setfm", aliases=["setuser", "setlastfm"])
@bot.slash_command(name="setfm", description="Sets your Last.fm username.")
async def setfm(ctx: nerimity.Context, username: str = None):
if not username:
await ctx.send(u.error_msg("Please provide your Last.fm username."))
else:
try:
await bot.set_lastfm(ctx.author.id, username)
await ctx.send(u.good_msg(f"Your Last.fm user has been set to **{username}**!"))
except Exception as e:
print(e)
await ctx.send(u.error_msg("Unknown database error."))

View file

@ -1,38 +1,49 @@
import nerimity import nerimity
import pylast import pylast
import commands.utils as u import bot
import utils as u
def setup(bot): def setup(bot: bot.Bot):
@bot.command(name="fm", aliases=["np"]) @bot.command(name="fm", aliases=["np"])
@bot.slash_command(name="fm", description="Shows what you're currently playing") @bot.slash_command(name="fm", description="Shows what you're currently playing")
async def fm(ctx: nerimity.Context, params: str = ""): async def fm(ctx: nerimity.Context, lookup: str = None):
username = params if params else "kaaisudev" if lookup: username = lookup
else:
try: username = await bot.get_lastfm(ctx.author.id)
except Exception as e:
print(e)
await ctx.send(u.error_msg("Unknown database error."))
try: if not username:
track = bot.lastfm.get_user(username).get_now_playing() await ctx.send(u.error_msg("Please provide a Last.fm username (or set yours with `/setfm`)"))
if track == None: else:
now_playing = False try:
played_track = bot.lastfm.get_user(username).get_recent_tracks(limit=1) user = bot.lastfm.get_user(username)
track = played_track[0].track track = user.get_now_playing()
if track == None:
now_playing = False
played_track = user.get_recent_tracks(limit=1)
track = played_track[0].track
else: else:
now_playing = True now_playing = True
track_url = track.get_url() track_url = track.get_url()
track_name = track.get_name() track_name = track.get_name()
track_artist = track.get_artist().get_name() track_artist = track.get_artist().get_name()
track_artist_url = track.get_artist().get_url() track_artist_url = track.get_artist().get_url()
if now_playing == True: if now_playing == True:
await ctx.send(f"Now playing for **{username}**: [{track_name}]({track_url}) by [{track_artist}]({track_artist_url})") await ctx.send(f"Now playing for **{username}**: [{track_name}]({track_url}) by [{track_artist}]({track_artist_url})")
else: else:
await ctx.send(f"Last played for **{username}**: [{track_name}]({track_url}) by [{track_artist}]({track_artist_url})") await ctx.send(f"Last played for **{username}**: [{track_name}]({track_url}) by [{track_artist}]({track_artist_url})")
except IndexError: except IndexError:
await ctx.send(u.error_msg("User has no recent tracks or they're set to private.")) await ctx.send(u.error_msg(f"User **{username}** has no recent tracks or they're set to private."))
except pylast.WSError: except pylast.WSError:
await ctx.send(u.error_msg("User not found.")) await ctx.send(u.error_msg(f"User **{username}** not found."))
except Exception as e:
print(e) except Exception as e:
await ctx.send(u.error_msg("Unknown error.")) print(e)
await ctx.send(u.error_msg("Unknown error."))

View file

@ -1,2 +0,0 @@
def error_msg(message: str):
return f"[#e5323b][Error] [#reset]{message}"

View file

@ -1,7 +1,5 @@
import tomllib import tomllib
import nerimity import nerimity
import pylast
import bot import bot
@ -10,8 +8,8 @@ with open("config.toml", "rb") as f:
# nerimity client # nerimity client
bot = bot.Bot( bot = bot.Bot(
token = config['token'],
prefix = '!', prefix = '!',
token = config['token'],
lastfm_api_key = config['api_key'], lastfm_api_key = config['api_key'],
lastfm_api_secret = config['api_secret'] lastfm_api_secret = config['api_secret']
) )
@ -21,5 +19,6 @@ bot.load_commands("commands")
@bot.listen("on_ready") @bot.listen("on_ready")
async def on_ready(params): async def on_ready(params):
print(f"Logged in as {bot.account.username}") print(f"Logged in as {bot.account.username}")
await bot.init_db()
bot.run() bot.run()

5
utils.py Normal file
View file

@ -0,0 +1,5 @@
def error_msg(message: str):
return f"[#e5323b][Error] [#reset]{message}"
def good_msg(message: str):
return f"[#52ff54][Success] [#reset]{message}"