telegram-notify.ts 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import type { Plugin } from "@opencode-ai/plugin"
  2. import { SimpleTelegramBot } from "../lib/telegram-bot"
  3. export const TelegramNotify: Plugin = async ({ $ }) => {
  4. // Initialize Telegram bot
  5. const bot = new SimpleTelegramBot()
  6. let lastMessage = ""
  7. return {
  8. async event(input) {
  9. if (input.event.type === "session.idle") {
  10. // Send the last message content along with idle notification
  11. const message = lastMessage
  12. ? `🟡 Session idle! Here's your last message:\n\n${lastMessage}`
  13. : "🟡 Hey! Your OpenCode session is idle - time to check your work!"
  14. bot.sendMessage(message)
  15. }
  16. if (input.event.type === "message.updated") {
  17. // Reset idle timer when user sends messages
  18. bot.resetActivity()
  19. const messageContent = (input.event as any).message?.content ||
  20. (input.event as any).content || ""
  21. // Check if it's a command to send last message
  22. if (messageContent.includes("/send-last") || messageContent.includes("/last")) {
  23. if (lastMessage) {
  24. bot.sendMessage(`📱 Here's your last message:\n\n${lastMessage}`)
  25. } else {
  26. bot.sendMessage("📱 No previous message found.")
  27. }
  28. return
  29. }
  30. // Check if it's a command to send to phone
  31. if (messageContent.includes("/send-to-phone") || messageContent.includes("/phone")) {
  32. if (lastMessage) {
  33. bot.sendMessage(`📱 Sending to your phone:\n\n${lastMessage}`)
  34. } else {
  35. bot.sendMessage("📱 No message to send to phone.")
  36. }
  37. return
  38. }
  39. // Try to capture message content from the event
  40. try {
  41. // Access message content if available
  42. const messageContent = (input.event as any).message?.content ||
  43. (input.event as any).content ||
  44. "Message updated"
  45. if (messageContent && messageContent !== "Message updated") {
  46. lastMessage = messageContent
  47. // Send a preview of the message to Telegram
  48. const preview = lastMessage.length > 200
  49. ? lastMessage.substring(0, 200) + "..."
  50. : lastMessage
  51. bot.sendMessage(`📱 Last message preview:\n\n${preview}`)
  52. }
  53. } catch (error) {
  54. // If we can't access the message content, just log it
  55. console.log("Message updated but couldn't capture content")
  56. }
  57. }
  58. if (input.event.type === "file.edited") {
  59. // Reset idle timer when user edits files
  60. bot.resetActivity()
  61. }
  62. if (input.event.type === "message.updated") {
  63. // Reset idle timer when user sends messages
  64. bot.resetActivity()
  65. // Try to capture message content from the event
  66. try {
  67. // Access message content if available
  68. const messageContent = (input.event as any).message?.content ||
  69. (input.event as any).content ||
  70. "Message updated"
  71. if (messageContent && messageContent !== "Message updated") {
  72. lastMessage = messageContent
  73. // Send a preview of the message to Telegram
  74. const preview = lastMessage.length > 200
  75. ? lastMessage.substring(0, 200) + "..."
  76. : lastMessage
  77. bot.sendMessage(`📱 Last message preview:\n\n${preview}`)
  78. }
  79. } catch (error) {
  80. // If we can't access the message content, just log it
  81. console.log("Message updated but couldn't capture content")
  82. }
  83. }
  84. // Also listen for message parts being updated
  85. if (input.event.type === "message.part.updated") {
  86. bot.resetActivity()
  87. try {
  88. const partContent = (input.event as any).part?.content ||
  89. (input.event as any).content ||
  90. "Message part updated"
  91. if (partContent && partContent !== "Message part updated") {
  92. lastMessage = partContent
  93. const preview = lastMessage.length > 200
  94. ? lastMessage.substring(0, 200) + "..."
  95. : lastMessage
  96. bot.sendMessage(`📱 Message part preview:\n\n${preview}`)
  97. }
  98. } catch (error) {
  99. console.log("Message part updated but couldn't capture content")
  100. }
  101. }
  102. }
  103. }
  104. }