Skip to content

Commit 7370b16

Browse files
committed
git status
git status suggestions implemented
1 parent 9580d97 commit 7370b16

File tree

11 files changed

+755
-706
lines changed

11 files changed

+755
-706
lines changed

backend/apps/ai/common/constants.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@
55
DEFAULT_SIMILARITY_THRESHOLD = 0.4
66
DELIMITER = "\n\n"
77
MIN_REQUEST_INTERVAL_SECONDS = 1.2
8+
QUEUE_RESPONSE_TIME_MINUTES = 1

backend/apps/slack/MANIFEST.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ oauth_config:
108108
- mpim:read
109109
- users:read
110110
bot:
111+
- app_mentions:read
111112
- channels:read
112113
- chat:write
113114
- commands
@@ -129,6 +130,7 @@ settings:
129130
- team_join
130131
bot_events:
131132
- app_home_opened
133+
- app_mention
132134
- member_joined_channel
133135
- message.channels
134136
- team_join

backend/apps/slack/events/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ def configure_slack_events():
33
from apps.slack.apps import SlackConfig
44
from apps.slack.events import (
55
app_home_opened,
6+
app_mention,
67
message_posted,
78
team_join,
89
url_verification,
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
"""Slack app mention event handler."""
2+
3+
import logging
4+
5+
from apps.slack.common.handlers.ai import get_blocks
6+
from apps.slack.events.event import EventBase
7+
8+
logger = logging.getLogger(__name__)
9+
10+
11+
class AppMention(EventBase):
12+
"""Handles app mention events when the bot is mentioned in a channel."""
13+
14+
event_type = "app_mention"
15+
16+
def handle_event(self, event, client):
17+
"""Handle an incoming app mention event."""
18+
channel_id = event.get("channel")
19+
text = event.get("text", "")
20+
21+
query = text
22+
for mention in event.get("blocks", []):
23+
if mention.get("type") == "rich_text":
24+
for element in mention.get("elements", []):
25+
if element.get("type") == "rich_text_section":
26+
for text_element in element.get("elements", []):
27+
if text_element.get("type") == "text":
28+
query = text_element.get("text", "").strip()
29+
break
30+
31+
if not query:
32+
logger.warning("No query found in app mention")
33+
return
34+
35+
logger.info("Handling app mention")
36+
37+
client.chat_postMessage(
38+
channel=channel_id,
39+
blocks=get_blocks(query=query),
40+
text=query,
41+
thread_ts=event.get("ts"),
42+
)

backend/apps/slack/events/message_posted.py

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import django_rq
77

8-
from apps.slack.common.handlers.ai import get_blocks
8+
from apps.ai.common.constants import QUEUE_RESPONSE_TIME_MINUTES
99
from apps.slack.common.question_detector import QuestionDetector
1010
from apps.slack.events.event import EventBase
1111
from apps.slack.models import Conversation, Member, Message
@@ -22,33 +22,26 @@ class MessagePosted(EventBase):
2222
def __init__(self):
2323
"""Initialize MessagePosted event handler."""
2424
self.question_detector = QuestionDetector()
25-
self.bot_user_id = None
2625

2726
def handle_event(self, event, client):
2827
"""Handle an incoming message event."""
29-
if event.get("subtype") or event.get("bot_id") or event.get("thread_ts"):
28+
if event.get("subtype") or event.get("bot_id"):
3029
logger.info("Ignored message due to subtype, bot_id, or thread_ts.")
3130
return
3231

33-
if not self.bot_user_id:
34-
auth_response = client.auth_test()
35-
self.bot_user_id = auth_response.get("user_id")
32+
if event.get("thread_ts"):
33+
try:
34+
Message.objects.get(
35+
slack_message_id=event.get("thread_ts"),
36+
conversation__slack_channel_id=event.get("channel"),
37+
).update(has_replies=True)
38+
except Message.DoesNotExist:
39+
logger.warning("Thread message not found.")
40+
return
3641

3742
channel_id = event.get("channel")
3843
user_id = event.get("user")
3944
text = event.get("text", "")
40-
bot_mention_string = f"<@{self.bot_user_id}>"
41-
42-
if bot_mention_string in text:
43-
query = text.replace(bot_mention_string, "").strip()
44-
45-
client.chat_postMessage(
46-
channel=channel_id,
47-
blocks=get_blocks(query=query),
48-
text=query,
49-
thread_ts=event.get("ts"),
50-
)
51-
return
5245

5346
try:
5447
conversation = Conversation.objects.get(
@@ -64,14 +57,17 @@ def handle_event(self, event, client):
6457

6558
try:
6659
author = Member.objects.get(slack_user_id=user_id, workspace=conversation.workspace)
67-
message = Message.update_data(
68-
data=event, conversation=conversation, author=author, save=True
69-
)
70-
71-
django_rq.get_queue("default").enqueue_in(
72-
timedelta(minutes=1), generate_ai_reply_if_unanswered, message.id
73-
)
74-
7560
except Member.DoesNotExist:
76-
logger.warning("Could not find Member")
77-
return
61+
user_info = client.users_info(user=user_id)
62+
author = Member.update_data(user_info["user"], conversation.workspace, save=True)
63+
logger.info("Created new member")
64+
65+
message = Message.update_data(
66+
data=event, conversation=conversation, author=author, save=True
67+
)
68+
69+
django_rq.get_queue("ai").enqueue_in(
70+
timedelta(minutes=QUEUE_RESPONSE_TIME_MINUTES),
71+
generate_ai_reply_if_unanswered,
72+
message.id,
73+
)

backend/apps/slack/services/message_auto_reply.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
logger = logging.getLogger(__name__)
1313

1414

15-
@job("default")
15+
@job("ai")
1616
def generate_ai_reply_if_unanswered(message_id: int):
1717
"""Check if a message is still unanswered and generate AI reply."""
1818
try:

backend/apps/slack/templates/commands/ai.jinja

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ Use this command to ask questions about OWASP projects, OWASP chapters, and comm
55
*Examples:*
66
• `{{ COMMAND }} What are the OWASP Top 10 vulnerabilities?`
77
• `{{ COMMAND }} How do I contribute to an OWASP project?`
8-
• `{{ COMMAND }} Tell me about OWASP ZAP`
9-
• `{{ COMMAND }} What is secure coding?`
8+
• `{{ COMMAND }} When is the next OWASP appsec days event?`
109

1110
{{ DIVIDER }}
1211

0 commit comments

Comments
 (0)