You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
6.4 KiB
TypeScript
150 lines
6.4 KiB
TypeScript
import { sendMessage } from '../utils/messaging';
|
|
import { createTask, assignTask, completeTask, getPendingTasks } from '../../services/taskService';
|
|
import { setRemindersEnabled } from '../../services/userService';
|
|
|
|
function formatTaskList(tasks: any[]) {
|
|
if (tasks.length === 0) {
|
|
return 'No tienes tareas pendientes.';
|
|
}
|
|
|
|
return tasks.map((task) => {
|
|
return `- Tarea ${task.id}: ${task.description}${task.dueDate ? ` (para el ${task.dueDate})` : ''}`;
|
|
}).join('\n');
|
|
}
|
|
|
|
export function handleTaskCommand(body: string, sender: string, groupId: string, linkedGroups: Set<string>) {
|
|
if (groupId && linkedGroups.has(groupId)) {
|
|
if (body.startsWith('/tarea')) {
|
|
const command = body.replace('/tarea', '').trim();
|
|
const [action, ...args] = command.split(' ');
|
|
const description = args.join(' ');
|
|
|
|
// Extract WhatsApp mention (format: @<phone_number>)
|
|
const assignedUserMatch = description.match(/@\d+/);
|
|
const assignedUser = assignedUserMatch ? assignedUserMatch[0] : null;
|
|
|
|
// Validate phone number format
|
|
if (assignedUser && !/^@\d{8,}$/.test(assignedUser)) {
|
|
sendMessage(sender, 'Formato de mención inválido. Usa @ seguido del número de teléfono');
|
|
return;
|
|
}
|
|
|
|
const dueDateMatch = description.match(/\d{4}-\d{2}-\d{2}/);
|
|
const dueDate = dueDateMatch ? dueDateMatch[0] : null;
|
|
|
|
const cleanDescription = description
|
|
.replace(/@\w+/g, '')
|
|
.replace(/\d{4}-\d{2}-\d{2}/g, '')
|
|
.trim();
|
|
|
|
if (!action || action === 'mostrar') {
|
|
// Handle bare /tarea or /tarea mostrar
|
|
const user = `@${sender.split('@')[0]}`; // Default to the sender
|
|
const tasks = getPendingTasks(user);
|
|
|
|
if (tasks.length === 0) {
|
|
sendMessage(sender, 'No tienes tareas pendientes.');
|
|
} else {
|
|
const taskList = formatTaskList(tasks);
|
|
sendMessage(sender, `Tus tareas pendientes:\n${taskList}`);
|
|
}
|
|
} else if (action === 'nueva') {
|
|
try {
|
|
const finalAssignedUser = assignedUser || `@${sender.split('@')[0]}`;
|
|
const task = createTask(sender, {
|
|
description: cleanDescription,
|
|
assignedTo: finalAssignedUser,
|
|
dueDate: dueDate || undefined
|
|
});
|
|
|
|
let message = `✅ Tarea creada:\nID: ${task.id}\nDescripción: ${task.description}`;
|
|
if (task.assignedTo) message += `\nAsignada a: ${task.assignedTo}`;
|
|
if (task.dueDate) message += `\nFecha límite: ${task.dueDate}`;
|
|
message += `\nCreada: ${task.createdAt}`;
|
|
|
|
// Send confirmation privately to creator
|
|
sendMessage(sender, message);
|
|
// Also notify assignee if different from creator
|
|
if (assignedUser && assignedUser !== `@${sender.split('@')[0]}`) {
|
|
sendMessage(assignedUser, `📝 Se te ha asignado una nueva tarea:\n${message}`);
|
|
}
|
|
} catch (error) {
|
|
console.error('Error creating task:', error);
|
|
sendMessage(sender, `❌ Error al crear la tarea: ${error.message}`);
|
|
}
|
|
} else if (action === 'asignar') {
|
|
try {
|
|
const taskId = validateTaskId(args[0]);
|
|
if (!assignedUser) {
|
|
throw new Error('Debes mencionar a un usuario para asignar la tarea. Ejemplo: /tarea asignar 1 @12345678');
|
|
}
|
|
|
|
assignTask(taskId, assignedUser);
|
|
// Send confirmation privately to the person who assigned
|
|
sendMessage(sender, `✅ Tarea ${taskId} asignada a ${assignedUser}`);
|
|
// Notify the new assignee privately
|
|
sendMessage(assignedUser, `📝 Se te ha asignado la tarea ${taskId}`);
|
|
} catch (error) {
|
|
console.error('Error assigning task:', error);
|
|
sendMessage(sender, `❌ Error al asignar tarea: ${error.message}`);
|
|
}
|
|
} else if (action === 'lista' || (!action && args.length === 1)) {
|
|
// Handle both /tarea lista 14 and /tarea 14
|
|
try {
|
|
const taskId = validateTaskId(args[0]);
|
|
const task = getTaskById(taskId);
|
|
|
|
if (!task) {
|
|
sendMessage(sender, `Tarea ${taskId} no encontrada`);
|
|
return;
|
|
}
|
|
|
|
// Check if task is assigned to current user
|
|
const currentUser = `@${sender.split('@')[0]}`;
|
|
if (task.assignedTo !== currentUser) {
|
|
sendMessage(sender, `No puedes completar la tarea ${taskId} porque no está asignada a ti`);
|
|
return;
|
|
}
|
|
|
|
completeTask(taskId);
|
|
// Send confirmation privately to the user who completed
|
|
sendMessage(sender, `✅ Tarea ${taskId} completada: ${task.description}`);
|
|
// Notify the task creator if different from completer
|
|
if (task.createdBy && task.createdBy !== sender) {
|
|
sendMessage(task.createdBy, `✅ Tarea ${taskId} completada por @${sender.split('@')[0]}: ${task.description}`);
|
|
}
|
|
} catch (error) {
|
|
console.error('Error completing task:', error);
|
|
sendMessage(sender, `❌ Error al completar tarea: ${error.message}`);
|
|
}
|
|
} else if (action === 'mostrar' || !action) {
|
|
// Handle /tarea or /tarea mostrar
|
|
const user = `@${sender.split('@')[0]}`; // Default to the sender
|
|
const tasks = getPendingTasks(user);
|
|
|
|
if (tasks.length === 0) {
|
|
sendMessage(sender, 'No tienes tareas pendientes.');
|
|
} else {
|
|
const taskList = tasks.map((task) => {
|
|
return `- Tarea ${task.id}: ${task.description}${task.dueDate ? ` (para el ${task.dueDate})` : ''}`;
|
|
}).join('\n');
|
|
// Always send task list privately
|
|
sendMessage(sender, `Tus tareas pendientes:\n${taskList}`);
|
|
}
|
|
} else if (action === 'recordatorios') {
|
|
const enable = args[0]?.toLowerCase();
|
|
if (enable === 'on' || enable === 'off') {
|
|
const phoneNumber = sender.split('@')[0];
|
|
setRemindersEnabled(phoneNumber, enable === 'on');
|
|
// Send reminder settings confirmation privately
|
|
sendMessage(sender, `Recordatorios ${enable === 'on' ? 'activados' : 'desactivados'}`);
|
|
} else {
|
|
sendMessage(sender, 'Usa /tarea recordatorios on|off para gestionar tus recordatorios');
|
|
}
|
|
} else {
|
|
sendMessage(sender, 'Acción no reconocida. Usa /tarea nueva, /tarea asignar, /tarea completar, /tarea mostrar, o /tarea recordatorios.');
|
|
}
|
|
}
|
|
}
|
|
}
|