diff --git a/src/database/queries.py b/src/database/queries.py index d26be9e..568bc35 100644 --- a/src/database/queries.py +++ b/src/database/queries.py @@ -170,6 +170,15 @@ def delete_comment_by_id(conn: sqlite3.Connection, comment_id: str): return bool(curs.rowcount) +def hide_comment_by_id(conn: sqlite3.Connection, comment_id: str): + with conn: + curs = conn.execute(""" + UPDATE OR IGNORE COMMENT SET IsHidden = TRUE + WHERE CommentId = ? + """, (comment_id,)) + return bool(curs.rowcount) + + def insert_channel(conn: sqlite3.Connection, channel_name: str, channel_id: str): with conn: conn.execute( diff --git a/src/database/writes.py b/src/database/writes.py index 0c4ba03..7fe99c2 100644 --- a/src/database/writes.py +++ b/src/database/writes.py @@ -4,11 +4,13 @@ import sqlite3 from asyncio import coroutine from database.queries import delete_comment_by_id -from src.server.misc import is_authentic_delete_signal +from src.server.misc import is_authentic_delete_signal, request_lbrynet, validate_signature_from_claim from database.queries import get_comment_or_none from database.queries import insert_comment from database.queries import insert_channel +from database.queries import get_channel_id_from_comment_id +from database.queries import hide_comment_by_id from src.server.misc import channel_matches_pattern_or_error logger = logging.getLogger(__name__) @@ -47,5 +49,30 @@ async def delete_comment_if_authorized(app, comment_id, **kwargs): return {'deleted': await job.wait()} -async def write_comment(app, comment): - return await coroutine(create_comment_or_error)(app['writer'], **comment) +async def write_comment(app, params): + return await coroutine(create_comment_or_error)(app['writer'], **params) + + +async def hide_comment(app, comment_id): + return await coroutine(hide_comment_by_id)(app['writer'], comment_id) + + +# comment_ids: [ +# { +# "comment_id": id, +# "signing_ts": signing_ts, +# "signature": signature +# }, +# ... +# ] +async def hide_comment_if_authorized(app, comment_id, signing_ts, signature): + channel = get_channel_id_from_comment_id(app['reader'], comment_id) + claim = await request_lbrynet(app, 'claim_search', claim_id=channel['channel_id']) + claim = claim['items'][0] + if not validate_signature_from_claim(claim, signature, signing_ts, comment_id): + raise ValueError('Invalid Signature') + + job = await app['comment_scheduler'].spawn(hide_comment(app, comment_id)) + return { + 'hidden': await job.wait() + }