GChat / app.py
OzoneAsai's picture
Update app.py
33109c7
import streamlit as st
import hashlib
import datetime
# Streamlitの設定
st.title("Simple IRC with Streamlit")
# チャットメッセージと入力欄のコンポーネントを設定
messages = st.empty()
user_input = st.chat_input("Your message", key="message_input")
# サーバーでメッセージを保存するためのリスト
message_history = []
# Socket.IOを模した簡単なメッセージングシステムの実装
class MessageHandler:
def __init__(self):
self.connected_users = set()
def add_user(self, user_id):
self.connected_users.add(user_id)
def remove_user(self, user_id):
self.connected_users.remove(user_id)
def send_message(self, user_id, message):
timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
formatted_message = f"{timestamp} - {user_id}: {message}"
message_history.append(formatted_message)
self.refresh_messages()
def refresh_messages(self):
messages.markdown("\n".join(message_history), unsafe_allow_html=True)
# メッセージハンドラの初期化
message_handler = MessageHandler()
# ユーザーのIPアドレスをハッシュ化して名前として使用
user_id = hashlib.sha256(st.report_thread.get_report_ctx().session.request.ip.encode()).hexdigest()
# ユーザーをサーバーに追加
message_handler.add_user(user_id)
# Streamlit chat inputのコールバック
@st.cache(allow_output_mutation=True)
def on_submit(message):
# メッセージを送信
message_handler.send_message(user_id, message)
# Streamlit chat inputのイベントハンドラの設定
user_input.on_submit(on_submit)
# Streamlitアプリの実行
if __name__ == "__main__":
st.set_page_config(page_title="IRC with Streamlit")
# ユーザーがアクセスするたびに新しいセッションが作成されるようにする
st.experimental_singleton(message_handler)
# チャットメッセージの更新を定期的に行う
st.text("Connected Users: " + ", ".join(message_handler.connected_users))
st.text("Refreshed every 5 seconds")
st.text("Your hashed name: " + user_id)
# Streamlitアプリを実行
st.experimental_run_with_streamlit_app(main)