Assistant / app.py
Really-amin's picture
Update app.py
6e501ad verified
raw
history blame
6.28 kB
import streamlit as st
import time
import random
from datetime import datetime
# تنظیمات صفحه
st.set_page_config(page_title="چت‌بات هوشمند", page_icon="🤖", layout="wide")
# CSS سفارشی برای بهبود ظاهر و انیمیشن‌ها
st.markdown("""
<style>
@import url('https://fonts.googleapis.com/css2?family=Vazirmatn:wght@400;500;700&display=swap');
body {
font-family: 'Vazirmatn', sans-serif;
background-color: #f8fafc;
}
.chat-container {
max-width: 800px;
margin: auto;
border-radius: 15px;
overflow: hidden;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
.header {
background: linear-gradient(45deg, #4a90e2, #50e3c2);
color: white;
padding: 20px;
text-align: center;
position: relative;
}
.header .status {
position: absolute;
top: 20px;
right: 20px;
color: #10b981;
font-weight: bold;
}
.chat-messages {
background: #ffffff;
padding: 20px;
height: 500px;
overflow-y: auto;
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
}
.message {
margin-bottom: 15px;
padding: 10px 15px;
border-radius: 12px;
max-width: 75%;
animation: fadeIn 0.3s;
position: relative;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
.message.user {
background: #e0f7fa;
align-self: flex-end;
}
.message.bot {
background: #f1f1f1;
align-self: flex-start;
}
.timestamp {
font-size: 0.8em;
color: #888;
margin-top: 5px;
text-align: right;
}
.quick-replies {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin-top: 15px;
}
.quick-reply {
background: #4a90e2;
color: white;
padding: 8px 16px;
border-radius: 15px;
cursor: pointer;
font-weight: 500;
transition: background 0.3s ease;
}
.quick-reply:hover {
background: #357ab7;
}
.chat-input {
display: flex;
gap: 10px;
align-items: center;
padding: 20px;
background: #f8fafc;
}
.chat-input input[type="text"] {
flex-grow: 1;
padding: 10px;
border-radius: 5px;
border: 1px solid #ddd;
font-size: 1rem;
}
.chat-input button {
background: #4a90e2;
color: white;
padding: 10px 20px;
border: none;
border-radius: 5px;
cursor: pointer;
transition: background 0.3s;
}
.chat-input button:hover {
background: #357ab7;
}
.admin-panel {
background: #ffffff;
border-radius: 10px;
padding: 20px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
margin-bottom: 20px;
}
.statistics {
padding: 10px 0;
border-bottom: 1px solid #ddd;
}
</style>
""", unsafe_allow_html=True)
# داده‌های اولیه
if 'conversation_history' not in st.session_state:
st.session_state.conversation_history = []
if 'is_typing' not in st.session_state:
st.session_state.is_typing = False
quick_replies = ["راهنمای استفاده", "تماس با پشتیبانی", "گزارش مشکل", "بخشنامه‌های جدید"]
# توابع چت‌بات
def get_bot_response(user_message):
time.sleep(1) # شبیه‌سازی تایپ کردن
return random.choice(["سلام! چطور می‌تونم کمک کنم؟", "لطفاً سوال خود را مطرح کنید.", "در خدمت شما هستم."])
def add_message(sender, message):
st.session_state.conversation_history.append({
'sender': sender,
'message': message,
'timestamp': datetime.now().strftime("%H:%M")
})
# هدر
st.markdown("""
<div class="header">
<h2>چت‌بات هوشمند</h2>
<div class="status">آنلاین</div>
</div>
""", unsafe_allow_html=True)
# نمایش پیام‌ها
st.markdown("<div class='chat-container'><div class='chat-messages'>", unsafe_allow_html=True)
for message in st.session_state.conversation_history:
sender_class = "user" if message['sender'] == "user" else "bot"
st.markdown(f"""
<div class='message {sender_class}'>
<div>{message['message']}</div>
<div class='timestamp'>{message['timestamp']}</div>
</div>
""", unsafe_allow_html=True)
st.markdown("</div></div>", unsafe_allow_html=True)
# پاسخ‌های سریع
st.markdown("<div class='quick-replies'>", unsafe_allow_html=True)
for reply in quick_replies:
if st.button(reply):
add_message("user", reply)
bot_response = get_bot_response(reply)
add_message("bot", bot_response)
st.experimental_rerun()
st.markdown("</div>", unsafe_allow_html=True)
# ورودی کاربر
st.markdown("<div class='chat-input'>", unsafe_allow_html=True)
user_message = st.text_input("", placeholder="پیام خود را وارد کنید...", label_visibility="collapsed")
send_button = st.button("ارسال")
if send_button and user_message:
add_message("user", user_message)
st.session_state.is_typing = True
bot_response = get_bot_response(user_message)
add_message("bot", bot_response)
st.session_state.is_typing = False
st.experimental_rerun()
st.markdown("</div>", unsafe_allow_html=True)
# پنل مدیریت در سایدبار
with st.sidebar:
st.markdown("<div class='admin-panel'><h3>پنل مدیریت</h3>", unsafe_allow_html=True)
# نمایش آمار
total_messages = len(st.session_state.conversation_history)
user_messages = sum(1 for msg in st.session_state.conversation_history if msg['sender'] == 'user')
bot_messages = total_messages - user_messages
st.markdown(f"""
<div class="statistics">پیام‌های کل: {total_messages}</div>
<div class="statistics">پیام‌های کاربر: {user_messages}</div>
<div class="statistics">پیام‌های ربات: {bot_messages}</div>
""", unsafe_allow_html=True)
# دکمه پاک کردن تاریخچه
if st.button("پاک کردن تاریخچه"):
st.session_state.conversation_history = []
st.experimental_rerun()
# تنظیمات ظاهری
st.markdown("### تنظیمات ظاهری")
font_size = st.slider("اندازه فونت", 12, 20, 14)
st.markdown(f"<style>.message {{ font-size: {font_size}px; }}</style>", unsafe_allow_html=True)