admin_api.voice: refresh lvsp regions on insert

closes #76
This commit is contained in:
Luna 2020-01-29 19:52:44 +00:00
parent d050d3b025
commit 9567bf0a85
3 changed files with 43 additions and 11 deletions

View File

@ -74,6 +74,7 @@ async def insert_new_region():
log.info("updating guilds to first voice region: {}", res) log.info("updating guilds to first voice region: {}", res)
await app.voice.lvsp.refresh_regions()
return jsonify(regions) return jsonify(regions)

View File

@ -58,11 +58,10 @@ class LVSPManager:
# quick storage for Region dataclass instances. # quick storage for Region dataclass instances.
self.regions = {} self.regions = {}
self.app.sched.spawn(self._spawn()) self.app.sched.spawn(self.refresh_regions())
async def _spawn(self): async def refresh_regions(self):
"""Spawn LVSPConnection for each region.""" """Spawn LVSPConnection for each region."""
regions = await self.app.db.fetch( regions = await self.app.db.fetch(
""" """
SELECT id, vip SELECT id, vip
@ -78,9 +77,13 @@ class LVSPManager:
return return
for region in regions: for region in regions:
# store it locally for region() function # this function can be run multiple times, and so we ignore
self.regions[region.id] = region # regions that are already in self.regions, since they already have
# their lvsp connections spawned.
if region.id in self.regions:
continue
self.regions[region.id] = region
self.app.loop.create_task(self._spawn_region(region)) self.app.loop.create_task(self._spawn_region(region))
async def _spawn_region(self, region: Region): async def _spawn_region(self, region: Region):

View File

@ -25,11 +25,11 @@ from litecord.blueprints.guilds import delete_guild
from litecord.errors import GuildNotFound from litecord.errors import GuildNotFound
async def _create_guild(test_cli_staff): async def _create_guild(test_cli_staff, *, region=None) -> dict:
genned_name = secrets.token_hex(6) genned_name = secrets.token_hex(6)
resp = await test_cli_staff.post( resp = await test_cli_staff.post(
"/api/v6/guilds", json={"name": genned_name, "region": None} "/api/v6/guilds", json={"name": genned_name, "region": region}
) )
assert resp.status_code == 200 assert resp.status_code == 200
@ -119,3 +119,31 @@ async def test_guild_delete(test_cli_staff):
assert rjson["code"] == GuildNotFound.error_code assert rjson["code"] == GuildNotFound.error_code
finally: finally:
await _delete_guild(test_cli_staff, int(guild_id)) await _delete_guild(test_cli_staff, int(guild_id))
@pytest.mark.asyncio
async def test_guild_create_voice(test_cli_staff):
region_id = secrets.token_hex(6)
region_name = secrets.token_hex(6)
resp = await test_cli_staff.put(
"/api/v6/admin/voice/regions", json={"id": region_id, "name": region_name}
)
assert resp.status_code == 200
guild_id = None
try:
rjson = await resp.json
assert isinstance(rjson, list)
assert region_id in [r["id"] for r in rjson]
guild_id = await _create_guild(test_cli_staff, region=region_id)
finally:
if guild_id:
await _delete_guild(test_cli_staff, int(guild_id["id"]))
await test_cli_staff.app.db.execute(
"""
DELETE FROM voice_regions
WHERE id = $1
""",
region_id,
)