mirror of https://gitlab.com/litecord/litecord.git
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:
parent
624eb6eb0e
commit
bff5700d06
|
|
@ -3,6 +3,7 @@ from asyncpg import UniqueViolationError
|
||||||
|
|
||||||
from ..auth import token_check
|
from ..auth import token_check
|
||||||
from ..errors import Forbidden, BadRequest
|
from ..errors import Forbidden, BadRequest
|
||||||
|
from ..schemas import validate, USER_SETTINGS
|
||||||
|
|
||||||
bp = Blueprint('user', __name__)
|
bp = Blueprint('user', __name__)
|
||||||
|
|
||||||
|
|
@ -144,7 +145,19 @@ async def get_user_settings():
|
||||||
|
|
||||||
@bp.route('/@me/settings', methods=['PATCH'])
|
@bp.route('/@me/settings', methods=['PATCH'])
|
||||||
async def patch_current_settings():
|
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'])
|
@bp.route('/@me/consent', methods=['GET', 'POST'])
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ from cerberus import Validator
|
||||||
from logbook import Logger
|
from logbook import Logger
|
||||||
|
|
||||||
from .errors import BadRequest
|
from .errors import BadRequest
|
||||||
from .enums import ActivityType, StatusType
|
from .enums import ActivityType, StatusType, ExplicitFilter
|
||||||
|
|
||||||
|
|
||||||
log = Logger(__name__)
|
log = Logger(__name__)
|
||||||
|
|
@ -49,6 +49,14 @@ class LitecordValidator(Validator):
|
||||||
|
|
||||||
return value in statuses
|
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):
|
def validate(reqjson, schema, raise_err: bool = True):
|
||||||
validator = LitecordValidator(schema)
|
validator = LitecordValidator(schema)
|
||||||
|
|
@ -80,7 +88,7 @@ GUILD_UPDATE = {
|
||||||
'type': 'msg_notifications',
|
'type': 'msg_notifications',
|
||||||
'required': False,
|
'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_channel_id': {'type': 'snowflake', 'required': False},
|
||||||
'afk_timeout': {'type': 'number', 'required': False},
|
'afk_timeout': {'type': 'number', 'required': False},
|
||||||
|
|
@ -169,7 +177,8 @@ GW_ACTIVITY = {
|
||||||
|
|
||||||
GW_STATUS_UPDATE = {
|
GW_STATUS_UPDATE = {
|
||||||
'status': {'type': 'status_external', 'required': False},
|
'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},
|
'afk': {'type': 'boolean', 'required': False},
|
||||||
|
|
||||||
'since': {'type': 'number', 'required': True, 'nullable': True},
|
'since': {'type': 'number', 'required': True, 'nullable': True},
|
||||||
|
|
@ -208,3 +217,48 @@ INVITE = {
|
||||||
'temporary': {'type': 'boolean', 'required': False, 'default': False},
|
'temporary': {'type': 'boolean', 'required': False, 'default': False},
|
||||||
'unique': {'type': 'boolean', 'required': False, 'default': True},
|
'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
4
run.py
|
|
@ -75,7 +75,9 @@ async def app_after_request(resp):
|
||||||
'Authorization, '
|
'Authorization, '
|
||||||
'Origin, '
|
'Origin, '
|
||||||
'If-None-Match')
|
'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
|
return resp
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue