web3-starter-py/soundcloud/soundcloud_problem_statement/python/main.py
2022-03-23 18:25:34 +04:00

98 lines
4.1 KiB
Python

import socket
import threading
EVENT_PORT = 9090
CLIENT_PORT = 9099
client_pool = {}
follow_registry = {}
seq_no_to_message = {}
def event_server():
last_seq_no = 0
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server:
server.bind(("127.0.0.1", EVENT_PORT))
server.listen()
print("Listening for events on %d" % EVENT_PORT)
while True:
event_socket, address = server.accept()
print('Accepted connection from {}:{}'.format(address[0], address[1]))
with event_socket:
with event_socket.makefile() as socket_file:
for payload_line in socket_file:
payload = payload_line.strip()
print("Message received: %s" % payload)
payload_parts = payload.split("|")
seq_no_to_message[int(payload_parts[0])] = payload_parts
while last_seq_no + 1 in seq_no_to_message:
next_seq_no = last_seq_no + 1
next_message = seq_no_to_message[next_seq_no]
del seq_no_to_message[next_seq_no]
kind = next_message[1]
next_payload = "|".join(next_message)
if kind == "F":
from_user_id = int(next_message[2])
to_user_id = int(next_message[3])
if to_user_id not in follow_registry:
follow_registry[to_user_id] = set([])
follow_registry[to_user_id].add(from_user_id)
#if to_user_id in client_pool:
# client_pool[to_user_id].sendall(bytes(next_payload + "\n", "UTF-8"))
elif kind == "U":
from_user_id = int(next_message[2])
to_user_id = int(next_message[3])
if to_user_id not in follow_registry:
follow_registry[to_user_id] = set([])
follow_registry[to_user_id].remove(from_user_id)
elif kind == "P":
to_user_id = int(next_message[3])
if to_user_id in client_pool:
client_pool[to_user_id].sendall(bytes(next_payload + "\n", "UTF-8"))
elif kind == "B":
for client_id in client_pool:
client_pool[client_id].sendall(bytes(next_payload + "\n", "UTF-8"))
elif kind == "S":
from_user_id = int(next_message[2])
if from_user_id in follow_registry:
for follower in follow_registry[from_user_id]:
if follower in client_pool:
client_pool[follower].sendall(bytes(next_payload + "\n", "UTF-8"))
last_seq_no = next_seq_no
def client_connection_server():
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server:
server.bind(("127.0.0.1", CLIENT_PORT))
server.listen()
print("Listening for client requests on %d" % CLIENT_PORT)
while True:
client_socket, address = server.accept()
with client_socket.makefile() as f:
user_id_string = f.readline()
if user_id_string:
user_id = int(user_id_string)
client_pool[user_id] = client_socket
print("User connected: %d (%d total)" % (user_id, len(client_pool)))
if __name__ == "__main__":
thread1 = threading.Thread(target=event_server)
thread1.start()
thread2 = threading.Thread(target=client_connection_server)
thread2.start()
thread1.join()
thread2.join()