המרת הודעות מטלגרם לתוכן מותאם לקבוצת WhatsApp עם תזמון שליחה
Size
32.8 KB
Version
1.2.2
Created
Feb 8, 2026
Updated
about 1 month ago
1// ==UserScript==
2// @name Telegram to WhatsApp Content Converter
3// @description המרת הודעות מטלגרם לתוכן מותאם לקבוצת WhatsApp עם תזמון שליחה
4// @version 1.2.2
5// @match https://*.web.telegram.org/*
6// @match https://*.webk.telegram.org/*
7// @icon https://web.telegram.org/a/favicon.ico
8// @grant GM.getValue
9// @grant GM.setValue
10// @grant GM.deleteValue
11// @grant GM.listValues
12// @grant GM.setClipboard
13// @grant GM.openInTab
14// @grant unsafeWindow
15// ==/UserScript==
16(function() {
17 'use strict';
18
19 console.log('🚀 Telegram to WhatsApp Converter - Starting...');
20
21 // הנחיות ההמרה המלאות
22 const CONVERSION_GUIDELINES = `
23פתיחה מותאמת לקבוצה
24כל פוסט נפתח ב־"היי לכולן" – כדי לדבר ישירות אל קהל נשי, בגובה העיניים.
25
26שפה פשוטה, ברורה ומעשית
27אני כותבת בעברית, בצורה נגישה, כאילו אנחנו מדברות בוואטסאפ. בלי ז'רגון טכני מיותר.
28
29תמיד בלשון נקבה וברבים
30כל ההסברים, הצעות והטיפים מנוסחים בלשון נקבה (רבות), כדי שהקבוצה תרגיש שזה בשבילה.
31
32שמור על כל הפרטים - אל תקצר!
33אל תסכם את התוכן - תרגם אותו במלואו!
34שמור על כל הנקודות, הדוגמאות והפרטים מההודעה המקורית.
35אם יש 10 נקודות בהודעה המקורית - צריך להיות 10 נקודות בהודעה המומרת.
36אם יש הסבר ארוך - שמור אותו ארוך, רק תעשה אותו ברור יותר.
37
38הסבר מושגים מורכבים
39כשיש מושגים טכניים או מורכבים - תמיד תסבירי אותם בפשטות ובגובה העיניים.
40תני קונטקסט למה זה חשוב ואיך זה משפיע על העסק.
41השתמשי בדוגמאות מהחיים האמיתיים כדי להבהיר.
42אבל אל תמחקי את המושג המקורי - רק תוסיפי הסבר לידו.
43
44תכל'ס לעסקים
45אני מסכמת כל תוכן כך שייצא ממנו ערך פרקטי:
46- איך זה קשור לעסק שלכן
47- איך להשתמש בזה בפועל
48- דוגמה ליישום
49- או רעיון לפוסט / שירות / אוטומציה
50- אזהרות וסיכונים אם רלוונטי
51
52ויזואליות לוואטסאפ
53הטקסטים קצרים, מפורקים לפסקאות ברורות, עם אייקונים לפעמים 😊 כדי שיהיה נעים וקריא בוואטסאפ.
54השתמשי באימוג'ים רלוונטיים כדי להדגיש נקודות חשובות.
55
56לוקחת השראה מכל סגנון
57לא משנה אם הבאת כתבה, פוסט טוויטר, או סרטון – אני מתרגמת את התוכן לעברית עסקית שימושית.
58
59מבנה התוכן:
601. פתיחה מושכת עם "היי לכולן" + הקשר קצר
612. הסבר ברור של מה קורה / מה זה
623. פירוט כל הנקודות החשובות מההודעה המקורית עם הסברים
634. אזהרות או נקודות לתשומת לב אם רלוונטי
645. סיכום עסקי - מה זה אומר בשבילכן
65
66חשוב: אל תקצר! אל תסכם! תרגם את כל התוכן במלואו, רק תעשה אותו ברור יותר ומותאם לקהל נשי עסקי.
67
68אם יש בהודעה הטלגרם לינק הצטרפות לקבוצה תמחק אותו.
69תמיד תסיים את ההודעה ב״
70*רוצה להזמין חברות לקבוצה?*
71📩 קישור להצטרפות לקבוצה: https://chat.whatsapp.com/JMPxSSgheYNLr5gl4JugR״
72`;
73
74 // סגנונות CSS
75 const styles = `
76 .tg-to-wa-icon {
77 position: absolute;
78 top: 8px;
79 right: 8px;
80 width: 32px;
81 height: 32px;
82 background: linear-gradient(135deg, #25D366 0%, #128C7E 100%);
83 border-radius: 50%;
84 cursor: pointer;
85 display: flex;
86 align-items: center;
87 justify-content: center;
88 box-shadow: 0 2px 8px rgba(0,0,0,0.2);
89 z-index: 1000;
90 transition: all 0.2s ease;
91 }
92
93 .tg-to-wa-icon svg {
94 width: 18px;
95 height: 18px;
96 fill: white;
97 }
98
99 .tg-to-wa-popup {
100 position: fixed;
101 background: white;
102 border-radius: 12px;
103 box-shadow: 0 8px 32px rgba(0,0,0,0.15);
104 padding: 20px;
105 z-index: 10000;
106 max-width: 500px;
107 min-width: 400px;
108 direction: rtl;
109 font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
110 }
111
112 .tg-to-wa-popup-header {
113 display: flex;
114 justify-content: space-between;
115 align-items: center;
116 margin-bottom: 16px;
117 padding-bottom: 12px;
118 border-bottom: 2px solid #f0f0f0;
119 }
120
121 .tg-to-wa-popup-title {
122 font-size: 18px;
123 font-weight: 600;
124 color: #128C7E;
125 }
126
127 .tg-to-wa-close-btn {
128 background: none;
129 border: none;
130 font-size: 24px;
131 cursor: pointer;
132 color: #999;
133 padding: 0;
134 width: 30px;
135 height: 30px;
136 display: flex;
137 align-items: center;
138 justify-content: center;
139 border-radius: 50%;
140 transition: all 0.2s;
141 }
142
143 .tg-to-wa-close-btn:hover {
144 background: #f0f0f0;
145 color: #333;
146 }
147
148 .tg-to-wa-content {
149 background: #f8f9fa;
150 border-radius: 8px;
151 padding: 16px;
152 margin-bottom: 16px;
153 max-height: 300px;
154 overflow-y: auto;
155 font-size: 14px;
156 line-height: 1.6;
157 color: #333;
158 white-space: pre-wrap;
159 word-wrap: break-word;
160 }
161
162 .tg-to-wa-buttons {
163 display: flex;
164 flex-direction: column;
165 gap: 10px;
166 }
167
168 .tg-to-wa-btn {
169 padding: 12px 20px;
170 border: none;
171 border-radius: 8px;
172 font-size: 15px;
173 font-weight: 500;
174 cursor: pointer;
175 transition: all 0.2s;
176 display: flex;
177 align-items: center;
178 justify-content: center;
179 gap: 8px;
180 }
181
182 .tg-to-wa-btn-primary {
183 background: linear-gradient(135deg, #25D366 0%, #128C7E 100%);
184 color: white;
185 }
186
187 .tg-to-wa-btn-primary:hover {
188 transform: translateY(-2px);
189 box-shadow: 0 4px 12px rgba(37, 211, 102, 0.3);
190 }
191
192 .tg-to-wa-btn-secondary {
193 background: white;
194 color: #128C7E;
195 border: 2px solid #128C7E;
196 }
197
198 .tg-to-wa-btn-secondary:hover {
199 background: #f0f9f7;
200 }
201
202 .tg-to-wa-btn:disabled {
203 opacity: 0.6;
204 cursor: not-allowed;
205 }
206
207 .tg-to-wa-loading {
208 display: inline-block;
209 width: 16px;
210 height: 16px;
211 border: 2px solid rgba(255,255,255,0.3);
212 border-top-color: white;
213 border-radius: 50%;
214 animation: spin 0.8s linear infinite;
215 }
216
217 @keyframes spin {
218 to { transform: rotate(360deg); }
219 }
220
221 .tg-to-wa-schedule-section {
222 margin-top: 16px;
223 padding-top: 16px;
224 border-top: 2px solid #f0f0f0;
225 }
226
227 .tg-to-wa-schedule-title {
228 font-size: 16px;
229 font-weight: 600;
230 color: #333;
231 margin-bottom: 12px;
232 }
233
234 .tg-to-wa-schedule-inputs {
235 display: flex;
236 gap: 10px;
237 margin-bottom: 12px;
238 }
239
240 .tg-to-wa-input {
241 flex: 1;
242 padding: 10px;
243 border: 2px solid #e0e0e0;
244 border-radius: 8px;
245 font-size: 14px;
246 direction: ltr;
247 text-align: center;
248 }
249
250 .tg-to-wa-input:focus {
251 outline: none;
252 border-color: #128C7E;
253 }
254
255 .tg-to-wa-scheduled-list {
256 margin-top: 16px;
257 max-height: 200px;
258 overflow-y: auto;
259 }
260
261 .tg-to-wa-scheduled-item {
262 background: #fff;
263 border: 1px solid #e0e0e0;
264 border-radius: 8px;
265 padding: 12px;
266 margin-bottom: 8px;
267 display: flex;
268 justify-content: space-between;
269 align-items: center;
270 }
271
272 .tg-to-wa-scheduled-info {
273 flex: 1;
274 }
275
276 .tg-to-wa-scheduled-time {
277 font-weight: 600;
278 color: #128C7E;
279 margin-bottom: 4px;
280 }
281
282 .tg-to-wa-scheduled-preview {
283 font-size: 13px;
284 color: #666;
285 white-space: nowrap;
286 overflow: hidden;
287 text-overflow: ellipsis;
288 max-width: 300px;
289 }
290
291 .tg-to-wa-delete-btn {
292 background: #ff4444;
293 color: white;
294 border: none;
295 border-radius: 6px;
296 padding: 6px 12px;
297 cursor: pointer;
298 font-size: 13px;
299 transition: all 0.2s;
300 }
301
302 .tg-to-wa-delete-btn:hover {
303 background: #cc0000;
304 }
305
306 .tg-to-wa-overlay {
307 position: fixed;
308 top: 0;
309 left: 0;
310 right: 0;
311 bottom: 0;
312 background: rgba(0,0,0,0.5);
313 z-index: 9999;
314 }
315
316 .tg-to-wa-success-msg {
317 position: fixed;
318 top: 20px;
319 right: 20px;
320 background: #25D366;
321 color: white;
322 padding: 16px 24px;
323 border-radius: 8px;
324 box-shadow: 0 4px 12px rgba(0,0,0,0.2);
325 z-index: 10001;
326 animation: slideIn 0.3s ease;
327 }
328
329 @keyframes slideIn {
330 from {
331 transform: translateX(400px);
332 opacity: 0;
333 }
334 to {
335 transform: translateX(0);
336 opacity: 1;
337 }
338 }
339 `;
340
341 // הוספת הסגנונות לדף
342 const styleSheet = document.createElement('style');
343 styleSheet.textContent = styles;
344 document.head.appendChild(styleSheet);
345
346 // פונקציה להצגת הודעת הצלחה
347 function showSuccessMessage(message) {
348 const successMsg = document.createElement('div');
349 successMsg.className = 'tg-to-wa-success-msg';
350 successMsg.textContent = message;
351 document.body.appendChild(successMsg);
352
353 setTimeout(() => {
354 successMsg.remove();
355 }, 3000);
356 }
357
358 // פונקציה לחילוץ טקסט מהודעה
359 function extractMessageText(messageElement) {
360 // חיפוש אלמנט הטקסט בהודעה
361 const textElement = messageElement.querySelector('.text-content, .message-text, .text, [class*="text"], [class*="content"]');
362
363 if (textElement) {
364 return textElement.innerText || textElement.textContent || '';
365 }
366
367 // אם לא נמצא, ננסה לקחת את כל הטקסט
368 return messageElement.innerText || messageElement.textContent || '';
369 }
370
371 // פונקציה להמרת תוכן לפי ההנחיות
372 async function convertContent(originalText, additionalInstructions = '') {
373 console.log('מתחיל המרת תוכן:', originalText.substring(0, 100));
374
375 try {
376 // הסרת לינקים להצטרפות לקבוצות טלגרם
377 let cleanedText = originalText.replace(/https?:\/\/t\.me\/[^\s]+/g, '');
378 cleanedText = cleanedText.replace(/https?:\/\/telegram\.me\/[^\s]+/g, '');
379
380 let prompt = `אני צריכה שתמיר את ההודעה הבאה מטלגרם לתוכן מותאם לקבוצת WhatsApp נשית עסקית.
381
382הנחיות ההמרה:
383${CONVERSION_GUIDELINES}
384
385הודעה מקורית:
386${cleanedText}`;
387
388 // הוספת חידודים נוספים אם יש
389 if (additionalInstructions && additionalInstructions.trim()) {
390 prompt += `\n\nחידודים והנחיות נוספות:\n${additionalInstructions.trim()}`;
391 }
392
393 prompt += '\n\nהמר את ההודעה לפי ההנחיות. תן לי רק את התוכן המומר, בלי הסברים נוספים.';
394
395 console.log('שולח בקשה ל-AI...');
396 const convertedText = await RM.aiCall(prompt);
397 console.log('התקבל תוכן מומר:', convertedText.substring(0, 100));
398
399 // וידוא שהסיום הנכון קיים
400 const ending = '\n\n*רוצה להזמין חברות לקבוצה?*\n📩 קישור להצטרפות לקבוצה: https://chat.whatsapp.com/JMPxSSgheYNLr5gl4JugR';
401
402 if (!convertedText.includes('https://chat.whatsapp.com/JMPxSSgheYNLr5gl4JugR')) {
403 return convertedText + ending;
404 }
405
406 return convertedText;
407 } catch (error) {
408 console.error('שגיאה בהמרת תוכן:', error);
409 throw error;
410 }
411 }
412
413 // פונקציה להעתקה ללוח
414 async function copyToClipboard(text) {
415 try {
416 await GM.setClipboard(text);
417 return true;
418 } catch (error) {
419 console.error('שגיאה בהעתקה:', error);
420 return false;
421 }
422 }
423
424 // פונקציה לשמירת הודעה לרשימה
425 async function saveToList(text) {
426 try {
427 const savedMessages = await GM.getValue('savedMessages', []);
428 savedMessages.push({
429 text: text,
430 timestamp: Date.now(),
431 date: new Date().toLocaleString('he-IL')
432 });
433 await GM.setValue('savedMessages', savedMessages);
434 console.log('הודעה נשמרה לרשימה');
435 return true;
436 } catch (error) {
437 console.error('שגיאה בשמירה:', error);
438 return false;
439 }
440 }
441
442 // פונקציה לתזמון הודעה
443 async function scheduleMessage(text, date, time) {
444 try {
445 const scheduledMessages = await GM.getValue('scheduledMessages', []);
446 const scheduledDateTime = new Date(`${date}T${time}`);
447
448 scheduledMessages.push({
449 text: text,
450 scheduledDate: date,
451 scheduledTime: time,
452 scheduledDateTime: scheduledDateTime.getTime(),
453 createdAt: Date.now(),
454 status: 'pending'
455 });
456
457 await GM.setValue('scheduledMessages', scheduledMessages);
458 console.log('הודעה תוזמנה:', date, time);
459 return true;
460 } catch (error) {
461 console.error('שגיאה בתזמון:', error);
462 return false;
463 }
464 }
465
466 // פונקציה למחיקת הודעה מתוזמנת
467 async function deleteScheduledMessage(index) {
468 try {
469 const scheduledMessages = await GM.getValue('scheduledMessages', []);
470 scheduledMessages.splice(index, 1);
471 await GM.setValue('scheduledMessages', scheduledMessages);
472 return true;
473 } catch (error) {
474 console.error('שגיאה במחיקה:', error);
475 return false;
476 }
477 }
478
479 // פונקציה לשליחת הודעה ל-WhatsApp
480 async function sendToWhatsApp(text) {
481 try {
482 const groupLink = await GM.getValue('whatsappGroupLink', '');
483 if (!groupLink || !groupLink.includes('chat.whatsapp.com')) {
484 console.error('אין קישור קבוצה שמור');
485 return false;
486 }
487
488 // קידוד הטקסט ל-URL
489 const encodedText = encodeURIComponent(text);
490
491 // יצירת URL לשליחה ב-WhatsApp
492 const whatsappUrl = `${groupLink}?text=${encodedText}`;
493
494 console.log('פותח WhatsApp לשליחת הודעה...');
495
496 // פתיחת WhatsApp בטאב חדש
497 await GM.openInTab(whatsappUrl, false);
498
499 return true;
500 } catch (error) {
501 console.error('שגיאה בשליחה ל-WhatsApp:', error);
502 return false;
503 }
504 }
505
506 // פונקציה לבדיקת הודעות מתוזמנות ושליחתן
507 async function checkScheduledMessages() {
508 try {
509 const scheduledMessages = await GM.getValue('scheduledMessages', []);
510 const now = Date.now();
511
512 const messagesToSend = [];
513 const remainingMessages = [];
514
515 scheduledMessages.forEach((msg, index) => {
516 if (msg.status === 'pending' && msg.scheduledDateTime <= now) {
517 messagesToSend.push({ ...msg, index });
518 } else {
519 remainingMessages.push(msg);
520 }
521 });
522
523 if (messagesToSend.length > 0) {
524 console.log(`נמצאו ${messagesToSend.length} הודעות לשליחה`);
525
526 for (const msg of messagesToSend) {
527 console.log('שולח הודעה:', msg.text.substring(0, 50));
528 await sendToWhatsApp(msg.text);
529
530 // המתנה של 5 שניות בין הודעות
531 await new Promise(resolve => setTimeout(resolve, 5000));
532 }
533
534 // עדכון הרשימה - הסרת הודעות שנשלחו
535 await GM.setValue('scheduledMessages', remainingMessages);
536 }
537 } catch (error) {
538 console.error('שגיאה בבדיקת הודעות מתוזמנות:', error);
539 }
540 }
541
542 // פונקציה ליצירת חלון הפופאפ
543 async function createPopup(messageText, iconElement) {
544 // הסרת פופאפ קיים אם יש
545 const existingPopup = document.querySelector('.tg-to-wa-popup');
546 const existingOverlay = document.querySelector('.tg-to-wa-overlay');
547 if (existingPopup) existingPopup.remove();
548 if (existingOverlay) existingOverlay.remove();
549
550 // יצירת overlay
551 const overlay = document.createElement('div');
552 overlay.className = 'tg-to-wa-overlay';
553 document.body.appendChild(overlay);
554
555 // יצירת הפופאפ
556 const popup = document.createElement('div');
557 popup.className = 'tg-to-wa-popup';
558
559 // מיקום הפופאפ במרכז המסך
560 popup.style.top = '50%';
561 popup.style.left = '50%';
562 popup.style.transform = 'translate(-50%, -50%)';
563
564 // קבלת קישור הקבוצה השמור - אם אין, שימוש בברירת מחדל
565 const savedGroupLink = await GM.getValue('whatsappGroupLink', 'https://chat.whatsapp.com/JMPxSSgheYNLr5gl4JugR');
566
567 // תוכן הפופאפ
568 popup.innerHTML = `
569 <div class="tg-to-wa-popup-header">
570 <div class="tg-to-wa-popup-title">המרה לתוכן WhatsApp</div>
571 <button class="tg-to-wa-close-btn">×</button>
572 </div>
573 <div class="tg-to-wa-content">${messageText}</div>
574 <div class="tg-to-wa-buttons">
575 <button class="tg-to-wa-btn tg-to-wa-btn-primary" data-action="convert">
576 🔄 הפוך לתוכן
577 </button>
578 <button class="tg-to-wa-btn tg-to-wa-btn-secondary" data-action="copy">
579 📋 העתק
580 </button>
581 <button class="tg-to-wa-btn tg-to-wa-btn-secondary" data-action="save">
582 💾 שמור לרשימה
583 </button>
584 </div>
585 <div class="tg-to-wa-schedule-section">
586 <div class="tg-to-wa-schedule-title">חידודים והנחיות נוספות (אופציונלי)</div>
587 <textarea class="tg-to-wa-input" id="additional-instructions"
588 placeholder="לדוגמה: תדגישי את החלק על הסיכונים, תוסיפי דוגמה נוספת, תקצרי את החלק הטכני..."
589 style="width: 100%; min-height: 80px; resize: vertical; padding: 12px; font-family: inherit; line-height: 1.5;"></textarea>
590 </div>
591 <div class="tg-to-wa-schedule-section">
592 <div class="tg-to-wa-schedule-title">הגדרות קבוצת WhatsApp</div>
593 <input type="text" class="tg-to-wa-input" id="whatsapp-group-link"
594 placeholder="https://chat.whatsapp.com/..."
595 value="${savedGroupLink}"
596 style="width: 100%; margin-bottom: 12px;">
597 <button class="tg-to-wa-btn tg-to-wa-btn-secondary" data-action="save-link">
598 💾 שמור קישור קבוצה
599 </button>
600 </div>
601 <div class="tg-to-wa-schedule-section">
602 <div class="tg-to-wa-schedule-title">תזמון שליחה אוטומטית</div>
603 <div class="tg-to-wa-schedule-inputs">
604 <input type="date" class="tg-to-wa-input" id="schedule-date" min="${new Date().toISOString().split('T')[0]}">
605 <input type="time" class="tg-to-wa-input" id="schedule-time">
606 </div>
607 <button class="tg-to-wa-btn tg-to-wa-btn-primary" data-action="schedule">
608 ⏰ תזמן שליחה אוטומטית
609 </button>
610 <div class="tg-to-wa-scheduled-list" id="scheduled-list"></div>
611 </div>
612 `;
613
614 document.body.appendChild(popup);
615
616 // טעינת רשימת הודעות מתוזמנות
617 await loadScheduledMessages();
618
619 // הוספת מאזינים לכפתורים
620 const closeBtn = popup.querySelector('.tg-to-wa-close-btn');
621 const convertBtn = popup.querySelector('[data-action="convert"]');
622 const copyBtn = popup.querySelector('[data-action="copy"]');
623 const saveBtn = popup.querySelector('[data-action="save"]');
624 const saveLinkBtn = popup.querySelector('[data-action="save-link"]');
625 const scheduleBtn = popup.querySelector('[data-action="schedule"]');
626 const contentDiv = popup.querySelector('.tg-to-wa-content');
627 const groupLinkInput = document.getElementById('whatsapp-group-link');
628
629 // סגירת הפופאפ
630 const closePopup = () => {
631 popup.remove();
632 overlay.remove();
633 };
634
635 closeBtn.addEventListener('click', closePopup);
636 overlay.addEventListener('click', closePopup);
637
638 // שמירת קישור קבוצה
639 saveLinkBtn.addEventListener('click', async () => {
640 const groupLink = groupLinkInput.value.trim();
641 if (!groupLink) {
642 showSuccessMessage('נא להזין קישור קבוצה ⚠️');
643 return;
644 }
645 if (!groupLink.includes('chat.whatsapp.com')) {
646 showSuccessMessage('קישור לא תקין ❌');
647 return;
648 }
649 await GM.setValue('whatsappGroupLink', groupLink);
650 showSuccessMessage('קישור הקבוצה נשמר! ✅');
651 });
652
653 // המרת תוכן
654 convertBtn.addEventListener('click', async () => {
655 convertBtn.disabled = true;
656 convertBtn.innerHTML = '<span class="tg-to-wa-loading"></span> ממיר...';
657
658 try {
659 const convertedText = await convertContent(messageText);
660 contentDiv.textContent = convertedText;
661 showSuccessMessage('התוכן הומר בהצלחה! ✅');
662 } catch (error) {
663 showSuccessMessage('שגיאה בהמרה ❌');
664 } finally {
665 convertBtn.disabled = false;
666 convertBtn.innerHTML = '🔄 הפוך לתוכן';
667 }
668 });
669
670 // העתקה
671 copyBtn.addEventListener('click', async () => {
672 const currentText = contentDiv.textContent;
673 const success = await copyToClipboard(currentText);
674 if (success) {
675 showSuccessMessage('הועתק ללוח! 📋');
676 } else {
677 showSuccessMessage('שגיאה בהעתקה ❌');
678 }
679 });
680
681 // שמירה לרשימה
682 saveBtn.addEventListener('click', async () => {
683 const currentText = contentDiv.textContent;
684 const success = await saveToList(currentText);
685 if (success) {
686 showSuccessMessage('נשמר לרשימה! 💾');
687 } else {
688 showSuccessMessage('שגיאה בשמירה ❌');
689 }
690 });
691
692 // תזמון
693 scheduleBtn.addEventListener('click', async () => {
694 const dateInput = document.getElementById('schedule-date');
695 const timeInput = document.getElementById('schedule-time');
696 const currentText = contentDiv.textContent;
697 const groupLink = groupLinkInput.value.trim();
698
699 if (!dateInput.value || !timeInput.value) {
700 showSuccessMessage('נא למלא תאריך ושעה ⚠️');
701 return;
702 }
703
704 if (!groupLink || !groupLink.includes('chat.whatsapp.com')) {
705 showSuccessMessage('נא לשמור קישור קבוצה תקין ⚠️');
706 return;
707 }
708
709 const success = await scheduleMessage(currentText, dateInput.value, timeInput.value);
710 if (success) {
711 showSuccessMessage('הודעה תוזמנה לשליחה אוטומטית! ⏰');
712 dateInput.value = '';
713 timeInput.value = '';
714 await loadScheduledMessages();
715 } else {
716 showSuccessMessage('שגיאה בתזמון ❌');
717 }
718 });
719 }
720
721 // פונקציה לטעינת רשימת הודעות מתוזמנות
722 async function loadScheduledMessages() {
723 const scheduledList = document.getElementById('scheduled-list');
724 if (!scheduledList) return;
725
726 const scheduledMessages = await GM.getValue('scheduledMessages', []);
727
728 if (scheduledMessages.length === 0) {
729 scheduledList.innerHTML = '<div style="text-align: center; color: #999; padding: 20px;">אין הודעות מתוזמנות</div>';
730 return;
731 }
732
733 scheduledList.innerHTML = scheduledMessages.map((msg, index) => `
734 <div class="tg-to-wa-scheduled-item">
735 <div class="tg-to-wa-scheduled-info">
736 <div class="tg-to-wa-scheduled-time">${msg.scheduledDate} ${msg.scheduledTime}</div>
737 <div class="tg-to-wa-scheduled-preview">${msg.text.substring(0, 50)}...</div>
738 </div>
739 <button class="tg-to-wa-delete-btn" data-index="${index}">מחק</button>
740 </div>
741 `).join('');
742
743 // הוספת מאזינים למחיקה
744 scheduledList.querySelectorAll('.tg-to-wa-delete-btn').forEach(btn => {
745 btn.addEventListener('click', async (e) => {
746 const index = parseInt(e.target.dataset.index);
747 const success = await deleteScheduledMessage(index);
748 if (success) {
749 showSuccessMessage('הודעה נמחקה! 🗑️');
750 await loadScheduledMessages();
751 }
752 });
753 });
754 }
755
756 // פונקציה להוספת אייקון להודעה
757 function addIconToMessage(messageElement) {
758 // בדיקה אם כבר יש אייקון
759 if (messageElement.querySelector('.tg-to-wa-icon')) {
760 return;
761 }
762
763 // יצירת wrapper אם אין
764 if (!messageElement.classList.contains('message-wrapper')) {
765 messageElement.classList.add('message-wrapper');
766 }
767
768 // יצירת האייקון
769 const icon = document.createElement('div');
770 icon.className = 'tg-to-wa-icon';
771 icon.innerHTML = `
772 <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
773 <path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z"/>
774 </svg>
775 `;
776
777 // הוספת מאזין לחיצה
778 icon.addEventListener('click', async (e) => {
779 e.stopPropagation();
780 const messageText = extractMessageText(messageElement);
781 await createPopup(messageText, icon);
782 });
783
784 messageElement.style.position = 'relative';
785 messageElement.appendChild(icon);
786 }
787
788 // פונקציה לסריקת הודעות
789 function scanMessages() {
790 console.log('סורק הודעות...');
791
792 // חיפוש רק הודעות בתוך אזור השיחה הפעיל
793 const messagesContainer = document.querySelector('.MessageList, .messages-container, [class*="MessageList"]');
794 if (!messagesContainer) {
795 console.log('לא נמצא אזור הודעות');
796 return;
797 }
798
799 // חיפוש רק הודעות ראשיות בתוך אזור השיחה
800 const messages = messagesContainer.querySelectorAll('.Message[data-message-id]');
801
802 console.log('נמצאו', messages.length, 'הודעות');
803
804 messages.forEach(msg => {
805 // בדיקה שזו הודעה אמיתית עם טקסט
806 const hasText = msg.textContent && msg.textContent.trim().length > 0;
807 // בדיקה שאין כבר אייקון
808 const hasIcon = msg.querySelector('.tg-to-wa-icon') !== null;
809
810 if (hasText && !hasIcon) {
811 addIconToMessage(msg);
812 }
813 });
814 }
815
816 // פונקציה debounce
817 function debounce(func, wait) {
818 let timeout;
819 return function executedFunction(...args) {
820 const later = () => {
821 clearTimeout(timeout);
822 func(...args);
823 };
824 clearTimeout(timeout);
825 timeout = setTimeout(later, wait);
826 };
827 }
828
829 // MutationObserver לזיהוי הודעות חדשות
830 const debouncedScan = debounce(scanMessages, 500);
831
832 const observer = new MutationObserver((mutations) => {
833 debouncedScan();
834 });
835
836 // פונקציית אתחול
837 function init() {
838 console.log('Telegram to WhatsApp Converter - מאתחל...');
839
840 // המתנה לטעינת הדף
841 if (document.readyState === 'loading') {
842 document.addEventListener('DOMContentLoaded', init);
843 return;
844 }
845
846 // סריקה ראשונית
847 setTimeout(scanMessages, 2000);
848
849 // התחלת ניטור שינויים
850 observer.observe(document.body, {
851 childList: true,
852 subtree: true
853 });
854
855 // בדיקת הודעות מתוזמנות כל דקה
856 setInterval(checkScheduledMessages, 60000);
857
858 // בדיקה ראשונית של הודעות מתוזמנות
859 setTimeout(checkScheduledMessages, 5000);
860
861 console.log('Telegram to WhatsApp Converter - פעיל! ✅');
862 }
863
864 // הפעלה
865 init();
866})();