telegram-notify.ts 3.7 KB

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