diff --git a/src/controller/mainFrameController.py b/src/controller/mainFrameController.py index fb1b8c9..b9416d2 100644 --- a/src/controller/mainFrameController.py +++ b/src/controller/mainFrameController.py @@ -1,7 +1,11 @@ from collections import deque +import customtkinter as ctk from views.mainScreen import MainFrame from models.data import TextData from Ai.interence import VeraMindInference +from utils.database.database import FakeNewsChecker +from models.provider import Provider +from collections import Counter from Ai.llm import ArticleRater BAD_WORDS = ["FAKE", "SATIRE", "Fake", "fake"] @@ -12,24 +16,39 @@ WORDS = BAD_WORDS + GOOD_WORDS class MainFrameController: - - def __init__(self,frame:MainFrame) -> None: + """ + Controller class for the main frame of the application. + Handles user interactions, data processing, and database operations. + """ + + def __init__(self, frame: MainFrame) -> None: + """ + Initialize the controller with the main frame and required components. + + :param frame: The main frame of the application + """ self.frame = frame self.model_inference = VeraMindInference('VeraMind-Mini') + self.db = FakeNewsChecker() + self.update_provider_list() self.rater = ArticleRater() - - def get_textdata(self) -> TextData: + + def get_text_data(self) -> TextData: + """ + Retrieve text data from the UI input fields. + + :return: TextData object containing URL and text content + """ text_data = TextData() text_data.url = self.frame.entry_url.get() - if text_data.text_from_url(): + if not text_data.text_from_url(): text_data.text = self.frame.input_textbox.get("0.0", "end") - return text_data - + def press_check_button(self): text_data = self.get_textdata() print(text_data.text) - self.prediction(text_data) + self._predict(text_data) self.frame.output_textbox.configure(state="normal") self.frame.output_textbox.delete("0.0", "end") @@ -55,7 +74,8 @@ class MainFrameController: self.process_highlighting(highlight_buffer) self.frame.output_textbox.configure(state="disabled") - + self.update_provider_list() + def process_highlighting(self, highlight_buffer): start_index = self.frame.output_textbox.index(f"end-{sum(len(c) for c in highlight_buffer)}c") end_index = self.frame.output_textbox.index("end") @@ -83,11 +103,86 @@ class MainFrameController: self.frame.output_textbox.tag_config(tag_name, foreground=GOOD_COLOR) start = pos + len(word) - - def prediction(self, text_data:TextData) -> TextData: + def _predict(self, text_data: TextData) -> TextData: + """ + Make a prediction using the VeraMind model. + + :param text_data: TextData object containing the text to analyze + :return: Updated TextData object with prediction results + """ result = self.model_inference.predict(text_data.text) text_data.confidence = result["confidence"] - text_data.result = result["result"] - print(f"Prediction: {text_data.result}") - print(f"Confidence: {text_data.confidence}") - return text_data \ No newline at end of file + text_data.result = result["result"] + text_data.is_fake_news = result["is_fake"] + return text_data + + def _add_to_db(self, text_data: TextData) -> None: + """ + Add the analyzed data to the database. + + :param text_data: TextData object containing the analyzed information + """ + + self.db.insert_data(url=text_data.url, anbieter=text_data.get_provider(),is_fake_news= text_data.is_fake_news) + + def _fetch_db_data(self): + self.text_data_list = [] + data = self.db.fetch_data() + if data: + for row in data: + print(f"ID: {row[0]}, URL: {row[1]}, Anbieter: {row[2]}, Fake News: {'Ja' if row[3] else 'Nein'}") + text_data = TextData(url=row[1], provider=row[2], is_fake_news= row[3]) + self.text_data_list.append(text_data) + + def sort_provider(self, text_data_list): + # Gruppiere TextData-Objekte nach Provider + provider_groups = {} + for text_data in text_data_list: + if text_data.provider: + if text_data.provider not in provider_groups: + provider_groups[text_data.provider] = [] + provider_groups[text_data.provider].append(text_data) + + # Zähle die Häufigkeit jedes Providers + provider_counts = Counter(text_data.provider for text_data in text_data_list if text_data.provider) + + # Erstelle und sortiere die Provider-Liste + sorted_providers = [ + Provider(name, count, provider_groups.get(name, [])) + for name, count in sorted(provider_counts.items(), key=lambda x: x[1], reverse=True) + ] + + return sorted_providers + + def update_provider_list(self): + self._fetch_db_data() + # Lösche vorhandene Einträge in der scrollbaren Ansicht + for widget in self.frame.provider_container.winfo_children(): + widget.destroy() + + # Sortiere und zähle die Provider + sorted_providers = self.sort_provider(self.text_data_list) + + # Füge die sortierten Provider zur scrollbaren Ansicht hinzu + for i, provider in enumerate(sorted_providers): + provider_frame = ctk.CTkFrame(self.frame.provider_container) + provider_frame.pack(fill="x", padx=5, pady=2) + + name_label = ctk.CTkLabel(provider_frame, text=provider.title) + name_label.pack(side="left", padx=5) + + count_label = ctk.CTkLabel(provider_frame, text=str(provider.get_fake_percentage())+"%") + count_label.pack(side="right", padx=5) + + def _update_output(self, output: str) -> None: + """ + Update the output text box with the result. + + :param output: String containing the output to display + """ + self.frame.output_textbox.configure(state="normal") + self.frame.output_textbox.delete("0.0", "end") + self.frame.output_textbox.insert("0.0", output) + self.frame.output_textbox.configure(state="disabled") + + \ No newline at end of file