mirror of https://gitlab.com/litecord/litecord.git
channel.messages: add implementation for before, after and around
for GET /api/v6/channels/:id/messages.
This commit is contained in:
parent
f2d5913672
commit
2f822408b9
|
|
@ -6,7 +6,7 @@ from logbook import Logger
|
|||
from litecord.blueprints.auth import token_check
|
||||
from litecord.blueprints.checks import channel_check
|
||||
from litecord.blueprints.dms import try_dm_state
|
||||
from litecord.errors import MessageNotFound, Forbidden
|
||||
from litecord.errors import MessageNotFound, Forbidden, BadRequest
|
||||
from litecord.enums import MessageType, ChannelType, GUILD_CHANS
|
||||
from litecord.snowflake import get_snowflake
|
||||
from litecord.schemas import validate, MESSAGE_CREATE
|
||||
|
|
@ -16,19 +16,54 @@ log = Logger(__name__)
|
|||
bp = Blueprint('channel_messages', __name__)
|
||||
|
||||
|
||||
def query_tuple_from_args(args: dict, limit: int) -> tuple:
|
||||
before, after = None, None
|
||||
|
||||
if 'around' in request.args:
|
||||
average = int(limit / 2)
|
||||
around = int(request.args['around'])
|
||||
|
||||
after = around - average
|
||||
before = around + average
|
||||
|
||||
elif 'before' in request.args:
|
||||
before = int(request.args['before'])
|
||||
elif 'after' in request.args:
|
||||
before = int(request.args['after'])
|
||||
|
||||
return before, after
|
||||
|
||||
|
||||
@bp.route('/<int:channel_id>/messages', methods=['GET'])
|
||||
async def get_messages(channel_id):
|
||||
user_id = await token_check()
|
||||
|
||||
# TODO: check READ_MESSAGE_HISTORY permission
|
||||
await channel_check(user_id, channel_id)
|
||||
|
||||
# TODO: before, after, around keys
|
||||
try:
|
||||
limit = int(request.args.get('limit', 50))
|
||||
|
||||
if limit not in range(0, 100):
|
||||
raise ValueError()
|
||||
except (TypeError, ValueError):
|
||||
raise BadRequest('limit not int')
|
||||
|
||||
where_clause = ''
|
||||
before, after = query_tuple_from_args(request.args, limit)
|
||||
|
||||
if before:
|
||||
where_clause += f'AND id < {before}'
|
||||
|
||||
if after:
|
||||
where_clause += f'AND id > {after}'
|
||||
|
||||
message_ids = await app.db.fetch(f"""
|
||||
SELECT id
|
||||
FROM messages
|
||||
WHERE channel_id = $1
|
||||
WHERE channel_id = $1 {where_clause}
|
||||
ORDER BY id DESC
|
||||
LIMIT 100
|
||||
LIMIT {limit}
|
||||
""", channel_id)
|
||||
|
||||
result = []
|
||||
|
|
|
|||
Loading…
Reference in New Issue