mirror of
https://github.com/marcogll/talia_bot.git
synced 2026-01-13 21:35:19 +00:00
Merge pull request #1 from marcogll/feat/initial-project-structure-5769203822268670178
Initial Project Structure
This commit is contained in:
10
.env.example
Normal file
10
.env.example
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
TELEGRAM_BOT_TOKEN=
|
||||||
|
OWNER_CHAT_ID=
|
||||||
|
ADMIN_CHAT_IDS=
|
||||||
|
TEAM_CHAT_IDS=
|
||||||
|
GOOGLE_CLIENT_ID=
|
||||||
|
GOOGLE_CLIENT_SECRET=
|
||||||
|
GOOGLE_REFRESH_TOKEN=
|
||||||
|
N8N_WEBHOOK_URL=
|
||||||
|
OPENAI_API_KEY=
|
||||||
|
TIMEZONE=America/Mexico_City
|
||||||
15
Dockerfile
Normal file
15
Dockerfile
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# Python base image
|
||||||
|
FROM python:3.9-slim
|
||||||
|
|
||||||
|
# Set working directory
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Copy and install requirements
|
||||||
|
COPY requirements.txt .
|
||||||
|
RUN pip install -r requirements.txt
|
||||||
|
|
||||||
|
# Copy app code
|
||||||
|
COPY app/ .
|
||||||
|
|
||||||
|
# Run the bot
|
||||||
|
CMD ["python", "main.py"]
|
||||||
17
app/calendar.py
Normal file
17
app/calendar.py
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# app/calendar.py
|
||||||
|
|
||||||
|
def get_available_slots():
|
||||||
|
"""
|
||||||
|
Fetches available calendar slots.
|
||||||
|
"""
|
||||||
|
print("Fetching available slots from Google Calendar...")
|
||||||
|
# TODO: Implement Google Calendar API integration
|
||||||
|
return []
|
||||||
|
|
||||||
|
def create_event(summary, start_time, end_time, attendees):
|
||||||
|
"""
|
||||||
|
Creates a new event in the calendar.
|
||||||
|
"""
|
||||||
|
print(f"Creating event: {summary}")
|
||||||
|
# TODO: Implement Google Calendar API integration
|
||||||
|
return None
|
||||||
13
app/config.py
Normal file
13
app/config.py
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# app/config.py
|
||||||
|
import os
|
||||||
|
|
||||||
|
TELEGRAM_BOT_TOKEN = os.getenv("TELEGRAM_BOT_TOKEN")
|
||||||
|
OWNER_CHAT_ID = os.getenv("OWNER_CHAT_ID")
|
||||||
|
ADMIN_CHAT_IDS = os.getenv("ADMIN_CHAT_IDS", "").split(",")
|
||||||
|
TEAM_CHAT_IDS = os.getenv("TEAM_CHAT_IDS", "").split(",")
|
||||||
|
GOOGLE_CLIENT_ID = os.getenv("GOOGLE_CLIENT_ID")
|
||||||
|
GOOGLE_CLIENT_SECRET = os.getenv("GOOGLE_CLIENT_SECRET")
|
||||||
|
GOOGLE_REFRESH_TOKEN = os.getenv("GOOGLE_REFRESH_TOKEN")
|
||||||
|
N8N_WEBHOOK_URL = os.getenv("N8N_WEBHOOK_URL")
|
||||||
|
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
|
||||||
|
TIMEZONE = os.getenv("TIMEZONE", "America/Mexico_City")
|
||||||
15
app/llm.py
Normal file
15
app/llm.py
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# app/llm.py
|
||||||
|
|
||||||
|
from config import OPENAI_API_KEY
|
||||||
|
|
||||||
|
def get_smart_response(prompt):
|
||||||
|
"""
|
||||||
|
Generates a smart response using an LLM.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not OPENAI_API_KEY:
|
||||||
|
return "OpenAI API key not configured."
|
||||||
|
|
||||||
|
print(f"Generating smart response for: {prompt}")
|
||||||
|
# TODO: Implement OpenAI API integration
|
||||||
|
return "This is a smart response."
|
||||||
10
app/main.py
Normal file
10
app/main.py
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# app/main.py
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""
|
||||||
|
Main function to run the bot.
|
||||||
|
"""
|
||||||
|
print("Talía Bot is running...")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
9
app/modules/admin.py
Normal file
9
app/modules/admin.py
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# app/modules/admin.py
|
||||||
|
|
||||||
|
def perform_admin_action(action, target):
|
||||||
|
"""
|
||||||
|
Performs an administrative action.
|
||||||
|
"""
|
||||||
|
print(f"Performing admin action '{action}' on '{target}'")
|
||||||
|
# TODO: Implement administrative actions
|
||||||
|
return "Admin action completed."
|
||||||
9
app/modules/agenda.py
Normal file
9
app/modules/agenda.py
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# app/modules/agenda.py
|
||||||
|
|
||||||
|
def get_agenda(chat_id):
|
||||||
|
"""
|
||||||
|
Fetches and displays the user's agenda.
|
||||||
|
"""
|
||||||
|
print(f"[{chat_id}] Fetching agenda...")
|
||||||
|
# TODO: Implement agenda logic
|
||||||
|
return "Here is your agenda for today."
|
||||||
17
app/modules/aprobaciones.py
Normal file
17
app/modules/aprobaciones.py
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# app/modules/aprobaciones.py
|
||||||
|
|
||||||
|
def approve_request(request_id):
|
||||||
|
"""
|
||||||
|
Approves a request.
|
||||||
|
"""
|
||||||
|
print(f"Approving request {request_id}...")
|
||||||
|
# TODO: Implement approval logic
|
||||||
|
return "Request approved."
|
||||||
|
|
||||||
|
def reject_request(request_id):
|
||||||
|
"""
|
||||||
|
Rejects a request.
|
||||||
|
"""
|
||||||
|
print(f"Rejecting request {request_id}...")
|
||||||
|
# TODO: Implement rejection logic
|
||||||
|
return "Request rejected."
|
||||||
9
app/modules/citas.py
Normal file
9
app/modules/citas.py
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# app/modules/citas.py
|
||||||
|
|
||||||
|
def request_appointment(chat_id, requested_time):
|
||||||
|
"""
|
||||||
|
Handles a client's request for an appointment.
|
||||||
|
"""
|
||||||
|
print(f"[{chat_id}] Requesting appointment for {requested_time}...")
|
||||||
|
# TODO: Implement appointment request logic
|
||||||
|
return "Your appointment request has been received."
|
||||||
9
app/modules/equipo.py
Normal file
9
app/modules/equipo.py
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# app/modules/equipo.py
|
||||||
|
|
||||||
|
def request_activity(chat_id, activity_details):
|
||||||
|
"""
|
||||||
|
Handles a team member's request for an activity.
|
||||||
|
"""
|
||||||
|
print(f"[{chat_id}] Requesting activity: {activity_details}")
|
||||||
|
# TODO: Implement team activity request logic
|
||||||
|
return "Your activity request has been sent for approval."
|
||||||
9
app/modules/onboarding.py
Normal file
9
app/modules/onboarding.py
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# app/modules/onboarding.py
|
||||||
|
|
||||||
|
def handle_start(chat_id):
|
||||||
|
"""
|
||||||
|
Handles the /start command and sends a welcome message.
|
||||||
|
"""
|
||||||
|
print(f"[{chat_id}] Handling start command...")
|
||||||
|
# TODO: Implement welcome message and main menu
|
||||||
|
return "Welcome to Talía!"
|
||||||
17
app/modules/servicios.py
Normal file
17
app/modules/servicios.py
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# app/modules/servicios.py
|
||||||
|
|
||||||
|
def get_service_info(service_name):
|
||||||
|
"""
|
||||||
|
Provides information about a service.
|
||||||
|
"""
|
||||||
|
print(f"Fetching info for service: {service_name}")
|
||||||
|
# TODO: Implement service information logic
|
||||||
|
return f"Here is information about {service_name}."
|
||||||
|
|
||||||
|
def request_quote(project_details):
|
||||||
|
"""
|
||||||
|
Requests a quote for a project.
|
||||||
|
"""
|
||||||
|
print(f"Requesting quote for: {project_details}")
|
||||||
|
# TODO: Implement quote request logic
|
||||||
|
return "Your quote request has been received."
|
||||||
34
app/permissions.py
Normal file
34
app/permissions.py
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
# app/permissions.py
|
||||||
|
|
||||||
|
from config import OWNER_CHAT_ID, ADMIN_CHAT_IDS, TEAM_CHAT_IDS
|
||||||
|
|
||||||
|
def get_user_role(chat_id):
|
||||||
|
"""
|
||||||
|
Determines the role of a user based on their chat ID.
|
||||||
|
"""
|
||||||
|
chat_id_str = str(chat_id)
|
||||||
|
if chat_id_str == OWNER_CHAT_ID:
|
||||||
|
return "owner"
|
||||||
|
if chat_id_str in ADMIN_CHAT_IDS:
|
||||||
|
return "admin"
|
||||||
|
if chat_id_str in TEAM_CHAT_IDS:
|
||||||
|
return "team"
|
||||||
|
return "client"
|
||||||
|
|
||||||
|
def is_owner(chat_id):
|
||||||
|
"""
|
||||||
|
Checks if a user is the owner.
|
||||||
|
"""
|
||||||
|
return get_user_role(chat_id) == "owner"
|
||||||
|
|
||||||
|
def is_admin(chat_id):
|
||||||
|
"""
|
||||||
|
Checks if a user is an admin.
|
||||||
|
"""
|
||||||
|
return get_user_role(chat_id) in ["owner", "admin"]
|
||||||
|
|
||||||
|
def is_team_member(chat_id):
|
||||||
|
"""
|
||||||
|
Checks if a user is a team member.
|
||||||
|
"""
|
||||||
|
return get_user_role(chat_id) in ["owner", "admin", "team"]
|
||||||
27
app/scheduler.py
Normal file
27
app/scheduler.py
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# app/scheduler.py
|
||||||
|
|
||||||
|
import schedule
|
||||||
|
import time
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
from config import TIMEZONE
|
||||||
|
|
||||||
|
def send_daily_summary():
|
||||||
|
"""
|
||||||
|
Sends the daily summary to the owner.
|
||||||
|
"""
|
||||||
|
print(f"[{datetime.now()}] Sending daily summary...")
|
||||||
|
# TODO: Implement the logic to fetch and send the summary
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""
|
||||||
|
Main function to run the scheduler.
|
||||||
|
"""
|
||||||
|
schedule.every().day.at("07:00").do(send_daily_summary)
|
||||||
|
|
||||||
|
while True:
|
||||||
|
schedule.run_pending()
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
16
app/webhook_client.py
Normal file
16
app/webhook_client.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# app/webhook_client.py
|
||||||
|
|
||||||
|
import requests
|
||||||
|
from config import N8N_WEBHOOK_URL
|
||||||
|
|
||||||
|
def send_webhook(event_data):
|
||||||
|
"""
|
||||||
|
Sends a webhook to the n8n service.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
response = requests.post(N8N_WEBHOOK_URL, json=event_data)
|
||||||
|
response.raise_for_status()
|
||||||
|
return response.json()
|
||||||
|
except requests.exceptions.RequestException as e:
|
||||||
|
print(f"Error sending webhook: {e}")
|
||||||
|
return None
|
||||||
8
docker-compose.yml
Normal file
8
docker-compose.yml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
version: "3.9"
|
||||||
|
services:
|
||||||
|
talia-bot:
|
||||||
|
build: .
|
||||||
|
container_name: talia-bot
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
restart: unless-stopped
|
||||||
7
requirements.txt
Normal file
7
requirements.txt
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
python-telegram-bot
|
||||||
|
requests
|
||||||
|
schedule
|
||||||
|
google-api-python-client
|
||||||
|
google-auth-httplib2
|
||||||
|
google-auth-oauthlib
|
||||||
|
openai
|
||||||
41
tasks.md
Normal file
41
tasks.md
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
# Talía Development Tasks
|
||||||
|
|
||||||
|
This file tracks the development tasks for the Talía project.
|
||||||
|
|
||||||
|
## Phase 1: Project Scaffolding
|
||||||
|
|
||||||
|
- [x] Create `tasks.md` to track project development.
|
||||||
|
- [x] Create the basic directory structure (`app`, `app/modules`).
|
||||||
|
- [x] Create placeholder files in the root directory (`docker-compose.yml`, `Dockerfile`, `.env.example`).
|
||||||
|
- [x] Create placeholder files in the `app` directory.
|
||||||
|
- [x] Create placeholder files in the `app/modules` directory.
|
||||||
|
|
||||||
|
## Phase 2: Core Logic Implementation
|
||||||
|
|
||||||
|
- [ ] Implement `main.py` as the central orchestrator.
|
||||||
|
- [ ] Implement `config.py` to handle environment variables.
|
||||||
|
- [ ] Implement `permissions.py` for role-based access control.
|
||||||
|
- [ ] Implement `webhook_client.py` for n8n communication.
|
||||||
|
|
||||||
|
## Phase 3: Module Implementation
|
||||||
|
|
||||||
|
- [ ] Implement `onboarding.py` module.
|
||||||
|
- [ ] Implement `agenda.py` module.
|
||||||
|
- [ ] Implement `citas.py` module.
|
||||||
|
- [ ] Implement `equipo.py` module.
|
||||||
|
- [ ] Implement `aprobaciones.py` module.
|
||||||
|
- [ ] Implement `servicios.py` module.
|
||||||
|
- [ ] Implement `admin.py` module.
|
||||||
|
|
||||||
|
## Phase 4: Integrations
|
||||||
|
|
||||||
|
- [ ] Implement `calendar.py` for Google Calendar integration.
|
||||||
|
- [ ] Implement `llm.py` for AI-powered responses.
|
||||||
|
- [ ] Implement `scheduler.py` for daily summaries.
|
||||||
|
|
||||||
|
## Log
|
||||||
|
|
||||||
|
### 2024-05-22
|
||||||
|
|
||||||
|
- Created `tasks.md` to begin tracking development.
|
||||||
|
- Completed initial project scaffolding.
|
||||||
Reference in New Issue
Block a user