k96beni commited on
Commit
624503e
·
verified ·
1 Parent(s): b7546bf

Upload 2 files

Browse files
Files changed (2) hide show
  1. app.py +120 -0
  2. requirements.txt +6 -0
app.py ADDED
@@ -0,0 +1,120 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # slack_reporter/app.py
2
+ import os
3
+ import time
4
+ import schedule
5
+ import pandas as pd
6
+ import matplotlib.pyplot as plt
7
+ import requests
8
+ from datetime import datetime, timedelta
9
+ from huggingface_hub import HfApi, hf_hub_download
10
+ import gradio as gr
11
+
12
+ # --- Konfiguration ---
13
+ REPO_ID = "ChargeNodeEurope/logfiles"
14
+ LOG_FILENAME = "logs/conversation_log.txt"
15
+ WEBHOOK_URL = os.environ.get("SLACK_WEBHOOK_URL")
16
+ HF_TOKEN = os.environ.get("HF_TOKEN")
17
+
18
+ # --- Funktion: Skapa grafer ---
19
+ def generate_graphs(df):
20
+ now = datetime.now()
21
+ df['timestamp'] = pd.to_datetime(df['timestamp'])
22
+
23
+ # 1. Unika användare per dag (14 dagar)
24
+ daily_users = df.groupby(df['timestamp'].dt.date)['user_id'].nunique()
25
+ daily_users = daily_users.last("14D")
26
+ plt.figure(figsize=(8,4))
27
+ daily_users.plot(kind='bar', title="Unika användare per dag (14 dagar)")
28
+ plt.ylabel("Antal användare")
29
+ plt.tight_layout()
30
+ user_graph_path = "daily_users.png"
31
+ plt.savefig(user_graph_path)
32
+ plt.close()
33
+
34
+ # 2. Meddelanden per timme (72h)
35
+ cutoff = now - timedelta(hours=72)
36
+ df_recent = df[df['timestamp'] >= cutoff]
37
+ hourly = df_recent.groupby(df_recent['timestamp'].dt.floor('H')).size()
38
+ plt.figure(figsize=(10,4))
39
+ hourly.plot(title="Meddelanden per timme (senaste 72h)")
40
+ plt.ylabel("Antal meddelanden")
41
+ plt.xticks(rotation=45)
42
+ plt.tight_layout()
43
+ hourly_graph_path = "hourly_msgs.png"
44
+ plt.savefig(hourly_graph_path)
45
+ plt.close()
46
+
47
+ return user_graph_path, hourly_graph_path
48
+
49
+ # --- Funktion: Ladda upp grafer till Hugging Face Hub ---
50
+ def upload_graphs_to_hub(user_graph_path, hourly_graph_path):
51
+ api = HfApi()
52
+ api.upload_file(
53
+ path_or_fileobj=user_graph_path,
54
+ path_in_repo="graphs/daily_users.png",
55
+ repo_id=REPO_ID,
56
+ repo_type="dataset",
57
+ token=HF_TOKEN
58
+ )
59
+ api.upload_file(
60
+ path_or_fileobj=hourly_graph_path,
61
+ path_in_repo="graphs/hourly_msgs.png",
62
+ repo_id=REPO_ID,
63
+ repo_type="dataset",
64
+ token=HF_TOKEN
65
+ )
66
+ return (
67
+ f"https://huggingface.co/datasets/{REPO_ID}/resolve/main/graphs/daily_users.png",
68
+ f"https://huggingface.co/datasets/{REPO_ID}/resolve/main/graphs/hourly_msgs.png"
69
+ )
70
+
71
+ # --- Funktion: Skicka Slack-meddelande ---
72
+ def send_to_slack(user_url, hourly_url):
73
+ payload = {
74
+ "text": "\ud83d\udcca Dagliga grafer",
75
+ "attachments": [
76
+ {"title": "Unika användare (14 dagar)", "image_url": user_url},
77
+ {"title": "Meddelanden per timme (72h)", "image_url": hourly_url}
78
+ ]
79
+ }
80
+ try:
81
+ requests.post(WEBHOOK_URL, json=payload)
82
+ except Exception as e:
83
+ print("Fel vid Slack-post:", e)
84
+
85
+ # --- Huvudfunktion ---
86
+ def run_report():
87
+ print("Genererar grafer och skickar till Slack...")
88
+ log_path = hf_hub_download(
89
+ repo_id=REPO_ID,
90
+ filename=LOG_FILENAME,
91
+ repo_type="dataset",
92
+ token=HF_TOKEN
93
+ )
94
+ df = pd.read_json(log_path, lines=True)
95
+ user_graph, hourly_graph = generate_graphs(df)
96
+ user_url, hourly_url = upload_graphs_to_hub(user_graph, hourly_graph)
97
+ send_to_slack(user_url, hourly_url)
98
+ return "Slack-meddelande skickat med grafer."
99
+
100
+ # --- Schemaläggning ---
101
+ schedule.every().day.at("08:20").do(run_report)
102
+
103
+ def run_schedule():
104
+ while True:
105
+ schedule.run_pending()
106
+ time.sleep(60)
107
+
108
+ import threading
109
+ threading.Thread(target=run_schedule, daemon=True).start()
110
+
111
+ # --- Gradio-knapp för manuell körning ---
112
+ with gr.Blocks() as app:
113
+ gr.Markdown("# Slack Reporter - ChargeNode")
114
+ gr.Markdown("Tryck på knappen för att generera dagens rapport och posta till Slack.")
115
+ btn = gr.Button("Skicka nu")
116
+ output = gr.Textbox()
117
+ btn.click(fn=run_report, outputs=output)
118
+
119
+ if __name__ == "__main__":
120
+ app.launch()
requirements.txt ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ pandas
2
+ matplotlib
3
+ requests
4
+ schedule
5
+ huggingface_hub
6
+ gradio