mirror of https://gitlab.com/litecord/litecord.git
Add hazmat impl for OP 8 Request Guild Members
- storage: add Storage.guild_exists, Storage.query_members
This commit is contained in:
parent
51f7ea5ad0
commit
b091bd5c49
|
|
@ -496,6 +496,59 @@ class GatewayWebsocket:
|
||||||
await self._resume(range(seq, state.seq))
|
await self._resume(range(seq, state.seq))
|
||||||
await self.dispatch('RESUMED', {})
|
await self.dispatch('RESUMED', {})
|
||||||
|
|
||||||
|
async def _req_guild_members(self, guild_id: str, user_ids: List[int],
|
||||||
|
query: str, limit: int):
|
||||||
|
try:
|
||||||
|
guild_id = int(guild_id)
|
||||||
|
except (TypeError, ValueError):
|
||||||
|
return
|
||||||
|
|
||||||
|
limit = limit or 1000
|
||||||
|
exists = await self.storage.get_guild(guild_id)
|
||||||
|
|
||||||
|
if not exists:
|
||||||
|
return
|
||||||
|
|
||||||
|
# limit user_ids to 1000 possible members
|
||||||
|
user_ids = user_ids[:1000]
|
||||||
|
|
||||||
|
# assumption: requesting user_ids means
|
||||||
|
# we don't do query.
|
||||||
|
if user_ids:
|
||||||
|
members = await self.storage.get_member_multi(guild_id, user_ids)
|
||||||
|
mids = [m['user']['id'] for m in members]
|
||||||
|
not_found = [uid for uid in user_ids if uid not in mids]
|
||||||
|
|
||||||
|
await self.dispatch('GUILD_MEMBERS_CHUNK', {
|
||||||
|
'guild_id': str(guild_id),
|
||||||
|
'members': members,
|
||||||
|
'not_found': not_found,
|
||||||
|
})
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
# do the search
|
||||||
|
result = await self.storage.query_members(guild_id, query, limit)
|
||||||
|
await self.dispatch('GUILD_MEMBERS_CHUNK', {
|
||||||
|
'guild_id': str(guild_id),
|
||||||
|
'members': result
|
||||||
|
})
|
||||||
|
|
||||||
|
async def handle_8(self, data: Any):
|
||||||
|
"""Handle OP 8 Request Guild Members."""
|
||||||
|
gids = data['guild_id']
|
||||||
|
uids, query, limit = data.get('user_ids', []), \
|
||||||
|
data.get('query', ''), \
|
||||||
|
data.get('limit', 0)
|
||||||
|
|
||||||
|
if isinstance(gids, str):
|
||||||
|
await self._req_guild_members(gids, uids, query, limit)
|
||||||
|
return
|
||||||
|
|
||||||
|
for gid in gids:
|
||||||
|
# ignore uids on multiple guilds
|
||||||
|
await self._req_guild_members(gid, [], query, limit)
|
||||||
|
|
||||||
async def _guild_sync(self, guild_id: int):
|
async def _guild_sync(self, guild_id: int):
|
||||||
members = await self.storage.get_member_data(guild_id)
|
members = await self.storage.get_member_data(guild_id)
|
||||||
member_ids = [int(m['user']['id']) for m in members]
|
member_ids = [int(m['user']['id']) for m in members]
|
||||||
|
|
|
||||||
|
|
@ -200,6 +200,20 @@ class Storage:
|
||||||
|
|
||||||
return members
|
return members
|
||||||
|
|
||||||
|
async def query_members(self, guild_id: int, query: str, limit: int):
|
||||||
|
"""Find members with usernames matching the given query."""
|
||||||
|
mids = await self.db.fetch(f"""
|
||||||
|
SELECT user_id
|
||||||
|
FROM members
|
||||||
|
JOIN users ON members.user_id = users.id
|
||||||
|
WHERE members.guild_id = $1
|
||||||
|
AND users.username LIKE '%'||$2
|
||||||
|
LIMIT {limit}
|
||||||
|
""", guild_id, query)
|
||||||
|
|
||||||
|
members = await self.get_member_multi(guild_id, mids)
|
||||||
|
return members
|
||||||
|
|
||||||
async def _channels_extra(self, row) -> Dict:
|
async def _channels_extra(self, row) -> Dict:
|
||||||
"""Fill in more information about a channel."""
|
"""Fill in more information about a channel."""
|
||||||
channel_type = row['type']
|
channel_type = row['type']
|
||||||
|
|
@ -364,6 +378,16 @@ class Storage:
|
||||||
|
|
||||||
return {**guild, **extra}
|
return {**guild, **extra}
|
||||||
|
|
||||||
|
async def guild_exists(self, guild_id: int):
|
||||||
|
"""Return if a given guild ID exists."""
|
||||||
|
owner_id = await self.db.fetch("""
|
||||||
|
SELECT owner_id
|
||||||
|
FROM guilds
|
||||||
|
WHERE id = $1
|
||||||
|
""", guild_id)
|
||||||
|
|
||||||
|
return owner_id is not None
|
||||||
|
|
||||||
async def get_member_ids(self, guild_id: int) -> List[int]:
|
async def get_member_ids(self, guild_id: int) -> List[int]:
|
||||||
rows = await self.db.fetch("""
|
rows = await self.db.fetch("""
|
||||||
SELECT user_id
|
SELECT user_id
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue