def run(self): message = redis_connection.brpop("queue") if message: message_id = message[1] message_key = f"message{message_id}" redis_connection.hset(message_key, "status", "checking") message = redis_connection.hmget(message_key, ["sender_id", "recipient_id"]) sender_id = message[0] redis_connection.hincrby(f"user{sender_id}", "in_queue", -1) redis_connection.hincrby(f"user{sender_id}", "checking", 1) time.sleep(DELAY) is_spam = message_is_spam() redis_connection.hincrby(f"user{sender_id}", "checking", -1) if is_spam: sender_name = get_username(sender_id) message_text = redis_connection.hmget(message_key, ["text"])[0] redis_connection.publish("spam", f"User {sender_name} sent spam: {message_text}.") neo4j.mark_message_as_spam(message_id) redis_connection.zincrby(f"spam", 1, f"user{sender_id}") redis_connection.hset(message_key, "status", "blocked") redis_connection.hincrby(f"user{sender_id}", "blocked", 1) else: recipient_id = message[1] redis_connection.hset(message_key, "status", "sent") redis_connection.hincrby(f"user{sender_id}", "sent", 1) redis_connection.sadd(f"sent_to:{recipient_id}", message_id)
def user(user_id): while True: action = user_menu() if action == 0: sign_out(user_id) break elif action == 1: get_inbox_messages(user_id) elif action == 2: message = input("Enter message: ") recipient = input("Enter username of the receiver: ") if create_message(user_id, message, recipient): print(f"Sent your message to {recipient}") elif action == 3: keys = ["in_queue", "checking", "blocked", "sent", "delivered"] user = redis_connection.hmget(f"user{user_id}", keys) for i in range(5): print(f"{keys[i]}: {user[i]}") else: print("Choose only available [0-3] actions :)")
def get_inbox_messages(user_id): messages = redis_connection.smembers(f"sent_to{user_id}") if len(messages) == 0: print("Oh. You have empty inbox. Let's type someone? :)") return for message_id in messages: message = redis_connection.hmget(f"message{message_id}", ["text", "status", "sender_id"]) if message[1] != "delivered": redis_connection.hset(f"message{message_id}", "status", "delivered") redis_connection.hincrby(f"user{message[2]}", "sent", -1) redis_connection.hincrby(f"user{message[2]}", "delivered", 1) print(f"{message[0]} -> FROM: {get_username(message[2])}")
def get_username(user_id): return redis_connection.hmget(f"user{user_id}", ["name"])[0]