mirror of https://gitlab.com/litecord/litecord.git
Merge branch 'support/embed-links' into 'master'
Embed Links permission support Closes #49 See merge request litecord/litecord!43
This commit is contained in:
commit
cf16a14e94
|
|
@ -32,6 +32,7 @@ from litecord.enums import MessageType, ChannelType, GUILD_CHANS
|
||||||
from litecord.snowflake import get_snowflake
|
from litecord.snowflake import get_snowflake
|
||||||
from litecord.schemas import validate, MESSAGE_CREATE
|
from litecord.schemas import validate, MESSAGE_CREATE
|
||||||
from litecord.utils import pg_set_json
|
from litecord.utils import pg_set_json
|
||||||
|
from litecord.permissions import get_permissions
|
||||||
|
|
||||||
from litecord.embed.sanitizer import fill_embed
|
from litecord.embed.sanitizer import fill_embed
|
||||||
from litecord.embed.messages import process_url_embed
|
from litecord.embed.messages import process_url_embed
|
||||||
|
|
@ -360,6 +361,14 @@ async def msg_add_attachment(message_id: int, channel_id: int,
|
||||||
return attachment_id
|
return attachment_id
|
||||||
|
|
||||||
|
|
||||||
|
async def _spawn_embed(app_, payload, **kwargs):
|
||||||
|
app_.sched.spawn(
|
||||||
|
process_url_embed(
|
||||||
|
app_.config, app_.storage, app_.dispatcher, app_.session,
|
||||||
|
payload, **kwargs)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/<int:channel_id>/messages', methods=['POST'])
|
@bp.route('/<int:channel_id>/messages', methods=['POST'])
|
||||||
async def _create_message(channel_id):
|
async def _create_message(channel_id):
|
||||||
"""Create a message."""
|
"""Create a message."""
|
||||||
|
|
@ -424,12 +433,9 @@ async def _create_message(channel_id):
|
||||||
'MESSAGE_CREATE', payload)
|
'MESSAGE_CREATE', payload)
|
||||||
|
|
||||||
# spawn url processor for embedding of images
|
# spawn url processor for embedding of images
|
||||||
app.sched.spawn(
|
perms = await get_permissions(user_id, channel_id)
|
||||||
process_url_embed(
|
if perms.bits.embed_links:
|
||||||
app.config, app.storage, app.dispatcher, app.session,
|
await _spawn_embed(app, payload)
|
||||||
payload
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
# update read state for the author
|
# update read state for the author
|
||||||
await app.db.execute("""
|
await app.db.execute("""
|
||||||
|
|
@ -487,17 +493,14 @@ async def edit_message(channel_id, message_id):
|
||||||
# the artificial delay keeps consistency between the events, since
|
# the artificial delay keeps consistency between the events, since
|
||||||
# it makes more sense for the MESSAGE_UPDATE with new content to come
|
# it makes more sense for the MESSAGE_UPDATE with new content to come
|
||||||
# BEFORE the MESSAGE_UPDATE with the new embeds (based on content)
|
# BEFORE the MESSAGE_UPDATE with the new embeds (based on content)
|
||||||
app.sched.spawn(
|
perms = await get_permissions(user_id, channel_id)
|
||||||
process_url_embed(
|
if perms.bits.embed_links:
|
||||||
app.config, app.storage, app.dispatcher, app.session,
|
await _spawn_embed(app, {
|
||||||
{
|
|
||||||
'id': message_id,
|
'id': message_id,
|
||||||
'channel_id': channel_id,
|
'channel_id': channel_id,
|
||||||
'content': j['content'],
|
'content': j['content'],
|
||||||
'embeds': old_message['embeds']
|
'embeds': old_message['embeds']
|
||||||
}, delay=0.2
|
}, delay=0.2)
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
# only set new timestamp upon actual update
|
# only set new timestamp upon actual update
|
||||||
if updated:
|
if updated:
|
||||||
|
|
|
||||||
|
|
@ -278,26 +278,25 @@ async def _mass_chan_update(guild_id, channel_ids: List[Optional[int]]):
|
||||||
async def _process_overwrites(channel_id: int, overwrites: list):
|
async def _process_overwrites(channel_id: int, overwrites: list):
|
||||||
for overwrite in overwrites:
|
for overwrite in overwrites:
|
||||||
|
|
||||||
# 0 for user overwrite, 1 for role overwrite
|
# 0 for member overwrite, 1 for role overwrite
|
||||||
target_type = 0 if overwrite['type'] == 'user' else 1
|
target_type = 0 if overwrite['type'] == 'member' else 1
|
||||||
target_role = None if target_type == 0 else overwrite['id']
|
target_role = None if target_type == 0 else overwrite['id']
|
||||||
target_user = overwrite['id'] if target_type == 0 else None
|
target_user = overwrite['id'] if target_type == 0 else None
|
||||||
|
|
||||||
|
col_name = 'target_user' if target_type == 0 else 'target_role'
|
||||||
|
constraint_name = f'channel_overwrites_{col_name}_uniq'
|
||||||
|
|
||||||
await app.db.execute(
|
await app.db.execute(
|
||||||
"""
|
f"""
|
||||||
INSERT INTO channel_overwrites
|
INSERT INTO channel_overwrites
|
||||||
(channel_id, target_type, target_role,
|
(channel_id, target_type, target_role,
|
||||||
target_user, allow, deny)
|
target_user, allow, deny)
|
||||||
VALUES
|
VALUES
|
||||||
($1, $2, $3, $4, $5, $6)
|
($1, $2, $3, $4, $5, $6)
|
||||||
ON CONFLICT ON CONSTRAINT channel_overwrites_uniq
|
ON CONFLICT ON CONSTRAINT {constraint_name}
|
||||||
DO
|
DO
|
||||||
UPDATE
|
UPDATE
|
||||||
SET allow = $5, deny = $6
|
SET allow = $5, deny = $6
|
||||||
WHERE channel_overwrites.channel_id = $1
|
|
||||||
AND channel_overwrites.target_type = $2
|
|
||||||
AND channel_overwrites.target_role = $3
|
|
||||||
AND channel_overwrites.target_user = $4
|
|
||||||
""",
|
""",
|
||||||
channel_id, target_type,
|
channel_id, target_type,
|
||||||
target_role, target_user,
|
target_role, target_user,
|
||||||
|
|
|
||||||
|
|
@ -156,7 +156,7 @@ async def process_url_embed(config, storage, dispatcher,
|
||||||
if not new_embeds:
|
if not new_embeds:
|
||||||
return
|
return
|
||||||
|
|
||||||
log.debug('made {} thumbnail embeds for mid {}',
|
log.debug('made {} embeds for mid {}',
|
||||||
len(new_embeds), message_id)
|
len(new_embeds), message_id)
|
||||||
|
|
||||||
await msg_update_embeds(payload, new_embeds, storage, dispatcher)
|
await msg_update_embeds(payload, new_embeds, storage, dispatcher)
|
||||||
|
|
|
||||||
|
|
@ -403,9 +403,9 @@ class Storage:
|
||||||
drow = dict(row)
|
drow = dict(row)
|
||||||
|
|
||||||
target_type = drow['target_type']
|
target_type = drow['target_type']
|
||||||
drow['type'] = 'user' if target_type == 0 else 'role'
|
drow['type'] = 'member' if target_type == 0 else 'role'
|
||||||
|
|
||||||
# if type is 0, the overwrite is for a user
|
# if type is 0, the overwrite is for a member
|
||||||
# if type is 1, the overwrite is for a role
|
# if type is 1, the overwrite is for a role
|
||||||
drow['id'] = {
|
drow['id'] = {
|
||||||
0: drow['target_user'],
|
0: drow['target_user'],
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
ALTER TABLE channel_overwrites
|
||||||
|
DROP CONSTRAINT IF EXISTS channel_overwrites_uniq;
|
||||||
|
|
||||||
|
ALTER TABLE channel_overwrites
|
||||||
|
ADD CONSTRAINT channel_overwrites_target_role_uniq
|
||||||
|
UNIQUE (channel_id, target_role);
|
||||||
|
|
||||||
|
ALTER TABLE channel_overwrites
|
||||||
|
ADD CONSTRAINT channel_overwrites_target_user_uniq
|
||||||
|
UNIQUE (channel_id, target_user);
|
||||||
Loading…
Reference in New Issue