Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -29,7 +29,7 @@ def get_node_name():
|
|
| 29 |
"""π² Spins the wheel of fate to name our node - a random alias or user pick! π·οΈ"""
|
| 30 |
parser = argparse.ArgumentParser(description='Start a chat node with a specific name')
|
| 31 |
parser.add_argument('--node-name', type=str, default=None, help='Name for this chat node')
|
| 32 |
-
parser.add_argument('--port', type=int, default=8501, help='Port to run the Streamlit interface on')
|
| 33 |
args = parser.parse_args()
|
| 34 |
return args.node_name or f"node-{uuid.uuid4().hex[:8]}", args.port
|
| 35 |
|
|
@@ -123,8 +123,8 @@ async def start_websocket_server(host='0.0.0.0', port=8765):
|
|
| 123 |
|
| 124 |
# Chat interface maker - the stage builder for our chat extravaganza! πποΈ
|
| 125 |
def create_streamlit_interface(initial_username):
|
| 126 |
-
"""ποΈ Sets up the chat stage with live updates and
|
| 127 |
-
# Custom CSS for a sleek chat box
|
| 128 |
st.markdown("""
|
| 129 |
<style>
|
| 130 |
.chat-box {
|
|
@@ -136,16 +136,25 @@ def create_streamlit_interface(initial_username):
|
|
| 136 |
height: 400px;
|
| 137 |
overflow-y: auto;
|
| 138 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 139 |
</style>
|
| 140 |
""", unsafe_allow_html=True)
|
| 141 |
|
| 142 |
# Title and intro
|
| 143 |
st.title(f"Chat Node: {NODE_NAME}")
|
| 144 |
-
st.markdown("Chat live, switch names, and
|
| 145 |
|
| 146 |
-
# Session state
|
| 147 |
if 'username' not in st.session_state:
|
| 148 |
st.session_state.username = initial_username
|
|
|
|
|
|
|
|
|
|
|
|
|
| 149 |
|
| 150 |
# Chat display
|
| 151 |
chat_content = load_chat()
|
|
@@ -161,10 +170,49 @@ def create_streamlit_interface(initial_username):
|
|
| 161 |
message = st.text_input("Message", placeholder="Type your epic line here! βοΈ")
|
| 162 |
if st.button("Send π") and message.strip():
|
| 163 |
save_chat_entry(st.session_state.username, message)
|
| 164 |
-
st.
|
| 165 |
-
|
| 166 |
-
|
| 167 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 168 |
|
| 169 |
# Main event - the ringmaster kicking off the chat circus! πͺπ€‘
|
| 170 |
async def main():
|
|
@@ -174,7 +222,7 @@ async def main():
|
|
| 174 |
await start_websocket_server()
|
| 175 |
|
| 176 |
# Grab username from URL or roll the dice! π²
|
| 177 |
-
query_params = st.query_params if hasattr(st, 'query_params') else {}
|
| 178 |
initial_username = query_params.get("username", random.choice(FUN_USERNAMES)) if query_params else random.choice(FUN_USERNAMES)
|
| 179 |
print(f"Welcoming {initial_username} to the chat bash!")
|
| 180 |
|
|
|
|
| 29 |
"""π² Spins the wheel of fate to name our node - a random alias or user pick! π·οΈ"""
|
| 30 |
parser = argparse.ArgumentParser(description='Start a chat node with a specific name')
|
| 31 |
parser.add_argument('--node-name', type=str, default=None, help='Name for this chat node')
|
| 32 |
+
parser.add_argument('--port', type=int, default=8501, help='Port to run the Streamlit interface on')
|
| 33 |
args = parser.parse_args()
|
| 34 |
return args.node_name or f"node-{uuid.uuid4().hex[:8]}", args.port
|
| 35 |
|
|
|
|
| 123 |
|
| 124 |
# Chat interface maker - the stage builder for our chat extravaganza! πποΈ
|
| 125 |
def create_streamlit_interface(initial_username):
|
| 126 |
+
"""ποΈ Sets up the chat stage with live updates, timers, and refresh rate flair! π"""
|
| 127 |
+
# Custom CSS for a sleek chat box and timer
|
| 128 |
st.markdown("""
|
| 129 |
<style>
|
| 130 |
.chat-box {
|
|
|
|
| 136 |
height: 400px;
|
| 137 |
overflow-y: auto;
|
| 138 |
}
|
| 139 |
+
.timer {
|
| 140 |
+
font-size: 18px;
|
| 141 |
+
color: #ffcc00;
|
| 142 |
+
text-align: center;
|
| 143 |
+
}
|
| 144 |
</style>
|
| 145 |
""", unsafe_allow_html=True)
|
| 146 |
|
| 147 |
# Title and intro
|
| 148 |
st.title(f"Chat Node: {NODE_NAME}")
|
| 149 |
+
st.markdown("Chat live, switch names, and tweak the refresh rate! π")
|
| 150 |
|
| 151 |
+
# Session state for username and refresh rate
|
| 152 |
if 'username' not in st.session_state:
|
| 153 |
st.session_state.username = initial_username
|
| 154 |
+
if 'refresh_rate' not in st.session_state:
|
| 155 |
+
st.session_state.refresh_rate = 5 # Default 5 seconds
|
| 156 |
+
if 'last_refresh' not in st.session_state:
|
| 157 |
+
st.session_state.last_refresh = time.time()
|
| 158 |
|
| 159 |
# Chat display
|
| 160 |
chat_content = load_chat()
|
|
|
|
| 170 |
message = st.text_input("Message", placeholder="Type your epic line here! βοΈ")
|
| 171 |
if st.button("Send π") and message.strip():
|
| 172 |
save_chat_entry(st.session_state.username, message)
|
| 173 |
+
st.session_state.last_refresh = time.time() # Reset timer on send
|
| 174 |
+
st.rerun()
|
| 175 |
+
|
| 176 |
+
# Refresh rate controls
|
| 177 |
+
st.subheader("Set Refresh Rate β³")
|
| 178 |
+
refresh_rate = st.slider(
|
| 179 |
+
"Refresh Rate (seconds)",
|
| 180 |
+
min_value=1,
|
| 181 |
+
max_value=300, # 5 minutes = 300 seconds
|
| 182 |
+
value=st.session_state.refresh_rate,
|
| 183 |
+
step=1
|
| 184 |
+
)
|
| 185 |
+
st.session_state.refresh_rate = refresh_rate
|
| 186 |
+
|
| 187 |
+
# Emoji buttons for quick settings
|
| 188 |
+
col1, col2, col3 = st.columns(3)
|
| 189 |
+
with col1:
|
| 190 |
+
if st.button("π Small (1s)"):
|
| 191 |
+
st.session_state.refresh_rate = 1
|
| 192 |
+
st.session_state.last_refresh = time.time()
|
| 193 |
+
st.rerun()
|
| 194 |
+
with col2:
|
| 195 |
+
if st.button("π’ Medium (5s)"):
|
| 196 |
+
st.session_state.refresh_rate = 5
|
| 197 |
+
st.session_state.last_refresh = time.time()
|
| 198 |
+
st.rerun()
|
| 199 |
+
with col3:
|
| 200 |
+
if st.button("π Large (5m)"):
|
| 201 |
+
st.session_state.refresh_rate = 300
|
| 202 |
+
st.session_state.last_refresh = time.time()
|
| 203 |
+
st.rerun()
|
| 204 |
+
|
| 205 |
+
# Countdown timer
|
| 206 |
+
elapsed = time.time() - st.session_state.last_refresh
|
| 207 |
+
remaining = max(0, st.session_state.refresh_rate - int(elapsed))
|
| 208 |
+
st.markdown(f"<p class='timer'>Next refresh in: {remaining} seconds</p>", unsafe_allow_html=True)
|
| 209 |
+
|
| 210 |
+
# Auto-refresh logic
|
| 211 |
+
if elapsed >= st.session_state.refresh_rate:
|
| 212 |
+
st.session_state.last_refresh = time.time()
|
| 213 |
+
st.rerun()
|
| 214 |
+
else:
|
| 215 |
+
st.markdown(f"<script>window.setTimeout(() => window.location.reload(), {int((st.session_state.refresh_rate - elapsed) * 1000)});</script>", unsafe_allow_html=True)
|
| 216 |
|
| 217 |
# Main event - the ringmaster kicking off the chat circus! πͺπ€‘
|
| 218 |
async def main():
|
|
|
|
| 222 |
await start_websocket_server()
|
| 223 |
|
| 224 |
# Grab username from URL or roll the dice! π²
|
| 225 |
+
query_params = st.query_params if hasattr(st, 'query_params') else {}
|
| 226 |
initial_username = query_params.get("username", random.choice(FUN_USERNAMES)) if query_params else random.choice(FUN_USERNAMES)
|
| 227 |
print(f"Welcoming {initial_username} to the chat bash!")
|
| 228 |
|