-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathlocal_webhook_handler.py
More file actions
154 lines (128 loc) · 5.15 KB
/
local_webhook_handler.py
File metadata and controls
154 lines (128 loc) · 5.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#!/usr/bin/env python3
# Local module for Chat Platform webhook notifications.
__all__ = ["notify_ticket_event", "send_webhook"]
import logging
import requests
import local_config_loader
# CONFIG HELPERS
def load_webhook_config():
return local_config_loader.load_core_config() or {}
def is_enabled(service_name: str) -> bool:
webhook_service_status = load_webhook_config()
webhook_service_cfg = webhook_service_status.get(service_name.lower(), {})
return bool(webhook_service_cfg.get("enabled", False))
def get_webhook_urls():
# LOAD WEBHOOK URLS - Easy to add more services/platforms.
webhook_url_check = load_webhook_config()
discord_url = webhook_url_check.get("discord", {}).get("webhook_url")
slack_url = webhook_url_check.get("slack", {}).get("webhook_url")
#teams_url = webhook_url_check.get("teams365", {}).get("webhook_url")
return discord_url, slack_url, #teams_url
# MAIN ENTRY POINT: SEND TICKET EVENTS
def notify_ticket_event(ticket_number: str, ticket_subject: str, ticket_status: str):
results = {}
if is_enabled("discord"):
results["discord"] = send_discord_notification(ticket_number, ticket_subject, ticket_status)
else:
logging.debug("WEBHOOK HANDLER - Discord disabled; skipping.")
if is_enabled("slack"):
results["slack"] = send_slack_notification(ticket_number, ticket_subject, ticket_status)
else:
logging.debug("WEBHOOK HANDLER - Slack disabled; skipping.")
"""if is_enabled("teams365"):
results["teams365"] = send_teams365_notification(ticket_number, ticket_subject, ticket_status)
else:
logging.debug("WEBHOOK HANDLER - Teams365 disabled; skipping.")"""
return results
# -----------------------------------------------------
# GENERIC WEBHOOK SENDER
def send_webhook(url, payload, service_name):
enabled_service_key = service_name.lower()
if not is_enabled(enabled_service_key):
logging.info(f"WEBHOOK HANDLER - {service_name} disabled. Skipping.")
return False
if not url:
logging.warning(f"WEBHOOK HANDLER - {service_name} webhook URL missing in core_configuration.yml")
return False
try:
response = requests.post(url, json=payload, timeout=5)
response.raise_for_status()
logging.info(f"WEBHOOK HANDLER - Successfully sent notification to {service_name}.")
return True
except requests.exceptions.Timeout:
logging.error(f"WEBHOOK HANDLER - {service_name} request timed out.")
except requests.exceptions.ConnectionError:
logging.error(f"WEBHOOK HANDLER - Failed to connect to {service_name}.")
except requests.exceptions.RequestException as e:
logging.error(f"WEBHOOK HANDLER - {service_name} unexpected error: {e}")
return False
# -----------------------------------------------------
# DISCORD PAYLOAD
def send_discord_notification(ticket_number, ticket_subject, ticket_status):
discord_url, _ = get_webhook_urls()
new_ticket_status = ticket_status.lower() == "open"
title = (
f"New Ticket: {ticket_number} - Subject: {ticket_subject}"
if new_ticket_status
else f"Ticket: {ticket_number} updated — Status: {ticket_status}"
)
payload = {
"username": "GoobyDesk",
"embeds": [
{
"title": title,
"color": 0x58B9FF if new_ticket_status else 0xFFFF00,
}
],
}
return send_webhook(discord_url, payload, "Discord")
# -----------------------------------------------------
# SLACK PAYLOAD
def send_slack_notification(ticket_number, ticket_subject, ticket_status):
_, slack_url = get_webhook_urls()
ticket_status_new = ticket_status.lower() == "open"
title = (
f"New Ticket: {ticket_number} - Subject: {ticket_subject}"
if ticket_status_new
else f"Ticket: {ticket_number} updated — Status: {ticket_status}"
)
payload = {
"username": "GoobyDesk",
"attachments": [
{
"title": title,
"color": "#58B9FF" if ticket_status_new else "#FFFF00",
}
],
}
return send_webhook(slack_url, payload, "Slack")
# -----------------------------------------------------
# Microsoft Office 365 Teams PAYLOAD
"""
def send_teams365_notification(ticket_number, ticket_subject, ticket_status):
_, _, teams_url = get_webhook_urls()
is_new_ticket = ticket_status.lower() == "open"
title = (
f"New Ticket Created"
if is_new_ticket
else f"Ticket Updated"
)
payload = {
"@type": "MessageCard",
"@context": "https://schema.org/extensions",
"summary": f"GoobyDesk Ticket {ticket_number}",
"themeColor": "58B9FF" if is_new_ticket else "FFFF00",
"title": title,
"sections": [
{
"facts": [
{"name": "Ticket Number", "value": ticket_number},
{"name": "Subject", "value": ticket_subject},
{"name": "Status", "value": ticket_status},
],
"markdown": True,
}
],
}
return send_webhook(teams_url, payload, "Teams365")
"""