diff --git a/frontend/src/pages/squeak/Squeak.js b/frontend/src/pages/squeak/Squeak.js index a61832d0..a8f9e908 100644 --- a/frontend/src/pages/squeak/Squeak.js +++ b/frontend/src/pages/squeak/Squeak.js @@ -52,9 +52,9 @@ export default function SqueakPage() { getAncestorSqueakDisplaysRequest(hash, handleLoadedAncestorSqueaks); }; const subscribeAncestorSqueaks = (hash) => subscribeAncestorSqueakDisplaysRequest(hash, setAncestorSqueaks); - const getReplySqueaks = (hash, limit, blockHeight, squeakTime, squeakHash) => { + const getReplySqueaks = (hash, limit, lastEntry) => { setWaitingForReplySqueaks(true); - getReplySqueakDisplaysRequest(hash, limit, blockHeight, squeakTime, squeakHash, handleLoadedReplySqueaks); + getReplySqueakDisplaysRequest(hash, limit, lastEntry, handleLoadedReplySqueaks); }; const subscribeReplySqueaks = (hash) => subscribeReplySqueakDisplaysRequest(hash, (resp) => { setReplySqueaks((prevReplySqueaks) => prevReplySqueaks.concat(resp)); @@ -107,7 +107,7 @@ export default function SqueakPage() { return () => stream.cancel(); }, [hash]); useEffect(() => { - getReplySqueaks(hash, SQUEAKS_PER_PAGE, null, null, null); + getReplySqueaks(hash, SQUEAKS_PER_PAGE, null); }, [hash]); useEffect(() => { const stream = subscribeReplySqueaks(hash); @@ -234,10 +234,7 @@ export default function SqueakPage() { disabled={waitingForReplySqueaks} onClick={() => { const latestSqueak = replySqueaks.slice(-1).pop(); - const latestSqueakHeight = (latestSqueak ? latestSqueak.getBlockHeight() : null); - const latestSqueakTime = (latestSqueak ? latestSqueak.getSqueakTime() : null); - const latestSqueakHash = (latestSqueak ? latestSqueak.getSqueakHash() : null); - getReplySqueaks(hash, SQUEAKS_PER_PAGE, latestSqueakHeight, latestSqueakTime, latestSqueakHash); + getReplySqueaks(hash, SQUEAKS_PER_PAGE, latestSqueak); }} > diff --git a/frontend/src/pages/squeakaddress/SqueakAddress.js b/frontend/src/pages/squeakaddress/SqueakAddress.js index 78ddc91a..0633c2f6 100644 --- a/frontend/src/pages/squeakaddress/SqueakAddress.js +++ b/frontend/src/pages/squeakaddress/SqueakAddress.js @@ -49,9 +49,9 @@ export default function SqueakAddressPage() { const getSqueakProfile = (address) => { getSqueakProfileByAddressRequest(address, setSqueakProfile); }; - const getSqueaks = (address, limit, blockHeight, squeakTime, squeakHash) => { + const getSqueaks = (address, limit, lastEntry) => { setWaitingForSqueaks(true); - getAddressSqueakDisplaysRequest(address, limit, blockHeight, squeakTime, squeakHash, handleLoadedAddressSqueaks); + getAddressSqueakDisplaysRequest(address, limit, lastEntry, handleLoadedAddressSqueaks); }; const subscribeSqueaks = (address) => subscribeAddressSqueakDisplaysRequest(address, (resp) => { setSqueaks((prevSqueaks) => [resp].concat(prevSqueaks)); @@ -90,7 +90,7 @@ export default function SqueakAddressPage() { getSqueakProfile(address); }, [address]); useEffect(() => { - getSqueaks(address, SQUEAKS_PER_PAGE, null, null, null); + getSqueaks(address, SQUEAKS_PER_PAGE, null); }, [address]); useEffect(() => { const stream = subscribeSqueaks(address); @@ -247,10 +247,7 @@ export default function SqueakAddressPage() { disabled={waitingForSqueaks} onClick={() => { const latestSqueak = squeaks.slice(-1).pop(); - const latestSqueakHeight = (latestSqueak ? latestSqueak.getBlockHeight() : null); - const latestSqueakTime = (latestSqueak ? latestSqueak.getSqueakTime() : null); - const latestSqueakHash = (latestSqueak ? latestSqueak.getSqueakHash() : null); - getSqueaks(address, SQUEAKS_PER_PAGE, latestSqueakHeight, latestSqueakTime, latestSqueakHash); + getSqueaks(address, SQUEAKS_PER_PAGE, latestSqueak); }} > diff --git a/frontend/src/pages/timeline/Timeline.js b/frontend/src/pages/timeline/Timeline.js index a42851a7..ccc9e5b6 100644 --- a/frontend/src/pages/timeline/Timeline.js +++ b/frontend/src/pages/timeline/Timeline.js @@ -43,9 +43,9 @@ export default function TimelinePage() { const history = useHistory(); - const getSqueaks = (limit, blockHeight, squeakTime, squeakHash) => { + const getSqueaks = (limit, lastEntry) => { setWaitingForTimeline(true); - getTimelineSqueakDisplaysRequest(limit, blockHeight, squeakTime, squeakHash, handleLoadedTimeline, alertFailedRequest); + getTimelineSqueakDisplaysRequest(limit, lastEntry, handleLoadedTimeline, alertFailedRequest); }; const subscribeNewSqueaks = () => subscribeTimelineSqueakDisplaysRequest(handleLoadedNewSqueak); const getNetwork = () => { @@ -67,7 +67,7 @@ export default function TimelinePage() { const handleClickRefresh = () => { setSqueaks(null); setNewSqueaks(null); - getSqueaks(SQUEAKS_PER_PAGE, null, null, null); + getSqueaks(SQUEAKS_PER_PAGE, null); }; const handleLoadedTimeline = (loadedSqueaks) => { @@ -90,7 +90,7 @@ export default function TimelinePage() { }; useEffect(() => { - getSqueaks(SQUEAKS_PER_PAGE, null, null, null); + getSqueaks(SQUEAKS_PER_PAGE, null); }, []); useEffect(() => { const stream = subscribeNewSqueaks(); @@ -148,10 +148,7 @@ export default function TimelinePage() { disabled={waitingForTimeline} onClick={() => { const latestSqueak = squeaks.slice(-1).pop(); - const latestSqueakHeight = (latestSqueak ? latestSqueak.getBlockHeight() : null); - const latestSqueakTime = (latestSqueak ? latestSqueak.getSqueakTime() : null); - const latestSqueakHash = (latestSqueak ? latestSqueak.getSqueakHash() : null); - getSqueaks(SQUEAKS_PER_PAGE, latestSqueakHeight, latestSqueakTime, latestSqueakHash); + getSqueaks(SQUEAKS_PER_PAGE, latestSqueak); }} > diff --git a/frontend/src/squeakclient/requests.js b/frontend/src/squeakclient/requests.js index f1371538..a1dc5bdc 100644 --- a/frontend/src/squeakclient/requests.js +++ b/frontend/src/squeakclient/requests.js @@ -111,12 +111,10 @@ export function getUserRequest(handleResponse) { }); } -export function getTimelineSqueakDisplaysRequest(limit, blockHeight, squeakTime, squeakHash, handleResponse, handleErr) { +export function getTimelineSqueakDisplaysRequest(limit, lastEntry, handleResponse, handleErr) { const request = new GetTimelineSqueakDisplaysRequest(); request.setLimit(limit); - request.setBlockHeight(blockHeight); - request.setSqueakTime(squeakTime); - request.setSqueakHash(squeakHash); + request.setLastEntry(lastEntry); client.getTimelineSqueakDisplays(request, {}, (err, response) => { if (err) { handleErr(err); @@ -356,13 +354,11 @@ export function getAncestorSqueakDisplaysRequest(hash, handleResponse) { }); } -export function getReplySqueakDisplaysRequest(hash, limit, latestBlockHeight, latestSqueakTime, latestSqueakHash, handleResponse) { +export function getReplySqueakDisplaysRequest(hash, limit, lastEntry, handleResponse) { const request = new GetReplySqueakDisplaysRequest(); request.setSqueakHash(hash); request.setLimit(limit); - request.setLatestBlockHeight(latestBlockHeight); - request.setLatestSqueakTime(latestSqueakTime); - request.setLatestSqueakHash(latestSqueakHash); + request.setLastEntry(lastEntry); client.getReplySqueakDisplays(request, {}, (err, response) => { handleResponse(response.getSqueakDisplayEntriesList()); }); @@ -376,13 +372,11 @@ export function getSqueakProfileByAddressRequest(address, handleResponse) { }); } -export function getAddressSqueakDisplaysRequest(address, limit, blockHeight, squeakTime, squeakHash, handleResponse) { +export function getAddressSqueakDisplaysRequest(address, limit, lastEntry, handleResponse) { const request = new GetAddressSqueakDisplaysRequest(); request.setAddress(address); request.setLimit(limit); - request.setBlockHeight(blockHeight); - request.setSqueakTime(squeakTime); - request.setSqueakHash(squeakHash); + request.setLastEntry(lastEntry); client.getAddressSqueakDisplays(request, {}, (err, response) => { handleResponse(response.getSqueakDisplayEntriesList()); }); diff --git a/proto/squeak_admin.proto b/proto/squeak_admin.proto index e8d04b37..7bc74569 100644 --- a/proto/squeak_admin.proto +++ b/proto/squeak_admin.proto @@ -553,14 +553,8 @@ message GetTimelineSqueakDisplaysRequest { /// Limit number of results int32 limit = 1; - /// Block height - int32 block_height = 2; - - /// Squeak time - int64 squeak_time = 3; - - /// Hash of the squeak. - string squeak_hash = 4; + /// Last entry + SqueakDisplayEntry last_entry = 2; } message GetTimelineSqueakDisplaysReply { @@ -575,14 +569,8 @@ message GetAddressSqueakDisplaysRequest { /// Limit number of results int32 limit = 2; - /// Block height - int32 block_height = 3; - - /// Squeak time - int64 squeak_time = 4; - - /// Hash of the squeak. - string squeak_hash = 5; + /// Last entry + SqueakDisplayEntry last_entry = 3; } message GetAddressSqueakDisplaysReply { @@ -607,14 +595,8 @@ message GetReplySqueakDisplaysRequest { /// Limit number of results int32 limit = 2; - /// Block height - int32 latest_block_height = 3; - - /// Squeak time - int64 latest_squeak_time = 4; - - /// Hash of the squeak. - string latest_squeak_hash = 5; + /// Last entry + SqueakDisplayEntry last_entry = 3; } message GetReplySqueakDisplaysReply { diff --git a/squeaknode/admin/messages.py b/squeaknode/admin/messages.py index 0359cdd8..c0a83a97 100644 --- a/squeaknode/admin/messages.py +++ b/squeaknode/admin/messages.py @@ -201,3 +201,20 @@ def message_to_peer_address(peer_address: squeak_admin_pb2.PeerAddress) -> PeerA host=peer_address.host, port=peer_address.port, ) + + +def message_to_squeak_entry(squeak_entry: squeak_admin_pb2.SqueakDisplayEntry) -> SqueakEntry: + return SqueakEntry( + squeak_hash=bytes.fromhex(squeak_entry.squeak_hash), + address=squeak_entry.author_address, + block_height=squeak_entry.block_height, + block_hash=bytes.fromhex(squeak_entry.block_hash), + block_time=squeak_entry.block_time, + squeak_time=squeak_entry.squeak_time, + reply_to=bytes.fromhex( + squeak_entry.reply_to) if squeak_entry.reply_to else None, + is_unlocked=squeak_entry.is_unlocked, + squeak_profile=None, # TODO: message to squeak profile + liked_time=squeak_entry.liked_time_s, + content=squeak_entry.content_str, + ) diff --git a/squeaknode/admin/squeak_admin_server_handler.py b/squeaknode/admin/squeak_admin_server_handler.py index d3615170..57989d6e 100644 --- a/squeaknode/admin/squeak_admin_server_handler.py +++ b/squeaknode/admin/squeak_admin_server_handler.py @@ -24,6 +24,7 @@ import logging from proto import squeak_admin_pb2 from squeaknode.admin.messages import connected_peer_to_message from squeaknode.admin.messages import message_to_peer_address +from squeaknode.admin.messages import message_to_squeak_entry from squeaknode.admin.messages import offer_entry_to_message from squeaknode.admin.messages import payment_summary_to_message from squeaknode.admin.messages import received_payments_to_message @@ -312,28 +313,24 @@ class SqueakAdminServerHandler(object): def handle_get_timeline_squeak_display_entries(self, request): limit = request.limit - block_height = request.block_height - squeak_time = request.squeak_time - squeak_hash_str = request.squeak_hash - squeak_hash = bytes.fromhex( - squeak_hash_str) if squeak_hash_str else None + last_entry = message_to_squeak_entry(request.last_entry) if request.HasField( + "last_entry") else None + # block_height = last_entry.block_height + # squeak_time = last_entry.squeak_time + # squeak_hash_str = last_entry.squeak_hash + # squeak_hash = bytes.fromhex( + # squeak_hash_str) if squeak_hash_str else None logger.info("""Handle get timeline squeak display entries with limit: {} - block_height: {} - squeak_time: {} - squeak_hash: {} + last_entry: {} """.format( limit, - block_height, - squeak_time, - squeak_hash, + last_entry, )) squeak_entries = ( self.squeak_controller.get_timeline_squeak_entries( limit, - block_height, - squeak_time, - squeak_hash, + last_entry, ) ) logger.info( @@ -351,30 +348,21 @@ class SqueakAdminServerHandler(object): def handle_get_squeak_display_entries_for_address(self, request): address = request.address limit = request.limit - block_height = request.block_height - squeak_time = request.squeak_time - squeak_hash_str = request.squeak_hash - squeak_hash = bytes.fromhex( - squeak_hash_str) if squeak_hash_str else None + last_entry = message_to_squeak_entry(request.last_entry) if request.HasField( + "last_entry") else None logger.info("""Handle get squeak display entries for address: {} with limit: {} - block_height: {} - squeak_time: {} - squeak_hash: {} + last_entry: {} """.format( address, limit, - block_height, - squeak_time, - squeak_hash, + last_entry, )) squeak_entries = ( self.squeak_controller.get_squeak_entries_for_address( address, limit, - block_height, - squeak_time, - squeak_hash, + last_entry, ) ) logger.info( @@ -418,30 +406,21 @@ class SqueakAdminServerHandler(object): squeak_hash_str = request.squeak_hash squeak_hash = bytes.fromhex(squeak_hash_str) limit = request.limit - latest_block_height = request.latest_block_height - latest_squeak_time = request.latest_squeak_time - latest_squeak_hash_str = request.latest_squeak_hash - latest_squeak_hash = bytes.fromhex( - latest_squeak_hash_str) if latest_squeak_hash_str else None + last_entry = message_to_squeak_entry(request.last_entry) if request.HasField( + "last_entry") else None logger.info("""Handle get reply squeak display entries for squeak hash: {} with limit: {} - block_height: {} - squeak_time: {} - squeak_hash: {} + last_entry: {} """.format( squeak_hash_str, limit, - latest_block_height, - latest_squeak_time, - latest_squeak_hash_str, + last_entry, )) squeak_entries = ( self.squeak_controller.get_reply_squeak_entries( squeak_hash, limit, - latest_block_height, - latest_squeak_time, - latest_squeak_hash, + last_entry, ) ) logger.info( diff --git a/squeaknode/db/squeak_db.py b/squeaknode/db/squeak_db.py index 4640a4b2..ca5d0963 100644 --- a/squeaknode/db/squeak_db.py +++ b/squeaknode/db/squeak_db.py @@ -241,24 +241,22 @@ class SqueakDb: def get_timeline_squeak_entries( self, limit: int, - block_height: int = MAX_INT, - squeak_time: int = MAX_INT, - squeak_hash: bytes = MAX_HASH, + last_entry: Optional[SqueakEntry], ) -> List[SqueakEntry]: """ Get all followed squeaks. """ - block_height = block_height or MAX_INT - squeak_time = squeak_time or MAX_INT - squeak_hash = squeak_hash or MAX_HASH - logger.debug("""Timeline db query with + last_block_height = last_entry.block_height if last_entry else MAX_INT + last_squeak_time = last_entry.squeak_time if last_entry else MAX_INT + last_squeak_hash = last_entry.squeak_hash if last_entry else MAX_HASH + logger.info("""Timeline db query with limit: {} block_height: {} squeak_time: {} squeak_hash: {} """.format( limit, - block_height, - squeak_time, - squeak_hash.hex(), + last_block_height, + last_squeak_time, + last_squeak_hash.hex(), )) s = ( select([self.squeaks, self.profiles]) @@ -275,9 +273,9 @@ class SqueakDb: self.squeaks.c.n_time, self.squeaks.c.hash, ) < tuple_( - block_height, - squeak_time, - squeak_hash, + last_block_height, + last_squeak_time, + last_squeak_hash, ) ) .order_by( @@ -318,14 +316,23 @@ class SqueakDb: self, address: str, limit: int, - block_height: int, - squeak_time: int, - squeak_hash: bytes, + last_entry: Optional[SqueakEntry], ) -> List[SqueakEntry]: """ Get a squeak. """ - block_height = block_height or MAX_INT - squeak_time = squeak_time or MAX_INT - squeak_hash = squeak_hash or MAX_HASH + last_block_height = last_entry.block_height if last_entry else MAX_INT + last_squeak_time = last_entry.squeak_time if last_entry else MAX_INT + last_squeak_hash = last_entry.squeak_hash if last_entry else MAX_HASH + logger.info("""Timeline db query with + limit: {} + block_height: {} + squeak_time: {} + squeak_hash: {} + """.format( + limit, + last_block_height, + last_squeak_time, + last_squeak_hash.hex(), + )) s = ( select([self.squeaks, self.profiles]) .select_from( @@ -341,9 +348,9 @@ class SqueakDb: self.squeaks.c.n_time, self.squeaks.c.hash, ) < tuple_( - block_height, - squeak_time, - squeak_hash, + last_block_height, + last_squeak_time, + last_squeak_hash, ) ) .order_by( @@ -428,26 +435,22 @@ class SqueakDb: self, squeak_hash: bytes, limit: int, - latest_block_height: int, - latest_squeak_time: int, - latest_squeak_hash: bytes, + last_entry: Optional[SqueakEntry], ) -> List[SqueakEntry]: """ Get all replies for a squeak hash. """ - latest_block_height = latest_block_height or MAX_INT - latest_squeak_time = latest_squeak_time or MAX_INT - latest_squeak_hash = latest_squeak_hash or MAX_HASH - logger.debug("""Replies db query with - squeak_hash: {} + last_block_height = last_entry.block_height if last_entry else MAX_INT + last_squeak_time = last_entry.squeak_time if last_entry else MAX_INT + last_squeak_hash = last_entry.squeak_hash if last_entry else MAX_HASH + logger.info("""Timeline db query with limit: {} - latest_block_height: {} - latest_squeak_time: {} - latest_squeak_hash: {} + block_height: {} + squeak_time: {} + squeak_hash: {} """.format( - squeak_hash.hex(), limit, - latest_block_height, - latest_squeak_time, - latest_squeak_hash.hex(), + last_block_height, + last_squeak_time, + last_squeak_hash.hex(), )) s = ( select([self.squeaks, self.profiles]) @@ -464,9 +467,9 @@ class SqueakDb: self.squeaks.c.n_time, self.squeaks.c.hash, ) < tuple_( - latest_block_height, - latest_squeak_time, - latest_squeak_hash, + last_block_height, + last_squeak_time, + last_squeak_hash, ) ) .order_by( diff --git a/squeaknode/node/squeak_controller.py b/squeaknode/node/squeak_controller.py index 810df177..c07f149c 100644 --- a/squeaknode/node/squeak_controller.py +++ b/squeaknode/node/squeak_controller.py @@ -425,15 +425,11 @@ class SqueakController: def get_timeline_squeak_entries( self, limit: int, - block_height: int, - squeak_time: int, - squeak_hash: bytes, + last_entry: Optional[SqueakEntry], ) -> List[SqueakEntry]: return self.squeak_db.get_timeline_squeak_entries( limit, - block_height, - squeak_time, - squeak_hash, + last_entry, ) def get_liked_squeak_entries(self) -> List[SqueakEntry]: @@ -443,16 +439,12 @@ class SqueakController: self, address: str, limit: int, - block_height: int, - squeak_time: int, - squeak_hash: bytes, + last_entry: Optional[SqueakEntry], ) -> List[SqueakEntry]: return self.squeak_db.get_squeak_entries_for_address( address, limit, - block_height, - squeak_time, - squeak_hash, + last_entry, ) def get_ancestor_squeak_entries(self, squeak_hash: bytes) -> List[SqueakEntry]: @@ -464,16 +456,12 @@ class SqueakController: self, squeak_hash: bytes, limit: int, - latest_block_height: int, - latest_squeak_time: int, - latest_squeak_hash: bytes, + last_entry: Optional[SqueakEntry], ) -> List[SqueakEntry]: return self.squeak_db.get_thread_reply_squeak_entries( squeak_hash, limit, - latest_block_height, - latest_squeak_time, - latest_squeak_hash, + last_entry, ) def lookup_squeaks(self, addresses: List[str], min_block: int, max_block: int) -> List[bytes]: