diff --git a/.github/ACDbot/meeting_topic_mapping.json b/.github/ACDbot/meeting_topic_mapping.json index e0a3d84d..eb336e23 100644 --- a/.github/ACDbot/meeting_topic_mapping.json +++ b/.github/ACDbot/meeting_topic_mapping.json @@ -112,5 +112,19 @@ "upload_attempt_count": 0, "transcript_attempt_count": 0, "calendar_event_id": "MmpkcHAzY3JicTViY3V2OWdsaHRuZ2dxbDQgY191cGFvZm9uZzhtZ3JtcmtlZ243aWM3aGs1c0Bn" + }, + "88167935495": { + "discourse_topic_id": 22931, + "issue_title": "ACDbot test email notif to facilitator", + "start_time": "2025-02-24T03:00:00Z", + "duration": 35, + "issue_number": 14, + "meeting_id": "88167935495", + "Youtube_upload_processed": false, + "transcript_processed": false, + "upload_attempt_count": 0, + "transcript_attempt_count": 0, + "calendar_event_id": "b2F0NDVvcTN2cGw0a2p1aWVsYmZ1M2xjMGMgY191cGFvZm9uZzhtZ3JtcmtlZ243aWM3aGs1c0Bn", + "telegram_message_id": 42 } -} +} \ No newline at end of file diff --git a/.github/ACDbot/modules/gcal.py b/.github/ACDbot/modules/gcal.py index c76e16f8..41992bf5 100644 --- a/.github/ACDbot/modules/gcal.py +++ b/.github/ACDbot/modules/gcal.py @@ -13,6 +13,7 @@ def create_event(summary: str, start_dt, duration_minutes: int, calendar_id: str Creates a Google Calendar event using the Google Calendar API. Handles both datetime objects and ISO format strings for start_dt. """ + print(f"[DEBUG] Creating calendar event: {summary}") # Convert start_dt to datetime object if it's a string if isinstance(start_dt, str): @@ -43,11 +44,13 @@ def create_event(summary: str, start_dt, duration_minutes: int, calendar_id: str service = build('calendar', 'v3', credentials=credentials) event = service.events().insert(calendarId=calendar_id, body=event_body).execute() + print(f"[DEBUG] Created calendar event with ID: {event.get('id')}") return event.get('htmlLink') def update_event(event_id: str, summary: str, start_dt, duration_minutes: int, calendar_id: str, description=""): """Update an existing Google Calendar event""" + print(f"[DEBUG] Updating calendar event {event_id} with summary: {summary}") # Same datetime handling as create_event if isinstance(start_dt, str): @@ -73,10 +76,22 @@ def update_event(event_id: str, summary: str, start_dt, duration_minutes: int, c service = build('calendar', 'v3', credentials=credentials) + try: + # First try to get the event to verify it exists + existing_event = service.events().get( + calendarId=calendar_id, + eventId=event_id + ).execute() + print(f"[DEBUG] Found existing event with ID: {existing_event.get('id')}") + except Exception as e: + print(f"[DEBUG] Failed to find existing event: {str(e)}") + raise # Re-raise the exception to be handled by the caller + event = service.events().update( calendarId=calendar_id, eventId=event_id, body=event_body ).execute() + print(f"[DEBUG] Successfully updated event with ID: {event.get('id')}") return event.get('htmlLink') diff --git a/.github/ACDbot/modules/telegram.py b/.github/ACDbot/modules/telegram.py deleted file mode 100644 index a7789df7..00000000 --- a/.github/ACDbot/modules/telegram.py +++ /dev/null @@ -1,29 +0,0 @@ -import os -import requests - -ZOOM_CLIENT_ID = os.environ.get("ZOOM_CLIENT_ID") -ZOOM_CLIENT_SECRET = os.environ.get("ZOOM_CLIENT_SECRET") -ZOOM_ACCOUNT_ID = os.environ.get("ZOOM_ACCOUNT_ID") - -DISCOURSE_API_KEY = os.environ.get("DISCOURSE_API_KEY") -DISCOURSE_API_USERNAME = os.environ.get("DISCOURSE_API_USERNAME") -DISCOURSE_BASE_URL = os.environ.get("DISCOURSE_BASE_URL") - - -def send_message(text: str): - """ - Sends a message to a Telegram channel or group. - """ - token = os.environ["TELEGRAM_BOT_TOKEN"] - chat_id = os.environ["TELEGRAM_CHAT_ID"] - - url = f"https://api.telegram.org/bot{token}/sendMessage" - data = { - "chat_id": chat_id, - "text": text, - } - - resp = requests.post(url, data=data) - resp.raise_for_status() - - return resp.json() diff --git a/.github/ACDbot/modules/tg.py b/.github/ACDbot/modules/tg.py new file mode 100644 index 00000000..584380a3 --- /dev/null +++ b/.github/ACDbot/modules/tg.py @@ -0,0 +1,97 @@ +import os +import requests +from telegram.constants import ParseMode + +ZOOM_CLIENT_ID = os.environ.get("ZOOM_CLIENT_ID") +ZOOM_CLIENT_SECRET = os.environ.get("ZOOM_CLIENT_SECRET") +ZOOM_ACCOUNT_ID = os.environ.get("ZOOM_ACCOUNT_ID") + +DISCOURSE_API_KEY = os.environ.get("DISCOURSE_API_KEY") +DISCOURSE_API_USERNAME = os.environ.get("DISCOURSE_API_USERNAME") +DISCOURSE_BASE_URL = os.environ.get("DISCOURSE_BASE_URL") + + +def send_message(text: str): + """ + Sends a message to a Telegram channel or group. + Returns the message ID for future updates. + """ + token = os.environ["TELEGRAM_BOT_TOKEN"] + chat_id = os.environ["TELEGRAM_CHAT_ID"] + + url = f"https://api.telegram.org/bot{token}/sendMessage" + data = { + "chat_id": chat_id, + "text": text, + "parse_mode": "HTML" + } + + resp = requests.post(url, data=data) + resp.raise_for_status() + return resp.json()["result"]["message_id"] + +def update_message(message_id: int, text: str): + """ + Updates an existing message in the Telegram channel or group. + Returns True if successful, False if message not found. + """ + token = os.environ["TELEGRAM_BOT_TOKEN"] + chat_id = os.environ["TELEGRAM_CHAT_ID"] + + url = f"https://api.telegram.org/bot{token}/editMessageText" + data = { + "chat_id": chat_id, + "message_id": message_id, + "text": text, + "parse_mode": "HTML" + } + + try: + resp = requests.post(url, data=data) + resp.raise_for_status() + return True + except requests.exceptions.HTTPError as e: + if e.response.status_code == 400 and "message to edit not found" in e.response.text.lower(): + return False + raise + +def send_private_message(username: str, text: str): + """ + Sends a private message to a Telegram user using their username. + First gets the chat_id for the user, then sends the message. + Returns True if successful, False otherwise. + """ + token = os.environ["TELEGRAM_BOT_TOKEN"] + + # First, try to get user info + url = f"https://api.telegram.org/bot{token}/getChat" + data = { + "chat_id": f"@{username.lstrip('@')}" + } + + try: + # Get chat info + resp = requests.post(url, data=data) + resp.raise_for_status() + chat_data = resp.json() + + if not chat_data.get("ok"): + print(f"Failed to get chat info for user @{username}: {chat_data.get('description')}") + return False + + chat_id = chat_data["result"]["id"] + + # Now send the message + url = f"https://api.telegram.org/bot{token}/sendMessage" + data = { + "chat_id": chat_id, + "text": text, + } + + resp = requests.post(url, data=data) + resp.raise_for_status() + return True + + except Exception as e: + print(f"Failed to send private message to @{username}: {str(e)}") + return False diff --git a/.github/ACDbot/modules/transcript.py b/.github/ACDbot/modules/transcript.py index ca1caa57..fbe4c135 100644 --- a/.github/ACDbot/modules/transcript.py +++ b/.github/ACDbot/modules/transcript.py @@ -1,6 +1,6 @@ import os import json -from modules import zoom, discourse +from modules import zoom, discourse, tg import requests MAPPING_FILE = ".github/ACDbot/meeting_topic_mapping.json" @@ -103,8 +103,7 @@ def post_zoom_transcript_to_discourse(meeting_id: str): # Now, send the same content to Telegram try: - import modules.telegram as telegram # Ensure telegram module is available - telegram.send_message(post_content) + tg.send_message(post_content) print("Message sent to Telegram successfully.") except Exception as e: print(f"Error sending message to Telegram: {e}") diff --git a/.github/ACDbot/requirements.txt b/.github/ACDbot/requirements.txt index 6a10f701..b5626330 100644 --- a/.github/ACDbot/requirements.txt +++ b/.github/ACDbot/requirements.txt @@ -7,7 +7,7 @@ pytest==8.3.4 pytz==2022.1 Requests==2.32.3 python-dateutil>=2.8.2 - +python-telegram-bot==20.3 diff --git a/.github/ACDbot/scripts/handle_issue.py b/.github/ACDbot/scripts/handle_issue.py index e522d1e5..75b4564c 100644 --- a/.github/ACDbot/scripts/handle_issue.py +++ b/.github/ACDbot/scripts/handle_issue.py @@ -1,7 +1,7 @@ import os import sys import argparse -from modules import discourse, zoom, gcal +from modules import discourse, zoom, gcal, email_utils, tg from github import Github import re from datetime import datetime @@ -9,7 +9,6 @@ import requests from github import InputGitAuthor -# Import your custom modules MAPPING_FILE = ".github/ACDbot/meeting_topic_mapping.json" @@ -23,6 +22,22 @@ def save_meeting_topic_mapping(mapping): with open(MAPPING_FILE, "w") as f: json.dump(mapping, f, indent=2) +def extract_facilitator_info(issue_body): + """ + Extracts facilitator contact information from the issue body. + Returns a tuple of (email, telegram handle). + """ + email_pattern = r"Facilitator email:\s*([^\n\s]+)" + telegram_pattern = r"Facilitator telegram:\s*([^\n\s]+)" + + email_match = re.search(email_pattern, issue_body) + telegram_match = re.search(telegram_pattern, issue_body) + + facilitator_email = email_match.group(1) if email_match else None + facilitator_telegram = telegram_match.group(1) if telegram_match else None + + return facilitator_email, facilitator_telegram + def handle_github_issue(issue_number: int, repo_name: str): """ Fetches the specified GitHub issue, extracts its title and body, @@ -50,12 +65,14 @@ def handle_github_issue(issue_number: int, repo_name: str): if existing_entry: topic_id = existing_entry.get("discourse_topic_id") + issue_link = f"[GitHub Issue]({issue.html_url})" + updated_body = f"{issue_body}\n\n{issue_link}" # 3. Discourse handling if topic_id: discourse_response = discourse.update_topic( topic_id=topic_id, title=issue_title, - body=issue_body, + body=updated_body, category_id=63 ) action = "updated" @@ -67,7 +84,7 @@ def handle_github_issue(issue_number: int, repo_name: str): # Create new topic discourse_response = discourse.create_topic( title=issue_title, - body=issue_body, + body=updated_body, category_id=63 ) topic_id = discourse_response.get("topic_id") @@ -82,6 +99,8 @@ def handle_github_issue(issue_number: int, repo_name: str): start_time, duration = parse_issue_for_time(issue_body) meeting_updated = False zoom_id = None # Will hold the existing or new Zoom meeting ID + join_url = None # Will hold the join URL for new meetings + zoom_response = None # Will hold the zoom response for updated meetings # Find an existing mapping item by iterating over (meeting_id, entry) pairs. existing_item = next( @@ -107,8 +126,6 @@ def handle_github_issue(issue_number: int, repo_name: str): duration=duration ) comment_lines.append("\n**Zoom Meeting Updated**") - comment_lines.append(f"- Meeting URL: {zoom_response.get('join_url')}") - comment_lines.append(f"- Meeting ID: {existing_zoom_meeting_id}") print("[DEBUG] Zoom meeting updated.") zoom_id = existing_zoom_meeting_id meeting_updated = True @@ -120,29 +137,105 @@ def handle_github_issue(issue_number: int, repo_name: str): duration=duration ) comment_lines.append("\n**Zoom Meeting Created**") - comment_lines.append(f"- Meeting URL: {join_url}") - comment_lines.append(f"- Meeting ID: {zoom_id}") print("[DEBUG] Zoom meeting created.") meeting_updated = True # Use zoom_id as the meeting_id (which is the mapping key) meeting_id = str(zoom_id) + # Get the meeting join URL - needed for notifications + if zoom_response: + join_url = zoom_response.get('join_url') + elif not join_url: # If not a new meeting and no zoom_response, fetch the meeting details + meeting_details = zoom.get_meeting(zoom_id) + join_url = meeting_details.get('join_url') + + # Extract facilitator information + facilitator_email, facilitator_telegram = extract_facilitator_info(issue_body) + + # Send notifications regardless of whether the meeting was updated + # Send email notification + if facilitator_email: + try: + # Get the join URL - either from new meeting or updated meeting response + join_url = zoom_response.get('join_url') if zoom_response else None + if not join_url and existing_zoom_meeting_id: + # If no join URL yet, fetch meeting details + meeting_details = zoom.get_meeting(existing_zoom_meeting_id) + join_url = meeting_details.get('join_url') + + email_subject = f"{'Updated ' if existing_item else ''}Zoom Details - {issue_title}" + email_body = f""" +
For meeting: {issue_title}
+Join URL: {join_url}
+Meeting ID: {zoom_id}
+ + """ + email_utils.send_email(facilitator_email, email_subject, email_body) + comment_lines.append(f"- Zoom details sent to: {facilitator_email}") + except Exception as e: + print(f"Failed to send email: {e}") + comment_lines.append("- ⚠️ Failed to send email with Zoom details") + + # Send Telegram DM if handle is provided + if facilitator_telegram and join_url: # Only proceed if we have a join URL + try: + # Remove @ if present in telegram handle + telegram_handle = facilitator_telegram.lstrip('@') + telegram_message = f""" + 🎯 *Meeting Details* + + *Title*: {safe_title} + + *Join URL*: {safe_url} + *Meeting ID*: {zoom_id} + + *GitHub Issue*: {safe_issue_url} + """ + # Send private message to facilitator + if tg.send_private_message(telegram_handle, telegram_message): + comment_lines.append(f"- Zoom details sent via Telegram to: @{telegram_handle}") + else: + comment_lines.append("- ⚠️ Failed to send Telegram message with Zoom details") + + except Exception as e: + print(f"Failed to send Telegram message: {e}") + import traceback + print(traceback.format_exc()) + # Update mapping if this entry is new or if the meeting was updated. # (In the mapping, we use the meeting ID as the key.) if meeting_updated or (existing_item is None): - mapping[meeting_id] = { - "discourse_topic_id": topic_id, - "issue_title": issue.title, - "start_time": start_time, - "duration": duration, - "issue_number": issue.number, - "meeting_id": meeting_id, # Store meeting_id in case we later want it in the value. - "Youtube_upload_processed": False, - "transcript_processed": False, - "upload_attempt_count": 0, - "transcript_attempt_count": 0 - } + # When updating the mapping, preserve existing values + if existing_entry: + # Create new mapping with existing values + updated_mapping = existing_entry.copy() + # Update only the fields that changed + updated_mapping.update({ + "discourse_topic_id": topic_id, + "issue_title": issue.title, + "start_time": start_time, + "duration": duration, + "issue_number": issue.number, + "meeting_id": meeting_id + }) + # Preserve all other fields from existing entry + mapping[meeting_id] = updated_mapping + else: + # Create new mapping entry with initial values + mapping[meeting_id] = { + "discourse_topic_id": topic_id, + "issue_title": issue.title, + "start_time": start_time, + "duration": duration, + "issue_number": issue.number, + "meeting_id": meeting_id, + "Youtube_upload_processed": False, + "transcript_processed": False, + "upload_attempt_count": 0, + "transcript_attempt_count": 0 + } save_meeting_topic_mapping(mapping) commit_mapping_file() print(f"Mapping updated: Zoom Meeting ID {zoom_id} -> Discourse Topic ID {topic_id}") @@ -151,33 +244,85 @@ def handle_github_issue(issue_number: int, repo_name: str): # Calendar handling using meeting_id existing_event_id = mapping[meeting_id].get("calendar_event_id") + print(f"[DEBUG] Checking for existing calendar event ID: {existing_event_id}") if existing_event_id: - # Update existing event - event_link = gcal.update_event( - event_id=existing_event_id, - summary=issue.title, - start_dt=start_time, - duration_minutes=duration, - calendar_id="c_upaofong8mgrmrkegn7ic7hk5s@group.calendar.google.com", - description=f"Issue: {issue.html_url}\nZoom: {join_url}" - ) - print(f"Updated calendar event: {event_link}") + print(f"[DEBUG] Found existing calendar event ID in mapping: {existing_event_id}") + try: + # Get the clean event ID - take only the part before any @ or space + clean_event_id = existing_event_id.split(' ')[0].split('@')[0].split('eid=')[-1] + print(f"[DEBUG] Cleaned calendar event ID: {clean_event_id}") + + # First retrieve the event from the API + calendar_id = "c_upaofong8mgrmrkegn7ic7hk5s@group.calendar.google.com" + event = gcal.service.events().get( + calendarId=calendar_id, + eventId=clean_event_id + ).execute() + + # Update the event properties + event['summary'] = issue.title + event['description'] = f"Issue: {issue.html_url}" + + # Update start time + event['start'] = {'dateTime': start_time, 'timeZone': 'UTC'} + # Calculate end time from duration + from datetime import datetime, timedelta + start_dt = datetime.fromisoformat(start_time.replace('Z', '+00:00')) + end_time = (start_dt + timedelta(minutes=duration)).isoformat() + 'Z' + event['end'] = {'dateTime': end_time, 'timeZone': 'UTC'} + + # Update the event + updated_event = gcal.service.events().update( + calendarId=calendar_id, + eventId=clean_event_id, + body=event + ).execute() + + print(f"Updated calendar event: {updated_event['htmlLink']}") + + except Exception as e: + print(f"[DEBUG] Failed to update calendar event: {str(e)}") + print(f"[DEBUG] Exception type: {type(e)}") + print(f"[DEBUG] Creating new event instead") + + # Create new event if update fails + event_link = gcal.create_event( + summary=issue.title, + start_dt=start_time, + duration_minutes=duration, + calendar_id=calendar_id, + description=f"Issue: {issue.html_url}" + ) + print(f"Created new calendar event: {event_link}") + + # Extract and store the clean event ID + new_event_id = event_link.split('eid=')[1].split(' ')[0].split('@')[0] + mapping[meeting_id]["calendar_event_id"] = new_event_id + save_meeting_topic_mapping(mapping) + commit_mapping_file() else: + print("[DEBUG] No existing calendar event ID found in mapping") # Create new event event_link = gcal.create_event( summary=issue.title, start_dt=start_time, duration_minutes=duration, calendar_id="c_upaofong8mgrmrkegn7ic7hk5s@group.calendar.google.com", - description=f"Issue: {issue.html_url}\nZoom: {join_url}" + description=f"Issue: {issue.html_url}" ) print(f"Created calendar event: {event_link}") - # Store new event ID in mapping - mapping[meeting_id]["calendar_event_id"] = event_link.split('eid=')[-1] + + # Extract and store the clean event ID + new_event_id = event_link.split('eid=')[1].split(' ')[0].split('@')[0] + mapping[meeting_id]["calendar_event_id"] = new_event_id save_meeting_topic_mapping(mapping) commit_mapping_file() - print(f"Mapping updated: Zoom Meeting ID {zoom_id} -> calendar event ID {mapping[meeting_id]['calendar_event_id']}") + print(f"Stored new calendar event ID: {new_event_id}") + + # Debug print the final mapping state for this meeting + print(f"[DEBUG] Final mapping state for meeting {meeting_id}:") + print(json.dumps(mapping[meeting_id], indent=2)) except ValueError as e: print(f"[DEBUG] Meeting update failed: {str(e)}") @@ -188,14 +333,47 @@ def handle_github_issue(issue_number: int, repo_name: str): if comment_lines: issue.create_comment("\n".join(comment_lines)) - # Add Telegram notification here + # Add Telegram channel notification here try: - import modules.telegram as telegram discourse_url = f"{os.environ.get('DISCOURSE_BASE_URL', 'https://ethereum-magicians.org')}/t/{topic_id}" - telegram_message = f"New Discourse Topic: {issue_title}\n\n{issue_body}\n{discourse_url}" - telegram.send_message(telegram_message) + # Format message with HTML tags for better formatting + telegram_message = ( + f"Discourse Topic: {issue_title}\n\n" + f"{issue_body}\n\n" + f"Links:\n" + f"• Discourse Topic\n" + f"• GitHub Issue" + ) + + # Check if we already have a telegram message ID for this meeting + if meeting_id in mapping: + if "telegram_message_id" in mapping[meeting_id]: + message_id = int(mapping[meeting_id]["telegram_message_id"]) # Ensure message_id is an integer + try: + if tg.update_message(message_id, telegram_message): + print(f"Updated Telegram message {message_id}") + else: + raise Exception("Failed to update message") + except Exception as e: + print(f"Failed to update Telegram message: {e}") + # If update fails, send new message + message_id = tg.send_message(telegram_message) + mapping[meeting_id]["telegram_message_id"] = message_id + save_meeting_topic_mapping(mapping) + commit_mapping_file() + print(f"Created new Telegram message {message_id} (update failed)") + else: + # No message ID stored yet + message_id = tg.send_message(telegram_message) + mapping[meeting_id]["telegram_message_id"] = message_id + save_meeting_topic_mapping(mapping) + commit_mapping_file() + print(f"Created new Telegram message {message_id}") + except Exception as e: print(f"Telegram notification failed: {e}") + import traceback + print(traceback.format_exc()) # Remove any null mappings or failed entries mapping = {str(k): v for k, v in mapping.items() if v.get("discourse_topic_id") is not None} diff --git a/.github/ACDbot/scripts/upload_zoom_recording.py b/.github/ACDbot/scripts/upload_zoom_recording.py index 85fbd4a1..873fc31b 100644 --- a/.github/ACDbot/scripts/upload_zoom_recording.py +++ b/.github/ACDbot/scripts/upload_zoom_recording.py @@ -11,7 +11,7 @@ from google_auth_oauthlib.flow import InstalledAppFlow from googleapiclient.discovery import build from googleapiclient.errors import HttpError -from modules import zoom, transcript, discourse +from modules import zoom, transcript, discourse, tg from github import Github from google.auth.transport.requests import Request import json @@ -154,13 +154,12 @@ def upload_recording(meeting_id): # Send Telegram notification similar to handle_issue try: - import modules.telegram as telegram telegram_message = ( f"YouTube Upload Successful!\n\n" f"Title: {video_title}\n" f"URL: {youtube_link}" ) - telegram.send_message(telegram_message) + tg.send_message(telegram_message) print("Telegram notification sent for YouTube upload.") except Exception as e: print(f"Error sending Telegram message for YouTube upload: {e}") diff --git a/.github/ISSUE_TEMPLATE/protocol-calls.md b/.github/ISSUE_TEMPLATE/protocol-calls.md index 8d0ed4f9..95460735 100644 --- a/.github/ISSUE_TEMPLATE/protocol-calls.md +++ b/.github/ISSUE_TEMPLATE/protocol-calls.md @@ -10,7 +10,7 @@ assignees: '' # Meeting title - Date and time in UTC in format `month, day, year, time` with link to savvytime.com or timeanddate.com. E.g. [Jan 16, 2025, 14:00 UTC](https://savvytime.com/converter/utc/jan-16-2025/2pm) -- Duration in minutes : XX +- Duration in minutes : XXX - Other optional resources # Agenda @@ -19,3 +19,6 @@ assignees: '' - Agenda point n Other comments and resources + +Facilitator email: XXXXX +Facilitator telegram: XXXXX \ No newline at end of file diff --git a/.github/workflows/issue-workflow.yml b/.github/workflows/issue-workflow.yml index 164b8cb4..4be856dd 100644 --- a/.github/workflows/issue-workflow.yml +++ b/.github/workflows/issue-workflow.yml @@ -8,19 +8,10 @@ jobs: handle_new_issue: runs-on: ubuntu-latest if: > - github.event.issue.user.login == 'poojaranjan' || - github.event.issue.user.login == 'adietrichs' || - github.event.issue.user.login == 'CarlBeek' || - github.event.issue.user.login == 'timbeiko' || - github.event.issue.user.login == 'nconsigny' || - github.event.issue.user.login == 'nconsigny' || - github.event.issue.user.login == 'hwwhww' || - github.event.issue.user.login == 'mathhhewkeil' || - github.event.issue.user.login == 'jrudolf' || - github.event.issue.user.login == 'soispoke' || - github.event.issue.user.login == 'pipermerriam' || - github.event.issue.user.login == 'potuz' || - github.event.issue.user.login == 'ralexstokes' + contains( + '["poojaranjan", "adietrichs", "CarlBeek", "timbeiko", "nconsigny", "JustinDrake","vbuterin", "hwwhww", "mathhhewkeil", "jrudolf", "soispoke", "pipermerriam", "potuz", "ralexstokes"]', + github.actor + ) steps: - name: Check out code uses: actions/checkout@v3 @@ -70,7 +61,10 @@ jobs: #SENDER_EMAIL_PASSWORD: ${{ secrets.SENDER_EMAIL_PASSWORD }} #SMTP_SERVER: ${{ secrets.SMTP_SERVER }} TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }} - TELEGRAM_CHAT_ID: ${{ vars.TELEGRAM_CHAT_ID }} + TELEGRAM_CHAT_ID: ${{ vars.TELEGRAM_CHAT_ID }} + SENDER_EMAIL: ${{ secrets.SENDER_EMAIL }} + SENDER_EMAIL_PASSWORD: ${{ secrets.SENDER_EMAIL_PASSWORD }} + SMTP_SERVER: ${{ secrets.SMTP_SERVER }} permissions: contents: write