Compare commits

...

4 Commits

Author SHA1 Message Date
7d6373e38b fix(core): properly use on_voice_state_update
This is called for different members updating their own individual voice
states, not just the bot itself. If someone leaves the channel, we get
their view of their voice state.
2026-04-23 11:21:33 -04:00
3a5e182970 fix: rename modules for hot reloading 2026-04-23 11:21:33 -04:00
45b6ccdf22 feat: add direnv 2026-04-13 19:15:52 -04:00
0a80999ca7 refactor(pyproject): set typeCheckingMode to basic 2026-04-11 18:48:33 -04:00
6 changed files with 52 additions and 44 deletions

6
.envrc Normal file
View File

@@ -0,0 +1,6 @@
dotenv
export VIRTUAL_ENV=."venv"
layout python
use flake

1
.gitignore vendored
View File

@@ -1,3 +1,4 @@
.direnv
.env .env
.venv .venv
__pycache__ __pycache__

View File

@@ -31,34 +31,34 @@ REACTIONS = {
"pizza": ["🍕"], "pizza": ["🍕"],
} }
RELOADABLE_MODULES = [ RELOADABLE_MODULES = [
"arguments", "errornocord.arguments",
"audio", "errornocord.audio",
"audio.discord", "errornocord.audio.discord",
"audio.queue", "errornocord.audio.queue",
"audio.utils", "errornocord.audio.utils",
"audio.youtubedl", "errornocord.audio.youtubedl",
"commands", "errornocord.commands",
"commands.bot", "errornocord.commands.bot",
"commands.tools", "errornocord.commands.tools",
"commands.utils", "errornocord.commands.utils",
"commands.voice", "errornocord.commands.voice",
"commands.voice.channel", "errornocord.commands.voice.channel",
"commands.voice.playback", "errornocord.commands.voice.playback",
"commands.voice.playing", "errornocord.commands.voice.playing",
"commands.voice.queue", "errornocord.commands.voice.queue",
"commands.voice.sponsorblock", "errornocord.commands.voice.sponsorblock",
"commands.voice.utils", "errornocord.commands.voice.utils",
"constants", "errornocord.constants",
"core", "errornocord.core",
"events", "errornocord.events",
"extra", "errornocord.extra",
"fun", "errornocord.fun",
"sponsorblock", "errornocord.sponsorblock",
"tasks", "errornocord.tasks",
"utils", "errornocord.utils",
"utils.common", "errornocord.utils.common",
"utils.discord", "errornocord.utils.discord",
"voice", "errornocord.voice",
"yt_dlp", "yt_dlp",
"yt_dlp.version", "yt_dlp.version",
] ]

View File

@@ -148,22 +148,20 @@ async def on_message(message, edited=False):
command_locks[(message.guild.id, message.author.id)].release() command_locks[(message.guild.id, message.author.id)].release()
async def on_voice_state_update(_, before, after): async def on_voice_state_update(member, before, after):
if not before.channel and after.channel: def is_alone(channel):
return
if before.channel and not after.channel:
if before.channel.guild.id in players:
del players[before.channel.guild.id]
return
def is_empty(channel):
return [m.id for m in (channel.members if channel else [])] == [client.user.id] return [m.id for m in (channel.members if channel else [])] == [client.user.id]
if is_empty(after.channel): if member.id == client.user.id and is_alone(after.channel):
if after.channel.guild.id in players: if before.channel.guild.id in players:
del players[after.channel.guild.id] del players[before.channel.guild.id]
await after.channel.guild.voice_client.disconnect() await after.channel.guild.voice_client.disconnect()
return
if is_alone(before.channel):
if before.channel.guild.id in players:
del players[before.channel.guild.id]
await before.channel.guild.voice_client.disconnect()
def rreload(reloaded_modules, module): def rreload(reloaded_modules, module):
@@ -187,8 +185,8 @@ def rreload(reloaded_modules, module):
def reload(*_): def reload(*_):
reloaded_modules = set() reloaded_modules = set()
rreload(reloaded_modules, __import__("core")) rreload(reloaded_modules, __import__("errornocord.core"))
rreload(reloaded_modules, __import__("extra")) rreload(reloaded_modules, __import__("errornocord.extra"))
for module in filter( for module in filter(
lambda v: inspect.ismodule(v) and v.__name__ in RELOADABLE_MODULES, lambda v: inspect.ismodule(v) and v.__name__ in RELOADABLE_MODULES,
globals().values(), globals().values(),

View File

@@ -4,7 +4,7 @@ import string
import disnake import disnake
from youtube_transcript_api._api import YouTubeTranscriptApi from youtube_transcript_api._api import YouTubeTranscriptApi
from state import client, kill, players from .state import client, kill, players
async def transcript( async def transcript(

View File

@@ -8,3 +8,6 @@ errornocord = "errornocord.main:main"
[tool.setuptools.packages.find] [tool.setuptools.packages.find]
where = ["."] where = ["."]
include = ["errornocord*"] include = ["errornocord*"]
[tool.basedpyright]
typeCheckingMode = "basic"