Add user notes

- blueprints.users: fix get_other
 - blueprints.users: add dummy get_user_settings,
     patch_current_settings, get_consent, get_harvest and get_library
 - enums: add ExplicitFilter
 - storage: add Storage.fetch_notes
 - schema.sql: add incomplete user_settings table
This commit is contained in:
Luna Mendes 2018-09-22 20:18:48 -03:00
parent 26931425c4
commit 3858e20080
6 changed files with 153 additions and 5 deletions

View File

@ -23,6 +23,7 @@ $ createdb litecord
$ psql -f schema.sql litecord
# Configure litecord:
# edit config.py as you wish
$ cp config.example.py config.py
# Install all packages:

View File

@ -15,8 +15,8 @@ async def get_me():
return jsonify(user)
@bp.route('/<int:user_id>', methods=['GET'])
async def get_other():
@bp.route('/<int:target_id>', methods=['GET'])
async def get_other(target_id):
"""Get any user, given the user ID."""
user_id = await token_check()
@ -28,7 +28,7 @@ async def get_other():
if not bot:
raise Forbidden('Only bots can use this endpoint')
other = await app.storage.get_user(user_id)
other = await app.storage.get_user(target_id)
return jsonify(other)
@ -109,3 +109,92 @@ async def get_dms():
# @bp.route('/@me/channels', methods=['POST'])
async def start_dm():
pass
@bp.route('/@me/notes/<int:target_id>', methods=['PUT'])
async def put_note(target_id: int):
"""Put a note to a user."""
user_id = await token_check()
j = await request.get_json()
note = str(j['note'])
try:
await app.db.execute("""
INSERT INTO notes (user_id, target_id, note)
VALUES ($1, $2, $3)
""", user_id, target_id, note)
except UniqueViolationError:
await app.db.execute("""
UPDATE notes
SET note = $3
WHERE user_id = $1 AND target_id = $2
""", user_id, target_id, note)
return '', 204
@bp.route('/@me/settings', methods=['GET'])
async def get_user_settings():
# TODO: for now, just return hardcoded defaults,
# once we get the user_settings table working
# we can move to that.
await token_check()
return jsonify({
'afk_timeout': 300,
'animate_emoji': True,
'convert_emoticons': False,
'default_guilds_restricted': True,
'detect_platform_accounts': False,
'developer_mode': True,
'disable_games_tab': 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,
})
@bp.route('/@me/settings', methods=['PATCH'])
async def patch_current_settings():
return '', 204
@bp.route('/@me/consent', methods=['GET'])
async def get_consent():
"""Always disable data collection."""
return jsonify({
'usage_statistics': {
'consented': False,
},
'personalization': {
'consented': False,
}
})
@bp.route('/@me/harvest', methods=['GET'])
async def get_harvest():
"""Dummy route"""
return '', 204
@bp.route('/@me/library', methods=['GET'])
async def get_library():
"""Probably related to Discord Store?"""
return jsonify([])

View File

@ -71,3 +71,9 @@ class StatusType(EasyEnum):
IDLE = 'idle'
INVISIBLE = 'invisible'
OFFLINE = 'offline'
class ExplicitFilter(EasyEnum):
EDGE = 0
FRIENDS = 1
SAFE = 2

View File

@ -172,8 +172,7 @@ class GatewayWebsocket:
# TODO
'user_guild_settings': [],
# TODO
'notes': {},
'notes': await self.storage.fetch_notes(self.state.user_id),
'friend_suggestion_count': 0,
# TODO

View File

@ -380,3 +380,14 @@ class Storage:
res['pinned'] = False
return res
async def fetch_notes(self, user_id: int) -> dict:
"""Fetch a users' notes"""
note_rows = await self.db.fetch("""
SELECT target_id, note
FROM notes
WHERE user_id = $1
""", user_id)
return {str(row['target_id']): row['note']
for row in note_rows}

View File

@ -78,6 +78,48 @@ CREATE TABLE IF NOT EXISTS users (
PRIMARY KEY (id, username, discriminator)
);
/*
CREATE TABLE IF NOT EXISTS user_settings (
id bigint REFERENCES users (id),
afk_timeout int DEFAULT 300,
animate_emoji bool DEFAULT true,
convert_emoticons bool DEFAULT false,
default_guilds_restricted bool DEFAULT false,
detect_platform_accounts bool DEFAULT false,
-- smirk emoji
developer_mode bool DEFAULT true,
disable_games_tab bool DEFAULT true,
enable_tts_command bool DEFAULT false,
explicit_content_filter int DEFAULT 2,
friend_source_everyone bool DEFAULT true,
friend_source_mutuals bool DEFAULT true,
friend_source_guilds bool DEFAULT true,
gif_auto_play bool DEFAULT true,
-- TODO: guild_positions
-- TODO: restricted_guilds
inline_attachment_media bool DEFAULT true,
inline_embed_media bool DEFAULT true,
locale text DEFAULT 'en-US',
message_display_compact bool DEFAULT false,
render_embeds bool DEFAULT true,
render_reactions bool DEFAULT true,
show_current_game bool DEFAULT true,
status text DEFAULT 'online' NOT NULL,
theme text DEFAULT 'dark' NOT NULL,
timezone_offset int DEFAULT 0,
);
*/
CREATE TABLE IF NOT EXISTS notes (
user_id bigint REFERENCES users (id),