diff --git a/litecord/blueprints/guilds.py b/litecord/blueprints/guilds.py index dd51ad0..f9bea6f 100644 --- a/litecord/blueprints/guilds.py +++ b/litecord/blueprints/guilds.py @@ -59,12 +59,10 @@ async def create_guild(): VALUES ($1, $2) """, user_id, guild_id) - everyone_role_id = get_snowflake() - await app.db.execute(""" INSERT INTO roles (id, guild_id, name, position, permissions) VALUES ($1, $2, $3, $4, $5) - """, everyone_role_id, guild_id, '@everyone', 0, 104324161) + """, guild_id, guild_id, '@everyone', 0, 104324161) general_id = get_snowflake() diff --git a/litecord/gateway/websocket.py b/litecord/gateway/websocket.py index 4becb79..5ca13e2 100644 --- a/litecord/gateway/websocket.py +++ b/litecord/gateway/websocket.py @@ -145,19 +145,71 @@ class GatewayWebsocket: await self.dispatch('GUILD_CREATE', dict(guild)) + async def user_ready(self): + """Fetch information about users in the READY packet. + + This part of the API is completly undocumented. + PLEAS DISCORD DO NOT BAN ME + """ + + return { + 'relationships': [], + 'user_guild_settings': [], + 'notes': {}, + 'friend_suggestion_count': 0, + 'presences': [], + 'read_state': [], + 'experiments': [], + 'guild_experiments': [], + 'connected_accounts': [], + 'user_settings': { + 'afk_timeout': 300, + 'animate_emoji': True, + 'convert_emoticons': False, + 'default_guilds_restricted': True, + 'detect_platform_accounts': False, + 'developer_mode': True, + 'enable_tts_command': False, + 'explicit_content_filter': 2, + 'friend_source_flags': { + 'mutual_friends': True + }, + 'gif_auto_play': True, + 'guild_positions': [], + 'inline_attachment_media': True, + 'inline_embed_media': True, + 'locale': 'en-US', + 'message_display_compact': False, + 'render_embeds': True, + 'render_reactions': True, + 'restricted_guilds': [], + 'show_current_game': True, + 'status': 'online', + 'theme': 'dark', + 'timezone_offset': 420, + }, + 'analytics_token': 'transbian', + 'required_action': 'be gay', + } + async def dispatch_ready(self): """Dispatch the READY packet for a connecting account.""" guilds = await self._make_guild_list() user = await self.storage.get_user(self.state.user_id, True) - await self.dispatch('READY', { + uready = {} + if not self.state.bot: + # user, fetch info + uready = await self.user_ready() + + await self.dispatch('READY', {**{ 'v': 6, 'user': user, 'private_channels': [], 'guilds': guilds, 'session_id': self.state.session_id, '_trace': ['transbian'] - }) + }, **uready}) # async dispatch of guilds self.ext.loop.create_task(self.guild_dispatch(guilds)) diff --git a/litecord/storage.py b/litecord/storage.py index f66952a..a75c231 100644 --- a/litecord/storage.py +++ b/litecord/storage.py @@ -112,7 +112,7 @@ class Storage: return { 'user': await self.get_user(member_id), 'nick': row['nickname'], - 'roles': [row[0] for row in members_roles], + 'roles': [guild_id] + [row[0] for row in members_roles], 'joined_at': row['joined_at'].isoformat(), 'deaf': row['deafened'], 'mute': row['muted'], @@ -177,7 +177,8 @@ class Storage: async def get_channel_data(self, guild_id) -> List[Dict]: """Get channel information on a guild""" channel_basics = await self.db.fetch(""" - SELECT * FROM guild_channels + SELECT id, guild_id::text, parent_id, name, position, nsfw + FROM guild_channels WHERE guild_id = $1 """, guild_id) @@ -215,6 +216,21 @@ class Storage: return channels + async def get_role_data(self, guild_id: int) -> List[Dict[str, Any]]: + roledata = await self.db.fetch(""" + SELECT id::text, name, color, hoist, position, + permissions, managed, mentionable + FROM roles + WHERE guild_id = $1 + """, guild_id) + + roles = [] + + for row in roledata: + roles.append(dict(row)) + + return roles + async def get_guild_extra(self, guild_id: int, user_id=None, large=None) -> Dict: """Get extra information about a guild.""" @@ -238,12 +254,14 @@ class Storage: members = await self.get_member_data(guild_id) channels = await self.get_channel_data(guild_id) + roles = await self.get_role_data(guild_id) return {**res, **{ 'member_count': member_count, 'members': members, 'voice_states': [], 'channels': channels, + 'roles': roles, # TODO: finish those 'presences': [], }} diff --git a/schema.sql b/schema.sql index 9e9bf62..67df08a 100644 --- a/schema.sql +++ b/schema.sql @@ -278,7 +278,7 @@ CREATE TABLE IF NOT EXISTS roles ( guild_id bigint REFERENCES guilds (id) ON DELETE CASCADE, name varchar(100) NOT NULL, - color int DEFAULT 0, + color int DEFAULT 1, hoist bool DEFAULT false, position int NOT NULL, permissions int NOT NULL,