storage: inject message.member field

required some changes around how we fetch data from the members table,
but it works
This commit is contained in:
Luna 2019-03-05 18:31:33 -03:00
parent 7b4aaabcbf
commit a846c57ae8
1 changed files with 36 additions and 8 deletions

View File

@ -171,12 +171,34 @@ class Storage:
return drow return drow
async def _member_basic(self, guild_id: int, member_id: int): async def _member_basic(self, guild_id: int, member_id: int):
return await self.db.fetchrow(""" row = await self.db.fetchrow("""
SELECT user_id, nickname, joined_at, deafened, muted SELECT user_id, nickname, joined_at,
deafened AS deaf, muted AS mute
FROM members FROM members
WHERE guild_id = $1 and user_id = $2 WHERE guild_id = $1 and user_id = $2
""", guild_id, member_id) """, guild_id, member_id)
if row is None:
return None
row = dict(row)
row['joined_at'] = timestamp_(row['joined_at'])
return row
async def _member_basic_with_roles(self, guild_id: int,
member_id: int):
basic = await self._member_basic(guild_id, member_id)
if basic is None:
return None
basic = dict(basic)
roles = await self.get_member_role_ids(guild_id, member_id)
return {**basic, **{
'roles': roles
}}
async def get_member_role_ids(self, guild_id: int, async def get_member_role_ids(self, guild_id: int,
member_id: int) -> List[str]: member_id: int) -> List[str]:
"""Get a list of role IDs that are on a member.""" """Get a list of role IDs that are on a member."""
@ -203,6 +225,7 @@ class Storage:
async def _member_dict(self, row, guild_id, member_id) -> Dict[str, Any]: async def _member_dict(self, row, guild_id, member_id) -> Dict[str, Any]:
roles = await self.get_member_role_ids(guild_id, member_id) roles = await self.get_member_role_ids(guild_id, member_id)
return { return {
'user': await self.get_user(member_id), 'user': await self.get_user(member_id),
'nick': row['nickname'], 'nick': row['nickname'],
@ -211,9 +234,9 @@ class Storage:
# the user since it is known that everyone has # the user since it is known that everyone has
# that role. # that role.
'roles': roles, 'roles': roles,
'joined_at': timestamp_(row['joined_at']), 'joined_at': row['joined_at'],
'deaf': row['deafened'], 'deaf': row['deaf'],
'mute': row['muted'], 'mute': row['mute'],
} }
async def get_member_data_one(self, guild_id: int, async def get_member_data_one(self, guild_id: int,
@ -244,7 +267,8 @@ class Storage:
async def get_member_data(self, guild_id: int) -> List[Dict[str, Any]]: async def get_member_data(self, guild_id: int) -> List[Dict[str, Any]]:
"""Get member information on a guild.""" """Get member information on a guild."""
members_basic = await self.db.fetch(""" members_basic = await self.db.fetch("""
SELECT user_id, nickname, joined_at, deafened, muted SELECT user_id, nickname, joined_at,
deafened AS deaf, muted AS mute
FROM members FROM members
WHERE guild_id = $1 WHERE guild_id = $1
""", guild_id) """, guild_id)
@ -849,8 +873,12 @@ class Storage:
res['attachments'] = await self.get_attachments(message_id) res['attachments'] = await self.get_attachments(message_id)
# TODO: res['member'] for partial member data # if message is not from a dm, guild_id is None and so, _member_basic
# of the author # will just return None
res['member'] = await self._member_basic_with_roles(guild_id, user_id)
if res['member'] is None:
res.pop('member')
pin_id = await self.db.fetchval(""" pin_id = await self.db.fetchval("""
SELECT message_id SELECT message_id