mirror of
https://github.com/yzernik/squeaknode.git
synced 2026-08-13 12:33:25 +02:00
135 lines
5 KiB
Python
135 lines
5 KiB
Python
import sys
|
|
|
|
import logging
|
|
from concurrent import futures
|
|
|
|
import grpc
|
|
|
|
from proto import squeak_admin_pb2, squeak_admin_pb2_grpc
|
|
|
|
from squeakserver.server.util import get_hash
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class SqueakAdminServerServicer(squeak_admin_pb2_grpc.SqueakAdminServicer):
|
|
"""Provides methods that implement functionality of squeak admin server."""
|
|
|
|
def __init__(self, host, port, handler):
|
|
self.host = host
|
|
self.port = port
|
|
self.handler = handler
|
|
|
|
def SayHello(self, request, context):
|
|
return squeak_admin_pb2.HelloReply(message='Hello, %s!' % request.name)
|
|
|
|
def LndGetInfo(self, request, context):
|
|
return self.handler.handle_lnd_get_info()
|
|
|
|
def LndWalletBalance(self, request, context):
|
|
return self.handler.handle_lnd_wallet_balance()
|
|
|
|
def CreateSigningProfile(self, request, context):
|
|
profile_name = request.profile_name
|
|
profile_id = self.handler.handle_create_signing_profile(profile_name)
|
|
return squeak_admin_pb2.CreateSigningProfileReply(profile_id=profile_id,)
|
|
|
|
def GetSigningProfiles(self, request, context):
|
|
profiles = self.handler.handle_get_signing_profiles()
|
|
profile_msgs = [
|
|
self._squeak_profile_to_message(profile)
|
|
for profile in
|
|
profiles
|
|
]
|
|
return squeak_admin_pb2.GetSigningProfilesReply(
|
|
squeak_profiles=profile_msgs
|
|
)
|
|
|
|
def GetSqueakProfile(self, request, context):
|
|
profile_id = request.profile_id
|
|
squeak_profile = self.handler.handle_get_squeak_profile(profile_id)
|
|
squeak_profile_msg = self._squeak_profile_to_message(squeak_profile)
|
|
return squeak_admin_pb2.GetSqueakProfileReply(
|
|
squeak_profile=squeak_profile_msg
|
|
)
|
|
|
|
def MakeSqueak(self, request, context):
|
|
profile_id = request.profile_id
|
|
content_str = request.content
|
|
replyto_hash = request.replyto
|
|
squeak_hash = self.handler.handle_make_squeak(
|
|
profile_id, content_str, replyto_hash
|
|
)
|
|
return squeak_admin_pb2.MakeSqueakReply(hash=squeak_hash,)
|
|
|
|
def GetSqueakDisplay(self, request, context):
|
|
squeak_hash = request.hash
|
|
squeak_entry_with_profile = self.handler.handle_get_squeak_display_entry(
|
|
squeak_hash
|
|
)
|
|
display_message = self._squeak_entry_to_message(squeak_entry_with_profile)
|
|
return squeak_admin_pb2.GetSqueakDisplayReply(
|
|
squeak_display_entry=display_message
|
|
)
|
|
|
|
def GetFollowedSqueakDisplays(self, request, context):
|
|
squeak_entries_with_profile = self.handler.handle_get_followed_squeak_display_entries()
|
|
# TODO: use list comprehension
|
|
ret = []
|
|
for entry in squeak_entries_with_profile:
|
|
display_message = self._squeak_entry_to_message(entry)
|
|
ret.append(display_message)
|
|
return squeak_admin_pb2.GetFollowedSqueakDisplaysReply(
|
|
squeak_display_entries=ret
|
|
)
|
|
|
|
def GetAddressSqueakDisplays(self, request, context):
|
|
address = request.address
|
|
min_block = 0
|
|
max_block = sys.maxsize
|
|
squeak_entries_with_profile = self.handler.handle_get_squeak_display_entries_for_address(
|
|
address,
|
|
min_block,
|
|
max_block,
|
|
)
|
|
# TODO: use list comprehension
|
|
ret = []
|
|
for entry in squeak_entries_with_profile:
|
|
display_message = self._squeak_entry_to_message(entry)
|
|
ret.append(display_message)
|
|
return squeak_admin_pb2.GetFollowedSqueakDisplaysReply(
|
|
squeak_display_entries=ret
|
|
)
|
|
|
|
def _squeak_entry_to_message(self, squeak_entry_with_profile):
|
|
squeak_entry = squeak_entry_with_profile.squeak_entry
|
|
squeak = squeak_entry.squeak
|
|
block_header = squeak_entry.block_header
|
|
is_unlocked = squeak.HasDecryptionKey()
|
|
content_str = squeak.GetDecryptedContentStr() if is_unlocked else None
|
|
logger.info("Got block_header: {}".format(block_header))
|
|
return squeak_admin_pb2.SqueakDisplayEntry(
|
|
squeak_hash=get_hash(squeak).hex(),
|
|
is_unlocked=squeak.HasDecryptionKey(),
|
|
content_str=content_str,
|
|
block_height=squeak.nBlockHeight,
|
|
block_time=block_header.nTime,
|
|
)
|
|
|
|
def _squeak_profile_to_message(self, squeak_profile):
|
|
has_private_key = squeak_profile.private_key is not None
|
|
return squeak_admin_pb2.SqueakProfile(
|
|
profile_id=squeak_profile.profile_id,
|
|
profile_name=squeak_profile.profile_name,
|
|
has_private_key=has_private_key,
|
|
address=squeak_profile.address,
|
|
sharing=squeak_profile.sharing,
|
|
following=squeak_profile.following,
|
|
)
|
|
|
|
def serve(self):
|
|
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
|
|
squeak_admin_pb2_grpc.add_SqueakAdminServicer_to_server(self, server)
|
|
server.add_insecure_port("{}:{}".format(self.host, self.port))
|
|
server.start()
|
|
server.wait_for_termination()
|