blueprints.users: add user setting patch impl

- schemas: add explicit type
 - schemas: add USER_SETTINGS
 - run: make Access-Control-Allow-Methods the same as Allow header when
    possible
This commit is contained in:
Luna Mendes 2018-09-29 23:43:02 -03:00
parent 624eb6eb0e
commit bff5700d06
3 changed files with 74 additions and 5 deletions

View File

@ -3,6 +3,7 @@ from asyncpg import UniqueViolationError
from ..auth import token_check
from ..errors import Forbidden, BadRequest
from ..schemas import validate, USER_SETTINGS
bp = Blueprint('user', __name__)
@ -144,7 +145,19 @@ async def get_user_settings():
@bp.route('/@me/settings', methods=['PATCH'])
async def patch_current_settings():
return '', 204
user_id = await token_check()
j = validate(await request.get_json(), USER_SETTINGS)
for key in j:
await app.db.execute(f"""
UPDATE user_settings
SET {key}=$1
""", j[key])
settings = await app.storage.get_user_settings(user_id)
await app.dispatcher.dispatch_user(
user_id, 'USER_SETTINGS_UPDATE', settings)
return jsonify(settings)
@bp.route('/@me/consent', methods=['GET', 'POST'])

View File

@ -4,7 +4,7 @@ from cerberus import Validator
from logbook import Logger
from .errors import BadRequest
from .enums import ActivityType, StatusType
from .enums import ActivityType, StatusType, ExplicitFilter
log = Logger(__name__)
@ -49,6 +49,14 @@ class LitecordValidator(Validator):
return value in statuses
def _validate_type_explicit(self, value: str) -> bool:
try:
val = int(value)
except (TypeError, ValueError):
return False
return val in ExplicitFilter.values()
def validate(reqjson, schema, raise_err: bool = True):
validator = LitecordValidator(schema)
@ -80,7 +88,7 @@ GUILD_UPDATE = {
'type': 'msg_notifications',
'required': False,
},
'explicit_content_filter': {'type': 'explicit_content', 'required': False},
'explicit_content_filter': {'type': 'explicit', 'required': False},
'afk_channel_id': {'type': 'snowflake', 'required': False},
'afk_timeout': {'type': 'number', 'required': False},
@ -169,7 +177,8 @@ GW_ACTIVITY = {
GW_STATUS_UPDATE = {
'status': {'type': 'status_external', 'required': False},
'activities': {'type': 'list', 'schema': GW_ACTIVITY},
'activities': {
'type': 'list', 'required': False, 'schema': GW_ACTIVITY},
'afk': {'type': 'boolean', 'required': False},
'since': {'type': 'number', 'required': True, 'nullable': True},
@ -208,3 +217,48 @@ INVITE = {
'temporary': {'type': 'boolean', 'required': False, 'default': False},
'unique': {'type': 'boolean', 'required': False, 'default': True},
}
USER_SETTINGS = {
'afk_timeout': {
'type': 'number', 'required': False, 'min': 0, 'max': 3000},
'animate_emoji': {'type': 'boolean', 'required': False},
'convert_emoticons': {'type': 'boolean', 'required': False},
'default_guilds_restricted': {'type': 'boolean', 'required': False},
'detect_platform_accounts': {'type': 'boolean', 'required': False},
'developer_mode': {'type': 'boolean', 'required': False},
'disable_games_tab': {'type': 'boolean', 'required': False},
'enable_tts_command': {'type': 'boolean', 'required': False},
'explicit_content_filter': {'type': 'explicit', 'required': False},
'friend_source': {
'type': 'dict',
'required': False,
'schema': {
'all': {'type': 'boolean', 'required': False},
'mutual_guilds': {'type': 'boolean', 'required': False},
'mutual_friends': {'type': 'boolean', 'required': False},
}
},
'guild_positions': {
'type': 'list',
'required': False,
'schema': {'type': 'snowflake'}
},
'restricted_guilds': {
'type': 'list',
'required': False,
'schema': {'type': 'snowflake'}
},
'gif_auto_play': {'type': 'boolean', 'required': False},
'inline_attachment_media': {'type': 'boolean', 'required': False},
'inline_embed_media': {'type': 'boolean', 'required': False},
'message_display_compact': {'type': 'boolean', 'required': False},
'render_embeds': {'type': 'boolean', 'required': False},
'render_reactions': {'type': 'boolean', 'required': False},
'show_current_game': {'type': 'boolean', 'required': False},
'timezone_offset': {'type': 'number', 'required': False},
}

4
run.py
View File

@ -75,7 +75,9 @@ async def app_after_request(resp):
'Authorization, '
'Origin, '
'If-None-Match')
resp.headers['Access-Control-Allow-Methods'] = '*'
# resp.headers['Access-Control-Allow-Methods'] = '*'
resp.headers['Access-Control-Allow-Methods'] = \
resp.headers.get('allow', '*')
return resp