import streamlit as st
import pandas as pd
from processor import DataProcessor
from llm_handler import DDoSInference
class DDoSResistanceHelper:
def __init__(self):
# Set up Streamlit page configuration
st.set_page_config(
page_title="DDoS Resistance Helper | LLM Network Analyzer",
page_icon="🛡️",
layout="wide"
)
# Initialize session state
self.setup_session_state()
# Initialize processor and LLM handler
self.processor = DataProcessor()
self.llm_handler = DDoSInference()
# Define themes
self.themes = {
'Light': {
'base': 'light',
'primaryColor': '#3B82F6',
'backgroundColor': '#FFFFFF',
'secondaryBackgroundColor': '#F3F4F6',
'textColor': '#000000'
},
'Dark': {
'base': 'dark',
'primaryColor': '#10B981',
'backgroundColor': '#1F2937',
'secondaryBackgroundColor': '#374151',
'textColor': '#FFFFFF'
},
'Neon': {
'base': 'dark',
'primaryColor': '#22D3EE',
'backgroundColor': '#000000',
'secondaryBackgroundColor': '#1F2937',
'textColor': '#22D3EE'
}
}
def setup_session_state(self):
"""Initialize Streamlit session state variables."""
st.write("Initializing session state...")
session_keys = ['chat_history', 'current_file', 'analysis_complete', 'selected_theme', 'preview_data']
for key in session_keys:
if key not in st.session_state:
st.session_state[key] = [] if key == 'chat_history' else None
st.write("Session state initialized.")
def apply_theme(self):
"""Apply selected theme to Streamlit app."""
theme_name = st.session_state.get('selected_theme', 'Light')
theme = self.themes[theme_name]
st.markdown(f"""
""", unsafe_allow_html=True)
def render_theme_selector(self):
"""Render theme selection icons on the top-right corner."""
st.sidebar.empty()
st.write(f'
', unsafe_allow_html=True)
if st.button("🌞 Light", key="light_theme"):
st.session_state.selected_theme = 'Light'
self.apply_theme()
if st.button("🌙 Dark", key="dark_theme"):
st.session_state.selected_theme = 'Dark'
self.apply_theme()
if st.button("💡 Neon", key="neon_theme"):
st.session_state.selected_theme = 'Neon'
self.apply_theme()
def render_file_upload(self):
"""Render file upload section with an upload icon in the main header."""
st.title("DDoS Resistance Helper | LLM Network Analyzer")
uploaded_file = st.file_uploader("Upload Data File 📂", type=['csv'])
if uploaded_file:
st.session_state.current_file = uploaded_file
st.session_state.preview_data = pd.read_csv(uploaded_file).head(5)
if st.button("🚀 Process Data"):
self.process_uploaded_file(uploaded_file)
def process_uploaded_file(self, file):
"""Process the uploaded file and perform analysis."""
try:
st.write("Processing file...")
with st.spinner("Analyzing data..."):
# Preprocess the uploaded file
df = self.processor.preprocess_data(file)
# Perform LLM analysis
results = self.llm_handler.analyze_data(df)
st.session_state.analysis_complete = True
st.success("Analysis completed!")
except Exception as e:
st.error(f"Error: {e}")
def render_chat_interface(self):
"""Render chat interface in the sidebar."""
st.sidebar.header("💬 Chat Interface")
for msg in st.session_state.chat_history:
st.sidebar.write(f"[{msg['role'].capitalize()}]: {msg['content']}")
new_chat = st.sidebar.text_input("Ask a question...")
if new_chat:
st.session_state.chat_history.append({"role": "user", "content": new_chat})
response = self.llm_handler.get_chat_response(new_chat)
st.session_state.chat_history.append({"role": "assistant", "content": response})
def render_analysis_interface(self):
"""Render analysis results interface."""
st.subheader("📋 Data Preview")
if st.session_state.preview_data is not None:
st.dataframe(st.session_state.preview_data)
if st.session_state.analysis_complete:
st.subheader("🔍 Analysis Results")
st.info("Analysis complete. Visualizations and results here.")
def main(self):
"""Main application runner."""
self.apply_theme()
self.render_theme_selector()
self.render_file_upload()
self.render_analysis_interface()
self.render_chat_interface()
if __name__ == "__main__":
app = DDoSResistanceHelper()
app.main()