if extension != ".json": continue result["#" + channel_name] = os.path.join(dirpath, history_file) return result return {} def get_message_text(message): """Returns the text value of `message` if it is a valid text message, or `None` otherwise""" if message.get("type") == "message" and isinstance(message.get("ts"), str): if isinstance(message.get("text"), str) and isinstance(message.get("user"), str): # normal message return server_text_to_sendable_text(message["text"]) if message.get("subtype") == "message_changed" and isinstance(message.get("message"), dict) and isinstance(message["message"].get("user"), str) and isinstance(message["message"].get("text"), str): # edited message return server_text_to_sendable_text(message["message"]["text"]) return None markov = Markov(2) # Markov model with 2 word look-behind entries = open("kjv.txt", "r").read().split("\n") matcher = re.compile(Markov.WORD_PATTERN, re.IGNORECASE) for message in (matcher.findall(m) for m in entries): markov.train([m.lower() for m in message], 3) for channel_name, history_file in get_history_files().items(): with open(history_file, "r") as f: for entry in f: text = get_message_text(json.loads(entry)) if text is not None: markov.train(Markov.tokenize_text(sendable_text_to_text(text))) for x in range(10000): print(Markov.format_words(markov.speak()))