eventDetails.ts 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import { Context } from "grammy";
  2. import { CosmoeClient } from "../../client/cosmoe";
  3. export async function handleEventDetails(ctx: Context): Promise<void> {
  4. try {
  5. if (!ctx.message || !ctx.message.text) {
  6. return;
  7. }
  8. const match = /^\/event_(.+)$/.exec(ctx.message.text);
  9. if (match && match[1]) {
  10. const cosmoeClient = new CosmoeClient();
  11. const eventId = match[1];
  12. const result = await cosmoeClient.getEventDetail(eventId);
  13. if (result.code === 200) {
  14. const event = result.data;
  15. let message = `*${event.name}*\n`;
  16. message += `📅 *日期* ${event.event_date}\n\n`;
  17. message += `⏰ *时间段*\n`;
  18. if (event.slots && event.slots.length > 0) {
  19. // Check if today is the event day or before the event day (Beijing time)
  20. const eventDate = new Date(event.event_date);
  21. const now = new Date();
  22. // Adjust to Beijing timezone (UTC+8)
  23. const beijingOffset = 8 * 60; // 8 hours in minutes
  24. const beijingTime = new Date(now.getTime() + (now.getTimezoneOffset() + beijingOffset) * 60000);
  25. // Reset time parts for comparison (compare dates only)
  26. const todayDate = new Date(beijingTime.getFullYear(), beijingTime.getMonth(), beijingTime.getDate());
  27. const eventDay = new Date(eventDate.getFullYear(), eventDate.getMonth(), eventDate.getDate());
  28. const isEventActive = todayDate <= eventDay;
  29. // Sort slots by range for consistent ordering
  30. const sortedSlots = [...event.slots].sort((a, b) => a.range.localeCompare(b.range));
  31. sortedSlots.forEach((slot: any, index: number) => {
  32. message += `• ${slot.range}: ¥${slot.price} (${slot.remaining}/${slot.capacity})\n`;
  33. if (slot.remaining > 0 && isEventActive) {
  34. message += ` • 预约 -> /book\\_${eventId}\\_${index}\n`;
  35. }
  36. });
  37. } else {
  38. message += "没有可预约的时间段\n";
  39. }
  40. message += `\n🖼️ *封面图* ${event.cover_image_url}`;
  41. await ctx.reply(message, { parse_mode: "Markdown" });
  42. } else {
  43. await ctx.reply(`获取活动详情时出错: ${result.msg || '未知错误'}`);
  44. }
  45. }
  46. } catch (error) {
  47. console.error("Error fetching event details:", error);
  48. await ctx.reply("获取活动详情时出错,请稍后再试");
  49. }
  50. }